From 127e0fadd26c9421a56e0db3b1f5ac3fc8d8d2ff Mon Sep 17 00:00:00 2001 From: localhost Date: Sat, 11 Apr 2026 19:49:11 +0200 Subject: [PATCH] ranges update + trust based limit --- bun.lockb | Bin 54330 -> 54028 bytes package.json | 1 - ranges/1clickvpn.txt | 7 - ranges/1vpn.txt | 3 +- ranges/anonvpn.txt | 22 +- ranges/expressvpn.txt | 3 +- ranges/planet.txt | 18 +- ranges/turbovpn.txt | 2 +- ranges/urbanvpn.txt | 7 +- ranges/vpnly.txt | 223 +-- scripts/1clickvpn.ts | 2 - scripts/1vpn.ts | 14 - scripts/expressvpn.ts | 79 - scripts/planetvpn.ts | 3312 --------------------------------------- scripts/turbovpn.ts | 15 - scripts/urbanvpn.ts | 22 - scripts/vpnly.ts | 32 - src/router/websocket.ts | 61 +- src/utils/ranges.ts | 1 + src/utils/rate-limit.ts | 30 + 20 files changed, 121 insertions(+), 3733 deletions(-) delete mode 100644 scripts/1clickvpn.ts delete mode 100644 scripts/1vpn.ts delete mode 100644 scripts/expressvpn.ts delete mode 100644 scripts/planetvpn.ts delete mode 100644 scripts/turbovpn.ts delete mode 100644 scripts/urbanvpn.ts delete mode 100644 scripts/vpnly.ts diff --git a/bun.lockb b/bun.lockb index 01c51753696c0a4720bf5954256838246db19e65..7e8efb2896e886adf2f2c9f4c9e7665e7df406d6 100755 GIT binary patch delta 6866 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 delta 7065 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 diff --git a/package.json b/package.json index bc87e7e..913c864 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "@types/pg": "^8.11.10", "@types/ws": "^8.18.1", "age-encryption": "^0.2.4", - "crypto-js": "^4.2.0", "date-fns": "^4.1.0", "elysia": "^1.1.25", "eta": "^4.0.1", diff --git a/ranges/1clickvpn.txt b/ranges/1clickvpn.txt index 6056ea3..1ed7e35 100644 --- a/ranges/1clickvpn.txt +++ b/ranges/1clickvpn.txt @@ -1,10 +1,3 @@ 95.141.32.101/32 93.115.28.181/32 185.136.159.181/32 -79.141.162.81/32 -5.149.253.57/32 -5.149.255.178/32 -5.149.250.222/32 -77.83.198.123/32 -185.235.137.161/32 -83.143.87.194/32 \ No newline at end of file diff --git a/ranges/1vpn.txt b/ranges/1vpn.txt index b3e6039..02021ab 100644 --- a/ranges/1vpn.txt +++ b/ranges/1vpn.txt @@ -5,7 +5,6 @@ 91.242.241.58/32 193.104.75.35/32 66.42.61.251/32 -198.145.121.235/32 198.145.121.151/32 91.236.230.83/32 -92.118.126.116/32 \ No newline at end of file +92.118.126.116/32 diff --git a/ranges/anonvpn.txt b/ranges/anonvpn.txt index e221fff..5c68981 100644 --- a/ranges/anonvpn.txt +++ b/ranges/anonvpn.txt @@ -4,24 +4,30 @@ 63.125.93.136/32 161.77.141.85/32 176.106.62.91/32 +176.106.63.26/32 85.255.180.8/32 +178.209.75.96/32 83.168.84.194/32 +83.168.86.140/32 +212.68.180.226/32 +31.133.94.250/32 +31.133.95.77/32 +212.68.178.22/32 +158.46.163.29/32 161.77.142.156/32 -208.214.161.115/32 63.125.92.107/32 161.77.143.49/32 -45.155.203.59/32 +63.125.90.226/32 +208.214.161.115/32 209.46.2.40/32 45.155.202.30/32 -209.46.2.120/32 -63.125.90.226/32 -158.46.163.29/32 176.106.63.59/32 83.168.86.1/32 176.103.230.40/32 85.255.180.245/32 63.125.93.220/32 161.77.71.191/32 -161.77.70.73/32 -208.214.160.169/32 -208.214.165.71/32 \ No newline at end of file +45.155.203.59/32 +212.68.177.120/32 +178.171.120.242/32 +131.222.219.99/32 \ No newline at end of file diff --git a/ranges/expressvpn.txt b/ranges/expressvpn.txt index 75299d0..326082c 100644 --- a/ranges/expressvpn.txt +++ b/ranges/expressvpn.txt @@ -658,4 +658,5 @@ 45.134.20.0/24 185.195.19.0/24 85.203.15.0/24 -85.203.36.0/24 \ No newline at end of file +85.203.36.0/24 +185.194.178.0/24 \ No newline at end of file diff --git a/ranges/planet.txt b/ranges/planet.txt index 3387f19..d415a86 100644 --- a/ranges/planet.txt +++ b/ranges/planet.txt @@ -1,11 +1,11 @@ -38.165.232.58/32 -57.128.102.31/32 -57.129.2.17/32 +38.165.232.16/32 +162.19.19.237/32 +57.129.25.46/32 185.191.204.202/32 95.110.229.220/32 -38.165.228.24/32 -51.158.206.8/32 -110.172.145.222/32 -198.244.176.53/32 -216.106.183.243/32 -15.204.97.212/32 \ No newline at end of file +190.103.179.106/32 +51.158.204.28/32 +185.227.138.194/32 +198.244.231.55/32 +167.17.69.162/32 +15.204.97.215/32 diff --git a/ranges/turbovpn.txt b/ranges/turbovpn.txt index a7ae881..36407f4 100644 --- a/ranges/turbovpn.txt +++ b/ranges/turbovpn.txt @@ -3,4 +3,4 @@ 162.19.205.94/32 169.150.210.53/32 198.244.234.214/32 -79.110.54.211/32 \ No newline at end of file +79.110.54.211/32 diff --git a/ranges/urbanvpn.txt b/ranges/urbanvpn.txt index e3d64c6..5da20f9 100644 --- a/ranges/urbanvpn.txt +++ b/ranges/urbanvpn.txt @@ -39,7 +39,6 @@ 140.174.187.15/32 108.181.68.87/32 140.174.187.17/32 -178.172.217.13/32 173.209.63.146/32 67.43.236.226/32 148.113.221.150/32 @@ -161,7 +160,6 @@ 180.149.230.169/32 103.108.230.31/32 103.108.230.51/32 -5.180.44.194/32 180.149.230.241/32 102.68.86.97/32 91.213.233.111/32 @@ -184,7 +182,6 @@ 109.248.149.173/32 154.70.207.190/32 154.70.207.146/32 -43.231.113.84/32 43.231.114.178/32 171.22.254.19/32 171.22.254.144/32 @@ -209,7 +206,6 @@ 190.97.163.17/32 190.120.229.196/32 138.186.143.50/32 -103.103.0.21/32 112.199.95.186/32 103.152.255.235/32 57.128.235.172/32 @@ -240,7 +236,6 @@ 165.231.211.122/32 193.37.255.2/32 185.245.85.126/32 -119.59.98.133/32 119.59.98.74/32 188.213.34.178/32 185.169.64.46/32 @@ -269,4 +264,4 @@ 45.228.67.28/32 103.97.125.216/32 103.9.78.107/32 -129.232.237.178/32 \ No newline at end of file +129.232.237.178/32 diff --git a/ranges/vpnly.txt b/ranges/vpnly.txt index 2fb4291..e9e793e 100644 --- a/ranges/vpnly.txt +++ b/ranges/vpnly.txt @@ -1,217 +1,38 @@ -46.229.253.218/32 -195.74.93.252/32 -78.31.67.36/32 -89.163.144.107/32 -46.229.253.197/32 -89.163.144.21/32 -89.163.144.37/32 -46.229.253.212/32 -5.199.143.248/32 -195.74.93.75/32 -213.202.219.29/32 -195.74.93.73/32 -5.104.111.246/32 -195.74.93.74/32 -46.229.253.195/32 -78.31.67.70/32 -208.87.241.235/32 -108.181.0.171/32 -208.87.240.255/32 -108.181.4.69/32 -208.87.241.221/32 -208.87.242.23/32 -108.181.0.21/32 -108.181.1.241/32 -208.87.240.19/32 -208.87.242.199/32 -108.181.3.149/32 -208.87.242.111/32 -108.181.3.145/32 -108.181.0.109/32 -45.12.133.12/32 -104.168.10.152/32 -64.31.63.35/32 -104.168.10.60/32 -45.12.133.22/32 -94.232.247.205/32 -104.168.10.210/32 -94.232.247.207/32 -64.31.63.233/32 -64.31.63.245/32 -104.168.10.80/32 -64.31.63.133/32 -104.168.10.61/32 -45.12.133.18/32 -104.168.10.168/32 -46.229.243.197/32 -46.229.243.200/32 -108.181.59.34/32 -46.229.243.199/32 -46.229.243.201/32 -108.181.58.33/32 -46.229.243.203/32 -46.229.243.178/32 -80.92.204.6/32 -80.92.204.74/32 -45.12.138.188/32 -80.71.157.209/32 -80.92.204.84/32 -45.83.129.161/32 -80.92.204.82/32 -45.14.247.113/32 -80.92.204.73/32 -80.92.204.75/32 -80.71.157.218/32 -80.71.157.239/32 -80.92.204.85/32 80.92.204.57/32 80.92.204.42/32 -80.92.204.62/32 -208.87.240.255/32 -108.181.0.171/32 -108.181.0.21/32 -108.181.3.145/32 -208.87.241.235/32 -208.87.241.221/32 -108.181.1.241/32 -208.87.242.111/32 -208.87.242.23/32 -108.181.4.69/32 -208.87.240.19/32 -108.181.3.149/32 -108.181.0.109/32 -208.87.242.199/32 -45.12.133.18/32 -45.12.133.12/32 -94.232.247.207/32 -94.232.247.205/32 -45.12.133.22/32 -46.229.243.200/32 -46.229.243.201/32 -46.229.243.203/32 -46.229.243.197/32 -46.229.243.199/32 -46.229.243.178/32 -45.83.129.161/32 45.14.247.113/32 +80.92.204.62/32 80.92.204.74/32 -80.92.204.57/32 -80.71.157.239/32 -80.92.204.73/32 -80.92.204.82/32 -80.92.204.42/32 -80.92.204.75/32 -45.12.138.188/32 -80.92.204.84/32 80.92.204.6/32 -80.71.157.218/32 -80.92.204.62/32 -80.92.204.85/32 -80.71.157.209/32 -208.87.241.235/32 -108.181.0.21/32 -208.87.242.23/32 -108.181.3.145/32 -108.181.1.241/32 -108.181.0.109/32 -208.87.242.111/32 -208.87.240.19/32 -208.87.240.255/32 -108.181.0.171/32 -208.87.242.199/32 -108.181.3.149/32 -208.87.241.221/32 -108.181.4.69/32 -94.232.247.205/32 -45.12.133.22/32 -45.12.133.12/32 -94.232.247.207/32 -45.12.133.18/32 -46.229.243.199/32 -46.229.243.197/32 -46.229.243.203/32 -46.229.243.201/32 -46.229.243.200/32 -46.229.243.178/32 -80.92.204.74/32 -80.71.157.218/32 -80.92.204.75/32 -80.92.204.82/32 -80.92.204.62/32 -80.71.157.239/32 -80.92.204.57/32 -45.12.138.188/32 -80.92.204.6/32 -45.83.129.161/32 -80.71.157.209/32 -80.92.204.85/32 -80.92.204.42/32 -80.92.204.73/32 -80.92.204.84/32 -45.14.247.113/32 -208.87.242.23/32 -108.181.0.21/32 -208.87.240.255/32 -208.87.241.221/32 -208.87.242.199/32 -108.181.0.171/32 -108.181.4.69/32 -108.181.0.109/32 -208.87.242.111/32 -108.181.1.241/32 -108.181.3.149/32 -108.181.3.145/32 -208.87.241.235/32 -208.87.240.19/32 -45.12.133.12/32 -45.12.133.22/32 -45.12.133.18/32 -94.232.247.207/32 -94.232.247.205/32 -46.229.243.203/32 -46.229.243.197/32 -46.229.243.201/32 -46.229.243.178/32 -46.229.243.199/32 -46.229.243.200/32 -80.92.204.6/32 -80.92.204.82/32 -80.92.204.62/32 80.92.204.84/32 80.92.204.85/32 -80.92.204.73/32 -80.92.204.42/32 -80.92.204.74/32 -45.83.129.161/32 -80.92.204.75/32 -80.71.157.218/32 -45.14.247.113/32 80.71.157.239/32 -80.71.157.209/32 45.12.138.188/32 -80.92.204.57/32 -108.181.3.149/32 -208.87.240.19/32 -108.181.0.109/32 -208.87.242.111/32 -108.181.0.21/32 -208.87.242.23/32 -108.181.1.241/32 -108.181.0.171/32 -208.87.242.199/32 -208.87.241.235/32 -208.87.241.221/32 -108.181.4.69/32 -108.181.3.145/32 +45.83.129.161/32 +80.92.204.73/32 +80.92.204.82/32 +80.92.204.75/32 208.87.240.255/32 +108.181.3.145/32 +208.87.241.235/32 +108.181.3.149/32 +208.87.241.221/32 +108.181.0.109/32 +108.181.1.241/32 +208.87.242.199/32 +208.87.242.111/32 +108.181.4.69/32 +108.181.0.171/32 +208.87.240.19/32 +208.87.242.23/32 94.232.247.205/32 -45.12.133.12/32 -94.232.247.207/32 45.12.133.22/32 +94.232.247.207/32 45.12.133.18/32 -46.229.243.200/32 -46.229.243.197/32 +45.12.133.12/32 46.229.243.201/32 -46.229.243.178/32 +46.229.243.200/32 46.229.243.203/32 46.229.243.199/32 +46.229.243.197/32 +46.229.243.178/32 \ No newline at end of file diff --git a/scripts/1clickvpn.ts b/scripts/1clickvpn.ts deleted file mode 100644 index 6ccda7f..0000000 --- a/scripts/1clickvpn.ts +++ /dev/null @@ -1,2 +0,0 @@ -const oneClickVpn = await (await fetch('https://1clickvpn.net/api/v1/servers/')).json() -Bun.write('ranges/1clickvpn.txt', oneClickVpn.flatMap(v => v.nodes.map(n => n.ip + '/32')).join('\n')) \ No newline at end of file diff --git a/scripts/1vpn.ts b/scripts/1vpn.ts deleted file mode 100644 index fad8775..0000000 --- a/scripts/1vpn.ts +++ /dev/null @@ -1,14 +0,0 @@ -const freeLocationsText = await(await fetch('https://raw.githubusercontent.com/1vpn/browser_extension/b58394076cc61beda2a6cc2292915180db58bc17/src/utils/freeLocations.js')).text() -const freeLocations = JSON.parse(freeLocationsText.replace('const freeLocations = ', '').replace('export default freeLocations', '').trim()) - -for (const l of Object.entries(freeLocations).filter(h => h[1].isPremium != true)) { - for (const h of l[1].hosts) { - const v4 = await (await fetch('https://ipinfo.io', { - proxy: `https://a2epfq5ugq0u:ptkx3fqg6v7n@${h.hostname}:${h.port}`, - headers: { - 'user-agent': 'curl/8.4.0' - } - })).json() - console.log(v4.ip + '/32') - } -} \ No newline at end of file diff --git a/scripts/expressvpn.ts b/scripts/expressvpn.ts deleted file mode 100644 index de3f4a7..0000000 --- a/scripts/expressvpn.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { sleep } from "bun"; - -const file = Bun.file('ranges/expressvpn.txt'); -const writer = file.writer(); - -function inetnumToCIDR(value: string): string[] { - let [start, end] = value.split(' - ').map(ip => - ip.split('.').reduce((acc, octet) => (acc << 8) | parseInt(octet), 0) >>> 0 - ) - - const cidrs: string[] = [] - - while (start <= end) { - const maxBits = Math.floor(Math.log2(start & -start)) // largest block start allows - const fitBits = Math.floor(Math.log2(end - start + 1)) // largest block size fits - const size = Math.min(maxBits, fitBits) - const ip = [(start >>> 24) & 255, (start >>> 16) & 255, (start >>> 8) & 255, start & 255].join('.') - cidrs.push(`${ip}/${32 - size}`) - start += 2 ** size - } - - return cidrs -} - -const orgs = await (await fetch('https://apps.db.ripe.net/db-web-ui/api/whois/search?abuse-contact=true&ignore404=true&managed-attributes=true&resource-holder=true&type-filter=ORGANISATION&flags=r&offset=0&limit=200&query-string=VPN%20Consumer')).json() -const orgId = orgs.objects.object.map(o => o.attributes.attribute.find(a => a.name === 'organisation').value) - -for (const o of [...orgId, 'ORG-ETL39-RIPE']) { - const orgReq = await fetch(`https://apps.db.ripe.net/db-web-ui/api/whois/search?abuse-contact=true&ignore404=true&managed-attributes=true&resource-holder=true&type-filter=INETNUM,INET6NUM&inverse-attribute=ORG&flags=r&offset=0&limit=200&query-string=${o}`) - if (orgReq.status == 404) { - console.log(`no inetnum/inet6num for ${o}`) - continue - } - const org = await orgReq.json() - const primaries = org.objects.object.map(o => o['primary-key'].attribute[0]) - for (const p of primaries) { - if (p.name == 'inetnum') { - console.log(inetnumToCIDR(p.value).join('\n')) - writer.write(inetnumToCIDR(p.value).join('\n') + '\n') - } else if (p.name == 'inet6num') { - console.log(p.value) - writer.write(p.value + '\n') - } - } - - writer.flush() - - if (orgReq.headers.get('X-Rate-Limit-Remaining') == '1') { - console.log('sleeping 5s') - await sleep(5000) - } -} - -let start = 0 - -while (true) { - const ips = await (await fetch(`https://apps.db.ripe.net/db-web-ui/api/rest/fulltextsearch/select?facet=true&format=xml&hl=true&q=(netname:(%22VPN%5C-Consumer%5C-Network%22))%20AND%20(object-type:inetnum)&start=${start}&wt=json`, { - headers: { - 'Accept': 'application/json, text/plain, */*' - } - })).json() - start = start + 10 - - if (!ips.result.docs) break; - - const primaries = ips.result.docs.map(o => o.doc.strs.find(s => s.str.name.startsWith('inetnum')).str) - for (const p of primaries) { - if (p.name == 'inetnum') { - console.log(inetnumToCIDR(p.value).join('\n')) - writer.write(inetnumToCIDR(p.value).join('\n') + '\n') - } else if (p.name == 'inet6num') { - console.log(p.value) - writer.write(p.value + '\n') - } - } -} - -writer.flush() -writer.end(); \ No newline at end of file diff --git a/scripts/planetvpn.ts b/scripts/planetvpn.ts deleted file mode 100644 index 99880f7..0000000 --- a/scripts/planetvpn.ts +++ /dev/null @@ -1,3312 +0,0 @@ -import CryptoJS from "crypto-js"; -import * as fs from 'node:fs'; - -const hardcodedServers = [ - { - "id": 3, - "type": "premium", - "key": "al_pool", - "title": "Albania", - "title_trans": "Albania", - "icon": "al.png", - "country_code": "al", - "is_nearest": true, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.53, - "is_torrent": true, - "has_ads": false - }, - { - "id": 38, - "type": "premium", - "key": "ar_pool", - "title": "Argentina", - "title_trans": "Argentina", - "icon": "ar.png", - "country_code": "ar", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1, - "is_torrent": false, - "has_ads": false - }, - { - "id": 151, - "type": "premium", - "key": "am_pool", - "title": "Armenia", - "title_trans": "Armenia", - "icon": "am.png", - "country_code": "am", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.14, - "is_torrent": false, - "has_ads": false - }, - { - "id": 13, - "type": "premium", - "key": "au_pool", - "title": "Australia", - "title_trans": "Australia", - "icon": "au.png", - "country_code": "au", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.79, - "is_torrent": true, - "has_ads": false - }, - { - "id": 65, - "type": "premium", - "key": "at_pool", - "title": "Austria", - "title_trans": "Austria", - "icon": "at.png", - "country_code": "at", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.43, - "is_torrent": true, - "has_ads": false - }, - { - "id": 150, - "type": "premium", - "key": "az_pool", - "title": "Azerbaijan", - "title_trans": "Azerbaijan", - "icon": "az.png", - "country_code": "az", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 3.17, - "is_torrent": false, - "has_ads": false - }, - { - "id": 149, - "type": "public", - "key": "az_free_pool", - "title": "Azerbaijan - Free", - "title_trans": "Azerbaijan", - "icon": "az.png", - "country_code": "az", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 34.1, - "is_torrent": false, - "has_ads": true - }, - { - "id": 62, - "type": "premium", - "key": "bh_pool", - "title": "Bahrain", - "title_trans": "Bahrain", - "icon": "bh.png", - "country_code": "bh", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.44, - "is_torrent": false, - "has_ads": false - }, - { - "id": 30, - "type": "premium", - "key": "by_pool", - "title": "Belarus", - "title_trans": "Belarus", - "icon": "by.png", - "country_code": "by", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 10.88, - "is_torrent": false, - "has_ads": false - }, - { - "id": 32, - "type": "premium", - "key": "be_pool", - "title": "Belgium", - "title_trans": "Belgium", - "icon": "be.png", - "country_code": "be", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 3.05, - "is_torrent": true, - "has_ads": false - }, - { - "id": 61, - "type": "premium", - "key": "ba_pool", - "title": "Bosnia and Herzegovina", - "title_trans": "Bosnia and Herzegovina", - "icon": "ba.png", - "country_code": "ba", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.59, - "is_torrent": false, - "has_ads": false - }, - { - "id": 40, - "type": "premium", - "key": "br_pool", - "title": "Brazil", - "title_trans": "Brazil", - "icon": "br.png", - "country_code": "br", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.9, - "is_torrent": false, - "has_ads": false - }, - { - "id": 145, - "type": "public", - "key": "br_free_pool", - "title": "Brazil - Free", - "title_trans": "Brazil", - "icon": "br.png", - "country_code": "br", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 14.46, - "is_torrent": false, - "has_ads": true - }, - { - "id": 4, - "type": "premium", - "key": "bg_pool", - "title": "Bulgaria", - "title_trans": "Bulgaria", - "icon": "bg.png", - "country_code": "bg", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.42, - "is_torrent": false, - "has_ads": false - }, - { - "id": 29, - "type": "premium", - "key": "ca_pool", - "title": "Canada", - "title_trans": "Canada", - "icon": "ca.png", - "country_code": "ca", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 13.72, - "is_torrent": false, - "has_ads": false - }, - { - "id": 43, - "type": "premium", - "key": "cl_pool", - "title": "Chile", - "title_trans": "Chile", - "icon": "cl.png", - "country_code": "cl", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.34, - "is_torrent": false, - "has_ads": false - }, - { - "id": 45, - "type": "premium", - "key": "co_pool", - "title": "Colombia", - "title_trans": "Colombia", - "icon": "co.png", - "country_code": "co", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.24, - "is_torrent": false, - "has_ads": false - }, - { - "id": 50, - "type": "premium", - "key": "hr_pool", - "title": "Croatia", - "title_trans": "Croatia", - "icon": "hr.png", - "country_code": "hr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.01, - "is_torrent": false, - "has_ads": false - }, - { - "id": 25, - "type": "premium", - "key": "cy_pool", - "title": "Cyprus", - "title_trans": "Cyprus", - "icon": "cy.png", - "country_code": "cy", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.32, - "is_torrent": false, - "has_ads": false - }, - { - "id": 11, - "type": "premium", - "key": "cz_pool", - "title": "Czech", - "title_trans": "Czechia", - "icon": "cz.png", - "country_code": "cz", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.97, - "is_torrent": false, - "has_ads": false - }, - { - "id": 34, - "type": "premium", - "key": "dk_pool", - "title": "Denmark", - "title_trans": "Denmark", - "icon": "dk.png", - "country_code": "dk", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.02, - "is_torrent": true, - "has_ads": false - }, - { - "id": 127, - "type": "premium", - "key": "ec_pool", - "title": "Ecuador", - "title_trans": "Ecuador", - "icon": "ec.png", - "country_code": "ec", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.08, - "is_torrent": false, - "has_ads": false - }, - { - "id": 2, - "type": "premium", - "key": "eg_pool", - "title": "Egypt", - "title_trans": "Egypt", - "icon": "eg.png", - "country_code": "eg", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.59, - "is_torrent": false, - "has_ads": false - }, - { - "id": 16, - "type": "premium", - "key": "ee_pool", - "title": "Estonia", - "title_trans": "Estonia", - "icon": "ee.png", - "country_code": "ee", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.99, - "is_torrent": true, - "has_ads": false - }, - { - "id": 35, - "type": "premium", - "key": "fi_pool", - "title": "Finland", - "title_trans": "Finland", - "icon": "fi.png", - "country_code": "fi", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.67, - "is_torrent": true, - "has_ads": false - }, - { - "id": 9, - "type": "premium", - "key": "fr_pool", - "title": "France", - "title_trans": "France", - "icon": "fr.png", - "country_code": "fr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.59, - "is_torrent": true, - "has_ads": false - }, - { - "id": 56, - "type": "public", - "key": "fr_free_pool", - "title": "France - Free", - "title_trans": "France", - "icon": "fr.png", - "country_code": "fr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0, - "is_torrent": false, - "has_ads": false - }, - { - "id": 51, - "type": "premium", - "key": "ge_pool", - "title": "Georgia", - "title_trans": "Georgia", - "icon": "ge.png", - "country_code": "ge", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 7.62, - "is_torrent": false, - "has_ads": false - }, - { - "id": 20, - "type": "premium", - "key": "de_pool", - "title": "Germany", - "title_trans": "Germany", - "icon": "de.png", - "country_code": "de", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.11, - "is_torrent": false, - "has_ads": false - }, - { - "id": 54, - "type": "public", - "key": "de_free_pool", - "title": "Germany - Free", - "title_trans": "Germany", - "icon": "de.png", - "country_code": "de", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 14.16, - "is_torrent": false, - "has_ads": false - }, - { - "id": 27, - "type": "premium", - "key": "gr_pool", - "title": "Greece", - "title_trans": "Greece", - "icon": "gr.png", - "country_code": "gr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.39, - "is_torrent": true, - "has_ads": false - }, - { - "id": 128, - "type": "premium", - "key": "gt_pool", - "title": "Guatemala", - "title_trans": "Guatemala", - "icon": "gt.png", - "country_code": "gt", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.01, - "is_torrent": false, - "has_ads": false - }, - { - "id": 14, - "type": "premium", - "key": "cn_pool", - "title": "Hong Kong", - "title_trans": "Hong Kong", - "icon": "hk.png", - "country_code": "hk", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.45, - "is_torrent": false, - "has_ads": false - }, - { - "id": 66, - "type": "premium", - "key": "hu_pool", - "title": "Hungary", - "title_trans": "Hungary", - "icon": "hu.png", - "country_code": "hu", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 12.47, - "is_torrent": false, - "has_ads": false - }, - { - "id": 90, - "type": "premium", - "key": "in_pool", - "title": "India", - "title_trans": "India", - "icon": "in.png", - "country_code": "in", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.15, - "is_torrent": true, - "has_ads": false - }, - { - "id": 26, - "type": "premium", - "key": "id_pool", - "title": "Indonesia", - "title_trans": "Indonesia", - "icon": "id.png", - "country_code": "id", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.74, - "is_torrent": true, - "has_ads": false - }, - { - "id": 60, - "type": "premium", - "key": "ie_pool", - "title": "Ireland", - "title_trans": "Ireland", - "icon": "ie.png", - "country_code": "ie", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.21, - "is_torrent": true, - "has_ads": false - }, - { - "id": 22, - "type": "premium", - "key": "il_pool", - "title": "Israel", - "title_trans": "Israel", - "icon": "il.png", - "country_code": "il", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.34, - "is_torrent": true, - "has_ads": false - }, - { - "id": 148, - "type": "public", - "key": "il_free_pool", - "title": "Israel - Free", - "title_trans": "Israel", - "icon": "il.png", - "country_code": "il", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 12.27, - "is_torrent": false, - "has_ads": true - }, - { - "id": 24, - "type": "premium", - "key": "it_pool", - "title": "Italy", - "title_trans": "Italy", - "icon": "it.png", - "country_code": "it", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 3.44, - "is_torrent": false, - "has_ads": false - }, - { - "id": 147, - "type": "public", - "key": "it_free_pool", - "title": "Italy - Free", - "title_trans": "Italy", - "icon": "it.png", - "country_code": "it", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 8.53, - "is_torrent": false, - "has_ads": true - }, - { - "id": 12, - "type": "premium", - "key": "jp_pool", - "title": "Japan", - "title_trans": "Japan", - "icon": "jp.png", - "country_code": "jp", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.62, - "is_torrent": false, - "has_ads": false - }, - { - "id": 67, - "type": "premium", - "key": "kz_pool", - "title": "Kazakhstan", - "title_trans": "Kazakhstan", - "icon": "kz.png", - "country_code": "kz", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.01, - "is_torrent": false, - "has_ads": false - }, - { - "id": 6, - "type": "premium", - "key": "lv_pool", - "title": "Latvia", - "title_trans": "Latvia", - "icon": "lv.png", - "country_code": "lv", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.08, - "is_torrent": false, - "has_ads": false - }, - { - "id": 15, - "type": "premium", - "key": "lt_pool", - "title": "Lithuania", - "title_trans": "Lithuania", - "icon": "lt.png", - "country_code": "lt", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.37, - "is_torrent": true, - "has_ads": false - }, - { - "id": 69, - "type": "premium", - "key": "my_pool", - "title": "Malaysia", - "title_trans": "Malaysia", - "icon": "my.png", - "country_code": "my", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0, - "is_torrent": false, - "has_ads": false - }, - { - "id": 42, - "type": "premium", - "key": "mx_pool", - "title": "Mexico", - "title_trans": "Mexico", - "icon": "mx.png", - "country_code": "mx", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.71, - "is_torrent": false, - "has_ads": false - }, - { - "id": 144, - "type": "public", - "key": "mx_free_pool", - "title": "Mexico - Free", - "title_trans": "Mexico", - "icon": "mx.png", - "country_code": "mx", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 11.55, - "is_torrent": false, - "has_ads": true - }, - { - "id": 19, - "type": "premium", - "key": "nl_pool", - "title": "Netherlands", - "title_trans": "Netherlands", - "icon": "nl.png", - "country_code": "nl", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 11.93, - "is_torrent": true, - "has_ads": false - }, - { - "id": 68, - "type": "public", - "key": "nl_free_pool", - "title": "Netherlands - Free", - "title_trans": "Netherlands", - "icon": "nl.png", - "country_code": "nl", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 24.91, - "is_torrent": false, - "has_ads": false - }, - { - "id": 33, - "type": "premium", - "key": "no_pool", - "title": "Norway", - "title_trans": "Norway", - "icon": "no.png", - "country_code": "no", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.14, - "is_torrent": true, - "has_ads": false - }, - { - "id": 94, - "type": "premium", - "key": "pk_pool", - "title": "Pakistan", - "title_trans": "Pakistan", - "icon": "pk.png", - "country_code": "pk", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.2, - "is_torrent": false, - "has_ads": false - }, - { - "id": 124, - "type": "premium", - "key": "pa_pool", - "title": "Panama", - "title_trans": "Panama", - "icon": "pa.png", - "country_code": "pa", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.47, - "is_torrent": false, - "has_ads": false - }, - { - "id": 125, - "type": "premium", - "key": "py_pool", - "title": "Paraguay", - "title_trans": "Paraguay", - "icon": "py.png", - "country_code": "py", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.29, - "is_torrent": false, - "has_ads": false - }, - { - "id": 44, - "type": "premium", - "key": "pe_pool", - "title": "Peru", - "title_trans": "Peru", - "icon": "pe.png", - "country_code": "pe", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.11, - "is_torrent": false, - "has_ads": false - }, - { - "id": 64, - "type": "premium", - "key": "ph_pool", - "title": "Philippines", - "title_trans": "Philippines", - "icon": "ph.png", - "country_code": "ph", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.24, - "is_torrent": false, - "has_ads": false - }, - { - "id": 17, - "type": "premium", - "key": "pl_pool", - "title": "Poland", - "title_trans": "Poland", - "icon": "pl.png", - "country_code": "pl", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": false, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.07, - "is_torrent": false, - "has_ads": false - }, - { - "id": 39, - "type": "premium", - "key": "pt_pool", - "title": "Portugal", - "title_trans": "Portugal", - "icon": "pt.png", - "country_code": "pt", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.01, - "is_torrent": true, - "has_ads": false - }, - { - "id": 46, - "type": "premium", - "key": "kr_pool", - "title": "Republic of Korea", - "title_trans": "Korea", - "icon": "kr.png", - "country_code": "kr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.5, - "is_torrent": false, - "has_ads": false - }, - { - "id": 31, - "type": "premium", - "key": "md_pool", - "title": "Republic of Moldova", - "title_trans": "Moldova", - "icon": "md.png", - "country_code": "md", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.2, - "is_torrent": false, - "has_ads": false - }, - { - "id": 49, - "type": "premium", - "key": "ro_pool", - "title": "Romania", - "title_trans": "Romania", - "icon": "ro.png", - "country_code": "ro", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.19, - "is_torrent": false, - "has_ads": false - }, - { - "id": 8, - "type": "premium", - "key": "ru_pool", - "title": "Russia", - "title_trans": "Russia", - "icon": "ru.png", - "country_code": "ru", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 10.88, - "is_torrent": false, - "has_ads": false - }, - { - "id": 52, - "type": "premium", - "key": "sa_pool", - "title": "Saudi Arabia", - "title_trans": "Saudi Arabia", - "icon": "sa.png", - "country_code": "sa", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.85, - "is_torrent": false, - "has_ads": false - }, - { - "id": 48, - "type": "premium", - "key": "rs_pool", - "title": "Serbia", - "title_trans": "Serbia", - "icon": "rs.png", - "country_code": "rs", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.3, - "is_torrent": true, - "has_ads": false - }, - { - "id": 21, - "type": "premium", - "key": "sg_pool", - "title": "Singapore", - "title_trans": "Singapore", - "icon": "sg.png", - "country_code": "sg", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.68, - "is_torrent": false, - "has_ads": false - }, - { - "id": 47, - "type": "premium", - "key": "sk_pool", - "title": "Slovakia", - "title_trans": "Slovakia", - "icon": "sk.png", - "country_code": "sk", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.08, - "is_torrent": true, - "has_ads": false - }, - { - "id": 28, - "type": "premium", - "key": "za_pool", - "title": "South Africa", - "title_trans": "Republic of South Africa", - "icon": "za.png", - "country_code": "za", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.53, - "is_torrent": false, - "has_ads": false - }, - { - "id": 23, - "type": "premium", - "key": "es_pool", - "title": "Spain", - "title_trans": "Spain", - "icon": "es.png", - "country_code": "es", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.16, - "is_torrent": false, - "has_ads": false - }, - { - "id": 18, - "type": "premium", - "key": "se_pool", - "title": "Sweden", - "title_trans": "Sweden", - "icon": "se.png", - "country_code": "se", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.42, - "is_torrent": false, - "has_ads": false - }, - { - "id": 36, - "type": "premium", - "key": "ch_pool", - "title": "Switzerland", - "title_trans": "Switzerland", - "icon": "ch.png", - "country_code": "ch", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.16, - "is_torrent": false, - "has_ads": false - }, - { - "id": 95, - "type": "premium", - "key": "tw_pool", - "title": "Taiwan", - "title_trans": "Taiwan (Taipei)", - "icon": "tw.png", - "country_code": "tw", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.05, - "is_torrent": false, - "has_ads": false - }, - { - "id": 63, - "type": "premium", - "key": "th_pool", - "title": "Thailand", - "title_trans": "Thailand", - "icon": "th.png", - "country_code": "th", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0, - "is_torrent": false, - "has_ads": false - }, - { - "id": 1, - "type": "premium", - "key": "tr_pool", - "title": "Turkey", - "title_trans": "Turkey", - "icon": "tr.png", - "country_code": "tr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 3.02, - "is_torrent": true, - "has_ads": false - }, - { - "id": 146, - "type": "public", - "key": "tr_free_pool", - "title": "Turkey - Free", - "title_trans": "Turkey", - "icon": "tr.png", - "country_code": "tr", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": true, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 28.61, - "is_torrent": false, - "has_ads": true - }, - { - "id": 5, - "type": "premium", - "key": "ua_pool", - "title": "Ukraine", - "title_trans": "Ukraine", - "icon": "ua.png", - "country_code": "ua", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.43, - "is_torrent": true, - "has_ads": false - }, - { - "id": 37, - "type": "premium", - "key": "ae_pool", - "title": "United Arab Emirates", - "title_trans": "United Arab Emirates", - "icon": "ae.png", - "country_code": "ae", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.5, - "is_torrent": false, - "has_ads": false - }, - { - "id": 10, - "type": "premium", - "key": "gb_pool", - "title": "United Kingdom", - "title_trans": "United Kingdom", - "icon": "gb.png", - "country_code": "gb", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.59, - "is_torrent": false, - "has_ads": false - }, - { - "id": 59, - "type": "public", - "key": "gb_free_pool", - "title": "United Kingdom - Free", - "title_trans": "United Kingdom", - "icon": "gb.png", - "country_code": "gb", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 6.9, - "is_torrent": false, - "has_ads": false - }, - { - "id": 7, - "type": "premium", - "key": "us_pool", - "title": "United States ", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.17, - "is_torrent": false, - "has_ads": false - }, - { - "id": 74, - "type": "premium", - "key": "ash_us_pool", - "title": "United States - Ashburn", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 4.83, - "is_torrent": false, - "has_ads": false - }, - { - "id": 73, - "type": "premium", - "key": "atl_us_pool", - "title": "United States - Atlanta", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.03, - "is_torrent": false, - "has_ads": false - }, - { - "id": 82, - "type": "premium", - "key": "chr_us_pool", - "title": "United States - Charlotte", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.34, - "is_torrent": false, - "has_ads": false - }, - { - "id": 71, - "type": "premium", - "key": "chi_us_pool", - "title": "United States - Chicago", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.27, - "is_torrent": false, - "has_ads": false - }, - { - "id": 83, - "type": "premium", - "key": "dls_us_pool", - "title": "United States - Dallas", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.52, - "is_torrent": false, - "has_ads": false - }, - { - "id": 78, - "type": "premium", - "key": "den_us_pool", - "title": "United States - Denver", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 5.51, - "is_torrent": false, - "has_ads": false - }, - { - "id": 98, - "type": "premium", - "key": "la_us_pool", - "title": "United States - Los Angeles", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 3.43, - "is_torrent": false, - "has_ads": false - }, - { - "id": 77, - "type": "premium", - "key": "nyk_us_pool", - "title": "United States - New York", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.01, - "is_torrent": false, - "has_ads": false - }, - { - "id": 81, - "type": "premium", - "key": "snf_us_pool", - "title": "United States - San Francisco", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.48, - "is_torrent": false, - "has_ads": false - }, - { - "id": 76, - "type": "premium", - "key": "snj_us_pool", - "title": "United States - San Jose", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 1.52, - "is_torrent": false, - "has_ads": false - }, - { - "id": 72, - "type": "premium", - "key": "sea_us_pool", - "title": "United States - Seattle", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.35, - "is_torrent": false, - "has_ads": false - }, - { - "id": 85, - "type": "premium", - "key": "lou_us_pool", - "title": "United States - St. Louis", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 2.19, - "is_torrent": false, - "has_ads": false - }, - { - "id": 84, - "type": "premium", - "key": "was_us_pool", - "title": "United States - Washington", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.17, - "is_torrent": false, - "has_ads": false - }, - { - "id": 53, - "type": "public", - "key": "us_ny_free_pool", - "title": "USA New York - Free", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 13.13, - "is_torrent": false, - "has_ads": false - }, - { - "id": 57, - "type": "public", - "key": "us_free_pool", - "title": "USA Portland - Free", - "title_trans": "USA", - "icon": "us.png", - "country_code": "us", - "is_nearest": true, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 12.67, - "is_torrent": false, - "has_ads": false - }, - { - "id": 152, - "type": "premium", - "key": "uz_pool", - "title": "Uzbekistan", - "title_trans": "Uzbekistan", - "icon": "uz.png", - "country_code": "uz", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": true, - "is_udp_xor_supt": true, - "is_proxy_node_switch_avbl": false, - "is_udp_node_switch_avbl": false, - "is_tcp_node_switch_avbl": false, - "is_ike2_node_switch_avbl": false, - "is_l2tp_node_switch_avbl": false, - "is_pptp_node_switch_avbl": false, - "is_xray_node_switch_avbl": false, - "is_wg_node_switch_avbl": false, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.4, - "is_torrent": false, - "has_ads": false - }, - { - "id": 70, - "type": "premium", - "key": "vn_pool", - "title": "Vietnam", - "title_trans": "Vietnam", - "icon": "vn.png", - "country_code": "vn", - "is_nearest": false, - "is_proxy_supt": true, - "is_udp_supt": true, - "is_tcp_supt": true, - "is_ike2_supt": true, - "is_l2tp_supt": true, - "is_pptp_supt": true, - "is_ss_supt": true, - "is_xray_supt": false, - "is_tcp_xor_supt": false, - "is_udp_xor_supt": false, - "is_proxy_node_switch_avbl": true, - "is_udp_node_switch_avbl": true, - "is_tcp_node_switch_avbl": true, - "is_ike2_node_switch_avbl": true, - "is_l2tp_node_switch_avbl": true, - "is_pptp_node_switch_avbl": true, - "is_xray_node_switch_avbl": true, - "is_wg_node_switch_avbl": true, - "is_ss_node_switch_avbl": false, - "is_tcp_xor_node_switch_avbl": false, - "is_udp_xor_node_switch_avbl": false, - "load": 0.02, - "is_torrent": false, - "has_ads": false - } -] - -type EncryptedPayload = { - iv: string; - value: string; -}; - - function buildKeyBase64(): string { - const parts = [ - "C3g4V+nKy7r+iXc/p", - "G5Gab+bMpwa+Dh940", - "P82d+ulCj+zx72A=", - ]; - - return parts.map((s) => s.replace(/\+/g, "")).join(""); -} - -export function decryptExtensiveJson(input: EncryptedPayload): T { - const key = CryptoJS.enc.Base64.parse(buildKeyBase64()); - const iv = CryptoJS.enc.Base64.parse(input.iv); - - const decrypted = CryptoJS.AES.decrypt(input.value, key, { - iv, - }).toString(CryptoJS.enc.Utf8); - - if (!decrypted) { - throw new Error("Decryption failed"); - } - - return JSON.parse(decrypted) as T; -} - -for (const s of hardcodedServers.filter(s => s.type == 'public')) { - const json = await (await fetch(`https://5fvfofc9f.online/v2/network/data/extensive?nodes_pool_id=${s.id}&protocol=proxy&token=`, { - headers: { - 'cookie': 'session=xJfMEo2ziVO1yONsVuFho2gWoOSicKfxfSeKBzTO', - 'uuid-app': '417d6c71-0a98-4215-8c97-bba837b15161' - } - })).json() - - if (!json.payload) continue - const result = decryptExtensiveJson(JSON.parse(Buffer.from(json.payload, 'base64').toString('utf8'))); - fs.appendFileSync('ranges/planet.txt', result.data.ip_address + '/32\n') -} \ No newline at end of file diff --git a/scripts/turbovpn.ts b/scripts/turbovpn.ts deleted file mode 100644 index 87d35eb..0000000 --- a/scripts/turbovpn.ts +++ /dev/null @@ -1,15 +0,0 @@ -const json = await (await fetch('https://turbovpn.com/api/mms/serverlist/v1/webext/servers_list', { - method: 'POST', - headers: { - 'X-App-Type': '302', - 'X-App-Ver-Code': '202507111355', - 'content-type': 'application/json' - }, - body: JSON.stringify({ - "country": "NL", - "user_ip": "1.1.1.1", - "os_lang": "en-us", - "login_id": "0" - }) -})).json() -Bun.write('ranges/turbovpn.txt', json.servers.map(s => s.host_ip + '/32').join('\n')) \ No newline at end of file diff --git a/scripts/urbanvpn.ts b/scripts/urbanvpn.ts deleted file mode 100644 index 4916e80..0000000 --- a/scripts/urbanvpn.ts +++ /dev/null @@ -1,22 +0,0 @@ -const post = await (await fetch('https://api-pro.falais.com/rest/v1/security/tokens/accs', { - method: 'POST', - headers: { - 'authorization': 'Bearer FihZXBoQi83OomWPQgj9VqEFPzRsLz6p', - 'content-type': 'application/json' - }, - body: JSON.stringify({ - "type": "accs", - "clientApp": { - "name": "URBAN_VPN_BROWSER_EXTENSION" - } - }) -})).json() - -const servers = await (await fetch('https://stats.falais.com/api/rest/v2/entrypoints/countries', { - headers: { - 'authorization': `Bearer ${post.value}`, - 'x-client-app': 'URBAN_VPN_BROWSER_EXTENSION' - } -})).json() - -Bun.write('ranges/urbanvpn.txt', servers.countries.elements.flatMap(c => c.servers.elements.map(s => s.address.primary.ip + '/32')).join('\n')) \ No newline at end of file diff --git a/scripts/vpnly.ts b/scripts/vpnly.ts deleted file mode 100644 index c966cdc..0000000 --- a/scripts/vpnly.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as fs from 'node:fs' - -async function getARecords(hostname: string): Promise { - const url = `https://cloudflare-dns.com/dns-query?name=${encodeURIComponent( - hostname - )}&type=A`; - - const res = await fetch(url, { - headers: { Accept: "application/dns-json" }, - }); - - if (!res.ok) { - throw new Error(`dns query failed: ${res.status} ${res.statusText}`); - } - - const body = (await res.json()) as { - Status: number; - Answer?: Array<{ name: string; type: number; data: string }>; - }; - - if (body.Status !== 0 || !body.Answer) { - return []; - } - - return body.Answer.filter((a) => a.type === 1).map((a) => a.data); -} - -const hostnames = ['de-hub.freeruproxy.ink', 'us-hub.freeruproxy.ink', 'fr-hub.freeruproxy.ink', 'nl-hub.freeruproxy.ink'] -for (const h of hostnames) { - const records = await getARecords(h) - fs.appendFileSync('ranges/vpnly.txt', records.map(r => r + '/32').join('\n') + '\n') -} \ No newline at end of file diff --git a/src/router/websocket.ts b/src/router/websocket.ts index 2390ccd..6d60484 100644 --- a/src/router/websocket.ts +++ b/src/router/websocket.ts @@ -11,21 +11,40 @@ import { error } from '@/utils/html' import redis from '@/utils/redis'; import { parseSlop } from '@/utils/slop'; import { checkIpRanges } from '@/utils/ranges'; -import { getRateLimitSubjects } from '@/utils/rate-limit'; +import { getRateLimitState, getRateLimitSubjects } from '@/utils/rate-limit'; const app = new Elysia() const videoIds: Record = {} -const MB_LIMIT = 250 const saveKey = (videoId: string) => `save:${videoId}` -const checkMbLimit = async (subjects: string[], mb?: number): Promise => { - const keys = subjects.map(subject => `save-mb:${Bun.hash(subject).toString()}`) - const currentValues = await Promise.all(keys.map(key => redis.get(key))) - const currents = currentValues.map(value => parseInt(value || '0')) +const DEFAULT_STORAGE_LIMIT_MESSAGE = 'Daily storage limit reached. Is this an urgent archive? Please email me: admin@preservetube.com' +const NEW_VISITOR_STORAGE_LIMIT_MESSAGE = 'You are a new visitor, so your storage limit is lower for the first few hours. Please come back later.
Is this an urgent archive? Please email me: admin@preservetube.com' - if (!mb) return currents.some(current => current >= MB_LIMIT) - if (currents.some(current => current + mb > MB_LIMIT)) return true +const checkMbLimit = async (subjects: string[], mb?: number): Promise<{ isLimited: boolean, isNewVisitorLimited: boolean }> => { + const keys = subjects.map(subject => `save-mb:${Bun.hash(subject).toString()}`) + const [currentValues, states] = await Promise.all([ + Promise.all(keys.map(key => redis.get(key))), + Promise.all(subjects.map(subject => getRateLimitState(subject))) + ]) + const currents = currentValues.map(value => parseInt(value || '0')) + const limitedIndexes = currents + .map((current, index) => { + const limit = states[index]!.limit + if (mb === undefined) return current >= limit ? index : -1 + return current + mb > limit ? index : -1 + }) + .filter(index => index !== -1) + + if (limitedIndexes.length > 0) { + return { + isLimited: true, + isNewVisitorLimited: limitedIndexes.some(index => states[index]!.isNewVisitor) + } + } + if (mb === undefined) { + return { isLimited: false, isNewVisitorLimited: false } + } const pipeline = redis.pipeline() for (const key of keys) { @@ -33,7 +52,7 @@ const checkMbLimit = async (subjects: string[], mb?: number): Promise = pipeline.expire(key, 24 * 60 * 60) } await pipeline.exec() - return false + return { isLimited: false, isNewVisitorLimited: false } } const sendError = (ws: any, message: string, close: boolean = true) => { @@ -125,9 +144,9 @@ app.ws('/save', { getRateLimitKey(ws.data.headers['cf-connecting-ip'] || '0.0.0.0'), ws.data.query.rlid ) - const isLimited = await checkMbLimit(subjects) - if (isLimited) { - return sendError(ws, 'You have been ratelimited.
Is this an urgent archive? Please email me: admin@preservetube.com'); + const limitStatus = await checkMbLimit(subjects) + if (limitStatus.isLimited) { + return sendError(ws, limitStatus.isNewVisitorLimited ? NEW_VISITOR_STORAGE_LIMIT_MESSAGE : DEFAULT_STORAGE_LIMIT_MESSAGE); } console.log(`saving (${subjects.map(subject => Bun.hash(subject).toString()).join(',')}) - ${ws.data.path} - ${JSON.stringify(ws.data.query)}`) @@ -180,12 +199,12 @@ app.ws('/save', { getRateLimitKey(ws.data.headers['cf-connecting-ip'] || '0.0.0.0'), ws.data.query.rlid ) - const isMbLimited = await checkMbLimit(subjects, mbsUsed) - if (isMbLimited) { + const limitStatus = await checkMbLimit(subjects, mbsUsed) + if (limitStatus.isLimited) { const file = fs.readdirSync('./videos/').find(f => f.includes(`${videoId}.`)) if (file) fs.unlinkSync('./videos/' + file) await cleanup(ws, videoId); - return sendError(ws, 'Daily storage limit reached. Is this an urgent archive? Please email me: admin@preservetube.com'); + return sendError(ws, limitStatus.isNewVisitorLimited ? NEW_VISITOR_STORAGE_LIMIT_MESSAGE : DEFAULT_STORAGE_LIMIT_MESSAGE); } const uploadSuccess = await handleUpload(ws, videoId); @@ -263,9 +282,9 @@ app.ws('/savechannel', { getRateLimitKey(ws.data.headers['cf-connecting-ip'] || '0.0.0.0'), ws.data.query.rlid ) - const isLimited = await checkMbLimit(subjects) - if (isLimited) { - sendError(ws, 'You have been ratelimited.
Is this an urgent archive? Please email me: admin@preservetube.com', false); + const limitStatus = await checkMbLimit(subjects) + if (limitStatus.isLimited) { + sendError(ws, limitStatus.isNewVisitorLimited ? NEW_VISITOR_STORAGE_LIMIT_MESSAGE : DEFAULT_STORAGE_LIMIT_MESSAGE, false); break; } @@ -287,11 +306,11 @@ app.ws('/savechannel', { const downloadResult = await downloadVideo(ws, video.video_id); if (!downloadResult.fail) { const mbsUsed = Math.ceil(downloadResult.size / (1024 * 1024)) - const isMbLimited = await checkMbLimit(subjects, mbsUsed) - if (isMbLimited) { + const limitStatus = await checkMbLimit(subjects, mbsUsed) + if (limitStatus.isLimited) { const file = fs.readdirSync('./videos/').find(f => f.includes(`${video.video_id}.`)) if (file) fs.unlinkSync('./videos/' + file) - sendError(ws, 'Daily storage limit reached. Is this an urgent archive? Please email me: admin@preservetube.com', false); + sendError(ws, limitStatus.isNewVisitorLimited ? NEW_VISITOR_STORAGE_LIMIT_MESSAGE : DEFAULT_STORAGE_LIMIT_MESSAGE, false); break; } await handleUpload(ws, video.video_id, true); diff --git a/src/utils/ranges.ts b/src/utils/ranges.ts index 155e1eb..a0a38d3 100644 --- a/src/utils/ranges.ts +++ b/src/utils/ranges.ts @@ -30,6 +30,7 @@ const asnBanList: number[] = [ 206092, 137409, 262287, + 29066, // tor exits 60729, diff --git a/src/utils/rate-limit.ts b/src/utils/rate-limit.ts index 8972827..c9c3543 100644 --- a/src/utils/rate-limit.ts +++ b/src/utils/rate-limit.ts @@ -1,5 +1,10 @@ +import redis from '@/utils/redis' + const RATE_LIMIT_COOKIE = 'pt_rlid' const RATE_LIMIT_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 +const DEFAULT_MB_LIMIT = 250 +const NEW_IP_MB_LIMIT = 150 +const NEW_IP_TRUST_WINDOW_MS = 6 * 60 * 60 * 1000 // 6h const parseCookieHeader = (cookieHeader?: string): Record => { if (!cookieHeader) return {} @@ -25,6 +30,31 @@ export const buildRateLimitCookie = (value: string): string => { return `${RATE_LIMIT_COOKIE}=${encodeURIComponent(value)}; Max-Age=${RATE_LIMIT_COOKIE_MAX_AGE}; Path=/; HttpOnly; SameSite=Lax; Secure` } +const isIpRateLimitSubject = (subject: string): boolean => subject.startsWith('ip:') + +const getSubjectTrustKey = (subject: string): string => `rate-limit:first-seen:${Bun.hash(subject).toString()}` + +export const getRateLimitState = async (subject: string): Promise<{ limit: number, isNewVisitor: boolean }> => { + if (!isIpRateLimitSubject(subject)) { + return { limit: DEFAULT_MB_LIMIT, isNewVisitor: false } + } + + const now = Date.now() + const trustKey = getSubjectTrustKey(subject) + await redis.set(trustKey, now.toString(), 'NX') + + const firstSeen = Number(await redis.get(trustKey) || now) + if (Number.isNaN(firstSeen)) { + return { limit: NEW_IP_MB_LIMIT, isNewVisitor: true } + } + + const isNewVisitor = now - firstSeen < NEW_IP_TRUST_WINDOW_MS + return { + limit: isNewVisitor ? NEW_IP_MB_LIMIT : DEFAULT_MB_LIMIT, + isNewVisitor + } +} + export const getRateLimitSubjects = (ip: string, visitorId?: string): string[] => { const subjects = new Set()