[{"data":1,"prerenderedAt":2382},["ShallowReactive",2],{"navigation_docs":3,"-quayel-gateway-data-sources":91,"-quayel-gateway-data-sources-surround":2381},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":90},"Quayel Gateway","i-lucide-network","\u002Fquayel-gateway","quayel-gateway",[10,29,68],{"title":11,"icon":12,"path":13,"stem":14,"children":15},"Getting Started","i-lucide-rocket","\u002Fquayel-gateway\u002Fgetting-started","quayel-gateway\u002F01.getting-started\u002Findex",[16,19,24],{"title":17,"path":13,"stem":14,"icon":18},"Introduction","i-lucide-book-open",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fquayel-gateway\u002Fgetting-started\u002Finstallation","quayel-gateway\u002F01.getting-started\u002F1.installation","i-lucide-container",{"title":25,"path":26,"stem":27,"icon":28},"Project Structure","\u002Fquayel-gateway\u002Fgetting-started\u002Fproject-structure","quayel-gateway\u002F01.getting-started\u002F2.project-structure","i-lucide-folder-tree",{"title":30,"icon":31,"path":32,"stem":33,"children":34},"Plugins","i-lucide-puzzle","\u002Fquayel-gateway\u002Fplugins","quayel-gateway\u002F02.plugins\u002Findex",[35,38,43,48,53,58,63],{"title":36,"path":32,"stem":33,"icon":37},"Overview","i-lucide-workflow",{"title":39,"path":40,"stem":41,"icon":42},"IP Intelligence","\u002Fquayel-gateway\u002Fplugins\u002Fip-intel","quayel-gateway\u002F02.plugins\u002F1.ip-intel","i-lucide-radar",{"title":44,"path":45,"stem":46,"icon":47},"Firewall","\u002Fquayel-gateway\u002Fplugins\u002Ffirewall","quayel-gateway\u002F02.plugins\u002F2.firewall","i-lucide-shield",{"title":49,"path":50,"stem":51,"icon":52},"Rate Limiting","\u002Fquayel-gateway\u002Fplugins\u002Frate-limiting","quayel-gateway\u002F02.plugins\u002F3.rate-limiting","i-lucide-gauge",{"title":54,"path":55,"stem":56,"icon":57},"Cache","\u002Fquayel-gateway\u002Fplugins\u002Fcache","quayel-gateway\u002F02.plugins\u002F4.cache","i-lucide-database",{"title":59,"path":60,"stem":61,"icon":62},"Load Balancer","\u002Fquayel-gateway\u002Fplugins\u002Fload-balancer","quayel-gateway\u002F02.plugins\u002F5.load-balancer","i-lucide-scale",{"title":64,"path":65,"stem":66,"icon":67},"Auto-SSL","\u002Fquayel-gateway\u002Fplugins\u002Fauto-ssl","quayel-gateway\u002F02.plugins\u002F6.auto-ssl","i-lucide-lock",{"title":69,"icon":70,"path":71,"stem":72,"children":73},"AI","i-lucide-bot","\u002Fquayel-gateway\u002Fai","quayel-gateway\u002F03.ai\u002Findex",[74,75,80,85],{"title":36,"path":71,"stem":72,"icon":70},{"title":76,"path":77,"stem":78,"icon":79},"The Quayel Gateway Skill","\u002Fquayel-gateway\u002Fai\u002Fskill","quayel-gateway\u002F03.ai\u002F1.skill","i-lucide-wand-sparkles",{"title":81,"path":82,"stem":83,"icon":84},"Installing the Skill","\u002Fquayel-gateway\u002Fai\u002Finstallation","quayel-gateway\u002F03.ai\u002F2.installation","i-lucide-download",{"title":86,"path":87,"stem":88,"icon":89},"AI Agent Guide","\u002Fquayel-gateway\u002Fai\u002Fagent-guide","quayel-gateway\u002F03.ai\u002F3.agent-guide","i-lucide-braces",false,{"id":92,"title":93,"body":94,"description":2373,"extension":2374,"links":2375,"meta":2376,"navigation":90,"path":2377,"seo":2378,"stem":2379,"__hash__":2380},"docs\u002Fquayel-gateway\u002F06.data-sources.md","Data Sources",{"type":95,"value":96,"toc":2352},"minimark",[97,101,119,123,240,248,264,269,276,284,376,381,434,441,521,525,549,556,633,637,640,647,734,739,747,754,836,840,846,853,933,943,949,961,965,971,978,1062,1066,1072,1079,1163,1167,1173,1180,1254,1258,1262,1268,1350,1353,1357,1363,1367,1374,1432,1438,1487,1493,1497,1500,1504,1670,1674,1847,1851,1875,1879,1895,1899,1977,1981,2089,2093,2187,2191,2348],[98,99,93],"h1",{"id":100},"data-sources",[102,103,104,105,109,110,113,114,118],"p",{},"All IP intelligence data is compiled directly into the gateway binary at build time using Rust's ",[106,107,108],"code",{},"include_bytes!()"," and ",[106,111,112],{},"include_str!()"," macros. The gateway requires ",[115,116,117],"strong",{},"zero downloads"," at startup and works completely offline.",[120,121,36],"h2",{"id":122},"overview",[124,125,126,142],"table",{},[127,128,129],"thead",{},[130,131,132,136,139],"tr",{},[133,134,135],"th",{},"Category",[133,137,138],{},"Datasets",[133,140,141],{},"Total Size",[143,144,145,157,168,179,190,201,212,223],"tbody",{},[130,146,147,151,154],{},[148,149,150],"td",{},"Geolocation",[148,152,153],{},"DB-IP City, Country, ASN (MMDB)",[148,155,156],{},"~139 MB",[130,158,159,162,165],{},[148,160,161],{},"VPN Detection",[148,163,164],{},"X4BNet VPN list",[148,166,167],{},"~177 KB",[130,169,170,173,176],{},[148,171,172],{},"Datacenter Detection",[148,174,175],{},"Provider ASN registry + bad ASN list (ASN-based)",[148,177,178],{},"~6 KB",[130,180,181,184,187],{},[148,182,183],{},"Tor Detection",[148,185,186],{},"Tor Project exit node list",[148,188,189],{},"~19 KB",[130,191,192,195,198],{},[148,193,194],{},"Edge Detection",[148,196,197],{},"Cloudflare IPv4 + IPv6",[148,199,200],{},"~336 B",[130,202,203,206,209],{},[148,204,205],{},"Hosting ASNs",[148,207,208],{},"Bad ASN list",[148,210,211],{},"~4.3 KB",[130,213,214,217,220],{},[148,215,216],{},"Proxy Detection",[148,218,219],{},"FireHOL anonymous (empty by default)",[148,221,222],{},"0 B",[130,224,225,230,235],{},[148,226,227],{},[115,228,229],{},"Total",[148,231,232],{},[115,233,234],{},"9 files",[148,236,237],{},[115,238,239],{},"~140.3 MB",[120,241,243,244,247],{"id":242},"data-files-srcdata","Data files (",[106,245,246],{},"src\u002Fdata\u002F",")",[102,249,250,251,253,254,256,257,259,260,263],{},"All files live in ",[106,252,246],{}," and are embedded via ",[106,255,108],{}," \u002F ",[106,258,112],{}," in ",[106,261,262],{},"src\u002Futils\u002Fembedded_data.rs",".",[265,266,268],"h3",{"id":267},"mmdb-databases-maxmind-binary-format","MMDB databases (MaxMind binary format)",[102,270,271,272,275],{},"These are binary databases queried at runtime using the ",[106,273,274],{},"maxminddb"," crate.",[277,278,280,283],"h4",{"id":279},"dbip-city-litemmdb-122-mb",[106,281,282],{},"dbip-city-lite.mmdb"," (122 MB)",[124,285,286,296],{},[127,287,288],{},[130,289,290,293],{},[133,291,292],{},"Field",[133,294,295],{},"Value",[143,297,298,314,326,336,346,356,366],{},[130,299,300,305],{},[148,301,302],{},[115,303,304],{},"Source",[148,306,307],{},[308,309,313],"a",{"href":310,"rel":311},"https:\u002F\u002Fdb-ip.com\u002Fdb\u002Fip\u002Fcity-lite",[312],"nofollow","DB-IP City Lite",[130,315,316,321],{},[148,317,318],{},[115,319,320],{},"URL",[148,322,323],{},[106,324,325],{},"https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-city-lite-{YYYY-MM}.mmdb.gz",[130,327,328,333],{},[148,329,330],{},[115,331,332],{},"Format",[148,334,335],{},"MMDB (MaxMind Database)",[130,337,338,343],{},[148,339,340],{},[115,341,342],{},"Records",[148,344,345],{},"~2.8 million IPv4 + IPv6 networks",[130,347,348,353],{},[148,349,350],{},[115,351,352],{},"License",[148,354,355],{},"CC-BY 4.0",[130,357,358,363],{},[148,359,360],{},[115,361,362],{},"Update frequency",[148,364,365],{},"Monthly (embedded at build time)",[130,367,368,373],{},[148,369,370],{},[115,371,372],{},"Provides",[148,374,375],{},"Country code, region, city name, latitude, longitude, timezone",[102,377,378],{},[115,379,380],{},"Lookup struct:",[382,383,388],"pre",{"className":384,"code":385,"language":386,"meta":387,"style":387},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","MaxMindCity {\n    city: Option\u003CMaxMindCityName>,        \u002F\u002F city name (en)\n    country: Option\u003CMaxMindCountry>,       \u002F\u002F iso_code: \"US\"\n    location: Option\u003CMaxMindLocation>,     \u002F\u002F lat, lon, timezone\n    subdivisions: Option\u003CVec\u003CMaxMindSubdivision>>, \u002F\u002F region\u002Fstate code\n    postal: Option\u003CMaxMindPostal>,         \u002F\u002F postal code\n}\n","rust","",[106,389,390,398,404,410,416,422,428],{"__ignoreMap":387},[391,392,395],"span",{"class":393,"line":394},"line",1,[391,396,397],{},"MaxMindCity {\n",[391,399,401],{"class":393,"line":400},2,[391,402,403],{},"    city: Option\u003CMaxMindCityName>,        \u002F\u002F city name (en)\n",[391,405,407],{"class":393,"line":406},3,[391,408,409],{},"    country: Option\u003CMaxMindCountry>,       \u002F\u002F iso_code: \"US\"\n",[391,411,413],{"class":393,"line":412},4,[391,414,415],{},"    location: Option\u003CMaxMindLocation>,     \u002F\u002F lat, lon, timezone\n",[391,417,419],{"class":393,"line":418},5,[391,420,421],{},"    subdivisions: Option\u003CVec\u003CMaxMindSubdivision>>, \u002F\u002F region\u002Fstate code\n",[391,423,425],{"class":393,"line":424},6,[391,426,427],{},"    postal: Option\u003CMaxMindPostal>,         \u002F\u002F postal code\n",[391,429,431],{"class":393,"line":430},7,[391,432,433],{},"}\n",[277,435,437,440],{"id":436},"dbip-asn-litemmdb-92-mb",[106,438,439],{},"dbip-asn-lite.mmdb"," (9.2 MB)",[124,442,443,451],{},[127,444,445],{},[130,446,447,449],{},[133,448,292],{},[133,450,295],{},[143,452,453,466,477,486,495,503,512],{},[130,454,455,459],{},[148,456,457],{},[115,458,304],{},[148,460,461],{},[308,462,465],{"href":463,"rel":464},"https:\u002F\u002Fdb-ip.com\u002Fdb\u002Fip\u002Fasn-lite",[312],"DB-IP ASN Lite",[130,467,468,472],{},[148,469,470],{},[115,471,320],{},[148,473,474],{},[106,475,476],{},"https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-asn-lite-{YYYY-MM}.mmdb.gz",[130,478,479,483],{},[148,480,481],{},[115,482,332],{},[148,484,485],{},"MMDB",[130,487,488,492],{},[148,489,490],{},[115,491,342],{},[148,493,494],{},"~1.1 million IPv4 + IPv6 networks",[130,496,497,501],{},[148,498,499],{},[115,500,352],{},[148,502,355],{},[130,504,505,509],{},[148,506,507],{},[115,508,362],{},[148,510,511],{},"Monthly",[130,513,514,518],{},[148,515,516],{},[115,517,372],{},[148,519,520],{},"ASN number, organization name",[102,522,523],{},[115,524,380],{},[382,526,528],{"className":384,"code":527,"language":386,"meta":387,"style":387},"MaxMindAsn {\n    autonomous_system_number: Option\u003Cu32>,      \u002F\u002F 16509\n    autonomous_system_organization: Option\u003CString>, \u002F\u002F \"AMAZON-02\"\n}\n",[106,529,530,535,540,545],{"__ignoreMap":387},[391,531,532],{"class":393,"line":394},[391,533,534],{},"MaxMindAsn {\n",[391,536,537],{"class":393,"line":400},[391,538,539],{},"    autonomous_system_number: Option\u003Cu32>,      \u002F\u002F 16509\n",[391,541,542],{"class":393,"line":406},[391,543,544],{},"    autonomous_system_organization: Option\u003CString>, \u002F\u002F \"AMAZON-02\"\n",[391,546,547],{"class":393,"line":412},[391,548,433],{},[277,550,552,555],{"id":551},"dbip-countrymmdb-80-mb",[106,553,554],{},"dbip-country.mmdb"," (8.0 MB)",[124,557,558,566],{},[127,559,560],{},[130,561,562,564],{},[133,563,292],{},[133,565,295],{},[143,567,568,581,592,600,608,616,624],{},[130,569,570,574],{},[148,571,572],{},[115,573,304],{},[148,575,576],{},[308,577,580],{"href":578,"rel":579},"https:\u002F\u002Fdb-ip.com\u002Fdb\u002Fip\u002Fcountry-lite",[312],"DB-IP Country Lite",[130,582,583,587],{},[148,584,585],{},[115,586,320],{},[148,588,589],{},[106,590,591],{},"https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-country-lite-{YYYY-MM}.mmdb.gz",[130,593,594,598],{},[148,595,596],{},[115,597,332],{},[148,599,485],{},[130,601,602,606],{},[148,603,604],{},[115,605,342],{},[148,607,345],{},[130,609,610,614],{},[148,611,612],{},[115,613,352],{},[148,615,355],{},[130,617,618,622],{},[148,619,620],{},[115,621,362],{},[148,623,511],{},[130,625,626,630],{},[148,627,628],{},[115,629,372],{},[148,631,632],{},"Country code only (fallback when city lookup misses)",[265,634,636],{"id":635},"cidr-lists-plain-text","CIDR lists (plain text)",[102,638,639],{},"One CIDR per line. Used for IP range membership checks via binary search (O(log n)).",[277,641,643,646],{"id":642},"vpntxt-177-kb",[106,644,645],{},"vpn.txt"," (177 KB)",[124,648,649,657],{},[127,650,651],{},[130,652,653,655],{},[133,654,292],{},[133,656,295],{},[143,658,659,672,683,692,702,712,721],{},[130,660,661,665],{},[148,662,663],{},[115,664,304],{},[148,666,667],{},[308,668,671],{"href":669,"rel":670},"https:\u002F\u002Fgithub.com\u002FX4BNet\u002Flists_vpn",[312],"X4BNet lists_vpn",[130,673,674,678],{},[148,675,676],{},[115,677,320],{},[148,679,680],{},[106,681,682],{},"https:\u002F\u002Fraw.githubusercontent.com\u002FX4BNet\u002Flists_vpn\u002Fmain\u002Foutput\u002Fvpn\u002Fipv4.txt",[130,684,685,689],{},[148,686,687],{},[115,688,332],{},[148,690,691],{},"CIDR list (one per line)",[130,693,694,699],{},[148,695,696],{},[115,697,698],{},"Entries",[148,700,701],{},"11,271 CIDR ranges",[130,703,704,709],{},[148,705,706],{},[115,707,708],{},"Original refresh",[148,710,711],{},"Daily (24h)",[130,713,714,718],{},[148,715,716],{},[115,717,372],{},[148,719,720],{},"Known VPN provider IP CIDRs",[130,722,723,728],{},[148,724,725],{},[115,726,727],{},"Used for",[148,729,730,733],{},[106,731,732],{},"ip.is_vpn"," detection",[102,735,736],{},[115,737,738],{},"Sample lines:",[382,740,745],{"className":741,"code":743,"language":744},[742],"language-text","1.0.1.0\u002F24\n1.0.2.0\u002F23\n1.0.8.0\u002F21\n","text",[106,746,743],{"__ignoreMap":387},[277,748,750,753],{"id":749},"tortxt-19-kb",[106,751,752],{},"tor.txt"," (19 KB)",[124,755,756,764],{},[127,757,758],{},[130,759,760,762],{},[133,761,292],{},[133,763,295],{},[143,765,766,779,789,798,807,816,825],{},[130,767,768,772],{},[148,769,770],{},[115,771,304],{},[148,773,774],{},[308,775,778],{"href":776,"rel":777},"https:\u002F\u002Fcheck.torproject.org\u002Ftorbulkexitlist",[312],"Tor Project",[130,780,781,785],{},[148,782,783],{},[115,784,320],{},[148,786,787],{},[106,788,776],{},[130,790,791,795],{},[148,792,793],{},[115,794,332],{},[148,796,797],{},"IP list (one per line)",[130,799,800,804],{},[148,801,802],{},[115,803,698],{},[148,805,806],{},"1,358 exit node IPs",[130,808,809,813],{},[148,810,811],{},[115,812,708],{},[148,814,815],{},"Hourly (1h)",[130,817,818,822],{},[148,819,820],{},[115,821,372],{},[148,823,824],{},"Current Tor exit node IPs",[130,826,827,831],{},[148,828,829],{},[115,830,727],{},[148,832,833,733],{},[106,834,835],{},"ip.is_tor",[102,837,838],{},[115,839,738],{},[382,841,844],{"className":842,"code":843,"language":744},[742],"2.26.97.42\n5.9.47.21\n17.5.12.34\n",[106,845,843],{"__ignoreMap":387},[277,847,849,852],{"id":848},"provider-asnstxt-15-kb",[106,850,851],{},"provider-asns.txt"," (~1.5 KB)",[124,854,855,863],{},[127,856,857],{},[130,858,859,861],{},[133,860,292],{},[133,862,295],{},[143,864,865,874,890,899,909,918],{},[130,866,867,871],{},[148,868,869],{},[115,870,304],{},[148,872,873],{},"Versioned in repo — manual registry",[130,875,876,880],{},[148,877,878],{},[115,879,332],{},[148,881,882,885,886,889],{},[106,883,884],{},"ASN|Label"," (one per line, ",[106,887,888],{},"#"," comments)",[130,891,892,896],{},[148,893,894],{},[115,895,698],{},[148,897,898],{},"38 ASNs across 31 providers (AWS, Google, Azure, Oracle, Hostinger, Hetzner, Linode, Contabo, …)",[130,900,901,906],{},[148,902,903],{},[115,904,905],{},"Refresh",[148,907,908],{},"Manual — add ONE line, rebuild",[130,910,911,915],{},[148,912,913],{},[115,914,372],{},[148,916,917],{},"ASN → provider label map",[130,919,920,924],{},[148,921,922],{},[115,923,727],{},[148,925,926,929,930,733],{},[106,927,928],{},"ip.is_datacenter"," + ",[106,931,932],{},"ip.provider",[102,934,935,936,939,940],{},"Datacenter detection is ",[115,937,938],{},"ASN-based",": the ASN MMDB resolves the client IP to its ASN at runtime (part of the standard lookup), and this registry classifies the network. The ASN identifies the operator no matter which IP blocks it announces — so no datacenter IP ranges need to be embedded. ",[115,941,942],{},"Adding a provider is one line:",[382,944,947],{"className":945,"code":946,"language":744},[742],"47583|Hostinger\n",[106,948,946],{"__ignoreMap":387},[102,950,951,952,955,956,263],{},"Find a provider's ASN: ",[106,953,954],{},"whois -h whois.radb.net -- '-i origin ASxxxx'"," or ",[308,957,960],{"href":958,"rel":959},"https:\u002F\u002Fbgp.tools",[312],"bgp.tools",[102,962,963],{},[115,964,738],{},[382,966,969],{"className":967,"code":968,"language":744},[742],"47583|Hostinger\n24940|Hetzner\n16509|Amazon AWS\n",[106,970,968],{"__ignoreMap":387},[277,972,974,977],{"id":973},"cloudflaretxt-336-b",[106,975,976],{},"cloudflare.txt"," (336 B)",[124,979,980,988],{},[127,981,982],{},[130,983,984,986],{},[133,985,292],{},[133,987,295],{},[143,989,990,1003,1018,1027,1036,1044,1053],{},[130,991,992,996],{},[148,993,994],{},[115,995,304],{},[148,997,998],{},[308,999,1002],{"href":1000,"rel":1001},"https:\u002F\u002Fwww.cloudflare.com\u002Fips-v4",[312],"Cloudflare",[130,1004,1005,1010],{},[148,1006,1007],{},[115,1008,1009],{},"URLs",[148,1011,1012,1014,1015],{},[106,1013,1000],{},", ",[106,1016,1017],{},"https:\u002F\u002Fwww.cloudflare.com\u002Fips-v6",[130,1019,1020,1024],{},[148,1021,1022],{},[115,1023,332],{},[148,1025,1026],{},"CIDR list (IPv4 + IPv6)",[130,1028,1029,1033],{},[148,1030,1031],{},[115,1032,698],{},[148,1034,1035],{},"22 CIDR ranges",[130,1037,1038,1042],{},[148,1039,1040],{},[115,1041,708],{},[148,1043,711],{},[130,1045,1046,1050],{},[148,1047,1048],{},[115,1049,372],{},[148,1051,1052],{},"Cloudflare edge IP ranges",[130,1054,1055,1059],{},[148,1056,1057],{},[115,1058,727],{},[148,1060,1061],{},"Edge detection (Cloudflare vs proxy vs direct)",[102,1063,1064],{},[115,1065,738],{},[382,1067,1070],{"className":1068,"code":1069,"language":744},[742],"173.245.48.0\u002F20\n103.21.244.0\u002F22\n103.22.200.0\u002F22\n2803:f800::\u002F32\n2a06:98c0::\u002F29\n",[106,1071,1069],{"__ignoreMap":387},[277,1073,1075,1078],{"id":1074},"hosting-asnstxt-43-kb",[106,1076,1077],{},"hosting-asns.txt"," (4.3 KB)",[124,1080,1081,1089],{},[127,1082,1083],{},[130,1084,1085,1087],{},[133,1086,292],{},[133,1088,295],{},[143,1090,1091,1104,1115,1124,1133,1142,1151],{},[130,1092,1093,1097],{},[148,1094,1095],{},[115,1096,304],{},[148,1098,1099],{},[308,1100,1103],{"href":1101,"rel":1102},"https:\u002F\u002Fgithub.com\u002Fbrianhama\u002Fbad-asn-list",[312],"brianhama\u002Fbad-asn-list",[130,1105,1106,1110],{},[148,1107,1108],{},[115,1109,320],{},[148,1111,1112],{},[106,1113,1114],{},"https:\u002F\u002Fraw.githubusercontent.com\u002Fbrianhama\u002Fbad-asn-list\u002Fmaster\u002Fbad-asn-list.csv",[130,1116,1117,1121],{},[148,1118,1119],{},[115,1120,332],{},[148,1122,1123],{},"ASN numbers (one per line)",[130,1125,1126,1130],{},[148,1127,1128],{},[115,1129,698],{},[148,1131,1132],{},"ASN numbers known for hosting, abuse, bulletproof hosting",[130,1134,1135,1139],{},[148,1136,1137],{},[115,1138,708],{},[148,1140,1141],{},"Weekly (7 days)",[130,1143,1144,1148],{},[148,1145,1146],{},[115,1147,372],{},[148,1149,1150],{},"ASN numbers associated with hosting\u002Fabuse",[130,1152,1153,1157],{},[148,1154,1155],{},[115,1156,727],{},[148,1158,1159,1162],{},[106,1160,1161],{},"is_datacenter"," fallback (ASN-based detection)",[102,1164,1165],{},[115,1166,738],{},[382,1168,1171],{"className":1169,"code":1170,"language":744},[742],"14061\n16276\n24940\n",[106,1172,1170],{"__ignoreMap":387},[277,1174,1176,1179],{"id":1175},"proxytxt-0-b-empty-by-default",[106,1177,1178],{},"proxy.txt"," (0 B — empty by default)",[124,1181,1182,1190],{},[127,1183,1184],{},[130,1185,1186,1188],{},[133,1187,292],{},[133,1189,295],{},[143,1191,1192,1205,1216,1225,1234,1243],{},[130,1193,1194,1198],{},[148,1195,1196],{},[115,1197,304],{},[148,1199,1200],{},[308,1201,1204],{"href":1202,"rel":1203},"https:\u002F\u002Fgithub.com\u002Ffirehol\u002Fblocklist-ipsets",[312],"FireHOL anonymous.netset",[130,1206,1207,1211],{},[148,1208,1209],{},[115,1210,320],{},[148,1212,1213],{},[106,1214,1215],{},"https:\u002F\u002Fraw.githubusercontent.com\u002Ffirehol\u002Fblocklist-ipsets\u002Fmaster\u002Ffirehol_anonymous.netset",[130,1217,1218,1222],{},[148,1219,1220],{},[115,1221,332],{},[148,1223,1224],{},"CIDR list",[130,1226,1227,1231],{},[148,1228,1229],{},[115,1230,698],{},[148,1232,1233],{},"0 (empty by default)",[130,1235,1236,1240],{},[148,1237,1238],{},[115,1239,372],{},[148,1241,1242],{},"Known anonymous proxy IP ranges",[130,1244,1245,1249],{},[148,1246,1247],{},[115,1248,727],{},[148,1250,1251,733],{},[106,1252,1253],{},"ip.is_proxy",[1255,1256,1257],"note",{},"FireHOL is disabled by default because the list is aggressive and may contain false positives. To use it, populate this file with the FireHOL data and rebuild.",[120,1259,1261],{"id":1260},"how-data-is-embedded","How data is embedded",[102,1263,1264,1265,1267],{},"In ",[106,1266,262],{},":",[382,1269,1271],{"className":384,"code":1270,"language":386,"meta":387,"style":387},"\u002F\u002F CIDR lists\npub const VPN_CIDRS: &str = include_str!(\"..\u002Fdata\u002Fvpn.txt\");\npub const TOR_CIDRS: &str = include_str!(\"..\u002Fdata\u002Ftor.txt\");\npub const CLOUDFLARE_CIDRS: &str = include_str!(\"..\u002Fdata\u002Fcloudflare.txt\");\npub const PROXY_CIDRS: &str = include_str!(\"..\u002Fdata\u002Fproxy.txt\");\n\n\u002F\u002F ASN lists\npub const PROVIDER_ASNS: &str = include_str!(\"..\u002Fdata\u002Fprovider-asns.txt\");\npub const HOSTING_ASNS: &str = include_str!(\"..\u002Fdata\u002Fhosting-asns.txt\");\n\n\u002F\u002F MMDB databases\npub const DBIP_CITY_MMDB: &[u8] = include_bytes!(\"..\u002Fdata\u002Fdbip-city-lite.mmdb\");\npub const DBIP_ASN_MMDB: &[u8] = include_bytes!(\"..\u002Fdata\u002Fdbip-asn-lite.mmdb\");\npub const DBIP_COUNTRY_MMDB: &[u8] = include_bytes!(\"..\u002Fdata\u002Fdbip-country.mmdb\");\n",[106,1272,1273,1278,1283,1288,1293,1298,1304,1309,1315,1321,1326,1332,1338,1344],{"__ignoreMap":387},[391,1274,1275],{"class":393,"line":394},[391,1276,1277],{},"\u002F\u002F CIDR lists\n",[391,1279,1280],{"class":393,"line":400},[391,1281,1282],{},"pub const VPN_CIDRS: &str = include_str!(\"..\u002Fdata\u002Fvpn.txt\");\n",[391,1284,1285],{"class":393,"line":406},[391,1286,1287],{},"pub const TOR_CIDRS: &str = include_str!(\"..\u002Fdata\u002Ftor.txt\");\n",[391,1289,1290],{"class":393,"line":412},[391,1291,1292],{},"pub const CLOUDFLARE_CIDRS: &str = include_str!(\"..\u002Fdata\u002Fcloudflare.txt\");\n",[391,1294,1295],{"class":393,"line":418},[391,1296,1297],{},"pub const PROXY_CIDRS: &str = include_str!(\"..\u002Fdata\u002Fproxy.txt\");\n",[391,1299,1300],{"class":393,"line":424},[391,1301,1303],{"emptyLinePlaceholder":1302},true,"\n",[391,1305,1306],{"class":393,"line":430},[391,1307,1308],{},"\u002F\u002F ASN lists\n",[391,1310,1312],{"class":393,"line":1311},8,[391,1313,1314],{},"pub const PROVIDER_ASNS: &str = include_str!(\"..\u002Fdata\u002Fprovider-asns.txt\");\n",[391,1316,1318],{"class":393,"line":1317},9,[391,1319,1320],{},"pub const HOSTING_ASNS: &str = include_str!(\"..\u002Fdata\u002Fhosting-asns.txt\");\n",[391,1322,1324],{"class":393,"line":1323},10,[391,1325,1303],{"emptyLinePlaceholder":1302},[391,1327,1329],{"class":393,"line":1328},11,[391,1330,1331],{},"\u002F\u002F MMDB databases\n",[391,1333,1335],{"class":393,"line":1334},12,[391,1336,1337],{},"pub const DBIP_CITY_MMDB: &[u8] = include_bytes!(\"..\u002Fdata\u002Fdbip-city-lite.mmdb\");\n",[391,1339,1341],{"class":393,"line":1340},13,[391,1342,1343],{},"pub const DBIP_ASN_MMDB: &[u8] = include_bytes!(\"..\u002Fdata\u002Fdbip-asn-lite.mmdb\");\n",[391,1345,1347],{"class":393,"line":1346},14,[391,1348,1349],{},"pub const DBIP_COUNTRY_MMDB: &[u8] = include_bytes!(\"..\u002Fdata\u002Fdbip-country.mmdb\");\n",[102,1351,1352],{},"These are compile-time constants. The data is part of the binary itself — no file I\u002FO at runtime.",[120,1354,1356],{"id":1355},"runtime-data-flow","Runtime data flow",[382,1358,1361],{"className":1359,"code":1360,"language":744},[742],"Gateway starts\n    │\n    ▼\n1. IpIntelPlugin::new()\n    │\n    ├── load_embedded_mmdb()\n    │   ├── Reader::from_source(DBIP_CITY_MMDB)  → geo_reader\n    │   ├── Reader::from_source(DBIP_ASN_MMDB)   → asn_reader\n    │   └── Reader::from_source(DBIP_COUNTRY_MMDB) → country_reader\n    │\n    └── load_embedded_cidr_sets()\n        ├── vpn.txt      → CidrSet (11,271 ranges, sorted)\n        ├── tor.txt      → CidrSet (1,358 IPs, sorted)\n        ├── cloudflare.txt → CidrSet (22 ranges, sorted)\n        └── proxy.txt    → CidrSet (0 ranges, empty)\n\n    └── load_embedded_asn_sets()\n        ├── provider-asns.txt → HashMap\u003CASN, Label> (38 ASNs)\n        └── hosting-asns.txt  → HashSet\u003CASN> (723 ASNs)\n\nPer request:\n    │\n    ▼\n1. LRU cache check (65,536 entries)\n    │\n    ├── HIT → return cached result (~1μs)\n    │\n    └── MISS:\n        ├── MMDB city lookup → country, region, city\n        ├── MMDB country fallback (if city missed)\n        ├── MMDB ASN lookup → asn, as_org\n        ├── provider-asns.txt \u002F hosting-asns.txt lookup (by ASN) → is_datacenter, provider\n        ├── CidrSet::contains(\"vpn\", ip) → is_vpn\n        ├── CidrSet::contains(\"tor\", ip) → is_tor\n        ├── CidrSet::contains(\"proxy\", ip) → is_proxy\n        ├── classify_network_type()\n        ├── calculate_risk_score()\n        └── Cache result (~5μs total)\n",[106,1362,1360],{"__ignoreMap":387},[120,1364,1366],{"id":1365},"cidr-lookup-algorithm","CIDR lookup algorithm",[102,1368,1369,1370,1373],{},"Each ",[106,1371,1372],{},"CidrSet"," stores sorted ranges for binary search:",[382,1375,1377],{"className":384,"code":1376,"language":386,"meta":387,"style":387},"\u002F\u002F Parsed CIDR: \"192.168.1.0\u002F24\" → CidrRange { start, end, prefix_len }\n\u002F\u002F Sorted by start address\n\nfn contains(&self, ip: IpAddr) -> bool {\n    let ip_num = ip_to_u128(ip);\n    self.ranges.binary_search_by(|r| {\n        if r.end \u003C ip_num { Ordering::Less }\n        else if r.start > ip_num { Ordering::Greater }\n        else { Ordering::Equal }\n    }).is_ok()\n}\n",[106,1378,1379,1384,1389,1393,1398,1403,1408,1413,1418,1423,1428],{"__ignoreMap":387},[391,1380,1381],{"class":393,"line":394},[391,1382,1383],{},"\u002F\u002F Parsed CIDR: \"192.168.1.0\u002F24\" → CidrRange { start, end, prefix_len }\n",[391,1385,1386],{"class":393,"line":400},[391,1387,1388],{},"\u002F\u002F Sorted by start address\n",[391,1390,1391],{"class":393,"line":406},[391,1392,1303],{"emptyLinePlaceholder":1302},[391,1394,1395],{"class":393,"line":412},[391,1396,1397],{},"fn contains(&self, ip: IpAddr) -> bool {\n",[391,1399,1400],{"class":393,"line":418},[391,1401,1402],{},"    let ip_num = ip_to_u128(ip);\n",[391,1404,1405],{"class":393,"line":424},[391,1406,1407],{},"    self.ranges.binary_search_by(|r| {\n",[391,1409,1410],{"class":393,"line":430},[391,1411,1412],{},"        if r.end \u003C ip_num { Ordering::Less }\n",[391,1414,1415],{"class":393,"line":1311},[391,1416,1417],{},"        else if r.start > ip_num { Ordering::Greater }\n",[391,1419,1420],{"class":393,"line":1317},[391,1421,1422],{},"        else { Ordering::Equal }\n",[391,1424,1425],{"class":393,"line":1323},[391,1426,1427],{},"    }).is_ok()\n",[391,1429,1430],{"class":393,"line":1328},[391,1431,433],{},[102,1433,1434,1437],{},[115,1435,1436],{},"Performance:"," O(log n) per lookup where n = number of ranges.",[124,1439,1440,1453],{},[127,1441,1442],{},[130,1443,1444,1447,1450],{},[133,1445,1446],{},"Set",[133,1448,1449],{},"Ranges",[133,1451,1452],{},"Worst-case comparisons",[143,1454,1455,1466,1477],{},[130,1456,1457,1460,1463],{},[148,1458,1459],{},"VPN",[148,1461,1462],{},"11,271",[148,1464,1465],{},"~14",[130,1467,1468,1471,1474],{},[148,1469,1470],{},"Tor",[148,1472,1473],{},"1,358",[148,1475,1476],{},"~11",[130,1478,1479,1481,1484],{},[148,1480,1002],{},[148,1482,1483],{},"22",[148,1485,1486],{},"~5",[102,1488,1489,1492],{},[115,1490,1491],{},"ASN lookups"," (datacenter\u002Fprovider detection) are O(1) hash lookups on the ASN the MMDB already returned — no range search at all.",[120,1494,1496],{"id":1495},"updating-embedded-data","Updating embedded data",[102,1498,1499],{},"To update the embedded data with fresh sources:",[265,1501,1503],{"id":1502},"_1-update-mmdb-files","1. Update MMDB files",[382,1505,1509],{"className":1506,"code":1507,"language":1508,"meta":387,"style":387},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Download latest DB-IP databases\nwget https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-city-lite-$(date +%Y-%m).mmdb.gz\ngunzip dbip-city-lite-*.mmdb.gz\n\nwget https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-asn-lite-$(date +%Y-%m).mmdb.gz\ngunzip dbip-asn-lite-*.mmdb.gz\n\nwget https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-country-lite-$(date +%Y-%m).mmdb.gz\ngunzip dbip-country-lite-*.mmdb.gz\n\n# Copy to src\u002Fdata\u002F\ncp dbip-city-lite-*.mmdb src\u002Fdata\u002Fdbip-city-lite.mmdb\ncp dbip-asn-lite-*.mmdb src\u002Fdata\u002Fdbip-asn-lite.mmdb\ncp dbip-country-lite-*.mmdb src\u002Fdata\u002Fdbip-country.mmdb\n","bash",[106,1510,1511,1517,1542,1556,1560,1577,1588,1592,1609,1620,1624,1629,1644,1657],{"__ignoreMap":387},[391,1512,1513],{"class":393,"line":394},[391,1514,1516],{"class":1515},"sHwdD","# Download latest DB-IP databases\n",[391,1518,1519,1523,1527,1531,1534,1537,1539],{"class":393,"line":400},[391,1520,1522],{"class":1521},"sBMFI","wget",[391,1524,1526],{"class":1525},"sfazB"," https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-city-lite-",[391,1528,1530],{"class":1529},"sMK4o","$(",[391,1532,1533],{"class":1521},"date",[391,1535,1536],{"class":1525}," +%Y-%m",[391,1538,247],{"class":1529},[391,1540,1541],{"class":1525},".mmdb.gz\n",[391,1543,1544,1547,1550,1554],{"class":393,"line":406},[391,1545,1546],{"class":1521},"gunzip",[391,1548,1549],{"class":1525}," dbip-city-lite-",[391,1551,1553],{"class":1552},"sTEyZ","*",[391,1555,1541],{"class":1525},[391,1557,1558],{"class":393,"line":412},[391,1559,1303],{"emptyLinePlaceholder":1302},[391,1561,1562,1564,1567,1569,1571,1573,1575],{"class":393,"line":418},[391,1563,1522],{"class":1521},[391,1565,1566],{"class":1525}," https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-asn-lite-",[391,1568,1530],{"class":1529},[391,1570,1533],{"class":1521},[391,1572,1536],{"class":1525},[391,1574,247],{"class":1529},[391,1576,1541],{"class":1525},[391,1578,1579,1581,1584,1586],{"class":393,"line":424},[391,1580,1546],{"class":1521},[391,1582,1583],{"class":1525}," dbip-asn-lite-",[391,1585,1553],{"class":1552},[391,1587,1541],{"class":1525},[391,1589,1590],{"class":393,"line":430},[391,1591,1303],{"emptyLinePlaceholder":1302},[391,1593,1594,1596,1599,1601,1603,1605,1607],{"class":393,"line":1311},[391,1595,1522],{"class":1521},[391,1597,1598],{"class":1525}," https:\u002F\u002Fdownload.db-ip.com\u002Ffree\u002Fdbip-country-lite-",[391,1600,1530],{"class":1529},[391,1602,1533],{"class":1521},[391,1604,1536],{"class":1525},[391,1606,247],{"class":1529},[391,1608,1541],{"class":1525},[391,1610,1611,1613,1616,1618],{"class":393,"line":1317},[391,1612,1546],{"class":1521},[391,1614,1615],{"class":1525}," dbip-country-lite-",[391,1617,1553],{"class":1552},[391,1619,1541],{"class":1525},[391,1621,1622],{"class":393,"line":1323},[391,1623,1303],{"emptyLinePlaceholder":1302},[391,1625,1626],{"class":393,"line":1328},[391,1627,1628],{"class":1515},"# Copy to src\u002Fdata\u002F\n",[391,1630,1631,1634,1636,1638,1641],{"class":393,"line":1334},[391,1632,1633],{"class":1521},"cp",[391,1635,1549],{"class":1525},[391,1637,1553],{"class":1552},[391,1639,1640],{"class":1525},".mmdb",[391,1642,1643],{"class":1525}," src\u002Fdata\u002Fdbip-city-lite.mmdb\n",[391,1645,1646,1648,1650,1652,1654],{"class":393,"line":1340},[391,1647,1633],{"class":1521},[391,1649,1583],{"class":1525},[391,1651,1553],{"class":1552},[391,1653,1640],{"class":1525},[391,1655,1656],{"class":1525}," src\u002Fdata\u002Fdbip-asn-lite.mmdb\n",[391,1658,1659,1661,1663,1665,1667],{"class":393,"line":1346},[391,1660,1633],{"class":1521},[391,1662,1615],{"class":1525},[391,1664,1553],{"class":1552},[391,1666,1640],{"class":1525},[391,1668,1669],{"class":1525}," src\u002Fdata\u002Fdbip-country.mmdb\n",[265,1671,1673],{"id":1672},"_2-update-cidr-lists","2. Update CIDR lists",[382,1675,1677],{"className":1506,"code":1676,"language":1508,"meta":387,"style":387},"# VPN\ncurl -sL https:\u002F\u002Fraw.githubusercontent.com\u002FX4BNet\u002Flists_vpn\u002Fmain\u002Foutput\u002Fvpn\u002Fipv4.txt \\\n  > src\u002Fdata\u002Fvpn.txt\n\n# Tor exits\ncurl -sL https:\u002F\u002Fcheck.torproject.org\u002Ftorbulkexitlist \\\n  > src\u002Fdata\u002Ftor.txt\n\n# Datacenter providers — edit the registry (one line per ASN), no download:\n#   echo '47583|Hostinger' >> src\u002Fdata\u002Fprovider-asns.txt\n\n# Cloudflare\ncurl -sL https:\u002F\u002Fwww.cloudflare.com\u002Fips-v4 > src\u002Fdata\u002Fcloudflare.txt\ncurl -sL https:\u002F\u002Fwww.cloudflare.com\u002Fips-v6 >> src\u002Fdata\u002Fcloudflare.txt\n\n# Hosting ASNs (bad-asn-list)\ncurl -sL https:\u002F\u002Fraw.githubusercontent.com\u002Fbrianhama\u002Fbad-asn-list\u002Fmaster\u002Fbad-asn-list.csv | \\\n  tail -n +2 | cut -d',' -f1 > src\u002Fdata\u002Fhosting-asns.txt\n",[106,1678,1679,1684,1698,1706,1710,1715,1726,1733,1737,1742,1747,1751,1756,1771,1785,1790,1796,1811],{"__ignoreMap":387},[391,1680,1681],{"class":393,"line":394},[391,1682,1683],{"class":1515},"# VPN\n",[391,1685,1686,1689,1692,1695],{"class":393,"line":400},[391,1687,1688],{"class":1521},"curl",[391,1690,1691],{"class":1525}," -sL",[391,1693,1694],{"class":1525}," https:\u002F\u002Fraw.githubusercontent.com\u002FX4BNet\u002Flists_vpn\u002Fmain\u002Foutput\u002Fvpn\u002Fipv4.txt",[391,1696,1697],{"class":1552}," \\\n",[391,1699,1700,1703],{"class":393,"line":406},[391,1701,1702],{"class":1529},"  >",[391,1704,1705],{"class":1525}," src\u002Fdata\u002Fvpn.txt\n",[391,1707,1708],{"class":393,"line":412},[391,1709,1303],{"emptyLinePlaceholder":1302},[391,1711,1712],{"class":393,"line":418},[391,1713,1714],{"class":1515},"# Tor exits\n",[391,1716,1717,1719,1721,1724],{"class":393,"line":424},[391,1718,1688],{"class":1521},[391,1720,1691],{"class":1525},[391,1722,1723],{"class":1525}," https:\u002F\u002Fcheck.torproject.org\u002Ftorbulkexitlist",[391,1725,1697],{"class":1552},[391,1727,1728,1730],{"class":393,"line":430},[391,1729,1702],{"class":1529},[391,1731,1732],{"class":1525}," src\u002Fdata\u002Ftor.txt\n",[391,1734,1735],{"class":393,"line":1311},[391,1736,1303],{"emptyLinePlaceholder":1302},[391,1738,1739],{"class":393,"line":1317},[391,1740,1741],{"class":1515},"# Datacenter providers — edit the registry (one line per ASN), no download:\n",[391,1743,1744],{"class":393,"line":1323},[391,1745,1746],{"class":1515},"#   echo '47583|Hostinger' >> src\u002Fdata\u002Fprovider-asns.txt\n",[391,1748,1749],{"class":393,"line":1328},[391,1750,1303],{"emptyLinePlaceholder":1302},[391,1752,1753],{"class":393,"line":1334},[391,1754,1755],{"class":1515},"# Cloudflare\n",[391,1757,1758,1760,1762,1765,1768],{"class":393,"line":1340},[391,1759,1688],{"class":1521},[391,1761,1691],{"class":1525},[391,1763,1764],{"class":1525}," https:\u002F\u002Fwww.cloudflare.com\u002Fips-v4",[391,1766,1767],{"class":1529}," >",[391,1769,1770],{"class":1525}," src\u002Fdata\u002Fcloudflare.txt\n",[391,1772,1773,1775,1777,1780,1783],{"class":393,"line":1346},[391,1774,1688],{"class":1521},[391,1776,1691],{"class":1525},[391,1778,1779],{"class":1525}," https:\u002F\u002Fwww.cloudflare.com\u002Fips-v6",[391,1781,1782],{"class":1529}," >>",[391,1784,1770],{"class":1525},[391,1786,1788],{"class":393,"line":1787},15,[391,1789,1303],{"emptyLinePlaceholder":1302},[391,1791,1793],{"class":393,"line":1792},16,[391,1794,1795],{"class":1515},"# Hosting ASNs (bad-asn-list)\n",[391,1797,1799,1801,1803,1806,1809],{"class":393,"line":1798},17,[391,1800,1688],{"class":1521},[391,1802,1691],{"class":1525},[391,1804,1805],{"class":1525}," https:\u002F\u002Fraw.githubusercontent.com\u002Fbrianhama\u002Fbad-asn-list\u002Fmaster\u002Fbad-asn-list.csv",[391,1807,1808],{"class":1529}," |",[391,1810,1697],{"class":1552},[391,1812,1814,1817,1820,1823,1825,1828,1831,1834,1837,1839,1842,1844],{"class":393,"line":1813},18,[391,1815,1816],{"class":1521},"  tail",[391,1818,1819],{"class":1525}," -n",[391,1821,1822],{"class":1525}," +2",[391,1824,1808],{"class":1529},[391,1826,1827],{"class":1521}," cut",[391,1829,1830],{"class":1525}," -d",[391,1832,1833],{"class":1529},"'",[391,1835,1836],{"class":1525},",",[391,1838,1833],{"class":1529},[391,1840,1841],{"class":1525}," -f1",[391,1843,1767],{"class":1529},[391,1845,1846],{"class":1525}," src\u002Fdata\u002Fhosting-asns.txt\n",[265,1848,1850],{"id":1849},"_3-rebuild","3. Rebuild",[382,1852,1854],{"className":1506,"code":1853,"language":1508,"meta":387,"style":387},"cargo build --release\nstrip target\u002Frelease\u002Fquayel-gateway\n",[106,1855,1856,1867],{"__ignoreMap":387},[391,1857,1858,1861,1864],{"class":393,"line":394},[391,1859,1860],{"class":1521},"cargo",[391,1862,1863],{"class":1525}," build",[391,1865,1866],{"class":1525}," --release\n",[391,1868,1869,1872],{"class":393,"line":400},[391,1870,1871],{"class":1521},"strip",[391,1873,1874],{"class":1525}," target\u002Frelease\u002Fquayel-gateway\n",[265,1876,1878],{"id":1877},"_4-deploy","4. Deploy",[382,1880,1882],{"className":1506,"code":1881,"language":1508,"meta":387,"style":387},"systemctl restart quayel-gateway\n",[106,1883,1884],{"__ignoreMap":387},[391,1885,1886,1889,1892],{"class":393,"line":394},[391,1887,1888],{"class":1521},"systemctl",[391,1890,1891],{"class":1525}," restart",[391,1893,1894],{"class":1525}," quayel-gateway\n",[120,1896,1898],{"id":1897},"recommended-update-schedule","Recommended update schedule",[124,1900,1901,1914],{},[127,1902,1903],{},[130,1904,1905,1908,1911],{},[133,1906,1907],{},"Data",[133,1909,1910],{},"Recommended Frequency",[133,1912,1913],{},"Why",[143,1915,1916,1926,1937,1947,1958,1968],{},[130,1917,1918,1921,1923],{},[148,1919,1920],{},"MMDB (city, ASN, country)",[148,1922,511],{},[148,1924,1925],{},"DB-IP releases monthly",[130,1927,1928,1931,1934],{},[148,1929,1930],{},"Tor exit list",[148,1932,1933],{},"Weekly",[148,1935,1936],{},"Exit nodes change frequently",[130,1938,1939,1942,1944],{},[148,1940,1941],{},"VPN list",[148,1943,1933],{},[148,1945,1946],{},"New VPN providers appear",[130,1948,1949,1952,1955],{},[148,1950,1951],{},"Provider ASN registry",[148,1953,1954],{},"On demand",[148,1956,1957],{},"Adding a provider is a one-line edit",[130,1959,1960,1963,1965],{},[148,1961,1962],{},"Cloudflare ranges",[148,1964,511],{},[148,1966,1967],{},"Rarely changes",[130,1969,1970,1972,1974],{},[148,1971,205],{},[148,1973,511],{},[148,1975,1976],{},"Slow-moving list",[120,1978,1980],{"id":1979},"binary-size-impact","Binary size impact",[124,1982,1983,1996],{},[127,1984,1985],{},[130,1986,1987,1990,1993],{},[133,1988,1989],{},"Component",[133,1991,1992],{},"Size",[133,1994,1995],{},"Percentage",[143,1997,1998,2009,2020,2031,2042,2052,2062,2072],{},[130,1999,2000,2003,2006],{},[148,2001,2002],{},"Code + dependencies",[148,2004,2005],{},"~13 MB",[148,2007,2008],{},"8.5%",[130,2010,2011,2014,2017],{},[148,2012,2013],{},"DB-IP City MMDB",[148,2015,2016],{},"~122 MB",[148,2018,2019],{},"79.6%",[130,2021,2022,2025,2028],{},[148,2023,2024],{},"DB-IP ASN MMDB",[148,2026,2027],{},"~9.2 MB",[148,2029,2030],{},"6.0%",[130,2032,2033,2036,2039],{},[148,2034,2035],{},"DB-IP Country MMDB",[148,2037,2038],{},"~8.0 MB",[148,2040,2041],{},"5.3%",[130,2043,2044,2047,2049],{},[148,2045,2046],{},"VPN CIDRs",[148,2048,167],{},[148,2050,2051],{},"0.1%",[130,2053,2054,2057,2059],{},[148,2055,2056],{},"Tor CIDRs",[148,2058,189],{},[148,2060,2061],{},"\u003C0.1%",[130,2063,2064,2067,2070],{},[148,2065,2066],{},"ASN lists + other CIDRs",[148,2068,2069],{},"~10 KB",[148,2071,2061],{},[130,2073,2074,2079,2084],{},[148,2075,2076],{},[115,2077,2078],{},"Total (stripped release)",[148,2080,2081],{},[115,2082,2083],{},"~151 MB",[148,2085,2086],{},[115,2087,2088],{},"100%",[120,2090,2092],{"id":2091},"runtime-memory","Runtime memory",[124,2094,2095,2106],{},[127,2096,2097],{},[130,2098,2099,2101,2103],{},[133,2100,1989],{},[133,2102,1992],{},[133,2104,2105],{},"Notes",[143,2107,2108,2118,2129,2140,2151,2161,2172],{},[130,2109,2110,2113,2115],{},[148,2111,2112],{},"Binary (code)",[148,2114,2005],{},[148,2116,2117],{},"Mapped from disk",[130,2119,2120,2123,2126],{},[148,2121,2122],{},"Embedded data",[148,2124,2125],{},"~140 MB",[148,2127,2128],{},"Mapped from binary",[130,2130,2131,2134,2137],{},[148,2132,2133],{},"MMDB readers",[148,2135,2136],{},"~0 MB",[148,2138,2139],{},"Memory-mapped, pages loaded on demand",[130,2141,2142,2145,2148],{},[148,2143,2144],{},"CIDR sets (sorted)",[148,2146,2147],{},"~5 MB",[148,2149,2150],{},"In-memory sorted arrays",[130,2152,2153,2156,2158],{},[148,2154,2155],{},"LRU cache",[148,2157,2005],{},[148,2159,2160],{},"65K entries × ~200 bytes",[130,2162,2163,2166,2169],{},[148,2164,2165],{},"Rate limit counters",[148,2167,2168],{},"~1 MB",[148,2170,2171],{},"Grows with unique keys",[130,2173,2174,2179,2184],{},[148,2175,2176],{},[115,2177,2178],{},"Total RSS",[148,2180,2181],{},[115,2182,2183],{},"~29 MB",[148,2185,2186],{},"At startup",[120,2188,2190],{"id":2189},"data-sources-attribution","Data sources attribution",[124,2192,2193,2203],{},[127,2194,2195],{},[130,2196,2197,2199,2201],{},[133,2198,304],{},[133,2200,352],{},[133,2202,320],{},[143,2204,2205,2218,2230,2243,2257,2271,2285,2299,2312,2324,2335],{},[130,2206,2207,2210,2212],{},[148,2208,2209],{},"DB-IP",[148,2211,355],{},[148,2213,2214],{},[308,2215,2216],{"href":2216,"rel":2217},"https:\u002F\u002Fdb-ip.com",[312],[130,2219,2220,2222,2225],{},[148,2221,671],{},[148,2223,2224],{},"MIT",[148,2226,2227],{},[308,2228,669],{"href":669,"rel":2229},[312],[130,2231,2232,2234,2237],{},[148,2233,778],{},[148,2235,2236],{},"BSD-3",[148,2238,2239],{},[308,2240,2241],{"href":2241,"rel":2242},"https:\u002F\u002Fcheck.torproject.org",[312],[130,2244,2245,2248,2251],{},[148,2246,2247],{},"AWS IP Ranges",[148,2249,2250],{},"AWS",[148,2252,2253],{},[308,2254,2255],{"href":2255,"rel":2256},"https:\u002F\u002Fip-ranges.amazonaws.com",[312],[130,2258,2259,2262,2265],{},[148,2260,2261],{},"GCP IP Ranges",[148,2263,2264],{},"Google",[148,2266,2267],{},[308,2268,2269],{"href":2269,"rel":2270},"https:\u002F\u002Fwww.gstatic.com\u002Fipranges",[312],[130,2272,2273,2276,2279],{},[148,2274,2275],{},"Oracle Cloud",[148,2277,2278],{},"Oracle",[148,2280,2281],{},[308,2282,2283],{"href":2283,"rel":2284},"https:\u002F\u002Fdocs.oracle.com\u002Fen-us\u002Fiaas\u002Ftools",[312],[130,2286,2287,2290,2293],{},[148,2288,2289],{},"Azure Service Tags",[148,2291,2292],{},"Microsoft",[148,2294,2295],{},[308,2296,2297],{"href":2297,"rel":2298},"https:\u002F\u002Fwww.microsoft.com\u002Fen-us\u002Fdownload",[312],[130,2300,2301,2304,2306],{},[148,2302,2303],{},"DigitalOcean",[148,2305,2224],{},[148,2307,2308],{},[308,2309,2310],{"href":2310,"rel":2311},"https:\u002F\u002Fwww.digitalocean.com\u002Fgeo",[312],[130,2313,2314,2316,2318],{},[148,2315,1002],{},[148,2317,1002],{},[148,2319,2320],{},[308,2321,2322],{"href":2322,"rel":2323},"https:\u002F\u002Fwww.cloudflare.com\u002Fips",[312],[130,2325,2326,2328,2330],{},[148,2327,1103],{},[148,2329,2224],{},[148,2331,2332],{},[308,2333,1101],{"href":1101,"rel":2334},[312],[130,2336,2337,2340,2343],{},[148,2338,2339],{},"FireHOL",[148,2341,2342],{},"GPL v3",[148,2344,2345],{},[308,2346,1202],{"href":1202,"rel":2347},[312],[2349,2350,2351],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":387,"searchDepth":400,"depth":400,"links":2353},[2354,2355,2360,2361,2362,2363,2369,2370,2371,2372],{"id":122,"depth":400,"text":36},{"id":242,"depth":400,"text":2356,"children":2357},"Data files (src\u002Fdata\u002F)",[2358,2359],{"id":267,"depth":406,"text":268},{"id":635,"depth":406,"text":636},{"id":1260,"depth":400,"text":1261},{"id":1355,"depth":400,"text":1356},{"id":1365,"depth":400,"text":1366},{"id":1495,"depth":400,"text":1496,"children":2364},[2365,2366,2367,2368],{"id":1502,"depth":406,"text":1503},{"id":1672,"depth":406,"text":1673},{"id":1849,"depth":406,"text":1850},{"id":1877,"depth":406,"text":1878},{"id":1897,"depth":400,"text":1898},{"id":1979,"depth":400,"text":1980},{"id":2091,"depth":400,"text":2092},{"id":2189,"depth":400,"text":2190},"All embedded IP intelligence datasets: sources, licenses, formats, and the update process.","md",null,{},"\u002Fquayel-gateway\u002Fdata-sources",{"title":93,"description":2373},"quayel-gateway\u002F06.data-sources","tqygAX-Y8GIFQHzgiE8l9fOwzlcvRO25H5sjZjr5FOI",[2375,2375],1791649769153]