diff --git a/.gitignore b/.gitignore index f071777c4..2dc577c99 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ build/ DerivedData/ Frameworks/ +.DS_Store ## Source / dependencies submodules/ diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md index 006fc97e4..839daa74a 100644 --- a/ACKNOWLEDGEMENTS.md +++ b/ACKNOWLEDGEMENTS.md @@ -886,4 +886,29 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## V2Ray Core +Copyright (c) V2Ray Authors, V2Fly Community +https://github.com/v2fly/v2ray-core + +V2Ray is a platform for building proxies to bypass network restrictions. It is developed and maintained by the V2Fly community. + +V2Ray Core is licensed under the MIT License: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/AUTHORS b/AUTHORS index 4157bfe98..9f940cc12 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,8 +8,8 @@ Fedir Nepyyvoda Juraj Hilje - +Tamim Hossain # Organizations -IVPN Limited \ No newline at end of file +IVPN Limited diff --git a/IVPNClient.xcodeproj/project.pbxproj b/IVPNClient.xcodeproj/project.pbxproj index eab1b7b6f..63f8a42d4 100644 --- a/IVPNClient.xcodeproj/project.pbxproj +++ b/IVPNClient.xcodeproj/project.pbxproj @@ -7,6 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + 4E46608B2E606EC4000AB900 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E4660892E606EC4000AB900 /* libresolv.tbd */; }; + 4E46608C2E606EC4000AB900 /* libresolv.9.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E46608A2E606EC4000AB900 /* libresolv.9.tbd */; }; + 4ED68D7A2E6F70FE009A6D96 /* V2rayConfigBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ED68D792E6F70F8009A6D96 /* V2rayConfigBuilder.swift */; }; 820079F42407D96D00EC2062 /* ConnectionInfoBoxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820079F32407D96D00EC2062 /* ConnectionInfoBoxView.swift */; }; 8201A5022354A32F008C83DB /* ErrorResultSessionNew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8201A5012354A32F008C83DB /* ErrorResultSessionNew.swift */; }; 8201A5042356536B008C83DB /* UpgradePlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8201A5032356536B008C83DB /* UpgradePlanViewController.swift */; }; @@ -46,7 +49,6 @@ 821CA2D7287C5AB20067F70D /* PortViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821CA2D6287C5AB20067F70D /* PortViewController.swift */; }; 821CA2DB288039670067F70D /* PortTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821CA2DA288039670067F70D /* PortTableViewCell.swift */; }; 821CA2DF288143470067F70D /* PortRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821CA2DE288143470067F70D /* PortRange.swift */; }; - 821E35582A95DCD200AEE5C7 /* V2RayCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821E35572A95DCD200AEE5C7 /* V2RayCore.swift */; }; 821E355A2A95F77700AEE5C7 /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = 821E35592A95F77700AEE5C7 /* config.json */; }; 821F1C7E21FF544200107311 /* VPNServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821F1C7D21FF544200107311 /* VPNServerViewModel.swift */; }; 821F604A240D21E3008072D7 /* ControlPanelViewController+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821F6049240D21E3008072D7 /* ControlPanelViewController+Ext.swift */; }; @@ -74,7 +76,6 @@ 822EE96C215CE0E300BE77F6 /* UserDefaults+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825A43FC215CCFE70076131F /* UserDefaults+Ext.swift */; }; 8232FBF42240DE19006B81D2 /* ErrorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8232FBF32240DE19006B81D2 /* ErrorResult.swift */; }; 8232FBF62240E40F006B81D2 /* Error+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8232FBF52240E40F006B81D2 /* Error+Ext.swift */; }; - 8234E0D72AB23E5C0015C9A2 /* V2RayControl.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8234E0D62AB23E5C0015C9A2 /* V2RayControl.xcframework */; }; 82351FCA241FA16600E6E0FD /* InfoAlertViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82351FC9241FA16600E6E0FD /* InfoAlertViewModelTests.swift */; }; 82351FCC241FBC8E00E6E0FD /* VPNStatusViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82351FCB241FBC8E00E6E0FD /* VPNStatusViewModelTests.swift */; }; 82351FCE2420CE6800E6E0FD /* MapMarkerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82351FCD2420CE6800E6E0FD /* MapMarkerView.swift */; }; @@ -458,6 +459,9 @@ /* Begin PBXFileReference section */ 042B1F5A4F38CCA3591AD441 /* Pods_openvpn_tunnel_provider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_openvpn_tunnel_provider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E4660892E606EC4000AB900 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; + 4E46608A2E606EC4000AB900 /* libresolv.9.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.9.tbd; path = usr/lib/libresolv.9.tbd; sourceTree = SDKROOT; }; + 4ED68D792E6F70F8009A6D96 /* V2rayConfigBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = V2rayConfigBuilder.swift; sourceTree = ""; }; 58126B967EB9B059871FD7AB /* Pods_wireguard_tunnel_provider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_wireguard_tunnel_provider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 751AB84B8432BC3E6BEDD483 /* Pods_today_extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_today_extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 820079F32407D96D00EC2062 /* ConnectionInfoBoxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionInfoBoxView.swift; sourceTree = ""; }; @@ -493,7 +497,6 @@ 821CA2D6287C5AB20067F70D /* PortViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortViewController.swift; sourceTree = ""; }; 821CA2DA288039670067F70D /* PortTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortTableViewCell.swift; sourceTree = ""; }; 821CA2DE288143470067F70D /* PortRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PortRange.swift; sourceTree = ""; }; - 821E35572A95DCD200AEE5C7 /* V2RayCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = V2RayCore.swift; sourceTree = ""; }; 821E35592A95F77700AEE5C7 /* config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = config.json; sourceTree = ""; }; 821F1C7D21FF544200107311 /* VPNServerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNServerViewModel.swift; sourceTree = ""; }; 821F6049240D21E3008072D7 /* ControlPanelViewController+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ControlPanelViewController+Ext.swift"; sourceTree = ""; }; @@ -513,7 +516,6 @@ 822EBCA72C91AB5900E708F6 /* PrivacyInfo-wireguard-tunnel-provider.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "PrivacyInfo-wireguard-tunnel-provider.xcprivacy"; sourceTree = ""; }; 8232FBF32240DE19006B81D2 /* ErrorResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorResult.swift; sourceTree = ""; }; 8232FBF52240E40F006B81D2 /* Error+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Error+Ext.swift"; sourceTree = ""; }; - 8234E0D62AB23E5C0015C9A2 /* V2RayControl.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = V2RayControl.xcframework; path = Frameworks/V2RayControl.xcframework; sourceTree = ""; }; 82351FC9241FA16600E6E0FD /* InfoAlertViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoAlertViewModelTests.swift; sourceTree = ""; }; 82351FCB241FBC8E00E6E0FD /* VPNStatusViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNStatusViewModelTests.swift; sourceTree = ""; }; 82351FCD2420CE6800E6E0FD /* MapMarkerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapMarkerView.swift; sourceTree = ""; }; @@ -788,6 +790,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4E46608B2E606EC4000AB900 /* libresolv.tbd in Frameworks */, + 4E46608C2E606EC4000AB900 /* libresolv.9.tbd in Frameworks */, 82B6052F21708575004B40E6 /* NetworkExtension.framework in Frameworks */, 82BF79622A2F8DDC00061972 /* liboqs.a in Frameworks */, 824B86E126D42A5700D0101A /* WireGuardKit in Frameworks */, @@ -827,7 +831,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8234E0D72AB23E5C0015C9A2 /* V2RayControl.xcframework in Frameworks */, 82D598C621A6A5C7000FABDE /* SystemConfiguration.framework in Frameworks */, 9CB2CE311DAF9227007A4D2D /* CoreData.framework in Frameworks */, 9C6942251DD0CBF800F9A801 /* NetworkExtension.framework in Frameworks */, @@ -850,7 +853,8 @@ 584496306C3B9383149618CE /* Frameworks */ = { isa = PBXGroup; children = ( - 8234E0D62AB23E5C0015C9A2 /* V2RayControl.xcframework */, + 4E4660892E606EC4000AB900 /* libresolv.tbd */, + 4E46608A2E606EC4000AB900 /* libresolv.9.tbd */, 8294BC8D22A126C900328932 /* TunnelKit.framework */, 8294BC8B22A10F4100328932 /* TunnelKit.framework */, 824F56072233FE6F00BCDD5C /* libwg-go.a */, @@ -942,9 +946,9 @@ 821BB5C32A7CF198005D9D64 /* V2Ray */ = { isa = PBXGroup; children = ( + 4ED68D792E6F70F8009A6D96 /* V2rayConfigBuilder.swift */, 8247C05F2A7CF54300A7C02F /* V2RayConfig.swift */, 82365E7E2AB86020006434C3 /* V2RaySettings.swift */, - 821E35572A95DCD200AEE5C7 /* V2RayCore.swift */, 821E35592A95F77700AEE5C7 /* config.json */, ); path = V2Ray; @@ -2379,12 +2383,12 @@ 828772FB221C28E000D5E330 /* FlagImageView.swift in Sources */, 8228C8D22B1DE906005977D3 /* PurchaseManager.swift in Sources */, 82E7880C22B0DA0D00A98D76 /* NETunnelProviderProtocol+Ext.swift in Sources */, + 4ED68D7A2E6F70FE009A6D96 /* V2rayConfigBuilder.swift in Sources */, 82968A35298A98C300077E0A /* KeyChain.swift in Sources */, 82F638C2217DA89000410318 /* AddressType.swift in Sources */, 82E0E9072A90CB110008BD3F /* AdvancedViewController.swift in Sources */, 822920A02480FA3600476FC1 /* ServersSort.swift in Sources */, 826E61482428F8E60064F195 /* AccountViewController.swift in Sources */, - 821E35582A95DCD200AEE5C7 /* V2RayCore.swift in Sources */, 820079F42407D96D00EC2062 /* ConnectionInfoBoxView.swift in Sources */, 821429BB22FC36100056B8FF /* ApiRequestDI.swift in Sources */, 82AB0877291A6B9C0084625A /* CustomPort+CoreDataClass.swift in Sources */, @@ -3475,10 +3479,10 @@ /* Begin XCRemoteSwiftPackageReference section */ 824B86DD26D42A4600D0101A /* XCRemoteSwiftPackageReference "wireguard-apple" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://git.zx2c4.com/wireguard-apple"; + repositoryURL = "https://github.com/ivpn/wireguard-apple"; requirement = { - kind = revision; - revision = ccc7472fd7d1c7c19584e6a30c45a56b8ba57790; + branch = master; + kind = branch; }; }; 82968A30298A970500077E0A /* XCRemoteSwiftPackageReference "Tunnelkit" */ = { diff --git a/IVPNClient/Config/Config.swift b/IVPNClient/Config/Config.swift index df789cff6..f29f9feed 100644 --- a/IVPNClient/Config/Config.swift +++ b/IVPNClient/Config/Config.swift @@ -85,6 +85,12 @@ struct Config { static let v2rayHost = "127.0.0.1" static let v2rayPort = 16661 + // HTTP/VMess/TCP (According to desktop-app) + static let v2rayTcpPort = 80 + + // HTTPS/VMess/QUIC (According to desktop-app) + static let v2rayQuicPort = 443 + // MARK: ENV variables static var Environment: String { diff --git a/IVPNClient/Config/servers.json b/IVPNClient/Config/servers.json index 5d0a07f3f..461034369 100644 --- a/IVPNClient/Config/servers.json +++ b/IVPNClient/Config/servers.json @@ -1 +1 @@ -{"wireguard":[{"gateway":"at.wg.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.wg.ivpn.net","dns_name":"at1.gw.ivpn.net","host":"185.244.212.69","public_key":"83LUBnP97SFpnS0y1MpEAFcg8MIiQJgW1FRv/8Mc40g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":57.14,"multihop_port":25601,"v2ray":"146.70.146.226","isp":"M247"}]},{"gateway":"au-nsw.wg.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.wg.ivpn.net","dns_name":"au-nsw1.gw.ivpn.net","host":"46.102.153.246","public_key":"KmSrG48t5xw9CJCPlYLBG3JnmiY0CnUgyRM5TUEwZhM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":29.53,"multihop_port":26601,"v2ray":"217.138.205.90","isp":"M247"},{"hostname":"au-nsw2.wg.ivpn.net","dns_name":"au-nsw2.gw.ivpn.net","host":"146.70.78.75","public_key":"q+wbp7GjiTszp5G16rNpGCqxkL0qSY3CH4pcgD6UsVQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":35.37,"multihop_port":27901,"v2ray":"146.70.210.26","isp":"M247"}]},{"gateway":"be.wg.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.wg.ivpn.net","dns_name":"be1.gw.ivpn.net","host":"194.187.251.13","public_key":"awriP5lpdxEMWKuG+A1DOg+vb1M5jd3WhynIMB61BhU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":68.29,"multihop_port":25701,"v2ray":"37.120.143.130","isp":"M247"}]},{"gateway":"bg.wg.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.wg.ivpn.net","dns_name":"bg1.gw.ivpn.net","host":"82.102.23.21","public_key":"WDSsdJE6wvATIWfzQwayPtE/0DaXBQgW/hPm7sQSJmU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.76,"multihop_port":25901,"v2ray":"146.70.53.82","isp":"M247"}]},{"gateway":"br.wg.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.wg.ivpn.net","dns_name":"br1.gw.ivpn.net","host":"45.162.230.53","public_key":"eN1f15S3YzRyYCALiPGRQcjkQO9xntcdqPhJJ6TOymc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.47,"multihop_port":26701,"v2ray":"45.162.230.186","isp":"Qnax"}]},{"gateway":"ca-bc.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Vancouver","latitude":49.231,"longitude":-122.8412,"isp":"Tech Futures","hosts":[{"hostname":"ca-bc1.wg.ivpn.net","dns_name":"ca-bc1.gw.ivpn.net","host":"104.193.135.231","public_key":"lXawKqHosFOoc9kqAZwun9Yk3VrPN7vmG/JuQm4kvx0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.53,"multihop_port":20550,"v2ray":"104.193.135.233","isp":"Tech Futures"}]},{"gateway":"ca-on.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca-on1.wg.ivpn.net","dns_name":"ca-on1.gw.ivpn.net","host":"184.75.215.5","public_key":"eXlmRV8RsCQZjWwiSYxwtEr/xwanM/2HER2YqIGTdHk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":21.59,"multihop_port":20580,"v2ray":"184.75.215.7","isp":"Amanah"},{"hostname":"ca-on2.wg.ivpn.net","dns_name":"ca-on2.gw.ivpn.net","host":"162.219.176.21","public_key":"nadUhrHR5E0fCB5wg4efZHNn2NRE+gnuTDjKT21y2V0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.27,"multihop_port":20590,"v2ray":"162.219.176.23","isp":"Amanah"}]},{"gateway":"ca-qc.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.499,"longitude":-73.57,"isp":"M247","hosts":[{"hostname":"ca-qc1.wg.ivpn.net","dns_name":"ca-qc1.gw.ivpn.net","host":"37.120.130.58","public_key":"rg+GGDmjM4Vxo1hURvKmgm9yonb6qcoKbPCP/DNDBnI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.53,"multihop_port":20960,"v2ray":"37.120.130.61","isp":"M247"},{"hostname":"ca-qc2.wg.ivpn.net","dns_name":"ca-qc2.gw.ivpn.net","host":"87.101.92.29","public_key":"XSKU6fBCDwlb+mGek1O/fUDd/ozO58ZLph/0H7mn+zE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.78,"multihop_port":27001,"v2ray":"89.47.234.130","isp":"M247"}]},{"gateway":"ch.wg.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"M247","hosts":[{"hostname":"ch1.wg.ivpn.net","dns_name":"ch1.gw.ivpn.net","host":"185.212.170.141","public_key":"dU7gLfcupYd37LW0q6cxC6PHMba+eUFAUOoU/ryXZkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.04,"multihop_port":23601,"v2ray":"37.120.213.138","isp":"M247"},{"hostname":"ch2.wg.ivpn.net","dns_name":"ch2.gw.ivpn.net","host":"81.17.24.165","public_key":"KRKeAFMJY6OH9RABaeC4feQG/JgbacZVg/w6VUjBSVQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.47,"multihop_port":20880,"v2ray":"81.17.24.167","isp":"Privatelayer"},{"hostname":"ch3.wg.ivpn.net","dns_name":"ch3.gw.ivpn.net","host":"141.255.166.198","public_key":"JBpgBKtqIneRuEga7mbP2PAk/e4HPRaC11H0A0+R3lA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.88,"multihop_port":22901,"v2ray":"179.43.167.66","isp":"Privatelayer"}]},{"gateway":"cz.wg.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.wg.ivpn.net","dns_name":"cz1.gw.ivpn.net","host":"185.180.14.41","public_key":"gVbEq2cGRzwCSGPqT2oRSYYN+P6IK3uvvRffErASDSk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":29.18,"multihop_port":25201,"v2ray":"195.181.160.184","isp":"Datapacket"}]},{"gateway":"de.wg.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Leaseweb","hosts":[{"hostname":"de2.wg.ivpn.net","dns_name":"de2.gw.ivpn.net","host":"37.58.60.151","public_key":"QhY3OtBf4FFafKtLO33e6k8JnAl8e6ktFcRUyLjCDVY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":23.36,"multihop_port":22001,"v2ray":"178.162.222.166","isp":"Leaseweb"},{"hostname":"de3.wg.ivpn.net","dns_name":"de3.gw.ivpn.net","host":"146.70.160.170","public_key":"CugQQtD8YJKRwS5IukNWkMcyqOzlOxfGRPhGeQRAb2Y=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.44,"multihop_port":21050,"v2ray":"146.70.160.166","isp":"M247"},{"hostname":"de4.wg.ivpn.net","dns_name":"de4.gw.ivpn.net","host":"185.102.219.26","public_key":"mS3/WpXjnMAMmXjSpd4nFzx9HSE3ubv2WyjpyH2REgs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.64,"multihop_port":20920,"v2ray":"185.102.219.56","isp":"Datapacket"}]},{"gateway":"dk.wg.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.wg.ivpn.net","dns_name":"dk1.gw.ivpn.net","host":"185.245.84.229","public_key":"jTsV5gOD7lT4egDj9rhKwO2OO2X7bKs2EQPcZEnUWDE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.44,"multihop_port":25501,"v2ray":"193.29.107.226","isp":"M247"}]},{"gateway":"es.wg.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.wg.ivpn.net","dns_name":"es1.gw.ivpn.net","host":"84.17.62.98","public_key":"w7umiArTtlJ4Pk6Ii9WX5VXK5vw/Qu+Z37/icKlIYWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.36,"multihop_port":21501,"v2ray":"185.93.3.196","isp":"Datapacket"}]},{"gateway":"fi.wg.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.wg.ivpn.net","dns_name":"fi1.gw.ivpn.net","host":"194.34.134.63","public_key":"mIxEzfjZ2wV6jJVj30w38ECd2LSH4bw/HLMnM2ICHiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":50.29,"multihop_port":26001,"v2ray":"185.103.110.231","isp":"Creanova"}]},{"gateway":"fr.wg.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.wg.ivpn.net","dns_name":"fr1.gw.ivpn.net","host":"185.246.211.185","public_key":"g7BuMzj3r/noLiLR4qhQMcvU6GSIY8RGEnaYtdYsFX4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.4,"multihop_port":23401,"v2ray":"185.246.211.184","isp":"Datapacket"}]},{"gateway":"gb-man.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.451,"longitude":-2.319,"isp":"M247","hosts":[{"hostname":"gb-man1.wg.ivpn.net","dns_name":"gb-man1.gw.ivpn.net","host":"185.195.202.23","public_key":"+hf4DYilNEIjTdSOuCNcWdqVyaRoxGzXw7wvNl7f7Rg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.88,"multihop_port":26901,"v2ray":"185.195.202.25","isp":"M247"}]},{"gateway":"gb.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"Datapacket","hosts":[{"hostname":"gb1.wg.ivpn.net","dns_name":"gb1.gw.ivpn.net","host":"185.59.221.140","public_key":"yKK5x+D17Jr3Q12T/UBaDjNVmNdZBsqpvTqH6YfsGHg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.95,"multihop_port":20801,"v2ray":"185.59.221.159","isp":"Datapacket"},{"hostname":"gb2.wg.ivpn.net","dns_name":"gb2.gw.ivpn.net","host":"185.59.221.225","public_key":"x0BTRaxsdxAd58ZyU2YMX4bmuj+Eg+8/urT2F3Vs1n8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.5,"multihop_port":24201,"v2ray":"185.59.221.226","isp":"Datapacket"},{"hostname":"gb3.wg.ivpn.net","dns_name":"gb3.gw.ivpn.net","host":"81.92.202.114","public_key":"7+jos+Eg+hMEOQE4Std6OJ+WVnCcmbqS1/EbPwn9w3s=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.61,"multihop_port":20980,"v2ray":"81.92.202.117","isp":"M247"}]},{"gateway":"gr.wg.ivpn.net","country_code":"GR","country":"Greece","city":"Athens","latitude":37.871,"longitude":23.8707,"isp":"Datapacket","hosts":[{"hostname":"gr1.wg.ivpn.net","dns_name":"gr1.gw.ivpn.net","host":"169.150.252.113","public_key":"79rPSFIEQ4KWX9UN+FSMVfI0mPPVY5elS16O/DA6uDw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.97,"multihop_port":20540,"v2ray":"169.150.252.115","isp":"Datapacket"}]},{"gateway":"hk.wg.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.wg.ivpn.net","dns_name":"hk2.gw.ivpn.net","host":"64.120.120.239","public_key":"kyolyq4cJydI3vQB2ESTIUAy2Fq0bpOf+Qe7GIq6XEA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":24.68,"multihop_port":27501,"v2ray":"64.120.120.237","isp":"Leaseweb"},{"hostname":"hk3.wg.ivpn.net","dns_name":"hk3.gw.ivpn.net","host":"118.107.244.206","public_key":"qq1simsFNm2FpZM0J8u8Aa0rkk5HEasvLksPyLv+0Sk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.56,"multihop_port":20460,"v2ray":"118.107.244.207","isp":"TheGigabit"}]},{"gateway":"hr.wg.ivpn.net","country_code":"HR","country":"Croatia","city":"Zagreb","latitude":45.811,"longitude":15.977,"isp":"Datapacket","hosts":[{"hostname":"hr1.wg.ivpn.net","dns_name":"hr1.gw.ivpn.net","host":"169.150.242.40","public_key":"yGDzFo6v9BilHj5jb7oaiwaw8hnACFgT1rrHkdnRsXI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.37,"multihop_port":20860,"v2ray":"169.150.242.42","isp":"Datapacket"}]},{"gateway":"hu.wg.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.wg.ivpn.net","dns_name":"hu1.gw.ivpn.net","host":"185.189.114.189","public_key":"G30fNdXrnlqtqqOLF23QXWzFdLIKDxLW60HoYPvqml8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.65,"multihop_port":25401,"v2ray":"37.120.144.178","isp":"M247"}]},{"gateway":"ie.wg.ivpn.net","country_code":"IE","country":"Ireland","city":"Dublin","latitude":53.337,"longitude":-6.259,"isp":"Datapacket","hosts":[{"hostname":"ie1.wg.ivpn.net","dns_name":"ie1.gw.ivpn.net","host":"87.249.137.138","public_key":"jTRkgALSK2hJZmzfQsyKVsYQEepIqgSDnJImzNyLfQ4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.28,"multihop_port":20850,"v2ray":"87.249.137.140","isp":"Datapacket"}]},{"gateway":"il.wg.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il1.wg.ivpn.net","dns_name":"il1.gw.ivpn.net","host":"185.191.204.133","public_key":"HR9gAjpxXU3YVt6kehBw5n8yVYVE0iIgJdc4HTqOzEE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.2,"multihop_port":27301,"v2ray":"185.191.204.135","isp":"HQServ"}]},{"gateway":"is.wg.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.wg.ivpn.net","dns_name":"is1.gw.ivpn.net","host":"82.221.107.185","public_key":"nZZT6TlQ2dXlVe3P3B5ozEScHYMWH4JY4y3to8w5dz0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":23501,"v2ray":"82.221.107.183","isp":"Advania"}]},{"gateway":"it.wg.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"Datapacket","hosts":[{"hostname":"it2.wg.ivpn.net","dns_name":"it2.gw.ivpn.net","host":"84.17.59.149","public_key":"IYi+s9DZusPErv0k2Ls/jgdubmeCrUcEJ1cNgmxPx0k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.09,"multihop_port":21100,"v2ray":"84.17.59.146","isp":"Datapacket"}]},{"gateway":"jp.wg.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.62,"longitude":139.74,"isp":"TheGigabit","hosts":[{"hostname":"jp2.wg.ivpn.net","dns_name":"jp2.gw.ivpn.net","host":"185.135.77.81","public_key":"YuhEd9+a90/+uucZC+qzsyMHkfe/GiwG1dq7g2HegXQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":35.49,"multihop_port":20830,"v2ray":"185.135.77.100","isp":"TheGigabit"}]},{"gateway":"lu.wg.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6113,"longitude":6.1294,"isp":"EstNOC","hosts":[{"hostname":"lu2.wg.ivpn.net","dns_name":"lu2.gw.ivpn.net","host":"185.221.132.181","public_key":"m5M76ffpSSUOJba3GK6WTooI8vNFYTnyw/PJuBbmGXA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":32.76,"multihop_port":27212,"v2ray":"185.221.132.183","isp":"EstNOC"}]},{"gateway":"mx.wg.ivpn.net","country_code":"MX","country":"Mexico","city":"Querétaro","latitude":20.574,"longitude":-100.2965,"isp":"Datapacket","hosts":[{"hostname":"mx1.wg.ivpn.net","dns_name":"mx1.gw.ivpn.net","host":"121.127.43.196","public_key":"ReKHoFVVGfR4Tgzl2GPPioAtQm3HmecKTU0HK67NcXU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.81,"multihop_port":20570,"v2ray":"121.127.43.198","isp":"Datapacket"}]},{"gateway":"my.wg.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.wg.ivpn.net","dns_name":"my1.gw.ivpn.net","host":"61.4.97.154","public_key":"M9SsMCpUw7ad6YbqQr8r2saBK2zAf3tBj82DzsQjgkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.43,"multihop_port":20470,"v2ray":"61.4.97.155","isp":"TheGigabit"}]},{"gateway":"nl.wg.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.376,"longitude":4.898,"isp":"Datapacket","hosts":[{"hostname":"nl2.wg.ivpn.net","dns_name":"nl2.gw.ivpn.net","host":"185.102.218.104","public_key":"AsMT2FqpkZbjzWeDch6GwufF5odl259W/hIkGytVfWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.52,"multihop_port":20910,"v2ray":"185.102.218.99","isp":"Datapacket"},{"hostname":"nl3.wg.ivpn.net","dns_name":"nl3.gw.ivpn.net","host":"95.211.95.9","public_key":"XDU6Syq1DY82IMatsHV0x/TAtbLiRwh/SdFCXlEn40c=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":24.46,"multihop_port":23101,"v2ray":"95.211.172.72","isp":"Leaseweb"},{"hostname":"nl4.wg.ivpn.net","dns_name":"nl4.gw.ivpn.net","host":"95.211.95.19","public_key":"cVB66gPq5cZ9dfXY+e2pbsCyih5o1zk04l5c5VCsV1g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.52,"multihop_port":23201,"v2ray":"95.211.172.99","isp":"Leaseweb"},{"hostname":"nl5.wg.ivpn.net","dns_name":"nl5.gw.ivpn.net","host":"95.211.243.162","public_key":"NCagAawwRixI6Iw/NWiGD8lbjDNCl0aTICZKJtO/1HA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.33,"multihop_port":23901,"v2ray":"95.211.187.225","isp":"Leaseweb"},{"hostname":"nl6.wg.ivpn.net","dns_name":"nl6.gw.ivpn.net","host":"95.211.243.182","public_key":"hMWpqb3FEATHIbImPVWB/5z2nWIXghwpnJjevPY+1H0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.65,"multihop_port":24101,"v2ray":"95.211.187.231","isp":"Leaseweb"},{"hostname":"nl7.wg.ivpn.net","dns_name":"nl7.gw.ivpn.net","host":"95.211.172.105","public_key":"hQNYqtfOOAEz0IGshLx/TI9hUrfR9gIIkjVm4VsCbBM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.41,"multihop_port":22501,"v2ray":"95.211.172.107","isp":"Leaseweb"},{"hostname":"nl8.wg.ivpn.net","dns_name":"nl8.gw.ivpn.net","host":"95.211.198.167","public_key":"/nY1/OhVhdHtbnU/s31zYUuPBH0pizv4DemW5KDOUkg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.01,"multihop_port":22801,"v2ray":"95.211.198.169","isp":"Leaseweb"}]},{"gateway":"no.wg.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.wg.ivpn.net","dns_name":"no1.gw.ivpn.net","host":"91.189.177.156","public_key":"xFO6ksbO3Gr05rRgAW0O5Veoi4bpTgz2G9RvtBzK7Cg=","local_ip":"172.16.0.1/12","ipv6":{},"load":22.33,"multihop_port":25301,"v2ray":"217.170.197.28","isp":"Servetheworld"}]},{"gateway":"pe.wg.ivpn.net","country_code":"PE","country":"Peru","city":"Lima","latitude":-12.089,"longitude":-76.9759,"isp":"Datapacket","hosts":[{"hostname":"pe1.wg.ivpn.net","dns_name":"pe1.gw.ivpn.net","host":"79.127.252.68","public_key":"LGvYaCFJxdDePXV+r5ENsmugIlVufCCSSm2A6EUXXGw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.63,"multihop_port":20490,"v2ray":"79.127.252.70","isp":"Datapacket"}]},{"gateway":"pl.wg.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.wg.ivpn.net","dns_name":"pl1.gw.ivpn.net","host":"185.246.208.109","public_key":"1JDmF79rWj5C+kHp71AbdHne/yGaizWCd2bLfSFvYjo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.35,"multihop_port":25101,"v2ray":"185.246.208.87","isp":"Datapacket"}]},{"gateway":"pt.wg.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.wg.ivpn.net","dns_name":"pt1.gw.ivpn.net","host":"94.46.175.113","public_key":"nMnA82YVrvEK80GVoY/0Z9McWeqjcLzuMYSL+86j5nU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.45,"multihop_port":27101,"v2ray":"94.46.175.130","isp":"Hostwebis"}]},{"gateway":"ro.wg.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.wg.ivpn.net","dns_name":"ro1.gw.ivpn.net","host":"37.120.206.53","public_key":"F2uQ57hysZTlw8WYELnyCw9Lga80wNYoYwkrrxyXKmw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":48.18,"multihop_port":22301,"v2ray":"185.120.147.58","isp":"M247"}]},{"gateway":"rs.wg.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.wg.ivpn.net","dns_name":"rs1.gw.ivpn.net","host":"141.98.103.253","public_key":"xLN/lpQThQ3z3tvYf7VqdAsRL/nton1Vhv2kCZlQtWE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":19.88,"multihop_port":26801,"v2ray":"146.70.111.114","isp":"M247"}]},{"gateway":"se.wg.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"GleSyS","hosts":[{"hostname":"se1.wg.ivpn.net","dns_name":"se1.gw.ivpn.net","host":"80.67.10.141","public_key":"u8VHnYEpoEjJWDAF9NAUkU6s810RnkMuhEfFD9U0cGo=","local_ip":"172.16.0.1/12","ipv6":{},"load":14.36,"multihop_port":24001,"v2ray":"80.67.10.139","isp":"GleSyS"},{"hostname":"se2.wg.ivpn.net","dns_name":"se2.gw.ivpn.net","host":"37.120.153.226","public_key":"2n0nFE1g/+vQr2AOQPm9Igyiy0zh9uTTultvOOSkMRo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.14,"multihop_port":20970,"v2ray":"37.120.153.227","isp":"M247"}]},{"gateway":"sg.wg.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.wg.ivpn.net","dns_name":"sg1.gw.ivpn.net","host":"185.128.24.189","public_key":"pWk0u1Xq8FHC+xpkN+C6yEKOTEanorR5zMCSfHlLzFw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.45,"multihop_port":26101,"v2ray":"146.70.192.138","isp":"M247"},{"hostname":"sg2.wg.ivpn.net","dns_name":"sg2.gw.ivpn.net","host":"37.120.151.122","public_key":"hSg0At4uwuIhmTy5UT4fRbi5AN6JO2ZWTuIvqd4nHCE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.25,"multihop_port":20950,"v2ray":"37.120.151.125","isp":"M247"}]},{"gateway":"sk.wg.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"Datapacket","hosts":[{"hostname":"sk2.wg.ivpn.net","dns_name":"sk2.gw.ivpn.net","host":"156.146.40.205","public_key":"xxEl8CIjNLpig6fp7z4USHZLK35Nu5HENFNwTdeAbzU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.5,"multihop_port":20400,"v2ray":"156.146.40.208","isp":"Datapacket"}]},{"gateway":"tw.wg.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.wg.ivpn.net","dns_name":"tw1.gw.ivpn.net","host":"185.189.160.123","public_key":"fMTCCbbKqPp60fkqnaQvJ9mX2r6zBlt7xhUp8sGfJQY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.28,"multihop_port":20820,"v2ray":"185.189.160.21","isp":"TheGigabit"}]},{"gateway":"ua.wg.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kyiv","latitude":50.4754,"longitude":30.5461,"isp":"Server.ua","hosts":[{"hostname":"ua2.wg.ivpn.net","dns_name":"ua2.gw.ivpn.net","host":"91.232.28.116","public_key":"WmMJBUyI0tdByPhMyvKWAbQMRE1I3ilPi/fIeG3m+UE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.85,"multihop_port":20450,"v2ray":"91.232.28.119","isp":"Server.ua"}]},{"gateway":"us-az.wg.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.5722,"longitude":-112.0891,"isp":"M247","hosts":[{"hostname":"us-az1.wg.ivpn.net","dns_name":"us-az1.gw.ivpn.net","host":"193.37.254.133","public_key":"Ts4MGazxpxL9rrYbERjgxa+kCEX85ou9gHoaJvDsRiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.4,"multihop_port":26401,"v2ray":"193.37.254.50","isp":"M247"}]},{"gateway":"us-ca.wg.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Tzulo","hosts":[{"hostname":"us-ca3.wg.ivpn.net","dns_name":"us-ca3.gw.ivpn.net","host":"198.54.129.100","public_key":"J5+Bx84LxNPdWEhewOvBV/fGWiDluIBlAcr1QlJZil8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.81,"multihop_port":21301,"v2ray":"198.54.129.212","isp":"Tzulo"},{"hostname":"us-ca5.wg.ivpn.net","dns_name":"us-ca5.gw.ivpn.net","host":"185.180.13.41","public_key":"FGl78s9Ct6xNamQ2/CtAyXwGePrrU0kiZxfM27pm8XA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.09,"multihop_port":20940,"v2ray":"185.180.13.38","isp":"Datapacket"}]},{"gateway":"us-co.wg.ivpn.net","country_code":"US","country":"United States","city":"Denver, CO","latitude":39.749,"longitude":-104.997,"isp":"Datapacket","hosts":[{"hostname":"us-co1.wg.ivpn.net","dns_name":"us-co1.gw.ivpn.net","host":"121.127.44.29","public_key":"eW3Xf/azDAah8xaM0z5rMxJZkWM6YlWuZsEbMwy9j2Y=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.63,"multihop_port":20560,"v2ray":"121.127.44.31","isp":"Datapacket"}]},{"gateway":"us-fl.wg.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.7839,"longitude":-80.2102,"isp":"Quadranet","hosts":[{"hostname":"us-fl1.wg.ivpn.net","dns_name":"us-fl1.gw.ivpn.net","host":"173.44.49.93","public_key":"Rkzo9WgxJBiKyEbkZvqGWtOVh9Gk9Vd7wL49SHXdHig=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.22,"multihop_port":24601,"v2ray":"96.47.236.98","isp":"Quadranet"}]},{"gateway":"us-ga.wg.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.7627,"longitude":-84.4225,"isp":"Quadranet","hosts":[{"hostname":"us-ga1.wg.ivpn.net","dns_name":"us-ga1.gw.ivpn.net","host":"104.129.24.149","public_key":"EJFl28aYpZKfmJqb1jxxTEnGx6kaH2USVrigpHKKXhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.63,"multihop_port":24501,"v2ray":"69.174.102.18","isp":"Quadranet"},{"hostname":"us-ga2.wg.ivpn.net","dns_name":"us-ga2.gw.ivpn.net","host":"107.150.22.77","public_key":"hr2uQOEGCvGeDkoCQJ2dCI8dM8Iu5aKhb1PIvJ9q72E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.25,"multihop_port":24810,"v2ray":"69.174.102.58","isp":"Quadranet"},{"hostname":"us-ga3.wg.ivpn.net","dns_name":"us-ga3.gw.ivpn.net","host":"185.93.0.212","public_key":"jD8h+pL5/d6fmYcTzl0lR8AWzQVN5XkwRFSmM/3NcDM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.35,"multihop_port":20900,"v2ray":"185.93.0.217","isp":"Datapacket"}]},{"gateway":"us-il.wg.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.8373,"longitude":-87.6862,"isp":"Quadranet","hosts":[{"hostname":"us-il1.wg.ivpn.net","dns_name":"us-il1.gw.ivpn.net","host":"72.11.137.158","public_key":"Uy5a8JOqneAUY1dC5s9jubLnotbyIfBsLP2nZuzRbHs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.44,"multihop_port":21401,"v2ray":"72.11.137.154","isp":"Quadranet"},{"hostname":"us-il2.wg.ivpn.net","dns_name":"us-il2.gw.ivpn.net","host":"72.11.137.148","public_key":"ANhVUMAQgStPVNRHW8mg0ZtN1YI1QHyXfNCO8+USNQQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.08,"multihop_port":24901,"v2ray":"104.129.31.226","isp":"Quadranet"},{"hostname":"us-il3.wg.ivpn.net","dns_name":"us-il3.gw.ivpn.net","host":"89.187.181.116","public_key":"hku9gjamhoii8OvxZgx+TdUDIkOAQYFu39qbav2AyUQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.31,"multihop_port":20930,"v2ray":"89.187.181.121","isp":"Datapacket"}]},{"gateway":"us-ma.wg.ivpn.net","country_code":"US","country":"United States","city":"Boston, MA","latitude":42.376,"longitude":-71.078,"isp":"Datapacket","hosts":[{"hostname":"us-ma1.wg.ivpn.net","dns_name":"us-ma1.gw.ivpn.net","host":"109.61.86.50","public_key":"JtIx5H4hqFUhwyrnlVlvthQgwNKJTKnpmT7Ld1XcPhM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":23.07,"multihop_port":20870,"v2ray":"109.61.86.52","isp":"Datapacket"}]},{"gateway":"us-nj.wg.ivpn.net","country_code":"US","country":"United States","city":"Secaucus, NJ","latitude":40.737764,"longitude":-74.151747,"isp":"Quadranet","hosts":[{"hostname":"us-nj3.wg.ivpn.net","dns_name":"us-nj3.gw.ivpn.net","host":"23.226.128.21","public_key":"AX7C1LO0ECUcHRYgX4/tIDYdR8npvfB/+pf4AfI3OHU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.3,"multihop_port":21610,"v2ray":"23.226.129.114","isp":"Quadranet"},{"hostname":"us-nj4.wg.ivpn.net","dns_name":"us-nj4.gw.ivpn.net","host":"194.36.111.54","public_key":"1Te4AfL1yKo2k4jzPALnRPfKE3YSzXKo4XIRHPz5FxI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.57,"multihop_port":27401,"v2ray":"37.120.202.42","isp":"M247"}]},{"gateway":"us-nv.wg.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.wg.ivpn.net","dns_name":"us-nv1.gw.ivpn.net","host":"185.242.5.37","public_key":"PRpvAZyoNWNm/KHlqafjtYoZtn1PkIPylUE4WbuYmgM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":57.8,"multihop_port":26501,"v2ray":"185.242.5.146","isp":"M247"}]},{"gateway":"us-ny.wg.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny2.wg.ivpn.net","dns_name":"us-ny2.gw.ivpn.net","host":"212.103.48.195","public_key":"c7DwY2uT+6ulWAJ5u8qJNWHroA0qyJLcdNzf/f2kkhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.16,"multihop_port":21801,"v2ray":"212.103.48.199","isp":"M247"},{"hostname":"us-ny3.wg.ivpn.net","dns_name":"us-ny3.gw.ivpn.net","host":"89.187.178.145","public_key":"m5/Ssw9SN3WuE+yD/fAsH5G8iuI8TcDGEiZZnPgiMCc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.8,"multihop_port":27601,"v2ray":"89.187.178.150","isp":"Datapacket"},{"hostname":"us-ny4.wg.ivpn.net","dns_name":"us-ny4.gw.ivpn.net","host":"91.132.137.170","public_key":"6/tjvgb7HFl7UuvBSegolxa1zKr3iSlDrlCexCmhAGE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.92,"multihop_port":20990,"v2ray":"91.132.137.173","isp":"M247"}]},{"gateway":"us-tx.wg.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.7936,"longitude":-96.7662,"isp":"Quadranet","hosts":[{"hostname":"us-tx1.wg.ivpn.net","dns_name":"us-tx1.gw.ivpn.net","host":"96.44.189.197","public_key":"LvWf548mFddi8PTrIGL6uD1/l85LU8z0Rc8tpvw2Vls=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.8,"multihop_port":21001,"v2ray":"96.44.142.234","isp":"Quadranet"},{"hostname":"us-tx2.wg.ivpn.net","dns_name":"us-tx2.gw.ivpn.net","host":"96.44.142.77","public_key":"om8hOGUcEvoOhHvJZoBHxNF4jxY/+Ml9Iy1WOSC/pFo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.18,"multihop_port":25001,"v2ray":"96.44.144.2","isp":"Quadranet"},{"hostname":"us-tx3.wg.ivpn.net","dns_name":"us-tx3.gw.ivpn.net","host":"198.55.116.66","public_key":"JPT1veXLmasj2uQDstX24mpR7VWD+GmV8JDkidkz91Q=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.9,"multihop_port":20890,"v2ray":"198.55.116.69","isp":"Quadranet"}]},{"gateway":"us-ut.wg.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.wg.ivpn.net","dns_name":"us-ut1.gw.ivpn.net","host":"206.190.145.92","public_key":"KirI7bpxD186CuYiOqNHF+QUe6YmRYf6CN3pXWOJT2k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":51.66,"multihop_port":24401,"v2ray":"206.190.145.88","isp":"100TB"}]},{"gateway":"us-va.wg.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.wg.ivpn.net","dns_name":"us-va1.gw.ivpn.net","host":"37.19.206.106","public_key":"ZCnZK6U+cRuP/WgzIDb/P6UG2rX/KyCRd5vJ1hAbr2E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.73,"multihop_port":27701,"v2ray":"37.19.206.111","isp":"Datapacket"}]},{"gateway":"us-wa.wg.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.wg.ivpn.net","dns_name":"us-wa2.gw.ivpn.net","host":"198.44.131.4","public_key":"VcrOOozBUCIURU0AnqMAE7AkMmC7Qrp+j/PzPbgbalU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":22.59,"multihop_port":27801,"v2ray":"198.44.131.20","isp":"Tzulo"}]},{"gateway":"za.wg.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.wg.ivpn.net","dns_name":"za1.gw.ivpn.net","host":"169.150.238.108","public_key":"tgrAA+uJZppS9esgOi0pe3rHajQQ7c/KF8WPOua6qy4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.31,"multihop_port":20840,"v2ray":"169.150.238.109","isp":"Datapacket"}]}],"openvpn":[{"gateway":"at.gw.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.gw.ivpn.net","dns_name":"at1.gw.ivpn.net","host":"185.244.212.66","load":57.14,"multihop_port":25601,"obfs":{"obfs3_multihop_port":25602,"obfs4_multihop_port":25603,"obfs4_key":"75HhQC6n6ctp9Fa9wCvEnc6ip5FnEfuIGc+dVNLH4M15FjB/Ve6bI1b8lYFhk6T+4/HkDQ"},"v2ray":"146.70.146.226","isp":"M247"}]},{"gateway":"au-nsw.gw.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.gw.ivpn.net","dns_name":"au-nsw1.gw.ivpn.net","host":"46.102.153.242","load":29.53,"multihop_port":26601,"obfs":{"obfs3_multihop_port":26602,"obfs4_multihop_port":26603,"obfs4_key":"/rjoeDjduOFq1UvT332vhS398h1RP5hC3m7sDJKNSyJ6TO8mkcxWAYILw0i+bgS/3JD5YA"},"v2ray":"217.138.205.90","isp":"M247"},{"hostname":"au-nsw2.gw.ivpn.net","dns_name":"au-nsw2.gw.ivpn.net","host":"146.70.78.74","load":35.37,"multihop_port":27901,"obfs":{"obfs3_multihop_port":27902,"obfs4_multihop_port":27903,"obfs4_key":"qtdQ5krD9EQFR98xNo/v5cmGb10wqt0Om9pYMIHWQh4oz5xcAXj32rViEyN0bnkkhaZnBA"},"v2ray":"146.70.210.26","isp":"M247"}]},{"gateway":"be.gw.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.gw.ivpn.net","dns_name":"be1.gw.ivpn.net","host":"194.187.251.10","load":68.29,"multihop_port":25701,"obfs":{"obfs3_multihop_port":25702,"obfs4_multihop_port":25703,"obfs4_key":"cN8i60FUVy2mmGpy+tkQAz8hu/N0EGPq8cZwIotEDwdhAYdLV+ATes/AEjzdub2K68TlYg"},"v2ray":"37.120.143.130","isp":"M247"}]},{"gateway":"bg.gw.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.gw.ivpn.net","dns_name":"bg1.gw.ivpn.net","host":"82.102.23.18","load":26.76,"multihop_port":25901,"obfs":{"obfs3_multihop_port":25902,"obfs4_multihop_port":25903,"obfs4_key":"K+mCw9+zy/8pBQt6IUKRlg2eJ3DCnJ1BvIccLq/6A2D6HoZddyDnZQYb2Sb2e464dVgBWw"},"v2ray":"146.70.53.82","isp":"M247"}]},{"gateway":"br.gw.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.gw.ivpn.net","dns_name":"br1.gw.ivpn.net","host":"45.162.230.50","load":9.47,"multihop_port":26701,"obfs":{"obfs3_multihop_port":26702,"obfs4_multihop_port":26703,"obfs4_key":"h4bBkocahWveuv/nWPRMYXBTw95ExTiXwmoydkNlV6hgfy8/ZjaKc34rqTuOyOH+CK7OZw"},"v2ray":"45.162.230.186","isp":"Qnax"}]},{"gateway":"ca-bc.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Vancouver","latitude":49.231,"longitude":-122.8412,"isp":"Tech Futures","hosts":[{"hostname":"ca-bc1.gw.ivpn.net","dns_name":"ca-bc1.gw.ivpn.net","host":"104.193.135.228","load":13.53,"multihop_port":20550,"obfs":{"obfs3_multihop_port":20551,"obfs4_multihop_port":20552,"obfs4_key":"EE2sCZ06sv+v/UIezUZLFrey101UpbHVG8ZD0G303wCzusXbkK4Bi+tzg0J7DM9v7YLwBg"},"v2ray":"104.193.135.233","isp":"Tech Futures"}]},{"gateway":"ca-on.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca-on1.gw.ivpn.net","dns_name":"ca-on1.gw.ivpn.net","host":"184.75.215.2","load":21.59,"multihop_port":20580,"obfs":{"obfs3_multihop_port":20581,"obfs4_multihop_port":20582,"obfs4_key":"ndx/mul0z+GgeDfKkqoSa8RuqCBA3MYWLnoBtH6YqOwWmjQY1wsotr80+nOhW4bRKu3HIw"},"v2ray":"184.75.215.7","isp":"Amanah"},{"hostname":"ca-on2.gw.ivpn.net","dns_name":"ca-on2.gw.ivpn.net","host":"162.219.176.18","load":26.27,"multihop_port":20590,"obfs":{"obfs3_multihop_port":20591,"obfs4_multihop_port":20592,"obfs4_key":"2jIHUkKQYA8cNacmXLYjMYioV3dkN8nr0gV4r9D9nwFB42Q5IpUYadk0oyk47Js+z36gWw"},"v2ray":"162.219.176.23","isp":"Amanah"}]},{"gateway":"ca-qc.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.499,"longitude":-73.57,"isp":"M247","hosts":[{"hostname":"ca-qc1.gw.ivpn.net","dns_name":"ca-qc1.gw.ivpn.net","host":"37.120.130.60","load":11.53,"multihop_port":20960,"obfs":{"obfs3_multihop_port":20961,"obfs4_multihop_port":20962,"obfs4_key":"bsOfJuEd+ZAuslrnkTkaBL0zzGt1UZyppbGOE+DV9fw0H6G63gnvNtmNRgffcnPJs9XeWg"},"v2ray":"37.120.130.61","isp":"M247"},{"hostname":"ca-qc2.gw.ivpn.net","dns_name":"ca-qc2.gw.ivpn.net","host":"87.101.92.26","load":12.78,"multihop_port":27001,"obfs":{"obfs3_multihop_port":27002,"obfs4_multihop_port":27003,"obfs4_key":"hfhRyd1nnfLN2QcWgqQo2iDkj6+Z71t2h4dbcsmBT5pZNBpWg3pbRfGQ0u6RCanCyK6xQA"},"v2ray":"89.47.234.130","isp":"M247"}]},{"gateway":"ch.gw.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"M247","hosts":[{"hostname":"ch1.gw.ivpn.net","dns_name":"ch1.gw.ivpn.net","host":"185.212.170.138","load":7.04,"multihop_port":23601,"obfs":{"obfs3_multihop_port":23602,"obfs4_multihop_port":23603,"obfs4_key":"ELnV4JNKu0vUNd3J+QDn64yfZtqM0hNN6O5n6RkDLHbeSDBZmxP1N4dlwwChV/uySX+DEQ"},"v2ray":"37.120.213.138","isp":"M247"},{"hostname":"ch2.gw.ivpn.net","dns_name":"ch2.gw.ivpn.net","host":"81.17.24.162","load":5.47,"multihop_port":20880,"obfs":{"obfs3_multihop_port":20881,"obfs4_multihop_port":20882,"obfs4_key":"XeGJcOeMYGPRN+xNlmd8lDSt71ae6BHF7kzaYXs9bVSv80cgoGTKQZ5+2VW6UHNURiI8aQ"},"v2ray":"81.17.24.167","isp":"Privatelayer"},{"hostname":"ch3.gw.ivpn.net","dns_name":"ch3.gw.ivpn.net","host":"141.255.166.194","load":16.88,"multihop_port":22901,"obfs":{"obfs3_multihop_port":22902,"obfs4_multihop_port":22903,"obfs4_key":"oNaH5sHCPGGk5m3/VMOrTDL+m1qsJrze+bqDs78vhOYBpjx5Jjq5TXu1dXNfDJCKNmKnUA"},"v2ray":"179.43.167.66","isp":"Privatelayer"}]},{"gateway":"cz.gw.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.gw.ivpn.net","dns_name":"cz1.gw.ivpn.net","host":"195.181.160.167","load":29.18,"multihop_port":25201,"obfs":{"obfs3_multihop_port":25202,"obfs4_multihop_port":25203,"obfs4_key":"JZ3PtIyflM3VwVow2vqi08OxddOWSx9j6B6yZSGoZLs9QE0hzSAj3ZBWEsCKFeQ2RcAoCQ"},"v2ray":"195.181.160.184","isp":"Datapacket"}]},{"gateway":"de.gw.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Leaseweb","hosts":[{"hostname":"de2.gw.ivpn.net","dns_name":"de2.gw.ivpn.net","host":"178.162.211.114","load":23.36,"multihop_port":22001,"obfs":{"obfs3_multihop_port":22002,"obfs4_multihop_port":22003,"obfs4_key":"dEhLA4ZsvVP8+PRvlSHKwmW8JyzR1Bwy7+BFKF7Ux4L2B5YvdqqOrv/8eHliEj2mm2Z8Iw"},"v2ray":"178.162.222.166","isp":"Leaseweb"},{"hostname":"de3.gw.ivpn.net","dns_name":"de3.gw.ivpn.net","host":"146.70.160.162","load":7.44,"multihop_port":21050,"obfs":{"obfs3_multihop_port":21051,"obfs4_multihop_port":21052,"obfs4_key":"IFf+iLf7lgc0K81tQkZL5zndlWflvnLZyYSGGNLtSXLLivlIeBuXCPFDJ7fkL3TOd5uhOA"},"v2ray":"146.70.160.166","isp":"M247"},{"hostname":"de4.gw.ivpn.net","dns_name":"de4.gw.ivpn.net","host":"185.102.219.40","load":8.64,"multihop_port":20920,"obfs":{"obfs3_multihop_port":20921,"obfs4_multihop_port":20922,"obfs4_key":"LzIBOv6zUOyI3/VfDLfqNmOTxCOHRo3bWirKHOf0GdJOPlmdZGHG9kH/aJwHNemsY0fWew"},"v2ray":"185.102.219.56","isp":"Datapacket"}]},{"gateway":"dk.gw.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.gw.ivpn.net","dns_name":"dk1.gw.ivpn.net","host":"185.245.84.226","load":14.44,"multihop_port":25501,"obfs":{"obfs3_multihop_port":25502,"obfs4_multihop_port":25503,"obfs4_key":"ngjtv9UISX4tB5AkBnrEN2TrAnUqVwNZ688VqDlS4BDxQXJeJF3ynZtngRqeowhEahsccQ"},"v2ray":"193.29.107.226","isp":"M247"}]},{"gateway":"es.gw.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.gw.ivpn.net","dns_name":"es1.gw.ivpn.net","host":"185.93.3.193","load":14.36,"multihop_port":21501,"obfs":{"obfs3_multihop_port":21502,"obfs4_multihop_port":21503,"obfs4_key":"x4A9SBY5yzPKH1QOkEsGYcIR2JA/Pu393jv/ZSg4YO2DsVhr3TQFxcMO3QhD9iSF48smJA"},"v2ray":"185.93.3.196","isp":"Datapacket"}]},{"gateway":"fi.gw.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.gw.ivpn.net","dns_name":"fi1.gw.ivpn.net","host":"185.112.82.12","load":50.29,"multihop_port":26001,"obfs":{"obfs3_multihop_port":26002,"obfs4_multihop_port":26003,"obfs4_key":"SvvSpGiFctjs4n2wZGnZUf9fAL8wag70SrA3FX+9f3Sq+KgBn+/8P6fE3239ezemg9svLA"},"v2ray":"185.103.110.231","isp":"Creanova"}]},{"gateway":"fr.gw.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.gw.ivpn.net","dns_name":"fr1.gw.ivpn.net","host":"185.246.211.179","load":5.4,"multihop_port":23401,"obfs":{"obfs3_multihop_port":23402,"obfs4_multihop_port":23403,"obfs4_key":"CMf0pNZ46nFdG0Tpa3hE0cK9wtUAReJL7HN66G9Jq3tlrTSWrU0DLf7sCQgXV+WFoc8iaw"},"v2ray":"185.246.211.184","isp":"Datapacket"}]},{"gateway":"gb-man.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.451,"longitude":-2.319,"isp":"M247","hosts":[{"hostname":"gb-man1.gw.ivpn.net","dns_name":"gb-man1.gw.ivpn.net","host":"185.195.202.20","load":13.88,"multihop_port":26901,"obfs":{"obfs3_multihop_port":26902,"obfs4_multihop_port":26903,"obfs4_key":"WuP3pMrsQA+uAC72sV+Y62E1uvOWcnbTNJCmRHXqtWbbYzECF5swu62dzD/JOKoa5t0tGQ"},"v2ray":"185.195.202.25","isp":"M247"}]},{"gateway":"gb.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"Datapacket","hosts":[{"hostname":"gb1.gw.ivpn.net","dns_name":"gb1.gw.ivpn.net","host":"185.59.221.133","load":9.95,"multihop_port":20801,"obfs":{"obfs3_multihop_port":20802,"obfs4_multihop_port":20803,"obfs4_key":"5whTESvZxQE28wKqJWZ9fQFy09d8//GNaPDeYHVR+FJZTyI+DMS6qX4Mt2FKSf/zBToaDg"},"v2ray":"185.59.221.159","isp":"Datapacket"},{"hostname":"gb2.gw.ivpn.net","dns_name":"gb2.gw.ivpn.net","host":"185.59.221.88","load":6.5,"multihop_port":24201,"obfs":{"obfs3_multihop_port":24202,"obfs4_multihop_port":24203,"obfs4_key":"4hrCOgPsRfmnQ6cLvV5mtM2XZCRS/DXG/izYSg2qZC+WJ0GsnhTlKByPM2iJ555MaM8vJA"},"v2ray":"185.59.221.226","isp":"Datapacket"},{"hostname":"gb3.gw.ivpn.net","dns_name":"gb3.gw.ivpn.net","host":"81.92.202.116","load":16.61,"multihop_port":20980,"obfs":{"obfs3_multihop_port":20981,"obfs4_multihop_port":20982,"obfs4_key":"GIqTpQh4aDEYbwpwhF23HNAr/vVqSqRwYxqe2mdkKzapfj0fd9ZLrM2jG2ISVdSjNBhYRQ"},"v2ray":"81.92.202.117","isp":"M247"}]},{"gateway":"gr.gw.ivpn.net","country_code":"GR","country":"Greece","city":"Athens","latitude":37.871,"longitude":23.8707,"isp":"Datapacket","hosts":[{"hostname":"gr1.gw.ivpn.net","dns_name":"gr1.gw.ivpn.net","host":"169.150.252.110","load":20.97,"multihop_port":20540,"obfs":{"obfs3_multihop_port":20541,"obfs4_multihop_port":20542,"obfs4_key":"zyWssFvuJOCSBixUnRaF0qk+BLJQbnm7YpZ5oSVk5ElIksjA7OvwigQBc2NF2kt9/lQSEw"},"v2ray":"169.150.252.115","isp":"Datapacket"}]},{"gateway":"hk.gw.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.gw.ivpn.net","dns_name":"hk2.gw.ivpn.net","host":"209.58.188.13","load":24.68,"multihop_port":27501,"obfs":{"obfs3_multihop_port":27502,"obfs4_multihop_port":27503,"obfs4_key":"GIunWjiq00Piv3Xf4VeMkmUQ8NzD8sxRkSIbA3bxrU4LhPVth+3qM2zQwI4GesQDCDY5RA"},"v2ray":"64.120.120.237","isp":"Leaseweb"},{"hostname":"hk3.gw.ivpn.net","dns_name":"hk3.gw.ivpn.net","host":"118.107.244.184","load":9.56,"multihop_port":20460,"obfs":{"obfs3_multihop_port":20461,"obfs4_multihop_port":20462,"obfs4_key":"wnI0gz3hLM9VhkABSncBIsGERgn16UzTxkj7dEeYYo/y2Wu0/w24rfriA5KL7ugpTyvEFg"},"v2ray":"118.107.244.207","isp":"TheGigabit"}]},{"gateway":"hr.gw.ivpn.net","country_code":"HR","country":"Croatia","city":"Zagreb","latitude":45.811,"longitude":15.977,"isp":"Datapacket","hosts":[{"hostname":"hr1.gw.ivpn.net","dns_name":"hr1.gw.ivpn.net","host":"169.150.242.1","load":10.37,"multihop_port":20860,"obfs":{"obfs3_multihop_port":20861,"obfs4_multihop_port":20862,"obfs4_key":"MndMzdMCy8m0bY1LPNh1GAWQXhTom4Jr5eSrkMGTF6n2r3hhYd1lGPM+Q417OB+/dz2qDA"},"v2ray":"169.150.242.42","isp":"Datapacket"}]},{"gateway":"hu.gw.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.gw.ivpn.net","dns_name":"hu1.gw.ivpn.net","host":"185.189.114.186","load":11.65,"multihop_port":25401,"obfs":{"obfs3_multihop_port":25402,"obfs4_multihop_port":25403,"obfs4_key":"2TwZqxAakni0S4S3ulOIqMZimqqug0KCr6pNREN6KytrtIh486nkJyiFRqaYZlx+FlxEcg"},"v2ray":"37.120.144.178","isp":"M247"}]},{"gateway":"ie.gw.ivpn.net","country_code":"IE","country":"Ireland","city":"Dublin","latitude":53.337,"longitude":-6.259,"isp":"Datapacket","hosts":[{"hostname":"ie1.gw.ivpn.net","dns_name":"ie1.gw.ivpn.net","host":"87.249.137.136","load":7.28,"multihop_port":20850,"obfs":{"obfs3_multihop_port":20851,"obfs4_multihop_port":20852,"obfs4_key":"tWiVshynDq75bW24Ch2p9nRjLF4wa7YWHy9xCX5hJ5J0lZpflq8L/UluCfi51nxZDTouZA"},"v2ray":"87.249.137.140","isp":"Datapacket"}]},{"gateway":"il.gw.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il1.gw.ivpn.net","dns_name":"il1.gw.ivpn.net","host":"185.191.204.130","load":9.2,"multihop_port":27301,"obfs":{"obfs3_multihop_port":27302,"obfs4_multihop_port":27303,"obfs4_key":"DysuSM7UWjquj4BAVYf6mOUnRKfY1QXs17MXiV5aYapFfOkQPpx5nQPVQ2M+rLDxN9TSRg"},"v2ray":"185.191.204.135","isp":"HQServ"}]},{"gateway":"is.gw.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.gw.ivpn.net","dns_name":"is1.gw.ivpn.net","host":"82.221.107.178","load":100,"multihop_port":23501,"obfs":{"obfs3_multihop_port":23502,"obfs4_multihop_port":23503,"obfs4_key":"xx/Lor3q60/pVh4PKWi0GZaw64pPXFTkALnGlvRaBMiPRkFilr7KhYmPInDnZxzr4c4AIw"},"v2ray":"82.221.107.183","isp":"Advania"}]},{"gateway":"it.gw.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"Datapacket","hosts":[{"hostname":"it2.gw.ivpn.net","dns_name":"it2.gw.ivpn.net","host":"84.17.59.137","load":5.09,"multihop_port":21100,"obfs":{"obfs3_multihop_port":21101,"obfs4_multihop_port":21102,"obfs4_key":"8msjDzd52ALBZF9Ej8i6BYXc4qSTiG8P739Px77EHp0uOVd5/VvDhrBfGcBQxDIgBlUeLw"},"v2ray":"84.17.59.146","isp":"Datapacket"}]},{"gateway":"jp.gw.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.62,"longitude":139.74,"isp":"TheGigabit","hosts":[{"hostname":"jp2.gw.ivpn.net","dns_name":"jp2.gw.ivpn.net","host":"185.135.77.35","load":35.49,"multihop_port":20830,"obfs":{"obfs3_multihop_port":20831,"obfs4_multihop_port":20832,"obfs4_key":"giZJF4edg7wcjxbdgD2RjFcF9QAzExLHIJYjm2cLLtx7MrxP0p96mIFj9T8LSQotKB63fA"},"v2ray":"185.135.77.100","isp":"TheGigabit"}]},{"gateway":"lu.gw.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6113,"longitude":6.1294,"isp":"EstNOC","hosts":[{"hostname":"lu2.gw.ivpn.net","dns_name":"lu2.gw.ivpn.net","host":"185.221.132.178","load":32.76,"multihop_port":27212,"obfs":{"obfs3_multihop_port":27213,"obfs4_multihop_port":27214,"obfs4_key":"5zv2iXbmjV6wI3IEGxSZNfOnIIzfeehDF4FxkwcPi5sqDqa+6ecU2Nx55qIRstLfyzNEJA"},"v2ray":"185.221.132.183","isp":"EstNOC"}]},{"gateway":"mx.gw.ivpn.net","country_code":"MX","country":"Mexico","city":"Querétaro","latitude":20.574,"longitude":-100.2965,"isp":"Datapacket","hosts":[{"hostname":"mx1.gw.ivpn.net","dns_name":"mx1.gw.ivpn.net","host":"121.127.43.193","load":12.81,"multihop_port":20570,"obfs":{"obfs3_multihop_port":20571,"obfs4_multihop_port":20572,"obfs4_key":"j+m8maujVIgwIuDswG84veNQpprZobIszwL5rJ3FZZGD8ES7c3P6pN9aCJW4YJvnRxducg"},"v2ray":"121.127.43.198","isp":"Datapacket"}]},{"gateway":"my.gw.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.gw.ivpn.net","dns_name":"my1.gw.ivpn.net","host":"61.4.97.148","load":8.43,"multihop_port":20470,"obfs":{"obfs3_multihop_port":20471,"obfs4_multihop_port":20472,"obfs4_key":"k2hwCe8gDb24K5n2jNXYO5YCl5XCIEhuRwpYSsEhKWorah8OUM1C1crawbfstj+W2IQdOA"},"v2ray":"61.4.97.155","isp":"TheGigabit"}]},{"gateway":"nl.gw.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.376,"longitude":4.898,"isp":"Datapacket","hosts":[{"hostname":"nl2.gw.ivpn.net","dns_name":"nl2.gw.ivpn.net","host":"185.102.218.112","load":8.52,"multihop_port":20910,"obfs":{"obfs3_multihop_port":20911,"obfs4_multihop_port":20912,"obfs4_key":"RsYbGPn8XBsjDEqiYyHlNQ9E/whBLlfbFAD0hzA68ArgdzWuD4pvwBhcl0ckNwXhYfNALA"},"v2ray":"185.102.218.99","isp":"Datapacket"},{"hostname":"nl3.gw.ivpn.net","dns_name":"nl3.gw.ivpn.net","host":"95.211.172.68","load":24.46,"multihop_port":23101,"obfs":{"obfs3_multihop_port":23102,"obfs4_multihop_port":23103,"obfs4_key":"eUXsScIg0K0LKVgA8yq2Mc++pfnTQ9nr3gnV8n1NIw7wRqinhO6uuXiSS5J19agQaPK1ew"},"v2ray":"95.211.172.72","isp":"Leaseweb"},{"hostname":"nl4.gw.ivpn.net","dns_name":"nl4.gw.ivpn.net","host":"95.211.172.95","load":6.52,"multihop_port":23201,"obfs":{"obfs3_multihop_port":23202,"obfs4_multihop_port":23203,"obfs4_key":"KEw6WJF+NDOQv7yMvq+dAAAkPbcYJ8PX6pffRd8EM3uaOy2QcpMcdHI7s700Kq/ZvV3HBQ"},"v2ray":"95.211.172.99","isp":"Leaseweb"},{"hostname":"nl5.gw.ivpn.net","dns_name":"nl5.gw.ivpn.net","host":"95.211.187.222","load":13.33,"multihop_port":23901,"obfs":{"obfs3_multihop_port":23902,"obfs4_multihop_port":23903,"obfs4_key":"fcWCrzzatLbk1LNKsuQZKpQrC3ZXwQ85GO5xRS467KJBRDrmvnyMb6ARbLGu+gYkTnNELQ"},"v2ray":"95.211.187.225","isp":"Leaseweb"},{"hostname":"nl6.gw.ivpn.net","dns_name":"nl6.gw.ivpn.net","host":"95.211.187.228","load":5.65,"multihop_port":24101,"obfs":{"obfs3_multihop_port":24102,"obfs4_multihop_port":24103,"obfs4_key":"lT3OGPQS1CwwqtalMExN7qxEoDDBLLlcoh5a6YW3DPj8esEBEG6wY5OfYonxltBzoVu4PA"},"v2ray":"95.211.187.231","isp":"Leaseweb"},{"hostname":"nl7.gw.ivpn.net","dns_name":"nl7.gw.ivpn.net","host":"95.211.95.22","load":7.41,"multihop_port":22501,"obfs":{"obfs3_multihop_port":22502,"obfs4_multihop_port":22503,"obfs4_key":"ffMnq7Gc/D7KWoLckJ4t8nf3zZqVdlffe2lVfUCceOyOTdRApkeJGgEai0TI1z76Yey9Lw"},"v2ray":"95.211.172.107","isp":"Leaseweb"},{"hostname":"nl8.gw.ivpn.net","dns_name":"nl8.gw.ivpn.net","host":"95.211.172.18","load":12.01,"multihop_port":22801,"obfs":{"obfs3_multihop_port":22802,"obfs4_multihop_port":22803,"obfs4_key":"h+u/6VkPDJXySoJ6QEM1hOjWPD58OS4AZPP9ofP/yCWGBQpPoMc78l7C74eFvqKKkFAXDw"},"v2ray":"95.211.198.169","isp":"Leaseweb"}]},{"gateway":"no.gw.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.gw.ivpn.net","dns_name":"no1.gw.ivpn.net","host":"194.242.10.150","load":22.33,"multihop_port":25301,"obfs":{"obfs3_multihop_port":25302,"obfs4_multihop_port":25303,"obfs4_key":"uhLy//KRu6DrYfgDJmwjC6Fxk5h+MRDNOwFe7qzGTjfOiHLWRSoRx6OdNvzjPPXq0ZJnZg"},"v2ray":"217.170.197.28","isp":"Servetheworld"}]},{"gateway":"pe.gw.ivpn.net","country_code":"PE","country":"Peru","city":"Lima","latitude":-12.089,"longitude":-76.9759,"isp":"Datapacket","hosts":[{"hostname":"pe1.gw.ivpn.net","dns_name":"pe1.gw.ivpn.net","host":"79.127.252.65","load":9.63,"multihop_port":20490,"obfs":{"obfs3_multihop_port":20491,"obfs4_multihop_port":20492,"obfs4_key":"ckCu0Xq5Zt5K3wbkJbtg0JwjxnW08NaY9M/pkkL6ENijKB7pIbYjtVrYdYAX/tH2kIBmeg"},"v2ray":"79.127.252.70","isp":"Datapacket"}]},{"gateway":"pl.gw.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.gw.ivpn.net","dns_name":"pl1.gw.ivpn.net","host":"185.246.208.86","load":6.35,"multihop_port":25101,"obfs":{"obfs3_multihop_port":25102,"obfs4_multihop_port":25103,"obfs4_key":"S9XZyigxYjF5jWcwYpMmV9HJq4Vni1yQvLKI03n0TJ7csrgsX7lPpFfECAGQruHh1wkMXg"},"v2ray":"185.246.208.87","isp":"Datapacket"}]},{"gateway":"pt.gw.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.gw.ivpn.net","dns_name":"pt1.gw.ivpn.net","host":"94.46.175.112","load":9.45,"multihop_port":27101,"obfs":{"obfs3_multihop_port":27102,"obfs4_multihop_port":27103,"obfs4_key":"NqXqKMt8UF25hYDIwfh2K4Rr4a7F41HzZDGjX7SYwRaoOtrTL665yV6Z3h9wF+/R1YE8KQ"},"v2ray":"94.46.175.130","isp":"Hostwebis"}]},{"gateway":"ro.gw.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.gw.ivpn.net","dns_name":"ro1.gw.ivpn.net","host":"37.120.206.50","load":48.18,"multihop_port":22301,"obfs":{"obfs3_multihop_port":22302,"obfs4_multihop_port":22303,"obfs4_key":"lqfg/sP9uLakoQiA6YI5/kHQ4/FvQTp6jRgxSswjHwC8POOM23FijEWKyykngn1Eb3xfLA"},"v2ray":"185.120.147.58","isp":"M247"}]},{"gateway":"rs.gw.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.gw.ivpn.net","dns_name":"rs1.gw.ivpn.net","host":"141.98.103.250","load":19.88,"multihop_port":26801,"obfs":{"obfs3_multihop_port":26802,"obfs4_multihop_port":26803,"obfs4_key":"0MqgxLrLFQTlQWGAjY9es+Nv45d37/5lulWw0iEFoiUvtzOcbut8hK9AhCis17EXi+lUXw"},"v2ray":"146.70.111.114","isp":"M247"}]},{"gateway":"se.gw.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"GleSyS","hosts":[{"hostname":"se1.gw.ivpn.net","dns_name":"se1.gw.ivpn.net","host":"80.67.10.138","load":14.36,"multihop_port":24001,"obfs":{"obfs3_multihop_port":24002,"obfs4_multihop_port":24003,"obfs4_key":"/yhTV2SsTXlwsG2mCS90ZAYIZivsSyloaFw6VDj0pnpJOuUxXcZBOgdyQ/lfWxJtvHZmPg"},"v2ray":"80.67.10.139","isp":"GleSyS"},{"hostname":"se2.gw.ivpn.net","dns_name":"se2.gw.ivpn.net","host":"37.120.153.228","load":13.14,"multihop_port":20970,"obfs":{"obfs3_multihop_port":20971,"obfs4_multihop_port":20972,"obfs4_key":"xd6oVIT+22zMb84GGO+veRRswXf51ucRiaxpkJ9k84S713VJcpyO2WzCoSd4bi4yLuY0Eg"},"v2ray":"37.120.153.227","isp":"M247"}]},{"gateway":"sg.gw.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.gw.ivpn.net","dns_name":"sg1.gw.ivpn.net","host":"185.128.24.186","load":10.45,"multihop_port":26101,"obfs":{"obfs3_multihop_port":26102,"obfs4_multihop_port":26103,"obfs4_key":"0N1ZmZlnyhS/3Y1OhvB0Bk3BGU2LFy0zyuWPYwM/P+mfX57w8zI7/YcBfIXZVgDiStt4MQ"},"v2ray":"146.70.192.138","isp":"M247"},{"hostname":"sg2.gw.ivpn.net","dns_name":"sg2.gw.ivpn.net","host":"37.120.151.124","load":11.25,"multihop_port":20950,"obfs":{"obfs3_multihop_port":20951,"obfs4_multihop_port":20952,"obfs4_key":"aTFzbPtK0zvLwSoUZkanzj+0wFPYg+IXyV01spxcedY5r46rywRCHgt8CRaBgpxhV8YzEA"},"v2ray":"37.120.151.125","isp":"M247"}]},{"gateway":"sk.gw.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"Datapacket","hosts":[{"hostname":"sk2.gw.ivpn.net","dns_name":"sk2.gw.ivpn.net","host":"156.146.40.202","load":9.5,"multihop_port":20400,"obfs":{"obfs3_multihop_port":20401,"obfs4_multihop_port":20402,"obfs4_key":"ALsqb8RNZcvMzBsxnf4WQQYklUL0P6TUhyoXiwK1XPOEcCtW278YediLvTvOMeD5WLkPKg"},"v2ray":"156.146.40.208","isp":"Datapacket"}]},{"gateway":"tw.gw.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.gw.ivpn.net","dns_name":"tw1.gw.ivpn.net","host":"185.189.160.6","load":8.28,"multihop_port":20820,"obfs":{"obfs3_multihop_port":20821,"obfs4_multihop_port":20822,"obfs4_key":"/ilRlB3BkUzUG2yd+++6KeYEF9PEB+3T3XcQhVjfoF8wJH1kgjGXvikjS1j/1SknFpGPaA"},"v2ray":"185.189.160.21","isp":"TheGigabit"}]},{"gateway":"ua.gw.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kyiv","latitude":50.4754,"longitude":30.5461,"isp":"Server.ua","hosts":[{"hostname":"ua2.gw.ivpn.net","dns_name":"ua2.gw.ivpn.net","host":"91.232.28.126","load":6.85,"multihop_port":20450,"obfs":{"obfs3_multihop_port":20451,"obfs4_multihop_port":20452,"obfs4_key":"lEx5hd4iiT/fRyl34m5b/752sAPUr8UIJFh4HIyziOnQgVpcYtviI9Du6qBOb7dOFT0VKg"},"v2ray":"91.232.28.119","isp":"Server.ua"}]},{"gateway":"us-az.gw.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.5722,"longitude":-112.0891,"isp":"M247","hosts":[{"hostname":"us-az1.gw.ivpn.net","dns_name":"us-az1.gw.ivpn.net","host":"193.37.254.130","load":15.4,"multihop_port":26401,"obfs":{"obfs3_multihop_port":26402,"obfs4_multihop_port":26403,"obfs4_key":"Y2klMvUi3NBIReXSALaKnNm8qI9IdWhFwgQrwl9ofUuVNuT6D93ohTTqbW//iKS5/lqndw"},"v2ray":"193.37.254.50","isp":"M247"}]},{"gateway":"us-ca.gw.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Tzulo","hosts":[{"hostname":"us-ca3.gw.ivpn.net","dns_name":"us-ca3.gw.ivpn.net","host":"198.54.129.99","load":9.81,"multihop_port":21301,"obfs":{"obfs3_multihop_port":21302,"obfs4_multihop_port":21303,"obfs4_key":"rharPyhkUzYwmCP8ZzeaCwnJAmwOqwDTLOlJqzi/kAxMn4OVXtbzCk9Ww8XR31D2rmk3MA"},"v2ray":"198.54.129.212","isp":"Tzulo"},{"hostname":"us-ca5.gw.ivpn.net","dns_name":"us-ca5.gw.ivpn.net","host":"185.180.13.57","load":20.09,"multihop_port":20940,"obfs":{"obfs3_multihop_port":20941,"obfs4_multihop_port":20942,"obfs4_key":"+nBc8v94uD0T/q9QeEcOgHiDODs0XtVxFI5Iw5bJJSD7YA8Bj9HuHkzsxFjVk/RIqKCyHA"},"v2ray":"185.180.13.38","isp":"Datapacket"}]},{"gateway":"us-co.gw.ivpn.net","country_code":"US","country":"United States","city":"Denver, CO","latitude":39.749,"longitude":-104.997,"isp":"Datapacket","hosts":[{"hostname":"us-co1.gw.ivpn.net","dns_name":"us-co1.gw.ivpn.net","host":"121.127.44.26","load":7.63,"multihop_port":20560,"obfs":{"obfs3_multihop_port":20561,"obfs4_multihop_port":20562,"obfs4_key":"mupqY+RsAT5UMgL7i4LRuGwAE1xTC7/Y0bBN5SL05dGt0QTlT7oFex/MMjPx2sTBLRHZBQ"},"v2ray":"121.127.44.31","isp":"Datapacket"}]},{"gateway":"us-fl.gw.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.7839,"longitude":-80.2102,"isp":"Quadranet","hosts":[{"hostname":"us-fl1.gw.ivpn.net","dns_name":"us-fl1.gw.ivpn.net","host":"173.44.49.90","load":13.22,"multihop_port":24601,"obfs":{"obfs3_multihop_port":24602,"obfs4_multihop_port":24603,"obfs4_key":"vS7u4rijvWECRS/Mo2KOpl8kx0NOozp3kF/FMxGmCZILE46etitrheYI2hCpNsYUg3YTBQ"},"v2ray":"96.47.236.98","isp":"Quadranet"}]},{"gateway":"us-ga.gw.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.7627,"longitude":-84.4225,"isp":"Quadranet","hosts":[{"hostname":"us-ga1.gw.ivpn.net","dns_name":"us-ga1.gw.ivpn.net","host":"104.129.24.146","load":10.63,"multihop_port":24501,"obfs":{"obfs3_multihop_port":24502,"obfs4_multihop_port":24503,"obfs4_key":"+No53UtdyPN4uT89vMlvRTjFnxtMKol+oOld9I9WMnlK7BU+y10oXWofzcI4eRgkm195FQ"},"v2ray":"69.174.102.18","isp":"Quadranet"},{"hostname":"us-ga2.gw.ivpn.net","dns_name":"us-ga2.gw.ivpn.net","host":"107.150.22.74","load":10.25,"multihop_port":24810,"obfs":{"obfs3_multihop_port":24811,"obfs4_multihop_port":24812,"obfs4_key":"3viWXkxZx1KZF9uzd5tRxb5lNMMnRZ90PqwLUaZdkZuaouj+Vb20t5uk3BVz/YyZkrSoGw"},"v2ray":"69.174.102.58","isp":"Quadranet"},{"hostname":"us-ga3.gw.ivpn.net","dns_name":"us-ga3.gw.ivpn.net","host":"185.93.0.215","load":15.35,"multihop_port":20900,"obfs":{"obfs3_multihop_port":20901,"obfs4_multihop_port":20902,"obfs4_key":"T+tizn1ig40+uFLUBYtIL43xkkK0v074ZSAM3EfwCzwgE3qPOxJfsPCi2iiGXcBKK0tvLg"},"v2ray":"185.93.0.217","isp":"Datapacket"}]},{"gateway":"us-il.gw.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.8373,"longitude":-87.6862,"isp":"Quadranet","hosts":[{"hostname":"us-il1.gw.ivpn.net","dns_name":"us-il1.gw.ivpn.net","host":"107.150.28.82","load":7.44,"multihop_port":21401,"obfs":{"obfs3_multihop_port":21402,"obfs4_multihop_port":21403,"obfs4_key":"6PpxOt8CwINAjun8o/wsf/cAidNbJZM/Pg4im1Cx9kCBV/lau3XFq3bMwBW0SzptZ/5WdA"},"v2ray":"72.11.137.154","isp":"Quadranet"},{"hostname":"us-il2.gw.ivpn.net","dns_name":"us-il2.gw.ivpn.net","host":"72.11.137.146","load":6.08,"multihop_port":24901,"obfs":{"obfs3_multihop_port":24902,"obfs4_multihop_port":24903,"obfs4_key":"cfvJR/gplqAbFx8myJSW/cPC3hN1782PPma2v5YKJR5LyekWX+AHTJjzdz8xSr2mM6IGQw"},"v2ray":"104.129.31.226","isp":"Quadranet"},{"hostname":"us-il3.gw.ivpn.net","dns_name":"us-il3.gw.ivpn.net","host":"89.187.181.118","load":9.31,"multihop_port":20930,"obfs":{"obfs3_multihop_port":20931,"obfs4_multihop_port":20932,"obfs4_key":"jKCjgD5H90uS3zpu9Vm+mIvo0QwEIU7f018gZLPGItQ8oZe2iWWfHjAp3DVMTCIJXNusOQ"},"v2ray":"89.187.181.121","isp":"Datapacket"}]},{"gateway":"us-ma.gw.ivpn.net","country_code":"US","country":"United States","city":"Boston, MA","latitude":42.376,"longitude":-71.078,"isp":"Datapacket","hosts":[{"hostname":"us-ma1.gw.ivpn.net","dns_name":"us-ma1.gw.ivpn.net","host":"109.61.86.47","load":23.07,"multihop_port":20870,"obfs":{"obfs3_multihop_port":20871,"obfs4_multihop_port":20872,"obfs4_key":"6gPx3OetMICSn/v9I/boxkZX1Me3J823v/QxJNGM1h2noy6XxkLXRpyGCASZe/frLEMIdA"},"v2ray":"109.61.86.52","isp":"Datapacket"}]},{"gateway":"us-nj.gw.ivpn.net","country_code":"US","country":"United States","city":"Secaucus, NJ","latitude":40.737764,"longitude":-74.151747,"isp":"Quadranet","hosts":[{"hostname":"us-nj3.gw.ivpn.net","dns_name":"us-nj3.gw.ivpn.net","host":"23.226.128.18","load":18.3,"multihop_port":21610,"obfs":{"obfs3_multihop_port":21611,"obfs4_multihop_port":21612,"obfs4_key":"JtB/8Lv8MOq9+bpYC751voS2CwoEwf9ku2CziwJScn3Gc1F/BTul6ehnrGiedmpkQXAtJw"},"v2ray":"23.226.129.114","isp":"Quadranet"},{"hostname":"us-nj4.gw.ivpn.net","dns_name":"us-nj4.gw.ivpn.net","host":"194.36.111.50","load":12.57,"multihop_port":27401,"obfs":{"obfs3_multihop_port":27402,"obfs4_multihop_port":27403,"obfs4_key":"lHDLT6cTgt0bh3ysogDdiXL4eWGRtJZ0cZGJmvpeK0YLUAsBfsOzKv46V0iv5ykwRPm6Mg"},"v2ray":"37.120.202.42","isp":"M247"}]},{"gateway":"us-nv.gw.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.gw.ivpn.net","dns_name":"us-nv1.gw.ivpn.net","host":"185.242.5.34","load":57.8,"multihop_port":26501,"obfs":{"obfs3_multihop_port":26502,"obfs4_multihop_port":26503,"obfs4_key":"Kux7OTSrUOkklATpG67hJPz7xCWpW6eD9Qdw2GNKAmaaPA5zvPC3SXQRvyrYdyAAqMXMfg"},"v2ray":"185.242.5.146","isp":"M247"}]},{"gateway":"us-ny.gw.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny2.gw.ivpn.net","dns_name":"us-ny2.gw.ivpn.net","host":"212.103.48.194","load":6.16,"multihop_port":21801,"obfs":{"obfs3_multihop_port":21802,"obfs4_multihop_port":21803,"obfs4_key":"GtK9yCXTtrLOrf0MTWdWqjzQ1vd1eKsVjiOuR5CiVaDf4dCSalyJ+kmik4nfU9Gj6UwcCg"},"v2ray":"212.103.48.199","isp":"M247"},{"hostname":"us-ny3.gw.ivpn.net","dns_name":"us-ny3.gw.ivpn.net","host":"89.187.178.144","load":8.8,"multihop_port":27601,"obfs":{"obfs3_multihop_port":27602,"obfs4_multihop_port":27603,"obfs4_key":"eL/9iKx6f5bHowNJBsT2E/Aag5w8Cvtb3DduySudJmuK2GtIOUwNzS33lFZwSUEnJIYwLg"},"v2ray":"89.187.178.150","isp":"Datapacket"},{"hostname":"us-ny4.gw.ivpn.net","dns_name":"us-ny4.gw.ivpn.net","host":"91.132.137.172","load":9.92,"multihop_port":20990,"obfs":{"obfs3_multihop_port":20991,"obfs4_multihop_port":20992,"obfs4_key":"P4Cw+PtgDKh6YfQAu7seQj4DJpRpdphchOCukV/Bum+yTaY2cOl9FcOzB+2O5l4gGy0iSA"},"v2ray":"91.132.137.173","isp":"M247"}]},{"gateway":"us-tx.gw.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.7936,"longitude":-96.7662,"isp":"Quadranet","hosts":[{"hostname":"us-tx1.gw.ivpn.net","dns_name":"us-tx1.gw.ivpn.net","host":"96.44.189.194","load":6.8,"multihop_port":21001,"obfs":{"obfs3_multihop_port":21002,"obfs4_multihop_port":21003,"obfs4_key":"GBDWrGN71fGa7a7S8b2tHzjYQMhnA2vJW5yq3iID+VoSzA1xIAgHiOxISEU93v+CBTCXWg"},"v2ray":"96.44.142.234","isp":"Quadranet"},{"hostname":"us-tx2.gw.ivpn.net","dns_name":"us-tx2.gw.ivpn.net","host":"96.44.142.74","load":17.18,"multihop_port":25001,"obfs":{"obfs3_multihop_port":25002,"obfs4_multihop_port":25003,"obfs4_key":"VYfEVELWNqOm7kyO19usXm3GSK9wawRObopQLOLDbLodKnmX/jPah+IlGkL2xYiNxEzUKw"},"v2ray":"96.44.144.2","isp":"Quadranet"},{"hostname":"us-tx3.gw.ivpn.net","dns_name":"us-tx3.gw.ivpn.net","host":"198.55.116.68","load":5.9,"multihop_port":20890,"obfs":{"obfs3_multihop_port":20891,"obfs4_multihop_port":20892,"obfs4_key":"VdYSHMDI8qT7WTJsLBt2OhX+s8f31iqhNZKpYJvsQIx417PYQScAurg/ZG+uq76SiBhSWQ"},"v2ray":"198.55.116.69","isp":"Quadranet"}]},{"gateway":"us-ut.gw.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.gw.ivpn.net","dns_name":"us-ut1.gw.ivpn.net","host":"198.105.216.28","load":51.66,"multihop_port":24401,"obfs":{"obfs3_multihop_port":24402,"obfs4_multihop_port":24403,"obfs4_key":"gb5dp9i4QnFKT0GQPMEsDlqN+JORU3lyU65s9R1064aZ1jKfWfkc+SxbOlNEh23CvIAOeg"},"v2ray":"206.190.145.88","isp":"100TB"}]},{"gateway":"us-va.gw.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.gw.ivpn.net","dns_name":"us-va1.gw.ivpn.net","host":"37.19.206.105","load":6.73,"multihop_port":27701,"obfs":{"obfs3_multihop_port":27702,"obfs4_multihop_port":27703,"obfs4_key":"5Lk8BSID+M9QAGSglQTrYkom+V0mkIv0HgR80+9vKCcnZOu0f+aJhfOXqKnpHarJbIEHCw"},"v2ray":"37.19.206.111","isp":"Datapacket"}]},{"gateway":"us-wa.gw.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.gw.ivpn.net","dns_name":"us-wa2.gw.ivpn.net","host":"198.44.131.3","load":22.59,"multihop_port":27801,"obfs":{"obfs3_multihop_port":27802,"obfs4_multihop_port":27803,"obfs4_key":"9h0W5BTzGSDpY2tGjdvViSJfEkT/BuwHS0cnFX07cEj3RRDtmxsC0f+kapO8+Kh+fz1XMQ"},"v2ray":"198.44.131.20","isp":"Tzulo"}]},{"gateway":"za.gw.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.gw.ivpn.net","dns_name":"za1.gw.ivpn.net","host":"169.150.238.103","load":5.31,"multihop_port":20840,"obfs":{"obfs3_multihop_port":20841,"obfs4_multihop_port":20842,"obfs4_key":"vM1zdiOMhoqMKZCOi/lMj7TfWJb5/UsM25p8FE/AUezwbYWhUkhpD5RbXBOBDNhZuYzPGA"},"v2ray":"169.150.238.109","isp":"Datapacket"}]}],"config":{"antitracker":{"default":{"ip":"10.0.254.2","multihop-ip":"10.0.254.102"},"hardcore":{"ip":"10.0.254.3","multihop-ip":"10.0.254.103"}},"antitracker_plus":{"DnsServers":[{"Name":"Basic","Description":"Basic","Normal":"10.0.254.4","Hardcore":"10.0.254.5"},{"Name":"Comprehensive","Description":"Comprehensive","Normal":"10.0.254.6","Hardcore":"10.0.254.7"},{"Name":"Restrictive","Description":"Restrictive","Normal":"10.0.254.18","Hardcore":"10.0.254.19"},{"Name":"Easylist","Description":"EasyList + EasyPrivacy","Normal":"10.0.254.14","Hardcore":"10.0.254.15"},{"Name":"Oisdbig","Description":"OISD Big","Normal":"10.0.254.2","Hardcore":"10.0.254.3"},{"Name":"Stevenblack","Description":"Steven Black Unified + Ads + Malware","Normal":"10.0.254.20","Hardcore":"10.0.254.21"},{"Name":"Hagezilight","Description":"Hagezi Light","Normal":"10.0.254.22","Hardcore":"10.0.254.23"},{"Name":"Hagezipro","Description":"Hagezi Pro","Normal":"10.0.254.10","Hardcore":"10.0.254.11"},{"Name":"Hageziproplus","Description":"Hagezi Pro++","Normal":"10.0.254.24","Hardcore":"10.0.254.25"},{"Name":"Hageziultimate","Description":"Hagezi Ultimate","Normal":"10.0.254.12","Hardcore":"10.0.254.13"}]},"api":{"ips":["198.50.177.220","149.56.162.156","198.50.177.222","149.56.162.159","198.50.177.223"],"ipv6s":["2607:5300:203:1735::8888","2607:5300:203:1735::8","2607:5300:203:1735:6580:7300:0:aaaa"]},"ports":{"test":[{"echoserver":"37.187.112.240"}],"openvpn":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":60000,"max":65000}},{"type":"UDP","port":123},{"type":"UDP","port":2049},{"type":"UDP","range":{"min":50000,"max":59999}},{"type":"UDP","port":2050},{"type":"UDP","range":{"min":40000,"max":49999}},{"type":"UDP","port":443},{"type":"UDP","port":1194},{"type":"UDP","range":{"min":30000,"max":39999}},{"type":"TCP","port":80},{"type":"TCP","port":443},{"type":"TCP","port":1194},{"type":"TCP","port":2049},{"type":"TCP","port":2050},{"type":"TCP","port":30587},{"type":"TCP","port":41893},{"type":"TCP","port":48574},{"type":"TCP","port":58237},{"type":"TCP","range":{"min":5500,"max":19999}},{"type":"TCP","range":{"min":30000,"max":65000}}],"wireguard":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","port":123},{"type":"UDP","port":443},{"type":"UDP","port":500},{"type":"UDP","port":1194},{"type":"UDP","port":2049},{"type":"UDP","port":2050},{"type":"UDP","port":4500},{"type":"UDP","port":30587},{"type":"UDP","port":41893},{"type":"UDP","port":48574},{"type":"UDP","port":58237},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":30000,"max":65000}}],"obfs3":{"port":5145},"obfs4":{"port":5146},"v2ray":{"id":"27de860d-5601-412d-8b71-baa048a94b98","openvpn":[{"type":"UDP","port":20501},{"type":"UDP","port":20502},{"type":"UDP","port":20503},{"type":"UDP","port":20504},{"type":"TCP","port":1443}],"wireguard":[{"type":"UDP","port":15351}]}}}} +{"wireguard":[{"gateway":"ar.wg.ivpn.net","country_code":"AR","country":"Argentina","city":"Buenos Aires","latitude":-34.614,"longitude":-58.371,"isp":"Datapacket","hosts":[{"hostname":"ar1.wg.ivpn.net","dns_name":"ar1.gw.ivpn.net","host":"149.22.83.100","public_key":"NXlWMTFlNJKQXfOnt+DJogxnDmfapEdgmHNat2JqwE0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.08,"multihop_port":20600,"v2ray":"149.22.83.102","isp":"Datapacket"}]},{"gateway":"at.wg.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.wg.ivpn.net","dns_name":"at1.gw.ivpn.net","host":"185.244.212.69","public_key":"83LUBnP97SFpnS0y1MpEAFcg8MIiQJgW1FRv/8Mc40g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":86.14,"multihop_port":25601,"v2ray":"146.70.146.226","isp":"M247"}]},{"gateway":"au-nsw.wg.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.wg.ivpn.net","dns_name":"au-nsw1.gw.ivpn.net","host":"46.102.153.246","public_key":"KmSrG48t5xw9CJCPlYLBG3JnmiY0CnUgyRM5TUEwZhM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.17,"multihop_port":26601,"v2ray":"217.138.205.90","isp":"M247"},{"hostname":"au-nsw2.wg.ivpn.net","dns_name":"au-nsw2.gw.ivpn.net","host":"146.70.78.75","public_key":"q+wbp7GjiTszp5G16rNpGCqxkL0qSY3CH4pcgD6UsVQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.66,"multihop_port":27901,"v2ray":"146.70.210.26","isp":"M247"}]},{"gateway":"be.wg.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.wg.ivpn.net","dns_name":"be1.gw.ivpn.net","host":"194.187.251.13","public_key":"awriP5lpdxEMWKuG+A1DOg+vb1M5jd3WhynIMB61BhU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":47.42,"multihop_port":25701,"v2ray":"37.120.143.130","isp":"M247"},{"hostname":"be2.wg.ivpn.net","dns_name":"be2.gw.ivpn.net","host":"79.127.224.164","public_key":"LeomjeizkMvWJAeYPdowWDrDgJfCRLMAYwt2jkazsyw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.82,"multihop_port":20610,"v2ray":"79.127.224.166","isp":"Datapacket"}]},{"gateway":"bg.wg.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.wg.ivpn.net","dns_name":"bg1.gw.ivpn.net","host":"82.102.23.21","public_key":"WDSsdJE6wvATIWfzQwayPtE/0DaXBQgW/hPm7sQSJmU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":28.19,"multihop_port":25901,"v2ray":"146.70.53.82","isp":"M247"}]},{"gateway":"br.wg.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.wg.ivpn.net","dns_name":"br1.gw.ivpn.net","host":"45.162.230.53","public_key":"eN1f15S3YzRyYCALiPGRQcjkQO9xntcdqPhJJ6TOymc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.29,"multihop_port":26701,"v2ray":"45.162.230.186","isp":"Qnax"}]},{"gateway":"ca-bc.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Vancouver","latitude":49.231,"longitude":-122.8412,"isp":"Tech Futures","hosts":[{"hostname":"ca-bc1.wg.ivpn.net","dns_name":"ca-bc1.gw.ivpn.net","host":"104.193.135.231","public_key":"lXawKqHosFOoc9kqAZwun9Yk3VrPN7vmG/JuQm4kvx0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.94,"multihop_port":20550,"v2ray":"104.193.135.233","isp":"Tech Futures"}]},{"gateway":"ca-on.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca-on1.wg.ivpn.net","dns_name":"ca-on1.gw.ivpn.net","host":"184.75.215.5","public_key":"eXlmRV8RsCQZjWwiSYxwtEr/xwanM/2HER2YqIGTdHk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.28,"multihop_port":20580,"v2ray":"184.75.215.7","isp":"Amanah"},{"hostname":"ca-on2.wg.ivpn.net","dns_name":"ca-on2.gw.ivpn.net","host":"162.219.176.21","public_key":"nadUhrHR5E0fCB5wg4efZHNn2NRE+gnuTDjKT21y2V0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.11,"multihop_port":20590,"v2ray":"162.219.176.23","isp":"Amanah"}]},{"gateway":"ca-qc.wg.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.499,"longitude":-73.57,"isp":"M247","hosts":[{"hostname":"ca-qc1.wg.ivpn.net","dns_name":"ca-qc1.gw.ivpn.net","host":"37.120.130.58","public_key":"rg+GGDmjM4Vxo1hURvKmgm9yonb6qcoKbPCP/DNDBnI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.7,"multihop_port":20960,"v2ray":"37.120.130.61","isp":"M247"},{"hostname":"ca-qc2.wg.ivpn.net","dns_name":"ca-qc2.gw.ivpn.net","host":"87.101.92.29","public_key":"XSKU6fBCDwlb+mGek1O/fUDd/ozO58ZLph/0H7mn+zE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.9,"multihop_port":27001,"v2ray":"89.47.234.130","isp":"M247"}]},{"gateway":"ch.wg.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"M247","hosts":[{"hostname":"ch1.wg.ivpn.net","dns_name":"ch1.gw.ivpn.net","host":"185.212.170.141","public_key":"dU7gLfcupYd37LW0q6cxC6PHMba+eUFAUOoU/ryXZkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":25.31,"multihop_port":23601,"v2ray":"37.120.213.138","isp":"M247"},{"hostname":"ch2.wg.ivpn.net","dns_name":"ch2.gw.ivpn.net","host":"81.17.24.165","public_key":"KRKeAFMJY6OH9RABaeC4feQG/JgbacZVg/w6VUjBSVQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.97,"multihop_port":20880,"v2ray":"81.17.24.167","isp":"Privatelayer"},{"hostname":"ch3.wg.ivpn.net","dns_name":"ch3.gw.ivpn.net","host":"141.255.166.198","public_key":"JBpgBKtqIneRuEga7mbP2PAk/e4HPRaC11H0A0+R3lA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.12,"multihop_port":22901,"v2ray":"179.43.167.66","isp":"Privatelayer"}]},{"gateway":"cz.wg.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.wg.ivpn.net","dns_name":"cz1.gw.ivpn.net","host":"185.180.14.41","public_key":"gVbEq2cGRzwCSGPqT2oRSYYN+P6IK3uvvRffErASDSk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":19.92,"multihop_port":25201,"v2ray":"195.181.160.184","isp":"Datapacket"}]},{"gateway":"de.wg.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Leaseweb","hosts":[{"hostname":"de2.wg.ivpn.net","dns_name":"de2.gw.ivpn.net","host":"37.58.60.151","public_key":"QhY3OtBf4FFafKtLO33e6k8JnAl8e6ktFcRUyLjCDVY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":21.16,"multihop_port":22001,"v2ray":"178.162.222.166","isp":"Leaseweb"},{"hostname":"de3.wg.ivpn.net","dns_name":"de3.gw.ivpn.net","host":"146.70.160.170","public_key":"CugQQtD8YJKRwS5IukNWkMcyqOzlOxfGRPhGeQRAb2Y=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":28.26,"multihop_port":21050,"v2ray":"146.70.160.166","isp":"M247"},{"hostname":"de4.wg.ivpn.net","dns_name":"de4.gw.ivpn.net","host":"185.102.219.26","public_key":"mS3/WpXjnMAMmXjSpd4nFzx9HSE3ubv2WyjpyH2REgs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.56,"multihop_port":20920,"v2ray":"185.102.219.56","isp":"Datapacket"}]},{"gateway":"dk.wg.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.wg.ivpn.net","dns_name":"dk1.gw.ivpn.net","host":"185.245.84.229","public_key":"jTsV5gOD7lT4egDj9rhKwO2OO2X7bKs2EQPcZEnUWDE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":100,"multihop_port":25501,"v2ray":"193.29.107.226","isp":"M247"},{"hostname":"dk2.wg.ivpn.net","dns_name":"dk2.gw.ivpn.net","host":"121.127.45.39","public_key":"olw7V0P0PD3OL4ucZUhCL/XNGqSSGYO59+RmXPBH22s=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.7,"multihop_port":20620,"v2ray":"121.127.45.41","isp":"Datapacket"}]},{"gateway":"es.wg.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.wg.ivpn.net","dns_name":"es1.gw.ivpn.net","host":"84.17.62.98","public_key":"w7umiArTtlJ4Pk6Ii9WX5VXK5vw/Qu+Z37/icKlIYWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":44.46,"multihop_port":21501,"v2ray":"185.93.3.196","isp":"Datapacket"}]},{"gateway":"fi.wg.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.wg.ivpn.net","dns_name":"fi1.gw.ivpn.net","host":"194.34.134.63","public_key":"mIxEzfjZ2wV6jJVj30w38ECd2LSH4bw/HLMnM2ICHiI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":28.42,"multihop_port":26001,"v2ray":"185.103.110.231","isp":"Creanova"}]},{"gateway":"fr.wg.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.wg.ivpn.net","dns_name":"fr1.gw.ivpn.net","host":"185.246.211.185","public_key":"g7BuMzj3r/noLiLR4qhQMcvU6GSIY8RGEnaYtdYsFX4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.8,"multihop_port":23401,"v2ray":"185.246.211.184","isp":"Datapacket"}]},{"gateway":"gb-man.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.451,"longitude":-2.319,"isp":"M247","hosts":[{"hostname":"gb-man1.wg.ivpn.net","dns_name":"gb-man1.gw.ivpn.net","host":"185.195.202.23","public_key":"+hf4DYilNEIjTdSOuCNcWdqVyaRoxGzXw7wvNl7f7Rg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.78,"multihop_port":26901,"v2ray":"185.195.202.25","isp":"M247"}]},{"gateway":"gb.wg.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"Datapacket","hosts":[{"hostname":"gb1.wg.ivpn.net","dns_name":"gb1.gw.ivpn.net","host":"185.59.221.140","public_key":"yKK5x+D17Jr3Q12T/UBaDjNVmNdZBsqpvTqH6YfsGHg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.77,"multihop_port":20801,"v2ray":"185.59.221.159","isp":"Datapacket"},{"hostname":"gb2.wg.ivpn.net","dns_name":"gb2.gw.ivpn.net","host":"185.59.221.225","public_key":"x0BTRaxsdxAd58ZyU2YMX4bmuj+Eg+8/urT2F3Vs1n8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.59,"multihop_port":24201,"v2ray":"185.59.221.226","isp":"Datapacket"},{"hostname":"gb3.wg.ivpn.net","dns_name":"gb3.gw.ivpn.net","host":"81.92.202.114","public_key":"7+jos+Eg+hMEOQE4Std6OJ+WVnCcmbqS1/EbPwn9w3s=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.41,"multihop_port":20980,"v2ray":"81.92.202.117","isp":"M247"}]},{"gateway":"gr.wg.ivpn.net","country_code":"GR","country":"Greece","city":"Athens","latitude":37.871,"longitude":23.8707,"isp":"Datapacket","hosts":[{"hostname":"gr1.wg.ivpn.net","dns_name":"gr1.gw.ivpn.net","host":"169.150.252.113","public_key":"79rPSFIEQ4KWX9UN+FSMVfI0mPPVY5elS16O/DA6uDw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.15,"multihop_port":20540,"v2ray":"169.150.252.115","isp":"Datapacket"}]},{"gateway":"hk.wg.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.wg.ivpn.net","dns_name":"hk2.gw.ivpn.net","host":"64.120.120.239","public_key":"kyolyq4cJydI3vQB2ESTIUAy2Fq0bpOf+Qe7GIq6XEA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":28.51,"multihop_port":27501,"v2ray":"64.120.120.237","isp":"Leaseweb"},{"hostname":"hk3.wg.ivpn.net","dns_name":"hk3.gw.ivpn.net","host":"118.107.244.206","public_key":"qq1simsFNm2FpZM0J8u8Aa0rkk5HEasvLksPyLv+0Sk=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.25,"multihop_port":20460,"v2ray":"118.107.244.207","isp":"TheGigabit"}]},{"gateway":"hr.wg.ivpn.net","country_code":"HR","country":"Croatia","city":"Zagreb","latitude":45.811,"longitude":15.977,"isp":"Datapacket","hosts":[{"hostname":"hr1.wg.ivpn.net","dns_name":"hr1.gw.ivpn.net","host":"169.150.242.40","public_key":"yGDzFo6v9BilHj5jb7oaiwaw8hnACFgT1rrHkdnRsXI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.57,"multihop_port":20860,"v2ray":"169.150.242.42","isp":"Datapacket"}]},{"gateway":"hu.wg.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.wg.ivpn.net","dns_name":"hu1.gw.ivpn.net","host":"185.189.114.189","public_key":"G30fNdXrnlqtqqOLF23QXWzFdLIKDxLW60HoYPvqml8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":54.08,"multihop_port":25401,"v2ray":"37.120.144.178","isp":"M247"}]},{"gateway":"ie.wg.ivpn.net","country_code":"IE","country":"Ireland","city":"Dublin","latitude":53.337,"longitude":-6.259,"isp":"Datapacket","hosts":[{"hostname":"ie1.wg.ivpn.net","dns_name":"ie1.gw.ivpn.net","host":"87.249.137.138","public_key":"jTRkgALSK2hJZmzfQsyKVsYQEepIqgSDnJImzNyLfQ4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":33.61,"multihop_port":20850,"v2ray":"87.249.137.140","isp":"Datapacket"}]},{"gateway":"il.wg.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il1.wg.ivpn.net","dns_name":"il1.gw.ivpn.net","host":"185.191.204.133","public_key":"HR9gAjpxXU3YVt6kehBw5n8yVYVE0iIgJdc4HTqOzEE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":11.93,"multihop_port":27301,"v2ray":"185.191.204.135","isp":"HQServ"}]},{"gateway":"is.wg.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.wg.ivpn.net","dns_name":"is1.gw.ivpn.net","host":"82.221.107.185","public_key":"nZZT6TlQ2dXlVe3P3B5ozEScHYMWH4JY4y3to8w5dz0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":70.39,"multihop_port":23501,"v2ray":"82.221.107.183","isp":"Advania"}]},{"gateway":"it.wg.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"Datapacket","hosts":[{"hostname":"it2.wg.ivpn.net","dns_name":"it2.gw.ivpn.net","host":"84.17.59.149","public_key":"IYi+s9DZusPErv0k2Ls/jgdubmeCrUcEJ1cNgmxPx0k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":14.1,"multihop_port":21100,"v2ray":"84.17.59.146","isp":"Datapacket"}]},{"gateway":"jp.wg.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.62,"longitude":139.74,"isp":"TheGigabit","hosts":[{"hostname":"jp2.wg.ivpn.net","dns_name":"jp2.gw.ivpn.net","host":"185.135.77.81","public_key":"YuhEd9+a90/+uucZC+qzsyMHkfe/GiwG1dq7g2HegXQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.67,"multihop_port":20830,"v2ray":"185.135.77.100","isp":"TheGigabit"}]},{"gateway":"lu.wg.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6113,"longitude":6.1294,"isp":"EstNOC","hosts":[{"hostname":"lu2.wg.ivpn.net","dns_name":"lu2.gw.ivpn.net","host":"185.221.132.181","public_key":"m5M76ffpSSUOJba3GK6WTooI8vNFYTnyw/PJuBbmGXA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":54.44,"multihop_port":27212,"v2ray":"185.221.132.183","isp":"EstNOC"}]},{"gateway":"mx.wg.ivpn.net","country_code":"MX","country":"Mexico","city":"Querétaro","latitude":20.574,"longitude":-100.2965,"isp":"Datapacket","hosts":[{"hostname":"mx1.wg.ivpn.net","dns_name":"mx1.gw.ivpn.net","host":"121.127.43.196","public_key":"ReKHoFVVGfR4Tgzl2GPPioAtQm3HmecKTU0HK67NcXU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":20.1,"multihop_port":20570,"v2ray":"121.127.43.198","isp":"Datapacket"}]},{"gateway":"my.wg.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.wg.ivpn.net","dns_name":"my1.gw.ivpn.net","host":"61.4.97.154","public_key":"M9SsMCpUw7ad6YbqQr8r2saBK2zAf3tBj82DzsQjgkY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":21.99,"multihop_port":20470,"v2ray":"61.4.97.155","isp":"TheGigabit"}]},{"gateway":"nl.wg.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.376,"longitude":4.898,"isp":"Datapacket","hosts":[{"hostname":"nl2.wg.ivpn.net","dns_name":"nl2.gw.ivpn.net","host":"185.102.218.104","public_key":"AsMT2FqpkZbjzWeDch6GwufF5odl259W/hIkGytVfWo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.9,"multihop_port":20910,"v2ray":"185.102.218.99","isp":"Datapacket"},{"hostname":"nl3.wg.ivpn.net","dns_name":"nl3.gw.ivpn.net","host":"95.211.95.9","public_key":"XDU6Syq1DY82IMatsHV0x/TAtbLiRwh/SdFCXlEn40c=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.42,"multihop_port":23101,"v2ray":"95.211.172.72","isp":"Leaseweb"},{"hostname":"nl4.wg.ivpn.net","dns_name":"nl4.gw.ivpn.net","host":"95.211.95.19","public_key":"cVB66gPq5cZ9dfXY+e2pbsCyih5o1zk04l5c5VCsV1g=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.64,"multihop_port":23201,"v2ray":"95.211.172.99","isp":"Leaseweb"},{"hostname":"nl5.wg.ivpn.net","dns_name":"nl5.gw.ivpn.net","host":"95.211.243.162","public_key":"NCagAawwRixI6Iw/NWiGD8lbjDNCl0aTICZKJtO/1HA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":35.67,"multihop_port":23901,"v2ray":"95.211.187.225","isp":"Leaseweb"},{"hostname":"nl6.wg.ivpn.net","dns_name":"nl6.gw.ivpn.net","host":"95.211.243.182","public_key":"hMWpqb3FEATHIbImPVWB/5z2nWIXghwpnJjevPY+1H0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.72,"multihop_port":24101,"v2ray":"95.211.187.231","isp":"Leaseweb"},{"hostname":"nl7.wg.ivpn.net","dns_name":"nl7.gw.ivpn.net","host":"95.211.172.105","public_key":"hQNYqtfOOAEz0IGshLx/TI9hUrfR9gIIkjVm4VsCbBM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":17.97,"multihop_port":22501,"v2ray":"95.211.172.107","isp":"Leaseweb"},{"hostname":"nl8.wg.ivpn.net","dns_name":"nl8.gw.ivpn.net","host":"95.211.198.167","public_key":"/nY1/OhVhdHtbnU/s31zYUuPBH0pizv4DemW5KDOUkg=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.34,"multihop_port":22801,"v2ray":"95.211.198.169","isp":"Leaseweb"}]},{"gateway":"no.wg.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.wg.ivpn.net","dns_name":"no1.gw.ivpn.net","host":"91.189.177.156","public_key":"xFO6ksbO3Gr05rRgAW0O5Veoi4bpTgz2G9RvtBzK7Cg=","local_ip":"172.16.0.1/12","ipv6":{},"load":27.15,"multihop_port":25301,"v2ray":"217.170.197.28","isp":"Servetheworld"}]},{"gateway":"pe.wg.ivpn.net","country_code":"PE","country":"Peru","city":"Lima","latitude":-12.089,"longitude":-76.9759,"isp":"Datapacket","hosts":[{"hostname":"pe1.wg.ivpn.net","dns_name":"pe1.gw.ivpn.net","host":"79.127.252.68","public_key":"LGvYaCFJxdDePXV+r5ENsmugIlVufCCSSm2A6EUXXGw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.7,"multihop_port":20490,"v2ray":"79.127.252.70","isp":"Datapacket"}]},{"gateway":"pl.wg.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.wg.ivpn.net","dns_name":"pl1.gw.ivpn.net","host":"185.246.208.109","public_key":"1JDmF79rWj5C+kHp71AbdHne/yGaizWCd2bLfSFvYjo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.7,"multihop_port":25101,"v2ray":"185.246.208.87","isp":"Datapacket"}]},{"gateway":"pt.wg.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.wg.ivpn.net","dns_name":"pt1.gw.ivpn.net","host":"94.46.175.113","public_key":"nMnA82YVrvEK80GVoY/0Z9McWeqjcLzuMYSL+86j5nU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.62,"multihop_port":27101,"v2ray":"94.46.175.130","isp":"Hostwebis"}]},{"gateway":"ro.wg.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.wg.ivpn.net","dns_name":"ro1.gw.ivpn.net","host":"37.120.206.53","public_key":"F2uQ57hysZTlw8WYELnyCw9Lga80wNYoYwkrrxyXKmw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":53.67,"multihop_port":22301,"v2ray":"185.120.147.58","isp":"M247"}]},{"gateway":"rs.wg.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.wg.ivpn.net","dns_name":"rs1.gw.ivpn.net","host":"141.98.103.253","public_key":"xLN/lpQThQ3z3tvYf7VqdAsRL/nton1Vhv2kCZlQtWE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":52.14,"multihop_port":26801,"v2ray":"146.70.111.114","isp":"M247"}]},{"gateway":"se.wg.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"GleSyS","hosts":[{"hostname":"se1.wg.ivpn.net","dns_name":"se1.gw.ivpn.net","host":"80.67.10.141","public_key":"u8VHnYEpoEjJWDAF9NAUkU6s810RnkMuhEfFD9U0cGo=","local_ip":"172.16.0.1/12","ipv6":{},"load":13.95,"multihop_port":24001,"v2ray":"80.67.10.139","isp":"GleSyS"},{"hostname":"se2.wg.ivpn.net","dns_name":"se2.gw.ivpn.net","host":"37.120.153.226","public_key":"2n0nFE1g/+vQr2AOQPm9Igyiy0zh9uTTultvOOSkMRo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.5,"multihop_port":20970,"v2ray":"37.120.153.227","isp":"M247"}]},{"gateway":"sg.wg.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.wg.ivpn.net","dns_name":"sg1.gw.ivpn.net","host":"185.128.24.189","public_key":"pWk0u1Xq8FHC+xpkN+C6yEKOTEanorR5zMCSfHlLzFw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":26.93,"multihop_port":26101,"v2ray":"146.70.192.138","isp":"M247"},{"hostname":"sg2.wg.ivpn.net","dns_name":"sg2.gw.ivpn.net","host":"37.120.151.122","public_key":"hSg0At4uwuIhmTy5UT4fRbi5AN6JO2ZWTuIvqd4nHCE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":88.88,"multihop_port":20950,"v2ray":"37.120.151.125","isp":"M247"}]},{"gateway":"sk.wg.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"Datapacket","hosts":[{"hostname":"sk2.wg.ivpn.net","dns_name":"sk2.gw.ivpn.net","host":"156.146.40.205","public_key":"xxEl8CIjNLpig6fp7z4USHZLK35Nu5HENFNwTdeAbzU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":31.71,"multihop_port":20400,"v2ray":"156.146.40.208","isp":"Datapacket"}]},{"gateway":"tw.wg.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.wg.ivpn.net","dns_name":"tw1.gw.ivpn.net","host":"185.189.160.123","public_key":"fMTCCbbKqPp60fkqnaQvJ9mX2r6zBlt7xhUp8sGfJQY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":21.11,"multihop_port":20820,"v2ray":"185.189.160.21","isp":"TheGigabit"}]},{"gateway":"ua.wg.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kyiv","latitude":50.4754,"longitude":30.5461,"isp":"Server.ua","hosts":[{"hostname":"ua2.wg.ivpn.net","dns_name":"ua2.gw.ivpn.net","host":"91.232.28.116","public_key":"WmMJBUyI0tdByPhMyvKWAbQMRE1I3ilPi/fIeG3m+UE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.31,"multihop_port":20450,"v2ray":"91.232.28.119","isp":"Server.ua"}]},{"gateway":"us-az.wg.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.455,"longitude":-111.978,"isp":"Tzulo","hosts":[{"hostname":"us-az2.wg.ivpn.net","dns_name":"us-az2.gw.ivpn.net","host":"198.44.133.198","public_key":"IXV6W/NAMdIyf5QpndaLOVDgwupq0hQIxPGLb580cy4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.15,"multihop_port":20350,"v2ray":"198.44.133.200","isp":"Tzulo"}]},{"gateway":"us-ca-sjc.wg.ivpn.net","country_code":"US","country":"United States","city":"San Jose, CA","latitude":37.408,"longitude":-121.893,"isp":"Tzulo","hosts":[{"hostname":"us-ca-sjc1.wg.ivpn.net","dns_name":"us-ca-sjc1.gw.ivpn.net","host":"198.44.134.38","public_key":"HJWSwK2AWdygxWVA6QzbsvyvGYUiLJWe4qZIiEZXMDo=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.56,"multihop_port":20370,"v2ray":"198.44.134.40","isp":"Tzulo"}]},{"gateway":"us-ca.wg.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Tzulo","hosts":[{"hostname":"us-ca3.wg.ivpn.net","dns_name":"us-ca3.gw.ivpn.net","host":"198.54.129.100","public_key":"J5+Bx84LxNPdWEhewOvBV/fGWiDluIBlAcr1QlJZil8=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.62,"multihop_port":21301,"v2ray":"198.54.129.212","isp":"Tzulo"},{"hostname":"us-ca5.wg.ivpn.net","dns_name":"us-ca5.gw.ivpn.net","host":"185.180.13.41","public_key":"FGl78s9Ct6xNamQ2/CtAyXwGePrrU0kiZxfM27pm8XA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.49,"multihop_port":20940,"v2ray":"185.180.13.38","isp":"Datapacket"},{"hostname":"us-ca6.wg.ivpn.net","dns_name":"us-ca6.gw.ivpn.net","host":"185.152.67.20","public_key":"gFPUMq/KAr5KXWAeIH1wyPJ3lzjJ70zkV7GqMP15ymA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.96,"multihop_port":20340,"v2ray":"185.152.67.22","isp":"Datapacket"},{"hostname":"us-ca7.wg.ivpn.net","dns_name":"us-ca7.gw.ivpn.net","host":"198.54.129.22","public_key":"BzJnDnpeR0oGDaXnkONIZWrTQtaaWl79oCAQuLi8umY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.77,"multihop_port":20360,"v2ray":"198.54.129.195","isp":"Tzulo"}]},{"gateway":"us-co.wg.ivpn.net","country_code":"US","country":"United States","city":"Denver, CO","latitude":39.749,"longitude":-104.997,"isp":"Datapacket","hosts":[{"hostname":"us-co1.wg.ivpn.net","dns_name":"us-co1.gw.ivpn.net","host":"121.127.44.29","public_key":"eW3Xf/azDAah8xaM0z5rMxJZkWM6YlWuZsEbMwy9j2Y=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":25.07,"multihop_port":20560,"v2ray":"121.127.44.31","isp":"Datapacket"}]},{"gateway":"us-fl.wg.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.776,"longitude":-80.193,"isp":"Datapacket","hosts":[{"hostname":"us-fl2.wg.ivpn.net","dns_name":"us-fl2.gw.ivpn.net","host":"195.181.163.83","public_key":"HWDCBq3k20Ky72W4wMrAtCITY0fwqNVooHzKEKFtHCc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":10.81,"multihop_port":20380,"v2ray":"195.181.163.86","isp":"Datapacket"}]},{"gateway":"us-ga.wg.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.749,"longitude":-84.387,"isp":"Datapacket","hosts":[{"hostname":"us-ga3.wg.ivpn.net","dns_name":"us-ga3.gw.ivpn.net","host":"185.93.0.212","public_key":"jD8h+pL5/d6fmYcTzl0lR8AWzQVN5XkwRFSmM/3NcDM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.56,"multihop_port":20900,"v2ray":"185.93.0.217","isp":"Datapacket"},{"hostname":"us-ga4.wg.ivpn.net","dns_name":"us-ga4.gw.ivpn.net","host":"67.213.209.3","public_key":"DBOSDaNKSauFlqPE62a3bVBeJ5VsLdx9Lms27hpajm0=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.6,"multihop_port":20310,"v2ray":"67.213.209.5","isp":"Ingenuity"},{"hostname":"us-ga5.wg.ivpn.net","dns_name":"us-ga5.gw.ivpn.net","host":"198.44.138.54","public_key":"4BIZI97EGcwqZBg5S+nba3rZ18CL0wG7I872Wj0WATY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.41,"multihop_port":20390,"v2ray":"198.44.138.56","isp":"Tzulo"}]},{"gateway":"us-il.wg.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.887,"longitude":-87.632,"isp":"Datapacket","hosts":[{"hostname":"us-il3.wg.ivpn.net","dns_name":"us-il3.gw.ivpn.net","host":"89.187.181.116","public_key":"hku9gjamhoii8OvxZgx+TdUDIkOAQYFu39qbav2AyUQ=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":18.84,"multihop_port":20930,"v2ray":"89.187.181.121","isp":"Datapacket"},{"hostname":"us-il4.wg.ivpn.net","dns_name":"us-il4.gw.ivpn.net","host":"68.235.50.198","public_key":"JeKmL8RcIHoHbjFcrStJL8uCHaoZ+jvY/M0SkLA93kE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":12.77,"multihop_port":20410,"v2ray":"68.235.50.200","isp":"Tzulo"},{"hostname":"us-il5.wg.ivpn.net","dns_name":"us-il5.gw.ivpn.net","host":"68.235.50.214","public_key":"TLS6jY8aHviLDDywQ6iCeEM+b+YI2l3YSD6UtGZ5okY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.66,"multihop_port":20420,"v2ray":"68.235.50.216","isp":"Tzulo"}]},{"gateway":"us-ma.wg.ivpn.net","country_code":"US","country":"United States","city":"Boston, MA","latitude":42.376,"longitude":-71.078,"isp":"Datapacket","hosts":[{"hostname":"us-ma1.wg.ivpn.net","dns_name":"us-ma1.gw.ivpn.net","host":"109.61.86.50","public_key":"JtIx5H4hqFUhwyrnlVlvthQgwNKJTKnpmT7Ld1XcPhM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":15.06,"multihop_port":20870,"v2ray":"109.61.86.52","isp":"Datapacket"}]},{"gateway":"us-nj.wg.ivpn.net","country_code":"US","country":"United States","city":"Secaucus, NJ","latitude":40.778,"longitude":-74.069,"isp":"Ingenuity","hosts":[{"hostname":"us-nj1.wg.ivpn.net","dns_name":"us-nj1.gw.ivpn.net","host":"69.4.232.51","public_key":"ZffXqS8uJHDHLwTuYAVNhYn6IbWvcM2FsdCCLugHCCw=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":13.15,"multihop_port":20320,"v2ray":"69.4.232.53","isp":"Ingenuity"},{"hostname":"us-nj4.wg.ivpn.net","dns_name":"us-nj4.gw.ivpn.net","host":"194.36.111.54","public_key":"1Te4AfL1yKo2k4jzPALnRPfKE3YSzXKo4XIRHPz5FxI=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":30.45,"multihop_port":27401,"v2ray":"37.120.202.42","isp":"M247"}]},{"gateway":"us-nv.wg.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.wg.ivpn.net","dns_name":"us-nv1.gw.ivpn.net","host":"185.242.5.37","public_key":"PRpvAZyoNWNm/KHlqafjtYoZtn1PkIPylUE4WbuYmgM=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.85,"multihop_port":26501,"v2ray":"185.242.5.146","isp":"M247"}]},{"gateway":"us-ny.wg.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny2.wg.ivpn.net","dns_name":"us-ny2.gw.ivpn.net","host":"212.103.48.195","public_key":"c7DwY2uT+6ulWAJ5u8qJNWHroA0qyJLcdNzf/f2kkhs=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.16,"multihop_port":21801,"v2ray":"212.103.48.199","isp":"M247"},{"hostname":"us-ny3.wg.ivpn.net","dns_name":"us-ny3.gw.ivpn.net","host":"89.187.178.145","public_key":"m5/Ssw9SN3WuE+yD/fAsH5G8iuI8TcDGEiZZnPgiMCc=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.25,"multihop_port":27601,"v2ray":"89.187.178.150","isp":"Datapacket"},{"hostname":"us-ny4.wg.ivpn.net","dns_name":"us-ny4.gw.ivpn.net","host":"91.132.137.170","public_key":"6/tjvgb7HFl7UuvBSegolxa1zKr3iSlDrlCexCmhAGE=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":6.03,"multihop_port":20990,"v2ray":"91.132.137.173","isp":"M247"}]},{"gateway":"us-tx.wg.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.912,"longitude":-96.785,"isp":"Datapacket","hosts":[{"hostname":"us-tx4.wg.ivpn.net","dns_name":"us-tx4.gw.ivpn.net","host":"89.187.164.118","public_key":"6jIFbOQFIW7HalTcJBq9hx28Yp9C11ZwtEojpGDqfFA=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.34,"multihop_port":20300,"v2ray":"89.187.164.120","isp":"Datapacket"},{"hostname":"us-tx5.wg.ivpn.net","dns_name":"us-tx5.gw.ivpn.net","host":"206.217.207.179","public_key":"9XqprMJxKlMFVP7uHm4GR6dHnu2qNNAFfWY/w9leInY=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":5.56,"multihop_port":20330,"v2ray":"206.217.207.181","isp":"Ingenuity"},{"hostname":"us-tx6.wg.ivpn.net","dns_name":"us-tx6.gw.ivpn.net","host":"198.44.137.198","public_key":"ovdPq1PhjsqSrYgH4LbLyKNkXs+q5w9YvG31B81TLyU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.86,"multihop_port":20430,"v2ray":"198.44.137.200","isp":"Tzulo"}]},{"gateway":"us-ut.wg.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.wg.ivpn.net","dns_name":"us-ut1.gw.ivpn.net","host":"206.190.145.92","public_key":"KirI7bpxD186CuYiOqNHF+QUe6YmRYf6CN3pXWOJT2k=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":9.15,"multihop_port":24401,"v2ray":"206.190.145.88","isp":"100TB"}]},{"gateway":"us-va.wg.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.wg.ivpn.net","dns_name":"us-va1.gw.ivpn.net","host":"37.19.206.106","public_key":"ZCnZK6U+cRuP/WgzIDb/P6UG2rX/KyCRd5vJ1hAbr2E=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":7.15,"multihop_port":27701,"v2ray":"37.19.206.111","isp":"Datapacket"}]},{"gateway":"us-wa.wg.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.wg.ivpn.net","dns_name":"us-wa2.gw.ivpn.net","host":"198.44.131.4","public_key":"VcrOOozBUCIURU0AnqMAE7AkMmC7Qrp+j/PzPbgbalU=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":16.82,"multihop_port":27801,"v2ray":"198.44.131.20","isp":"Tzulo"}]},{"gateway":"za.wg.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.wg.ivpn.net","dns_name":"za1.gw.ivpn.net","host":"169.150.238.108","public_key":"tgrAA+uJZppS9esgOi0pe3rHajQQ7c/KF8WPOua6qy4=","local_ip":"172.16.0.1/12","ipv6":{"local_ip":"fd00:4956:504e:ffff::/96"},"load":8.34,"multihop_port":20840,"v2ray":"169.150.238.109","isp":"Datapacket"}]}],"openvpn":[{"gateway":"ar.gw.ivpn.net","country_code":"AR","country":"Argentina","city":"Buenos Aires","latitude":-34.614,"longitude":-58.371,"isp":"Datapacket","hosts":[{"hostname":"ar1.gw.ivpn.net","dns_name":"ar1.gw.ivpn.net","host":"149.22.83.97","load":11.08,"multihop_port":20600,"obfs":{"obfs3_multihop_port":20601,"obfs4_multihop_port":20602,"obfs4_key":"nYpMZiGcjWbjQ+8GzltcIqSwcVS4u6m8q7A7szcJHNQ1XHrpHk9r99bHCpzfvnQmNAjdWw"},"v2ray":"149.22.83.102","isp":"Datapacket"}]},{"gateway":"at.gw.ivpn.net","country_code":"AT","country":"Austria","city":"Vienna","latitude":48.2,"longitude":16.3666,"isp":"M247","hosts":[{"hostname":"at1.gw.ivpn.net","dns_name":"at1.gw.ivpn.net","host":"185.244.212.66","load":86.14,"multihop_port":25601,"obfs":{"obfs3_multihop_port":25602,"obfs4_multihop_port":25603,"obfs4_key":"75HhQC6n6ctp9Fa9wCvEnc6ip5FnEfuIGc+dVNLH4M15FjB/Ve6bI1b8lYFhk6T+4/HkDQ"},"v2ray":"146.70.146.226","isp":"M247"}]},{"gateway":"au-nsw.gw.ivpn.net","country_code":"AU","country":"Australia","city":"Sydney","latitude":-33.92,"longitude":151.1852,"isp":"M247","hosts":[{"hostname":"au-nsw1.gw.ivpn.net","dns_name":"au-nsw1.gw.ivpn.net","host":"46.102.153.242","load":18.17,"multihop_port":26601,"obfs":{"obfs3_multihop_port":26602,"obfs4_multihop_port":26603,"obfs4_key":"/rjoeDjduOFq1UvT332vhS398h1RP5hC3m7sDJKNSyJ6TO8mkcxWAYILw0i+bgS/3JD5YA"},"v2ray":"217.138.205.90","isp":"M247"},{"hostname":"au-nsw2.gw.ivpn.net","dns_name":"au-nsw2.gw.ivpn.net","host":"146.70.78.74","load":16.66,"multihop_port":27901,"obfs":{"obfs3_multihop_port":27902,"obfs4_multihop_port":27903,"obfs4_key":"qtdQ5krD9EQFR98xNo/v5cmGb10wqt0Om9pYMIHWQh4oz5xcAXj32rViEyN0bnkkhaZnBA"},"v2ray":"146.70.210.26","isp":"M247"}]},{"gateway":"be.gw.ivpn.net","country_code":"BE","country":"Belgium","city":"Brussels","latitude":50.8333,"longitude":4.3333,"isp":"M247","hosts":[{"hostname":"be1.gw.ivpn.net","dns_name":"be1.gw.ivpn.net","host":"194.187.251.10","load":47.42,"multihop_port":25701,"obfs":{"obfs3_multihop_port":25702,"obfs4_multihop_port":25703,"obfs4_key":"cN8i60FUVy2mmGpy+tkQAz8hu/N0EGPq8cZwIotEDwdhAYdLV+ATes/AEjzdub2K68TlYg"},"v2ray":"37.120.143.130","isp":"M247"},{"hostname":"be2.gw.ivpn.net","dns_name":"be2.gw.ivpn.net","host":"79.127.224.161","load":17.82,"multihop_port":20610,"obfs":{"obfs3_multihop_port":20611,"obfs4_multihop_port":20612,"obfs4_key":"C0/5wLYnt+Ga3iPeVBVWCNTz3P4FE13ggOlgzRnOZHLtDJyVSvoN+gPI62gmOaPmh+LyFQ"},"v2ray":"79.127.224.166","isp":"Datapacket"}]},{"gateway":"bg.gw.ivpn.net","country_code":"BG","country":"Bulgaria","city":"Sofia","latitude":42.6833,"longitude":23.3167,"isp":"M247","hosts":[{"hostname":"bg1.gw.ivpn.net","dns_name":"bg1.gw.ivpn.net","host":"82.102.23.18","load":28.19,"multihop_port":25901,"obfs":{"obfs3_multihop_port":25902,"obfs4_multihop_port":25903,"obfs4_key":"K+mCw9+zy/8pBQt6IUKRlg2eJ3DCnJ1BvIccLq/6A2D6HoZddyDnZQYb2Sb2e464dVgBWw"},"v2ray":"146.70.53.82","isp":"M247"}]},{"gateway":"br.gw.ivpn.net","country_code":"BR","country":"Brazil","city":"Franca","latitude":-20.53,"longitude":-47.39,"isp":"Qnax","hosts":[{"hostname":"br1.gw.ivpn.net","dns_name":"br1.gw.ivpn.net","host":"45.162.230.50","load":13.29,"multihop_port":26701,"obfs":{"obfs3_multihop_port":26702,"obfs4_multihop_port":26703,"obfs4_key":"h4bBkocahWveuv/nWPRMYXBTw95ExTiXwmoydkNlV6hgfy8/ZjaKc34rqTuOyOH+CK7OZw"},"v2ray":"45.162.230.186","isp":"Qnax"}]},{"gateway":"ca-bc.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Vancouver","latitude":49.231,"longitude":-122.8412,"isp":"Tech Futures","hosts":[{"hostname":"ca-bc1.gw.ivpn.net","dns_name":"ca-bc1.gw.ivpn.net","host":"104.193.135.228","load":13.94,"multihop_port":20550,"obfs":{"obfs3_multihop_port":20551,"obfs4_multihop_port":20552,"obfs4_key":"EE2sCZ06sv+v/UIezUZLFrey101UpbHVG8ZD0G303wCzusXbkK4Bi+tzg0J7DM9v7YLwBg"},"v2ray":"104.193.135.233","isp":"Tech Futures"}]},{"gateway":"ca-on.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Toronto","latitude":43.7,"longitude":-79.42,"isp":"Amanah","hosts":[{"hostname":"ca-on1.gw.ivpn.net","dns_name":"ca-on1.gw.ivpn.net","host":"184.75.215.2","load":18.28,"multihop_port":20580,"obfs":{"obfs3_multihop_port":20581,"obfs4_multihop_port":20582,"obfs4_key":"ndx/mul0z+GgeDfKkqoSa8RuqCBA3MYWLnoBtH6YqOwWmjQY1wsotr80+nOhW4bRKu3HIw"},"v2ray":"184.75.215.7","isp":"Amanah"},{"hostname":"ca-on2.gw.ivpn.net","dns_name":"ca-on2.gw.ivpn.net","host":"162.219.176.18","load":12.11,"multihop_port":20590,"obfs":{"obfs3_multihop_port":20591,"obfs4_multihop_port":20592,"obfs4_key":"2jIHUkKQYA8cNacmXLYjMYioV3dkN8nr0gV4r9D9nwFB42Q5IpUYadk0oyk47Js+z36gWw"},"v2ray":"162.219.176.23","isp":"Amanah"}]},{"gateway":"ca-qc.gw.ivpn.net","country_code":"CA","country":"Canada","city":"Montreal","latitude":45.499,"longitude":-73.57,"isp":"M247","hosts":[{"hostname":"ca-qc1.gw.ivpn.net","dns_name":"ca-qc1.gw.ivpn.net","host":"37.120.130.60","load":13.7,"multihop_port":20960,"obfs":{"obfs3_multihop_port":20961,"obfs4_multihop_port":20962,"obfs4_key":"bsOfJuEd+ZAuslrnkTkaBL0zzGt1UZyppbGOE+DV9fw0H6G63gnvNtmNRgffcnPJs9XeWg"},"v2ray":"37.120.130.61","isp":"M247"},{"hostname":"ca-qc2.gw.ivpn.net","dns_name":"ca-qc2.gw.ivpn.net","host":"87.101.92.26","load":15.9,"multihop_port":27001,"obfs":{"obfs3_multihop_port":27002,"obfs4_multihop_port":27003,"obfs4_key":"hfhRyd1nnfLN2QcWgqQo2iDkj6+Z71t2h4dbcsmBT5pZNBpWg3pbRfGQ0u6RCanCyK6xQA"},"v2ray":"89.47.234.130","isp":"M247"}]},{"gateway":"ch.gw.ivpn.net","country_code":"CH","country":"Switzerland","city":"Zurich","latitude":47.38,"longitude":8.55,"isp":"M247","hosts":[{"hostname":"ch1.gw.ivpn.net","dns_name":"ch1.gw.ivpn.net","host":"185.212.170.138","load":25.31,"multihop_port":23601,"obfs":{"obfs3_multihop_port":23602,"obfs4_multihop_port":23603,"obfs4_key":"ELnV4JNKu0vUNd3J+QDn64yfZtqM0hNN6O5n6RkDLHbeSDBZmxP1N4dlwwChV/uySX+DEQ"},"v2ray":"37.120.213.138","isp":"M247"},{"hostname":"ch2.gw.ivpn.net","dns_name":"ch2.gw.ivpn.net","host":"81.17.24.162","load":11.97,"multihop_port":20880,"obfs":{"obfs3_multihop_port":20881,"obfs4_multihop_port":20882,"obfs4_key":"XeGJcOeMYGPRN+xNlmd8lDSt71ae6BHF7kzaYXs9bVSv80cgoGTKQZ5+2VW6UHNURiI8aQ"},"v2ray":"81.17.24.167","isp":"Privatelayer"},{"hostname":"ch3.gw.ivpn.net","dns_name":"ch3.gw.ivpn.net","host":"141.255.166.194","load":18.12,"multihop_port":22901,"obfs":{"obfs3_multihop_port":22902,"obfs4_multihop_port":22903,"obfs4_key":"oNaH5sHCPGGk5m3/VMOrTDL+m1qsJrze+bqDs78vhOYBpjx5Jjq5TXu1dXNfDJCKNmKnUA"},"v2ray":"179.43.167.66","isp":"Privatelayer"}]},{"gateway":"cz.gw.ivpn.net","country_code":"CZ","country":"Czech Republic","city":"Prague","latitude":50.0833,"longitude":14.466,"isp":"Datapacket","hosts":[{"hostname":"cz1.gw.ivpn.net","dns_name":"cz1.gw.ivpn.net","host":"195.181.160.167","load":19.92,"multihop_port":25201,"obfs":{"obfs3_multihop_port":25202,"obfs4_multihop_port":25203,"obfs4_key":"JZ3PtIyflM3VwVow2vqi08OxddOWSx9j6B6yZSGoZLs9QE0hzSAj3ZBWEsCKFeQ2RcAoCQ"},"v2ray":"195.181.160.184","isp":"Datapacket"}]},{"gateway":"de.gw.ivpn.net","country_code":"DE","country":"Germany","city":"Frankfurt","latitude":50.1,"longitude":8.675,"isp":"Leaseweb","hosts":[{"hostname":"de2.gw.ivpn.net","dns_name":"de2.gw.ivpn.net","host":"178.162.211.114","load":21.16,"multihop_port":22001,"obfs":{"obfs3_multihop_port":22002,"obfs4_multihop_port":22003,"obfs4_key":"dEhLA4ZsvVP8+PRvlSHKwmW8JyzR1Bwy7+BFKF7Ux4L2B5YvdqqOrv/8eHliEj2mm2Z8Iw"},"v2ray":"178.162.222.166","isp":"Leaseweb"},{"hostname":"de3.gw.ivpn.net","dns_name":"de3.gw.ivpn.net","host":"146.70.160.162","load":28.26,"multihop_port":21050,"obfs":{"obfs3_multihop_port":21051,"obfs4_multihop_port":21052,"obfs4_key":"IFf+iLf7lgc0K81tQkZL5zndlWflvnLZyYSGGNLtSXLLivlIeBuXCPFDJ7fkL3TOd5uhOA"},"v2ray":"146.70.160.166","isp":"M247"},{"hostname":"de4.gw.ivpn.net","dns_name":"de4.gw.ivpn.net","host":"185.102.219.40","load":14.56,"multihop_port":20920,"obfs":{"obfs3_multihop_port":20921,"obfs4_multihop_port":20922,"obfs4_key":"LzIBOv6zUOyI3/VfDLfqNmOTxCOHRo3bWirKHOf0GdJOPlmdZGHG9kH/aJwHNemsY0fWew"},"v2ray":"185.102.219.56","isp":"Datapacket"}]},{"gateway":"dk.gw.ivpn.net","country_code":"DK","country":"Denmark","city":"Copenhagen","latitude":55.6786,"longitude":12.5635,"isp":"M247","hosts":[{"hostname":"dk1.gw.ivpn.net","dns_name":"dk1.gw.ivpn.net","host":"185.245.84.226","load":100,"multihop_port":25501,"obfs":{"obfs3_multihop_port":25502,"obfs4_multihop_port":25503,"obfs4_key":"ngjtv9UISX4tB5AkBnrEN2TrAnUqVwNZ688VqDlS4BDxQXJeJF3ynZtngRqeowhEahsccQ"},"v2ray":"193.29.107.226","isp":"M247"},{"hostname":"dk2.gw.ivpn.net","dns_name":"dk2.gw.ivpn.net","host":"121.127.45.36","load":8.7,"multihop_port":20620,"obfs":{"obfs3_multihop_port":20621,"obfs4_multihop_port":20622,"obfs4_key":"D0UIq0H1cEggbQt8LPd92fe5oqlo7cip3HQBYzX7W7+nFo9F3x87yuL6TvvUCZrSwbIVAg"},"v2ray":"121.127.45.41","isp":"Datapacket"}]},{"gateway":"es.gw.ivpn.net","country_code":"ES","country":"Spain","city":"Madrid","latitude":40.4,"longitude":-3.6834,"isp":"Datapacket","hosts":[{"hostname":"es1.gw.ivpn.net","dns_name":"es1.gw.ivpn.net","host":"185.93.3.193","load":44.46,"multihop_port":21501,"obfs":{"obfs3_multihop_port":21502,"obfs4_multihop_port":21503,"obfs4_key":"x4A9SBY5yzPKH1QOkEsGYcIR2JA/Pu393jv/ZSg4YO2DsVhr3TQFxcMO3QhD9iSF48smJA"},"v2ray":"185.93.3.196","isp":"Datapacket"}]},{"gateway":"fi.gw.ivpn.net","country_code":"FI","country":"Finland","city":"Helsinki","latitude":60.1756,"longitude":24.9341,"isp":"Creanova","hosts":[{"hostname":"fi1.gw.ivpn.net","dns_name":"fi1.gw.ivpn.net","host":"185.112.82.12","load":28.42,"multihop_port":26001,"obfs":{"obfs3_multihop_port":26002,"obfs4_multihop_port":26003,"obfs4_key":"SvvSpGiFctjs4n2wZGnZUf9fAL8wag70SrA3FX+9f3Sq+KgBn+/8P6fE3239ezemg9svLA"},"v2ray":"185.103.110.231","isp":"Creanova"}]},{"gateway":"fr.gw.ivpn.net","country_code":"FR","country":"France","city":"Paris","latitude":48.8667,"longitude":2.3333,"isp":"Datapacket","hosts":[{"hostname":"fr1.gw.ivpn.net","dns_name":"fr1.gw.ivpn.net","host":"185.246.211.179","load":18.8,"multihop_port":23401,"obfs":{"obfs3_multihop_port":23402,"obfs4_multihop_port":23403,"obfs4_key":"CMf0pNZ46nFdG0Tpa3hE0cK9wtUAReJL7HN66G9Jq3tlrTSWrU0DLf7sCQgXV+WFoc8iaw"},"v2ray":"185.246.211.184","isp":"Datapacket"}]},{"gateway":"gb-man.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"Manchester","latitude":53.451,"longitude":-2.319,"isp":"M247","hosts":[{"hostname":"gb-man1.gw.ivpn.net","dns_name":"gb-man1.gw.ivpn.net","host":"185.195.202.20","load":7.78,"multihop_port":26901,"obfs":{"obfs3_multihop_port":26902,"obfs4_multihop_port":26903,"obfs4_key":"WuP3pMrsQA+uAC72sV+Y62E1uvOWcnbTNJCmRHXqtWbbYzECF5swu62dzD/JOKoa5t0tGQ"},"v2ray":"185.195.202.25","isp":"M247"}]},{"gateway":"gb.gw.ivpn.net","country_code":"GB","country":"United Kingdom","city":"London","latitude":51.5,"longitude":-0.1167,"isp":"Datapacket","hosts":[{"hostname":"gb1.gw.ivpn.net","dns_name":"gb1.gw.ivpn.net","host":"185.59.221.133","load":6.77,"multihop_port":20801,"obfs":{"obfs3_multihop_port":20802,"obfs4_multihop_port":20803,"obfs4_key":"5whTESvZxQE28wKqJWZ9fQFy09d8//GNaPDeYHVR+FJZTyI+DMS6qX4Mt2FKSf/zBToaDg"},"v2ray":"185.59.221.159","isp":"Datapacket"},{"hostname":"gb2.gw.ivpn.net","dns_name":"gb2.gw.ivpn.net","host":"185.59.221.88","load":6.59,"multihop_port":24201,"obfs":{"obfs3_multihop_port":24202,"obfs4_multihop_port":24203,"obfs4_key":"4hrCOgPsRfmnQ6cLvV5mtM2XZCRS/DXG/izYSg2qZC+WJ0GsnhTlKByPM2iJ555MaM8vJA"},"v2ray":"185.59.221.226","isp":"Datapacket"},{"hostname":"gb3.gw.ivpn.net","dns_name":"gb3.gw.ivpn.net","host":"81.92.202.116","load":8.41,"multihop_port":20980,"obfs":{"obfs3_multihop_port":20981,"obfs4_multihop_port":20982,"obfs4_key":"GIqTpQh4aDEYbwpwhF23HNAr/vVqSqRwYxqe2mdkKzapfj0fd9ZLrM2jG2ISVdSjNBhYRQ"},"v2ray":"81.92.202.117","isp":"M247"}]},{"gateway":"gr.gw.ivpn.net","country_code":"GR","country":"Greece","city":"Athens","latitude":37.871,"longitude":23.8707,"isp":"Datapacket","hosts":[{"hostname":"gr1.gw.ivpn.net","dns_name":"gr1.gw.ivpn.net","host":"169.150.252.110","load":11.15,"multihop_port":20540,"obfs":{"obfs3_multihop_port":20541,"obfs4_multihop_port":20542,"obfs4_key":"zyWssFvuJOCSBixUnRaF0qk+BLJQbnm7YpZ5oSVk5ElIksjA7OvwigQBc2NF2kt9/lQSEw"},"v2ray":"169.150.252.115","isp":"Datapacket"}]},{"gateway":"hk.gw.ivpn.net","country_code":"HK","country":"Hong Kong","city":"Hong Kong","latitude":22.305,"longitude":114.185,"isp":"Leaseweb","hosts":[{"hostname":"hk2.gw.ivpn.net","dns_name":"hk2.gw.ivpn.net","host":"209.58.188.13","load":28.51,"multihop_port":27501,"obfs":{"obfs3_multihop_port":27502,"obfs4_multihop_port":27503,"obfs4_key":"GIunWjiq00Piv3Xf4VeMkmUQ8NzD8sxRkSIbA3bxrU4LhPVth+3qM2zQwI4GesQDCDY5RA"},"v2ray":"64.120.120.237","isp":"Leaseweb"},{"hostname":"hk3.gw.ivpn.net","dns_name":"hk3.gw.ivpn.net","host":"118.107.244.184","load":7.25,"multihop_port":20460,"obfs":{"obfs3_multihop_port":20461,"obfs4_multihop_port":20462,"obfs4_key":"wnI0gz3hLM9VhkABSncBIsGERgn16UzTxkj7dEeYYo/y2Wu0/w24rfriA5KL7ugpTyvEFg"},"v2ray":"118.107.244.207","isp":"TheGigabit"}]},{"gateway":"hr.gw.ivpn.net","country_code":"HR","country":"Croatia","city":"Zagreb","latitude":45.811,"longitude":15.977,"isp":"Datapacket","hosts":[{"hostname":"hr1.gw.ivpn.net","dns_name":"hr1.gw.ivpn.net","host":"169.150.242.1","load":13.57,"multihop_port":20860,"obfs":{"obfs3_multihop_port":20861,"obfs4_multihop_port":20862,"obfs4_key":"MndMzdMCy8m0bY1LPNh1GAWQXhTom4Jr5eSrkMGTF6n2r3hhYd1lGPM+Q417OB+/dz2qDA"},"v2ray":"169.150.242.42","isp":"Datapacket"}]},{"gateway":"hu.gw.ivpn.net","country_code":"HU","country":"Hungary","city":"Budapest","latitude":47.5,"longitude":19.0833,"isp":"M247","hosts":[{"hostname":"hu1.gw.ivpn.net","dns_name":"hu1.gw.ivpn.net","host":"185.189.114.186","load":54.08,"multihop_port":25401,"obfs":{"obfs3_multihop_port":25402,"obfs4_multihop_port":25403,"obfs4_key":"2TwZqxAakni0S4S3ulOIqMZimqqug0KCr6pNREN6KytrtIh486nkJyiFRqaYZlx+FlxEcg"},"v2ray":"37.120.144.178","isp":"M247"}]},{"gateway":"ie.gw.ivpn.net","country_code":"IE","country":"Ireland","city":"Dublin","latitude":53.337,"longitude":-6.259,"isp":"Datapacket","hosts":[{"hostname":"ie1.gw.ivpn.net","dns_name":"ie1.gw.ivpn.net","host":"87.249.137.136","load":33.61,"multihop_port":20850,"obfs":{"obfs3_multihop_port":20851,"obfs4_multihop_port":20852,"obfs4_key":"tWiVshynDq75bW24Ch2p9nRjLF4wa7YWHy9xCX5hJ5J0lZpflq8L/UluCfi51nxZDTouZA"},"v2ray":"87.249.137.140","isp":"Datapacket"}]},{"gateway":"il.gw.ivpn.net","country_code":"IL","country":"Israel","city":"Holon, Tel Aviv","latitude":32.08,"longitude":34.77,"isp":"HQServ","hosts":[{"hostname":"il1.gw.ivpn.net","dns_name":"il1.gw.ivpn.net","host":"185.191.204.130","load":11.93,"multihop_port":27301,"obfs":{"obfs3_multihop_port":27302,"obfs4_multihop_port":27303,"obfs4_key":"DysuSM7UWjquj4BAVYf6mOUnRKfY1QXs17MXiV5aYapFfOkQPpx5nQPVQ2M+rLDxN9TSRg"},"v2ray":"185.191.204.135","isp":"HQServ"}]},{"gateway":"is.gw.ivpn.net","country_code":"IS","country":"Iceland","city":"Reykjavik","latitude":64.15,"longitude":-21.95,"isp":"Advania","hosts":[{"hostname":"is1.gw.ivpn.net","dns_name":"is1.gw.ivpn.net","host":"82.221.107.178","load":70.39,"multihop_port":23501,"obfs":{"obfs3_multihop_port":23502,"obfs4_multihop_port":23503,"obfs4_key":"xx/Lor3q60/pVh4PKWi0GZaw64pPXFTkALnGlvRaBMiPRkFilr7KhYmPInDnZxzr4c4AIw"},"v2ray":"82.221.107.183","isp":"Advania"}]},{"gateway":"it.gw.ivpn.net","country_code":"IT","country":"Italy","city":"Milan","latitude":45.47,"longitude":9.205,"isp":"Datapacket","hosts":[{"hostname":"it2.gw.ivpn.net","dns_name":"it2.gw.ivpn.net","host":"84.17.59.137","load":14.1,"multihop_port":21100,"obfs":{"obfs3_multihop_port":21101,"obfs4_multihop_port":21102,"obfs4_key":"8msjDzd52ALBZF9Ej8i6BYXc4qSTiG8P739Px77EHp0uOVd5/VvDhrBfGcBQxDIgBlUeLw"},"v2ray":"84.17.59.146","isp":"Datapacket"}]},{"gateway":"jp.gw.ivpn.net","country_code":"JP","country":"Japan","city":"Tokyo","latitude":35.62,"longitude":139.74,"isp":"TheGigabit","hosts":[{"hostname":"jp2.gw.ivpn.net","dns_name":"jp2.gw.ivpn.net","host":"185.135.77.35","load":8.67,"multihop_port":20830,"obfs":{"obfs3_multihop_port":20831,"obfs4_multihop_port":20832,"obfs4_key":"giZJF4edg7wcjxbdgD2RjFcF9QAzExLHIJYjm2cLLtx7MrxP0p96mIFj9T8LSQotKB63fA"},"v2ray":"185.135.77.100","isp":"TheGigabit"}]},{"gateway":"lu.gw.ivpn.net","country_code":"LU","country":"Luxembourg","city":"Luxembourg","latitude":49.6113,"longitude":6.1294,"isp":"EstNOC","hosts":[{"hostname":"lu2.gw.ivpn.net","dns_name":"lu2.gw.ivpn.net","host":"185.221.132.178","load":54.44,"multihop_port":27212,"obfs":{"obfs3_multihop_port":27213,"obfs4_multihop_port":27214,"obfs4_key":"5zv2iXbmjV6wI3IEGxSZNfOnIIzfeehDF4FxkwcPi5sqDqa+6ecU2Nx55qIRstLfyzNEJA"},"v2ray":"185.221.132.183","isp":"EstNOC"}]},{"gateway":"mx.gw.ivpn.net","country_code":"MX","country":"Mexico","city":"Querétaro","latitude":20.574,"longitude":-100.2965,"isp":"Datapacket","hosts":[{"hostname":"mx1.gw.ivpn.net","dns_name":"mx1.gw.ivpn.net","host":"121.127.43.193","load":20.1,"multihop_port":20570,"obfs":{"obfs3_multihop_port":20571,"obfs4_multihop_port":20572,"obfs4_key":"j+m8maujVIgwIuDswG84veNQpprZobIszwL5rJ3FZZGD8ES7c3P6pN9aCJW4YJvnRxducg"},"v2ray":"121.127.43.198","isp":"Datapacket"}]},{"gateway":"my.gw.ivpn.net","country_code":"MY","country":"Malaysia","city":"Kuala Lumpur","latitude":3.1494,"longitude":101.706,"isp":"TheGigabit","hosts":[{"hostname":"my1.gw.ivpn.net","dns_name":"my1.gw.ivpn.net","host":"61.4.97.148","load":21.99,"multihop_port":20470,"obfs":{"obfs3_multihop_port":20471,"obfs4_multihop_port":20472,"obfs4_key":"k2hwCe8gDb24K5n2jNXYO5YCl5XCIEhuRwpYSsEhKWorah8OUM1C1crawbfstj+W2IQdOA"},"v2ray":"61.4.97.155","isp":"TheGigabit"}]},{"gateway":"nl.gw.ivpn.net","country_code":"NL","country":"Netherlands","city":"Amsterdam","latitude":52.376,"longitude":4.898,"isp":"Datapacket","hosts":[{"hostname":"nl2.gw.ivpn.net","dns_name":"nl2.gw.ivpn.net","host":"185.102.218.112","load":6.9,"multihop_port":20910,"obfs":{"obfs3_multihop_port":20911,"obfs4_multihop_port":20912,"obfs4_key":"RsYbGPn8XBsjDEqiYyHlNQ9E/whBLlfbFAD0hzA68ArgdzWuD4pvwBhcl0ckNwXhYfNALA"},"v2ray":"185.102.218.99","isp":"Datapacket"},{"hostname":"nl3.gw.ivpn.net","dns_name":"nl3.gw.ivpn.net","host":"95.211.172.68","load":15.42,"multihop_port":23101,"obfs":{"obfs3_multihop_port":23102,"obfs4_multihop_port":23103,"obfs4_key":"eUXsScIg0K0LKVgA8yq2Mc++pfnTQ9nr3gnV8n1NIw7wRqinhO6uuXiSS5J19agQaPK1ew"},"v2ray":"95.211.172.72","isp":"Leaseweb"},{"hostname":"nl4.gw.ivpn.net","dns_name":"nl4.gw.ivpn.net","host":"95.211.172.95","load":5.64,"multihop_port":23201,"obfs":{"obfs3_multihop_port":23202,"obfs4_multihop_port":23203,"obfs4_key":"KEw6WJF+NDOQv7yMvq+dAAAkPbcYJ8PX6pffRd8EM3uaOy2QcpMcdHI7s700Kq/ZvV3HBQ"},"v2ray":"95.211.172.99","isp":"Leaseweb"},{"hostname":"nl5.gw.ivpn.net","dns_name":"nl5.gw.ivpn.net","host":"95.211.187.222","load":35.67,"multihop_port":23901,"obfs":{"obfs3_multihop_port":23902,"obfs4_multihop_port":23903,"obfs4_key":"fcWCrzzatLbk1LNKsuQZKpQrC3ZXwQ85GO5xRS467KJBRDrmvnyMb6ARbLGu+gYkTnNELQ"},"v2ray":"95.211.187.225","isp":"Leaseweb"},{"hostname":"nl6.gw.ivpn.net","dns_name":"nl6.gw.ivpn.net","host":"95.211.187.228","load":10.72,"multihop_port":24101,"obfs":{"obfs3_multihop_port":24102,"obfs4_multihop_port":24103,"obfs4_key":"lT3OGPQS1CwwqtalMExN7qxEoDDBLLlcoh5a6YW3DPj8esEBEG6wY5OfYonxltBzoVu4PA"},"v2ray":"95.211.187.231","isp":"Leaseweb"},{"hostname":"nl7.gw.ivpn.net","dns_name":"nl7.gw.ivpn.net","host":"95.211.95.22","load":17.97,"multihop_port":22501,"obfs":{"obfs3_multihop_port":22502,"obfs4_multihop_port":22503,"obfs4_key":"ffMnq7Gc/D7KWoLckJ4t8nf3zZqVdlffe2lVfUCceOyOTdRApkeJGgEai0TI1z76Yey9Lw"},"v2ray":"95.211.172.107","isp":"Leaseweb"},{"hostname":"nl8.gw.ivpn.net","dns_name":"nl8.gw.ivpn.net","host":"95.211.172.18","load":9.34,"multihop_port":22801,"obfs":{"obfs3_multihop_port":22802,"obfs4_multihop_port":22803,"obfs4_key":"h+u/6VkPDJXySoJ6QEM1hOjWPD58OS4AZPP9ofP/yCWGBQpPoMc78l7C74eFvqKKkFAXDw"},"v2ray":"95.211.198.169","isp":"Leaseweb"}]},{"gateway":"no.gw.ivpn.net","country_code":"NO","country":"Norway","city":"Oslo","latitude":59.9167,"longitude":10.75,"isp":"Servetheworld","hosts":[{"hostname":"no1.gw.ivpn.net","dns_name":"no1.gw.ivpn.net","host":"194.242.10.150","load":27.15,"multihop_port":25301,"obfs":{"obfs3_multihop_port":25302,"obfs4_multihop_port":25303,"obfs4_key":"uhLy//KRu6DrYfgDJmwjC6Fxk5h+MRDNOwFe7qzGTjfOiHLWRSoRx6OdNvzjPPXq0ZJnZg"},"v2ray":"217.170.197.28","isp":"Servetheworld"}]},{"gateway":"pe.gw.ivpn.net","country_code":"PE","country":"Peru","city":"Lima","latitude":-12.089,"longitude":-76.9759,"isp":"Datapacket","hosts":[{"hostname":"pe1.gw.ivpn.net","dns_name":"pe1.gw.ivpn.net","host":"79.127.252.65","load":5.7,"multihop_port":20490,"obfs":{"obfs3_multihop_port":20491,"obfs4_multihop_port":20492,"obfs4_key":"ckCu0Xq5Zt5K3wbkJbtg0JwjxnW08NaY9M/pkkL6ENijKB7pIbYjtVrYdYAX/tH2kIBmeg"},"v2ray":"79.127.252.70","isp":"Datapacket"}]},{"gateway":"pl.gw.ivpn.net","country_code":"PL","country":"Poland","city":"Warsaw","latitude":52.25,"longitude":21,"isp":"Datapacket","hosts":[{"hostname":"pl1.gw.ivpn.net","dns_name":"pl1.gw.ivpn.net","host":"185.246.208.86","load":6.7,"multihop_port":25101,"obfs":{"obfs3_multihop_port":25102,"obfs4_multihop_port":25103,"obfs4_key":"S9XZyigxYjF5jWcwYpMmV9HJq4Vni1yQvLKI03n0TJ7csrgsX7lPpFfECAGQruHh1wkMXg"},"v2ray":"185.246.208.87","isp":"Datapacket"}]},{"gateway":"pt.gw.ivpn.net","country_code":"PT","country":"Portugal","city":"Lisbon","latitude":38.7227,"longitude":-9.1449,"isp":"Hostwebis","hosts":[{"hostname":"pt1.gw.ivpn.net","dns_name":"pt1.gw.ivpn.net","host":"94.46.175.112","load":5.62,"multihop_port":27101,"obfs":{"obfs3_multihop_port":27102,"obfs4_multihop_port":27103,"obfs4_key":"NqXqKMt8UF25hYDIwfh2K4Rr4a7F41HzZDGjX7SYwRaoOtrTL665yV6Z3h9wF+/R1YE8KQ"},"v2ray":"94.46.175.130","isp":"Hostwebis"}]},{"gateway":"ro.gw.ivpn.net","country_code":"RO","country":"Romania","city":"Bucharest","latitude":44.4334,"longitude":26.0999,"isp":"M247","hosts":[{"hostname":"ro1.gw.ivpn.net","dns_name":"ro1.gw.ivpn.net","host":"37.120.206.50","load":53.67,"multihop_port":22301,"obfs":{"obfs3_multihop_port":22302,"obfs4_multihop_port":22303,"obfs4_key":"lqfg/sP9uLakoQiA6YI5/kHQ4/FvQTp6jRgxSswjHwC8POOM23FijEWKyykngn1Eb3xfLA"},"v2ray":"185.120.147.58","isp":"M247"}]},{"gateway":"rs.gw.ivpn.net","country_code":"RS","country":"Serbia","city":"Belgrade","latitude":44.8186,"longitude":20.468,"isp":"M247","hosts":[{"hostname":"rs1.gw.ivpn.net","dns_name":"rs1.gw.ivpn.net","host":"141.98.103.250","load":52.14,"multihop_port":26801,"obfs":{"obfs3_multihop_port":26802,"obfs4_multihop_port":26803,"obfs4_key":"0MqgxLrLFQTlQWGAjY9es+Nv45d37/5lulWw0iEFoiUvtzOcbut8hK9AhCis17EXi+lUXw"},"v2ray":"146.70.111.114","isp":"M247"}]},{"gateway":"se.gw.ivpn.net","country_code":"SE","country":"Sweden","city":"Stockholm","latitude":59.3508,"longitude":18.0973,"isp":"GleSyS","hosts":[{"hostname":"se1.gw.ivpn.net","dns_name":"se1.gw.ivpn.net","host":"80.67.10.138","load":13.95,"multihop_port":24001,"obfs":{"obfs3_multihop_port":24002,"obfs4_multihop_port":24003,"obfs4_key":"/yhTV2SsTXlwsG2mCS90ZAYIZivsSyloaFw6VDj0pnpJOuUxXcZBOgdyQ/lfWxJtvHZmPg"},"v2ray":"80.67.10.139","isp":"GleSyS"},{"hostname":"se2.gw.ivpn.net","dns_name":"se2.gw.ivpn.net","host":"37.120.153.228","load":26.5,"multihop_port":20970,"obfs":{"obfs3_multihop_port":20971,"obfs4_multihop_port":20972,"obfs4_key":"xd6oVIT+22zMb84GGO+veRRswXf51ucRiaxpkJ9k84S713VJcpyO2WzCoSd4bi4yLuY0Eg"},"v2ray":"37.120.153.227","isp":"M247"}]},{"gateway":"sg.gw.ivpn.net","country_code":"SG","country":"Singapore","city":"Singapore","latitude":1.293,"longitude":103.8558,"isp":"M247","hosts":[{"hostname":"sg1.gw.ivpn.net","dns_name":"sg1.gw.ivpn.net","host":"185.128.24.186","load":26.93,"multihop_port":26101,"obfs":{"obfs3_multihop_port":26102,"obfs4_multihop_port":26103,"obfs4_key":"0N1ZmZlnyhS/3Y1OhvB0Bk3BGU2LFy0zyuWPYwM/P+mfX57w8zI7/YcBfIXZVgDiStt4MQ"},"v2ray":"146.70.192.138","isp":"M247"},{"hostname":"sg2.gw.ivpn.net","dns_name":"sg2.gw.ivpn.net","host":"37.120.151.124","load":88.88,"multihop_port":20950,"obfs":{"obfs3_multihop_port":20951,"obfs4_multihop_port":20952,"obfs4_key":"aTFzbPtK0zvLwSoUZkanzj+0wFPYg+IXyV01spxcedY5r46rywRCHgt8CRaBgpxhV8YzEA"},"v2ray":"37.120.151.125","isp":"M247"}]},{"gateway":"sk.gw.ivpn.net","country_code":"SK","country":"Slovakia","city":"Bratislava","latitude":48.15,"longitude":17.117,"isp":"Datapacket","hosts":[{"hostname":"sk2.gw.ivpn.net","dns_name":"sk2.gw.ivpn.net","host":"156.146.40.202","load":31.71,"multihop_port":20400,"obfs":{"obfs3_multihop_port":20401,"obfs4_multihop_port":20402,"obfs4_key":"ALsqb8RNZcvMzBsxnf4WQQYklUL0P6TUhyoXiwK1XPOEcCtW278YediLvTvOMeD5WLkPKg"},"v2ray":"156.146.40.208","isp":"Datapacket"}]},{"gateway":"tw.gw.ivpn.net","country_code":"TW","country":"Taiwan","city":"Taipei","latitude":25.073,"longitude":121.578,"isp":"TheGigabit","hosts":[{"hostname":"tw1.gw.ivpn.net","dns_name":"tw1.gw.ivpn.net","host":"185.189.160.6","load":21.11,"multihop_port":20820,"obfs":{"obfs3_multihop_port":20821,"obfs4_multihop_port":20822,"obfs4_key":"/ilRlB3BkUzUG2yd+++6KeYEF9PEB+3T3XcQhVjfoF8wJH1kgjGXvikjS1j/1SknFpGPaA"},"v2ray":"185.189.160.21","isp":"TheGigabit"}]},{"gateway":"ua.gw.ivpn.net","country_code":"UA","country":"Ukraine","city":"Kyiv","latitude":50.4754,"longitude":30.5461,"isp":"Server.ua","hosts":[{"hostname":"ua2.gw.ivpn.net","dns_name":"ua2.gw.ivpn.net","host":"91.232.28.126","load":7.31,"multihop_port":20450,"obfs":{"obfs3_multihop_port":20451,"obfs4_multihop_port":20452,"obfs4_key":"lEx5hd4iiT/fRyl34m5b/752sAPUr8UIJFh4HIyziOnQgVpcYtviI9Du6qBOb7dOFT0VKg"},"v2ray":"91.232.28.119","isp":"Server.ua"}]},{"gateway":"us-az.gw.ivpn.net","country_code":"US","country":"United States","city":"Phoenix, AZ","latitude":33.455,"longitude":-111.978,"isp":"Tzulo","hosts":[{"hostname":"us-az2.gw.ivpn.net","dns_name":"us-az2.gw.ivpn.net","host":"198.44.133.195","load":7.15,"multihop_port":20350,"obfs":{"obfs3_multihop_port":20351,"obfs4_multihop_port":20352,"obfs4_key":"w312C9Y2spTP0jgZ8WK81WScpsjzhh89KPeo9Oh363xxrlQKemiHeTFTdxWgJPr5jstMMQ"},"v2ray":"198.44.133.200","isp":"Tzulo"}]},{"gateway":"us-ca-sjc.gw.ivpn.net","country_code":"US","country":"United States","city":"San Jose, CA","latitude":37.408,"longitude":-121.893,"isp":"Tzulo","hosts":[{"hostname":"us-ca-sjc1.gw.ivpn.net","dns_name":"us-ca-sjc1.gw.ivpn.net","host":"198.44.134.35","load":5.56,"multihop_port":20370,"obfs":{"obfs3_multihop_port":20371,"obfs4_multihop_port":20372,"obfs4_key":"6uU8G40246SdZd+OHZgXYhNPf/eRe/eZ+siGgzAU05QT7+cZumgh+mTpkVmEPOndcF8HLA"},"v2ray":"198.44.134.40","isp":"Tzulo"}]},{"gateway":"us-ca.gw.ivpn.net","country_code":"US","country":"United States","city":"Los Angeles, CA","latitude":34.1139,"longitude":-118.4068,"isp":"Tzulo","hosts":[{"hostname":"us-ca3.gw.ivpn.net","dns_name":"us-ca3.gw.ivpn.net","host":"198.54.129.99","load":9.62,"multihop_port":21301,"obfs":{"obfs3_multihop_port":21302,"obfs4_multihop_port":21303,"obfs4_key":"rharPyhkUzYwmCP8ZzeaCwnJAmwOqwDTLOlJqzi/kAxMn4OVXtbzCk9Ww8XR31D2rmk3MA"},"v2ray":"198.54.129.212","isp":"Tzulo"},{"hostname":"us-ca5.gw.ivpn.net","dns_name":"us-ca5.gw.ivpn.net","host":"185.180.13.57","load":9.49,"multihop_port":20940,"obfs":{"obfs3_multihop_port":20941,"obfs4_multihop_port":20942,"obfs4_key":"+nBc8v94uD0T/q9QeEcOgHiDODs0XtVxFI5Iw5bJJSD7YA8Bj9HuHkzsxFjVk/RIqKCyHA"},"v2ray":"185.180.13.38","isp":"Datapacket"},{"hostname":"us-ca6.gw.ivpn.net","dns_name":"us-ca6.gw.ivpn.net","host":"185.152.67.8","load":6.96,"multihop_port":20340,"obfs":{"obfs3_multihop_port":20341,"obfs4_multihop_port":20342,"obfs4_key":"XI/Vz2NKJGAOTY5tqN6BgIa2Pq4p9bbXF9yG/HIT82whDKSHqqzQrVVNex38/B99JXC9SA"},"v2ray":"185.152.67.22","isp":"Datapacket"},{"hostname":"us-ca7.gw.ivpn.net","dns_name":"us-ca7.gw.ivpn.net","host":"198.54.129.19","load":6.77,"multihop_port":20360,"obfs":{"obfs3_multihop_port":20361,"obfs4_multihop_port":20362,"obfs4_key":"l5sfflk5U6K7YvmvnMrTg67CgjcfPrv4J4w/bjVv8ldvyw2g0Zmgfwwm49L6iOV8A5NPcw"},"v2ray":"198.54.129.195","isp":"Tzulo"}]},{"gateway":"us-co.gw.ivpn.net","country_code":"US","country":"United States","city":"Denver, CO","latitude":39.749,"longitude":-104.997,"isp":"Datapacket","hosts":[{"hostname":"us-co1.gw.ivpn.net","dns_name":"us-co1.gw.ivpn.net","host":"121.127.44.26","load":25.07,"multihop_port":20560,"obfs":{"obfs3_multihop_port":20561,"obfs4_multihop_port":20562,"obfs4_key":"mupqY+RsAT5UMgL7i4LRuGwAE1xTC7/Y0bBN5SL05dGt0QTlT7oFex/MMjPx2sTBLRHZBQ"},"v2ray":"121.127.44.31","isp":"Datapacket"}]},{"gateway":"us-fl.gw.ivpn.net","country_code":"US","country":"United States","city":"Miami, FL","latitude":25.776,"longitude":-80.193,"isp":"Datapacket","hosts":[{"hostname":"us-fl2.gw.ivpn.net","dns_name":"us-fl2.gw.ivpn.net","host":"195.181.163.72","load":10.81,"multihop_port":20380,"obfs":{"obfs3_multihop_port":20381,"obfs4_multihop_port":20382,"obfs4_key":"hjZz9k3QyS00InRiWxhNoj0bkjKk0Tzxl/EAEzrhCnAH4DIfKqdRpF2KVqhN4t+owpnEag"},"v2ray":"195.181.163.86","isp":"Datapacket"}]},{"gateway":"us-ga.gw.ivpn.net","country_code":"US","country":"United States","city":"Atlanta, GA","latitude":33.749,"longitude":-84.387,"isp":"Datapacket","hosts":[{"hostname":"us-ga3.gw.ivpn.net","dns_name":"us-ga3.gw.ivpn.net","host":"185.93.0.215","load":5.56,"multihop_port":20900,"obfs":{"obfs3_multihop_port":20901,"obfs4_multihop_port":20902,"obfs4_key":"T+tizn1ig40+uFLUBYtIL43xkkK0v074ZSAM3EfwCzwgE3qPOxJfsPCi2iiGXcBKK0tvLg"},"v2ray":"185.93.0.217","isp":"Datapacket"},{"hostname":"us-ga4.gw.ivpn.net","dns_name":"us-ga4.gw.ivpn.net","host":"67.213.215.91","load":6.6,"multihop_port":20310,"obfs":{"obfs3_multihop_port":20311,"obfs4_multihop_port":20312,"obfs4_key":"Vme6BaDad4DaS29Hmqyt3MzBs2dPrnYdUihJ/mUXBc3DY89Z8oXuLdeoh3/auJJAA2FqCQ"},"v2ray":"67.213.209.5","isp":"Ingenuity"},{"hostname":"us-ga5.gw.ivpn.net","dns_name":"us-ga5.gw.ivpn.net","host":"198.44.138.51","load":6.41,"multihop_port":20390,"obfs":{"obfs3_multihop_port":20391,"obfs4_multihop_port":20392,"obfs4_key":"WYqQNxVjs1oqw8ckmLqFnWQCLe980g0DwYn/Ceyw7OBlUMaYajSTkAv43zUt0eazzHGeRg"},"v2ray":"198.44.138.56","isp":"Tzulo"}]},{"gateway":"us-il.gw.ivpn.net","country_code":"US","country":"United States","city":"Chicago, IL","latitude":41.887,"longitude":-87.632,"isp":"Datapacket","hosts":[{"hostname":"us-il3.gw.ivpn.net","dns_name":"us-il3.gw.ivpn.net","host":"89.187.181.118","load":18.84,"multihop_port":20930,"obfs":{"obfs3_multihop_port":20931,"obfs4_multihop_port":20932,"obfs4_key":"jKCjgD5H90uS3zpu9Vm+mIvo0QwEIU7f018gZLPGItQ8oZe2iWWfHjAp3DVMTCIJXNusOQ"},"v2ray":"89.187.181.121","isp":"Datapacket"},{"hostname":"us-il4.gw.ivpn.net","dns_name":"us-il4.gw.ivpn.net","host":"68.235.50.195","load":12.77,"multihop_port":20410,"obfs":{"obfs3_multihop_port":20411,"obfs4_multihop_port":20412,"obfs4_key":"LZvOe2brUHBL4TNcpL2DUBNPCQAh9StzltzXzj/3C1rTbWKDuIzjt1hioSVMxhBB80pzDg"},"v2ray":"68.235.50.200","isp":"Tzulo"},{"hostname":"us-il5.gw.ivpn.net","dns_name":"us-il5.gw.ivpn.net","host":"68.235.50.211","load":9.66,"multihop_port":20420,"obfs":{"obfs3_multihop_port":20421,"obfs4_multihop_port":20422,"obfs4_key":"8x9qetgJQPAXO53JSFKdF33Ntsri/azaW706XihoibFIx/JB5oh4gWC17LfW5Vz/gFO8Mg"},"v2ray":"68.235.50.216","isp":"Tzulo"}]},{"gateway":"us-ma.gw.ivpn.net","country_code":"US","country":"United States","city":"Boston, MA","latitude":42.376,"longitude":-71.078,"isp":"Datapacket","hosts":[{"hostname":"us-ma1.gw.ivpn.net","dns_name":"us-ma1.gw.ivpn.net","host":"109.61.86.47","load":15.06,"multihop_port":20870,"obfs":{"obfs3_multihop_port":20871,"obfs4_multihop_port":20872,"obfs4_key":"6gPx3OetMICSn/v9I/boxkZX1Me3J823v/QxJNGM1h2noy6XxkLXRpyGCASZe/frLEMIdA"},"v2ray":"109.61.86.52","isp":"Datapacket"}]},{"gateway":"us-nj.gw.ivpn.net","country_code":"US","country":"United States","city":"Secaucus, NJ","latitude":40.778,"longitude":-74.069,"isp":"Ingenuity","hosts":[{"hostname":"us-nj1.gw.ivpn.net","dns_name":"us-nj1.gw.ivpn.net","host":"67.213.220.13","load":13.15,"multihop_port":20320,"obfs":{"obfs3_multihop_port":20321,"obfs4_multihop_port":20322,"obfs4_key":"ChCOcj2flD4cPwApR45KIBkkyhVFKUwerIxnfZxrtcLTA2K7wqXGRczH5ebIONeja+i+Qw"},"v2ray":"69.4.232.53","isp":"Ingenuity"},{"hostname":"us-nj4.gw.ivpn.net","dns_name":"us-nj4.gw.ivpn.net","host":"194.36.111.50","load":30.45,"multihop_port":27401,"obfs":{"obfs3_multihop_port":27402,"obfs4_multihop_port":27403,"obfs4_key":"lHDLT6cTgt0bh3ysogDdiXL4eWGRtJZ0cZGJmvpeK0YLUAsBfsOzKv46V0iv5ykwRPm6Mg"},"v2ray":"37.120.202.42","isp":"M247"}]},{"gateway":"us-nv.gw.ivpn.net","country_code":"US","country":"United States","city":"Las Vegas, NV","latitude":36.2333,"longitude":-115.2654,"isp":"M247","hosts":[{"hostname":"us-nv1.gw.ivpn.net","dns_name":"us-nv1.gw.ivpn.net","host":"185.242.5.34","load":8.85,"multihop_port":26501,"obfs":{"obfs3_multihop_port":26502,"obfs4_multihop_port":26503,"obfs4_key":"Kux7OTSrUOkklATpG67hJPz7xCWpW6eD9Qdw2GNKAmaaPA5zvPC3SXQRvyrYdyAAqMXMfg"},"v2ray":"185.242.5.146","isp":"M247"}]},{"gateway":"us-ny.gw.ivpn.net","country_code":"US","country":"United States","city":"New York, NY","latitude":40.6943,"longitude":-73.9249,"isp":"M247","hosts":[{"hostname":"us-ny2.gw.ivpn.net","dns_name":"us-ny2.gw.ivpn.net","host":"212.103.48.194","load":6.16,"multihop_port":21801,"obfs":{"obfs3_multihop_port":21802,"obfs4_multihop_port":21803,"obfs4_key":"GtK9yCXTtrLOrf0MTWdWqjzQ1vd1eKsVjiOuR5CiVaDf4dCSalyJ+kmik4nfU9Gj6UwcCg"},"v2ray":"212.103.48.199","isp":"M247"},{"hostname":"us-ny3.gw.ivpn.net","dns_name":"us-ny3.gw.ivpn.net","host":"89.187.178.144","load":6.25,"multihop_port":27601,"obfs":{"obfs3_multihop_port":27602,"obfs4_multihop_port":27603,"obfs4_key":"eL/9iKx6f5bHowNJBsT2E/Aag5w8Cvtb3DduySudJmuK2GtIOUwNzS33lFZwSUEnJIYwLg"},"v2ray":"89.187.178.150","isp":"Datapacket"},{"hostname":"us-ny4.gw.ivpn.net","dns_name":"us-ny4.gw.ivpn.net","host":"91.132.137.172","load":6.03,"multihop_port":20990,"obfs":{"obfs3_multihop_port":20991,"obfs4_multihop_port":20992,"obfs4_key":"P4Cw+PtgDKh6YfQAu7seQj4DJpRpdphchOCukV/Bum+yTaY2cOl9FcOzB+2O5l4gGy0iSA"},"v2ray":"91.132.137.173","isp":"M247"}]},{"gateway":"us-tx.gw.ivpn.net","country_code":"US","country":"United States","city":"Dallas, TX","latitude":32.912,"longitude":-96.785,"isp":"Datapacket","hosts":[{"hostname":"us-tx4.gw.ivpn.net","dns_name":"us-tx4.gw.ivpn.net","host":"89.187.164.114","load":8.34,"multihop_port":20300,"obfs":{"obfs3_multihop_port":20301,"obfs4_multihop_port":20302,"obfs4_key":"/HpSOdr8Uy7XJE/OtakmxEOFauDUfXr0/YW7ot9vG9BQhMRFEhwwHmfFW5MIsrlsukzJUA"},"v2ray":"89.187.164.120","isp":"Datapacket"},{"hostname":"us-tx5.gw.ivpn.net","dns_name":"us-tx5.gw.ivpn.net","host":"174.127.114.249","load":5.56,"multihop_port":20330,"obfs":{"obfs3_multihop_port":20331,"obfs4_multihop_port":20332,"obfs4_key":"tWmnJOYPpK/Un1x88sXcVouJRC+p/Z2PAeqvpLL6PpSzaHeOObMGTlU4V0oxgm56n8rJOg"},"v2ray":"206.217.207.181","isp":"Ingenuity"},{"hostname":"us-tx6.gw.ivpn.net","dns_name":"us-tx6.gw.ivpn.net","host":"198.44.137.195","load":8.86,"multihop_port":20430,"obfs":{"obfs3_multihop_port":20431,"obfs4_multihop_port":20432,"obfs4_key":"En3wxWJvDOtmq5iIC/OqNzXcgoJA+X7ySJRReUKi4Oyi8NpQPRI7dl9D98ixSo9Txm2CdA"},"v2ray":"198.44.137.200","isp":"Tzulo"}]},{"gateway":"us-ut.gw.ivpn.net","country_code":"US","country":"United States","city":"Salt Lake City, UT","latitude":40.7774,"longitude":-111.93,"isp":"100TB","hosts":[{"hostname":"us-ut1.gw.ivpn.net","dns_name":"us-ut1.gw.ivpn.net","host":"198.105.216.28","load":9.15,"multihop_port":24401,"obfs":{"obfs3_multihop_port":24402,"obfs4_multihop_port":24403,"obfs4_key":"gb5dp9i4QnFKT0GQPMEsDlqN+JORU3lyU65s9R1064aZ1jKfWfkc+SxbOlNEh23CvIAOeg"},"v2ray":"206.190.145.88","isp":"100TB"}]},{"gateway":"us-va.gw.ivpn.net","country_code":"US","country":"United States","city":"Ashburn, VA","latitude":39.0437,"longitude":-77.4875,"isp":"Datapacket","hosts":[{"hostname":"us-va1.gw.ivpn.net","dns_name":"us-va1.gw.ivpn.net","host":"37.19.206.105","load":7.15,"multihop_port":27701,"obfs":{"obfs3_multihop_port":27702,"obfs4_multihop_port":27703,"obfs4_key":"5Lk8BSID+M9QAGSglQTrYkom+V0mkIv0HgR80+9vKCcnZOu0f+aJhfOXqKnpHarJbIEHCw"},"v2ray":"37.19.206.111","isp":"Datapacket"}]},{"gateway":"us-wa.gw.ivpn.net","country_code":"US","country":"United States","city":"Seattle, WA","latitude":47.6211,"longitude":-122.3244,"isp":"Tzulo","hosts":[{"hostname":"us-wa2.gw.ivpn.net","dns_name":"us-wa2.gw.ivpn.net","host":"198.44.131.3","load":16.82,"multihop_port":27801,"obfs":{"obfs3_multihop_port":27802,"obfs4_multihop_port":27803,"obfs4_key":"9h0W5BTzGSDpY2tGjdvViSJfEkT/BuwHS0cnFX07cEj3RRDtmxsC0f+kapO8+Kh+fz1XMQ"},"v2ray":"198.44.131.20","isp":"Tzulo"}]},{"gateway":"za.gw.ivpn.net","country_code":"ZA","country":"South Africa","city":"Johannesburg","latitude":-26.195,"longitude":28.034,"isp":"Datapacket","hosts":[{"hostname":"za1.gw.ivpn.net","dns_name":"za1.gw.ivpn.net","host":"169.150.238.103","load":8.34,"multihop_port":20840,"obfs":{"obfs3_multihop_port":20841,"obfs4_multihop_port":20842,"obfs4_key":"vM1zdiOMhoqMKZCOi/lMj7TfWJb5/UsM25p8FE/AUezwbYWhUkhpD5RbXBOBDNhZuYzPGA"},"v2ray":"169.150.238.109","isp":"Datapacket"}]}],"config":{"antitracker":{"default":{"ip":"10.0.254.2","multihop-ip":"10.0.254.102"},"hardcore":{"ip":"10.0.254.3","multihop-ip":"10.0.254.103"}},"antitracker_plus":{"DnsServers":[{"Name":"Basic","Description":"Basic","Normal":"10.0.254.4","Hardcore":"10.0.254.5"},{"Name":"Comprehensive","Description":"Comprehensive","Normal":"10.0.254.6","Hardcore":"10.0.254.7"},{"Name":"Restrictive","Description":"Restrictive","Normal":"10.0.254.18","Hardcore":"10.0.254.19"},{"Name":"Easylist","Description":"EasyList + EasyPrivacy","Normal":"10.0.254.14","Hardcore":"10.0.254.15"},{"Name":"Oisdbig","Description":"OISD Big","Normal":"10.0.254.2","Hardcore":"10.0.254.3"},{"Name":"Stevenblack","Description":"Steven Black Unified + Ads + Malware","Normal":"10.0.254.20","Hardcore":"10.0.254.21"},{"Name":"Hagezilight","Description":"Hagezi Light","Normal":"10.0.254.22","Hardcore":"10.0.254.23"},{"Name":"Hagezipro","Description":"Hagezi Pro","Normal":"10.0.254.10","Hardcore":"10.0.254.11"},{"Name":"Hageziproplus","Description":"Hagezi Pro++","Normal":"10.0.254.24","Hardcore":"10.0.254.25"},{"Name":"Hageziultimate","Description":"Hagezi Ultimate","Normal":"10.0.254.12","Hardcore":"10.0.254.13"}]},"api":{"ips":["198.50.177.220","149.56.162.156","198.50.177.222","149.56.162.159","198.50.177.223"],"ipv6s":["2607:5300:203:1735::8888","2607:5300:203:1735::8","2607:5300:203:1735:6580:7300:0:aaaa"]},"ports":{"test":[{"echoserver":"37.187.112.240"}],"openvpn":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":60000,"max":65000}},{"type":"UDP","port":123},{"type":"UDP","port":2049},{"type":"UDP","range":{"min":50000,"max":59999}},{"type":"UDP","port":2050},{"type":"UDP","range":{"min":40000,"max":49999}},{"type":"UDP","port":443},{"type":"UDP","port":1194},{"type":"UDP","range":{"min":30000,"max":39999}},{"type":"TCP","port":80},{"type":"TCP","port":443},{"type":"TCP","port":1194},{"type":"TCP","port":2049},{"type":"TCP","port":2050},{"type":"TCP","port":30587},{"type":"TCP","port":41893},{"type":"TCP","port":48574},{"type":"TCP","port":58237},{"type":"TCP","range":{"min":5500,"max":19999}},{"type":"TCP","range":{"min":30000,"max":65000}}],"wireguard":[{"type":"UDP","port":53},{"type":"UDP","port":80},{"type":"UDP","port":123},{"type":"UDP","port":443},{"type":"UDP","port":500},{"type":"UDP","port":1194},{"type":"UDP","port":2049},{"type":"UDP","port":2050},{"type":"UDP","port":4500},{"type":"UDP","port":30587},{"type":"UDP","port":41893},{"type":"UDP","port":48574},{"type":"UDP","port":58237},{"type":"UDP","range":{"min":5500,"max":19999}},{"type":"UDP","range":{"min":30000,"max":65000}}],"obfs3":{"port":5145},"obfs4":{"port":5146},"v2ray":{"id":"27de860d-5601-412d-8b71-baa048a94b98","openvpn":[{"type":"UDP","port":20501},{"type":"UDP","port":20502},{"type":"UDP","port":20503},{"type":"UDP","port":20504},{"type":"TCP","port":1443}],"wireguard":[{"type":"UDP","port":15351}]}}}} diff --git a/IVPNClient/Managers/ConnectionManager.swift b/IVPNClient/Managers/ConnectionManager.swift index bd52b54fc..02a356b22 100644 --- a/IVPNClient/Managers/ConnectionManager.swift +++ b/IVPNClient/Managers/ConnectionManager.swift @@ -97,14 +97,6 @@ class ConnectionManager { self.updateWireGuardLogFile() self.reconnectAutomatically = false } - DispatchQueue.delay(2.5) { - if UserDefaults.shared.isV2ray && !V2RayCore.shared.reconnectWithV2ray { - V2RayCore.shared.reconnectWithV2ray = true - self.reconnect() - } else { - V2RayCore.shared.reconnectWithV2ray = false - } - } } else { self.connected = false } @@ -147,7 +139,7 @@ class ConnectionManager { return } - self.vpnManager.disable(tunnelType: tunnelType) { _ in + self.vpnManager.disable(tunnelType: tunnelType) { _ in completion() } } @@ -249,15 +241,9 @@ class ConnectionManager { return } - if UserDefaults.shared.isV2ray && V2RayCore.shared.reconnectWithV2ray { - DispatchQueue.global(qos: .userInitiated).async { - let error = V2RayCore.shared.start() - if error != nil { - log(.error, message: error?.localizedDescription ?? "") - } else { - log(.info, message: "V2Ray start OK") - } - } + // Update V2Ray settings if V2Ray is enabled -> similar to android ;) + if UserDefaults.shared.isV2ray { + self.updateV2RaySettings() } self.vpnManager.connect(tunnelType: self.settings.connectionProtocol.tunnelType()) @@ -277,16 +263,7 @@ class ConnectionManager { } } - if UserDefaults.shared.isV2ray { - DispatchQueue.global(qos: .userInitiated).async { - let error = V2RayCore.shared.close() - if error != nil { - log(.error, message: error?.localizedDescription ?? "") - } else { - log(.info, message: "V2Ray stop OK") - } - } - } + } func installOnDemandRules() { @@ -505,6 +482,8 @@ class ConnectionManager { } func reconnect() { + log(.info, message: "Reconnecting to VPN server") + getStatus { tunnelType, status in if status == .connected || status == .connecting { self.reconnectAutomatically = true @@ -575,6 +554,112 @@ class ConnectionManager { } } + // MARK: - V2Ray Settings Update + + func updateV2RaySettings() { + guard UserDefaults.shared.isV2ray else { + log(.debug, message: "V2Ray obfuscation disabled, skipping settings update") + return + } + + guard let currentV2RaySettings = V2RaySettings.load() else { + log(.error, message: "V2Ray base configuration not found") + return + } + + if currentV2RaySettings.id.isEmpty { + log(.error, message: "V2Ray user ID is empty, authentication will fail") + return + } + + guard let entryHost = getEntryHost() else { + log(.error, message: "Entry server not available, cannot configure V2Ray") + return + } + + let v2rayOutboundIp = entryHost.v2ray + guard !v2rayOutboundIp.isEmpty else { + log(.error, message: "Entry host missing V2Ray configuration") + return + } + + let v2rayInboundIp = entryHost.host + let v2rayInboundPort = currentV2RaySettings.singleHopInboundPort + let v2rayOutboundPort = getV2RayOutboundPort() + let v2rayDnsName = !entryHost.dnsName.isEmpty ? entryHost.dnsName : entryHost.hostName + + // -> handle multi-hop conf + var finalInboundIp = v2rayInboundIp + var finalInboundPort = v2rayInboundPort + + if UserDefaults.shared.isMultiHop, Application.shared.serviceStatus.isEnabled(capability: .multihop) { + if let exitHost = getExitHost() { + finalInboundIp = exitHost.host + // -> use wg inbound port for multi-hop (fix-from-android) + finalInboundPort = Application.shared.settings.connectionProtocol.port() + log(.info, message: "Multi-hop V2Ray override: inbound=\(exitHost.host):\(finalInboundPort)") + } else { + log(.error, message: "Multi-hop enabled but no exit server available") + return + } + } + + if finalInboundIp.isEmpty || v2rayOutboundIp.isEmpty { + log(.error, message: "Critical V2Ray IPs are empty - inbound: '\(finalInboundIp)', outbound: '\(v2rayOutboundIp)'") + return + } + + let updatedV2RaySettings = V2RaySettings( + id: currentV2RaySettings.id, + outboundIp: v2rayOutboundIp, + outboundPort: v2rayOutboundPort, + inboundIp: finalInboundIp, + inboundPort: finalInboundPort, + dnsName: v2rayDnsName, + wireguard: currentV2RaySettings.wireguard + ) + + updatedV2RaySettings.save() + log(.info, message: "V2Ray settings updated successfully - inbound: \(finalInboundIp):\(finalInboundPort), outbound: \(v2rayOutboundIp):\(v2rayOutboundPort)") + } + + private func getEntryHost() -> Host? { + if let selectedHost = Application.shared.settings.selectedHost { + return selectedHost + } + + if let firstHost = Application.shared.settings.selectedServer.hosts.first { + return firstHost + } + + return nil + } + + private func getExitHost() -> Host? { + if let selectedHost = Application.shared.settings.selectedExitHost { + return selectedHost + } + + if let firstHost = Application.shared.settings.selectedExitServer.hosts.first { + return firstHost + } + + return nil + } + + private func getV2RayOutboundPort() -> Int { + let v2rayProtocol = UserDefaults.shared.v2rayProtocol + + switch v2rayProtocol { + case "tcp": + return Config.v2rayTcpPort // HTTP/VMess/TCP -> desktop + case "udp": + return Config.v2rayQuicPort // HTTPS/VMess/QUIC -> desktop + default: + return settings.connectionProtocol.port() + } + } + } extension ConnectionManager { diff --git a/IVPNClient/Managers/VPNManager.swift b/IVPNClient/Managers/VPNManager.swift index a4609ffb8..1227a9986 100644 --- a/IVPNClient/Managers/VPNManager.swift +++ b/IVPNClient/Managers/VPNManager.swift @@ -291,7 +291,32 @@ class VPNManager { manager.isEnabled = true do { - try manager.connection.startVPNTunnel() + var options: [String: NSObject]? = nil + if tunnelType == .wireguard && UserDefaults.shared.isV2ray { + // Always refresh V2Ray settings before connecting + Application.shared.connectionManager.updateV2RaySettings() + if let config = V2RayConfigBuilder.shared.makeConfig() { + options = ["v2rayConfig": config.jsonString() as NSString] + + // -> Pass outboundip + if let v2raySettings = V2RaySettings.load(), !v2raySettings.outboundIp.isEmpty { + options!["v2rayOutboundIp"] = v2raySettings.outboundIp as NSString + } + + log(.info, message: "Passing V2Ray config and settings to WireGuard tunnel provider") + + // Persist for on-demand restarts (e.g.,, after reboot) + UserDefaults.shared.set(config.jsonString(), forKey: UserDefaults.Key.v2rayConfigJson) + if let outbound = V2RaySettings.load()?.outboundIp, !outbound.isEmpty { + UserDefaults.shared.set(outbound, forKey: UserDefaults.Key.v2rayOutboundIpLast) + } + UserDefaults.shared.synchronize() + } else { + log(.error, message: "Failed to create V2Ray configuration") + } + } + + try manager.connection.startVPNTunnel(options: options) } catch NEVPNError.configurationInvalid { log(.error, message: "Error connecting to VPN: configuration is invalid") manager.isOnDemandEnabled = false diff --git a/IVPNClient/Models/V2Ray/V2RayCore.swift b/IVPNClient/Models/V2Ray/V2rayConfigBuilder.swift similarity index 60% rename from IVPNClient/Models/V2Ray/V2RayCore.swift rename to IVPNClient/Models/V2Ray/V2rayConfigBuilder.swift index dd439a374..5980c8757 100644 --- a/IVPNClient/Models/V2Ray/V2RayCore.swift +++ b/IVPNClient/Models/V2Ray/V2rayConfigBuilder.swift @@ -1,10 +1,10 @@ // -// V2RayCore.swift +// V2RayConfigBuilder.swift // IVPN iOS app // https://github.com/ivpn/ios-app // -// Created by Juraj Hilje on 2023-08-23. -// Copyright (c) 2023 IVPN Limited. +// Created by Tamim Hossain on 2025-09-05. +// Copyright (c) 2025 IVPN Limited. // // This file is part of the IVPN iOS app. // @@ -22,50 +22,15 @@ // import Foundation -import V2RayControl -class V2RayCore { +class V2RayConfigBuilder { // MARK: - Properties - - static let shared = V2RayCore() - var instance: V2rayControlInstance? - var reconnectWithV2ray = false + static let shared = V2RayConfigBuilder() // MARK: - Methods - - func start() -> Error? { - let _ = close() - var error: Error? - - guard let config = makeConfig() else { - return NSError(domain: "", code: 99, userInfo: [NSLocalizedDescriptionKey: "V2Ray configuration cannot be loaded"]) - } - - var startError: NSError? - instance = V2rayControlStart(config.jsonString(), &startError) - if startError != nil { - error = startError as Error? - } - - return error - } - - func close() -> Error? { - var error: Error? - - if let instance = instance { - var stopError: NSError? - V2rayControlStop(instance, &stopError) - if stopError != nil { - error = stopError as Error? - } - self.instance = nil - } - - return error - } - func makeConfig() -> V2RayConfig? { guard let settings = V2RaySettings.load() else { return nil diff --git a/IVPNClient/Scenes/Base.lproj/Main.storyboard b/IVPNClient/Scenes/Base.lproj/Main.storyboard index 24fdd99ef..a92ca6e70 100644 --- a/IVPNClient/Scenes/Base.lproj/Main.storyboard +++ b/IVPNClient/Scenes/Base.lproj/Main.storyboard @@ -1184,7 +1184,7 @@ - VPN obfuscation is a technique that masks VPN traffic to make it appear like standard internet traffic, helping to evade detection and bypass internet restrictions or censorship. Enable V2Ray only when connected to WiFi network. Manually reconnect VPN when switching WiFi networks. Learn more + VPN obfuscation is a technique that masks VPN traffic to make it appear like standard internet traffic, helping to evade detection and bypass internet restrictions or censorship. Learn more @@ -1209,31 +1209,13 @@ - + - - @@ -4975,3 +4957,4 @@ + diff --git a/IVPNClient/Utilities/Extensions/NETunnelProviderProtocol+Ext.swift b/IVPNClient/Utilities/Extensions/NETunnelProviderProtocol+Ext.swift index 1ac89c33a..641dcaca2 100644 --- a/IVPNClient/Utilities/Extensions/NETunnelProviderProtocol+Ext.swift +++ b/IVPNClient/Utilities/Extensions/NETunnelProviderProtocol+Ext.swift @@ -132,20 +132,16 @@ extension NETunnelProviderProtocol { KeyChain.wgIpv6Host = ipv6.localIP } - if UserDefaults.shared.isV2ray && V2RayCore.shared.reconnectWithV2ray { + if UserDefaults.shared.isV2ray { endpoint = Peer.endpoint(host: Config.v2rayHost, port: Config.v2rayPort) - v2raySettings?.inboundIp = v2rayInboundIp - v2raySettings?.inboundPort = v2rayInboundPort - v2raySettings?.outboundIp = v2rayOutboundIp - v2raySettings?.outboundPort = v2rayOutboundPort - v2raySettings?.dnsName = v2rayDnsName - v2raySettings?.save() } + let allowedIPs = Config.wgPeerAllowedIPs + let peer = Peer( publicKey: publicKey, presharedKey: KeyChain.wgPresharedKey, - allowedIPs: Config.wgPeerAllowedIPs, + allowedIPs: allowedIPs, endpoint: endpoint, persistentKeepalive: Config.wgPeerPersistentKeepalive ) @@ -186,8 +182,8 @@ extension NETunnelProviderProtocol { return selectedHost } - if let randomHost = Application.shared.settings.selectedServer.hosts.randomElement() { - return randomHost + if let firstHost = Application.shared.settings.selectedServer.hosts.first { + return firstHost } return nil @@ -198,8 +194,8 @@ extension NETunnelProviderProtocol { return selectedHost } - if let randomHost = Application.shared.settings.selectedExitServer.hosts.randomElement() { - return randomHost + if let firstHost = Application.shared.settings.selectedExitServer.hosts.first { + return firstHost } return nil diff --git a/IVPNClient/Utilities/Extensions/UserDefaults+Ext.swift b/IVPNClient/Utilities/Extensions/UserDefaults+Ext.swift index ec4449b09..10b27798e 100644 --- a/IVPNClient/Utilities/Extensions/UserDefaults+Ext.swift +++ b/IVPNClient/Utilities/Extensions/UserDefaults+Ext.swift @@ -94,6 +94,8 @@ extension UserDefaults { static let v2raySettings = "v2raySettings" static let v2rayProtocol = "v2rayProtocol" static let isV2ray = "isV2ray" + static let v2rayConfigJson = "v2rayConfigJson" + static let v2rayOutboundIpLast = "v2rayOutboundIpLast" static let disableWidgetPrompt = "disableWidgetPrompt" } @@ -301,6 +303,8 @@ extension UserDefaults { shared.removeObject(forKey: Key.v2raySettings) shared.removeObject(forKey: Key.v2rayProtocol) shared.removeObject(forKey: Key.isV2ray) + shared.removeObject(forKey: Key.v2rayConfigJson) + shared.removeObject(forKey: Key.v2rayOutboundIpLast) shared.removeObject(forKey: Key.disableWidgetPrompt) standard.removeObject(forKey: Key.serviceStatus) standard.removeObject(forKey: Key.selectedHost) diff --git a/README.md b/README.md index 2bffd6bbd..4ea0e15ce 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ ![Lint Code Base](https://github.com/ivpn/ios-app/workflows/Lint%20Code%20Base/badge.svg) **IVPN for iOS** is a native app built using Swift language. Some of the features include: multiple protocols (IKEv2, OpenVPN, WireGuard), Kill-switch, Multi-Hop, Trusted Networks, AntiTracker, Custom DNS, Dark mode and more. -IVPN iOS app is distributed on the [App Store](https://apps.apple.com/us/app/ivpn-serious-privacy-protection/id1193122683?mt=8). +IVPN iOS app is distributed on the [App Store](https://apps.apple.com/us/app/ivpn-serious-privacy-protection/id1193122683?mt=8). + +**Note:** This project uses a fork of [wireguard-apple](https://github.com/ivpn/wireguard-apple) which includes upstream changes from the official WireGuard Apple implementation and adds V2Ray extension support for enhanced connectivity options. * [About this Repo](#about-repo) * [Installation](#installation) @@ -56,7 +58,7 @@ Dependencies are installed with [Swift Package Manager](https://swift.org/packag Project dependencies: -* [WireGuardKit](https://github.com/WireGuard/wireguard-apple) +* [WireGuardKit](https://github.com/ivpn/wireguard-apple) (fork with V2Ray extension) * [TunnelKit](https://github.com/passepartoutvpn/tunnelkit) * [SnapKit](https://github.com/SnapKit/SnapKit) * [KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess) @@ -85,14 +87,6 @@ Rename and populate `OpenVPNConf.swift` file: cp IVPNClient/Config/OpenVPNConf.template.swift IVPNClient/Config/OpenVPNConf.swift ``` -### Build V2RayControl.xcframework - -Build `V2RayControl.xcframework`: - -```sh -./build-v2ray.sh -``` - ### Build liboqs.a To compile [liboqs](https://github.com/open-quantum-safe/liboqs), additional packages are required: diff --git a/V2RayControl/ctrl.go b/V2RayControl/ctrl.go deleted file mode 100644 index e71ce1461..000000000 --- a/V2RayControl/ctrl.go +++ /dev/null @@ -1,96 +0,0 @@ -package v2rayControl - -import ( - "fmt" - "sync" - - core "github.com/v2fly/v2ray-core/v5" - - // Mandatory features - _ "github.com/v2fly/v2ray-core/v5/app/dispatcher" - _ "github.com/v2fly/v2ray-core/v5/app/proxyman/inbound" - _ "github.com/v2fly/v2ray-core/v5/app/proxyman/outbound" - - // Inbound and outbound proxies - _ "github.com/v2fly/v2ray-core/v5/proxy/blackhole" - _ "github.com/v2fly/v2ray-core/v5/proxy/dns" - _ "github.com/v2fly/v2ray-core/v5/proxy/dokodemo" - _ "github.com/v2fly/v2ray-core/v5/proxy/freedom" - _ "github.com/v2fly/v2ray-core/v5/proxy/http" - _ "github.com/v2fly/v2ray-core/v5/proxy/shadowsocks" - _ "github.com/v2fly/v2ray-core/v5/proxy/socks" - _ "github.com/v2fly/v2ray-core/v5/proxy/trojan" - _ "github.com/v2fly/v2ray-core/v5/proxy/vless/inbound" - _ "github.com/v2fly/v2ray-core/v5/proxy/vless/outbound" - _ "github.com/v2fly/v2ray-core/v5/proxy/vmess/inbound" - _ "github.com/v2fly/v2ray-core/v5/proxy/vmess/outbound" - - // Transport headers - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/http" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/noop" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/srtp" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/tls" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/utp" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/wechat" - _ "github.com/v2fly/v2ray-core/v5/transport/internet/headers/wireguard" - - // JSON, TOML, YAML config support - _ "github.com/v2fly/v2ray-core/v5/main/formats" -) - -type Instance struct { - server *core.Instance -} - -var ( - locker sync.Mutex - v2rayInstance *Instance -) - -func Start(jsonConfig string) (*Instance, error) { - locker.Lock() - defer locker.Unlock() - - config, err := core.LoadConfig("json", []byte(jsonConfig)) - if err != nil { - return nil, err - } - - server, err := core.New(config) - if err != nil { - return nil, err - } - - err = server.Start() - if err != nil { - return nil, err - } - - v2rayInstance = &Instance{server: server} - - return v2rayInstance, nil -} - -func Stop(instance *Instance) error { - locker.Lock() - defer locker.Unlock() - - if instance.server == nil { - return fmt.Errorf("server instance is nil") - } - - if v2rayInstance != nil { - v2rayInstance.server.Close() - v2rayInstance = nil - } - - if instance != nil { - err := instance.server.Close() - if err != nil { - return err - } - instance = nil - } - - return nil -} diff --git a/V2RayControl/go.mod b/V2RayControl/go.mod deleted file mode 100644 index acbbe15c7..000000000 --- a/V2RayControl/go.mod +++ /dev/null @@ -1,48 +0,0 @@ -module v2rayControl - -go 1.20 -toolchain go1.24.1 - -require github.com/v2fly/v2ray-core/v5 v5.7.0 - -require ( - github.com/adrg/xdg v0.4.0 // indirect - github.com/bufbuild/protocompile v0.2.1-0.20230123224550-da57cd758c2f // indirect - github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165 // indirect - github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/jhump/protoreflect v1.15.0 // indirect - github.com/kr/pretty v0.3.0 // indirect - github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect - github.com/onsi/ginkgo/v2 v2.9.5 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pires/go-proxyproto v0.6.2 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.3.1 // indirect - github.com/quic-go/quic-go v0.48.2 // indirect - github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect - github.com/rogpeppe/go-internal v1.8.0 // indirect - github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb // indirect - github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08 // indirect - github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848 // indirect - github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e // indirect - github.com/xtaci/smux v1.5.15 // indirect - go.starlark.net v0.0.0-20220817180228-f738f5508c12 // indirect - go.uber.org/mock v0.4.0 // indirect - go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d // indirect - golang.org/x/crypto v0.35.0 // indirect - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.36.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/text v0.22.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect - google.golang.org/grpc v1.56.3 // indirect - google.golang.org/protobuf v1.33.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/V2RayControl/go.sum b/V2RayControl/go.sum deleted file mode 100644 index 238483d54..000000000 --- a/V2RayControl/go.sum +++ /dev/null @@ -1,508 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 h1:+JkXLHME8vLJafGhOH4aoV2Iu8bR55nU6iKMVfYVLjY= -github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1/go.mod h1:nuudZmJhzWtx2212z+pkuy7B6nkBqa+xwNXZHL1j8cg= -github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d h1:zsO4lp+bjv5XvPTF58Vq+qgmZEYZttJK+CWtSZhKenI= -github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d/go.mod h1:f1iKL6ZhUWvbk7PdWVmOaak10o86cqMUYEmn1CZNGEI= -github.com/bufbuild/protocompile v0.2.1-0.20230123224550-da57cd758c2f h1:IXSA5gow10s7zIOJfPOpXDtNBWCTA0715BDAhoJBXEs= -github.com/bufbuild/protocompile v0.2.1-0.20230123224550-da57cd758c2f/go.mod h1:tleDrpPTlLUVmgnEoN6qBliKWqJaZFJXqZdFjTd+ocU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165 h1:BS21ZUJ/B5X2UVUbczfmdWH7GapPWAhxcMsDnjJTU1E= -github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a h1:YtdtTUN1iH97s+6PUjLnaiKSQj4oG1/EZ3N9bx6g4kU= -github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a/go.mod h1:/CZpbhAusDOobpcb9yubw46kdYjq0zRC0Wpg9a9zFQM= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gaukas/godicttls v0.0.3 h1:YNDIf0d9adcxOijiLrEzpfZGAkNwLRzPaG6OjU7EITk= -github.com/gaukas/godicttls v0.0.3/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= -github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/render v1.0.2 h1:4ER/udB0+fMWB2Jlf15RV3F4A2FDuYi/9f+lFttR/Lg= -github.com/go-chi/render v1.0.2/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyhcJ38oeKGACXohU= -github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20210420193930-a4630ec28c79/go.mod h1:Opf9rtYVq0eTyX+aRVmRO9hE8ERAozcdrBxWG9Q6mkQ= -github.com/gopherjs/websocket v0.0.0-20191103002815-9a42957e2b3a/go.mod h1:jd+zY81Fx2lC4bfw58+Rflg1srqmedQjbBUejKOjYNY= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jhump/protoreflect v1.15.0 h1:U5T5/2LF0AZQFP9T4W5GfBjBaTruomrKobiR4E+oA/Q= -github.com/jhump/protoreflect v1.15.0/go.mod h1:qww51KYjD2hoCl/ohxw5cK2LSssFczrbO1t8Ld2TENs= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/reedsolomon v1.9.3 h1:N/VzgeMfHmLc+KHMD1UL/tNkfXAt8FnUqlgXGIduwAY= -github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc= -github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.51 h1:0+Xg7vObnhrz/4ZCZcZh7zPXlmU0aveS2HDBd0m0qSo= -github.com/miekg/dns v1.1.51/go.mod h1:2Z9d3CP1LQWihRZUf29mQ19yDThaI4DAYzte2CaQW5c= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mustafaturan/bus v1.0.2 h1:2x3ErwZ0uUPwwZ5ZZoknEQprdaxr68Yl3mY8jDye1Ws= -github.com/mustafaturan/bus v1.0.2/go.mod h1:h7gfehm8TThv4Dcaa+wDQG7r7j6p74v+7ftr0Rq9i1Q= -github.com/mustafaturan/monoton v1.0.0 h1:8SCej+JiNn0lyps7V+Jzc1CRAkDR4EZPWrTupQ61YCQ= -github.com/mustafaturan/monoton v1.0.0/go.mod h1:FOnE7NV3s3EWPXb8/7+/OSdiMBbdlkV0Lz8p1dc+vy8= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pion/dtls/v2 v2.2.4 h1:YSfYwDQgrxMYXLBc/m7PFY5BVtWlNm/DN4qoU2CbcWg= -github.com/pion/dtls/v2 v2.2.4/go.mod h1:WGKfxqhrddne4Kg3p11FUMJrynkOY4lb25zHNO49wuw= -github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= -github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/sctp v1.7.6 h1:8qZTdJtbKfAns/Hv5L0PAj8FyXcsKhMH1pKUCGisQg4= -github.com/pion/sctp v1.7.6/go.mod h1:ichkYQ5tlgCQwEwvgfdcAolqx1nHbYCxo4D7zK/K0X8= -github.com/pion/transport/v2 v2.0.0 h1:bsMYyqHCbkvHwj+eNCFBuxtlKndKfyGI2vaQmM3fIE4= -github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc= -github.com/pion/udp v0.1.4 h1:OowsTmu1Od3sD6i3fQUJxJn2fEvJO6L1TidgadtbTI8= -github.com/pion/udp v0.1.4/go.mod h1:G8LDo56HsFwC24LIcnT4YIDU5qcB6NepqqjP0keL2us= -github.com/pires/go-proxyproto v0.6.2 h1:KAZ7UteSOt6urjme6ZldyFm4wDe/z0ZUP0Yv0Dos0d8= -github.com/pires/go-proxyproto v0.6.2/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.3.1 h1:O4BLOM3hwfVF3AcktIylQXyl7Yi2iBNVy5QsV+ySxbg= -github.com/quic-go/qtls-go1-20 v0.3.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= -github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= -github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= -github.com/refraction-networking/utls v1.3.2 h1:o+AkWB57mkcoW36ET7uJ002CpBWHu0KPxi6vzxvPnv8= -github.com/refraction-networking/utls v1.3.2/go.mod h1:fmoaOww2bxzzEpIKOebIsnBvjQpqP7L2vcm/9KUfm/E= -github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 h1:f/FNXud6gA3MNr8meMVVGxhp+QBTqY91tM8HjEuMjGg= -github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3/go.mod h1:HgjTstvQsPGkxUsCd2KWxErBblirPizecHcpD3ffK+s= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/secure-io/siv-go v0.0.0-20180922214919-5ff40651e2c4 h1:zOjq+1/uLzn/Xo40stbvjIY/yehG0+mfmlsiEmc0xmQ= -github.com/secure-io/siv-go v0.0.0-20180922214919-5ff40651e2c4/go.mod h1:aI+8yClBW+1uovkHw6HM01YXnYB8vohtB9C83wzx34E= -github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb h1:XfLJSPIOUX+osiMraVgIrMR27uMXnRJWGm1+GL8/63U= -github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= -github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08 h1:4Yh46CVE3k/lPq6hUbEdbB1u1anRBXLewm3k+L0iOMc= -github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08/go.mod h1:KAuQNm+LWQCOFqdBcUgihPzRpVXRKzGbTNhfEfRZ4wY= -github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848 h1:p1UzXK6VAutXFFQMnre66h7g1BjRKUnLv0HfmmRoz7w= -github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848/go.mod h1:p80Bv154ZtrGpXMN15slDCqc9UGmfBuUzheDFBYaW/M= -github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e h1:5QefA066A1tF8gHIiADmOVOV5LS43gt3ONnlEl3xkwI= -github.com/v2fly/ss-bloomring v0.0.0-20210312155135-28617310f63e/go.mod h1:5t19P9LBIrNamL6AcMQOncg/r10y3Pc01AbHeMhwlpU= -github.com/v2fly/v2ray-core/v5 v5.7.0 h1:84h2KMfs195EwIdj0DLStS2GhZMa65U0malDmteo3Nw= -github.com/v2fly/v2ray-core/v5 v5.7.0/go.mod h1:iFLyTcrioq55DA7Q2BdRxvYrLx4m2pKzVukmoS33aTU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xiaokangwang/VLite v0.0.0-20220418190619-cff95160a432 h1:I/ATawgO2RerCq9ACwL0wBB8xNXZdE3J+93MCEHReRs= -github.com/xiaokangwang/VLite v0.0.0-20220418190619-cff95160a432/go.mod h1:QN7Go2ftTVfx0aCTh9RXHV8pkpi0FtmbwQw40dy61wQ= -github.com/xtaci/smux v1.5.15 h1:6hMiXswcleXj5oNfcJc+DXS8Vj36XX2LaX98udog6Kc= -github.com/xtaci/smux v1.5.15/go.mod h1:OMlQbT5vcgl2gb49mFkYo6SMf+zP3rcjcwQz7ZU7IGY= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.starlark.net v0.0.0-20220817180228-f738f5508c12 h1:xOBJXWGEDwU5xSDxH6macxO11Us0AH2fTa9rmsbbF7g= -go.starlark.net v0.0.0-20220817180228-f738f5508c12/go.mod h1:VZcBMdr3cT3PnBoWunTabuSEXwVAH+ZJ5zxfs3AdASk= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d h1:ggxwEf5eu0l8v+87VhX1czFh8zJul3hK16Gmruxn7hw= -go4.org/netipx v0.0.0-20220812043211-3cc044ffd68d/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA= -golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/V2RayControl/main/main.go b/V2RayControl/main/main.go deleted file mode 100644 index 5bb1e79f1..000000000 --- a/V2RayControl/main/main.go +++ /dev/null @@ -1,82 +0,0 @@ -package main - -import ( - "fmt" - "time" - "v2rayControl" -) - -func main() { - fmt.Println("v2rayControl test") - - if err := v2rayControl.Start(JsonCfgTest); err != nil { - fmt.Println(err) - return - } - - fmt.Println("Started") - time.Sleep(time.Second * 5) - - fmt.Println("Stopping...") - if err := v2rayControl.Stop(); err != nil { - fmt.Println(err) - return - } - - time.Sleep(time.Second) - fmt.Println("Done") -} - -const JsonCfgTest = ` -{ - "log": { - "loglevel": "debug" - }, - "inbounds": [ - { - "port": "53142", - "protocol": "dokodemo-door", - "settings": { - "address": "91.232.28.116", - "port": 15351, - "network": "udp" - } - } - ], - "outbounds": [ - { - "tag": "proxy", - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "91.232.28.119", - "port": 2049, - "users": [ - { - "id": "27de860d-5601-412d-8b71-baa048a94b98", - "alterId": 0, - "security": "none" - } - ] - } - ] - }, - "streamSettings": { - "network": "quic", - "security": "tls", - "quicSettings": { - "security": "", - "key": "", - "header": { - "type": "srtp" - } - }, - "tlsSettings": { - "serverName": "ua2.gw.inet-telecom.com" - } - } - } - ] -} -` diff --git a/build-v2ray.sh b/build-v2ray.sh deleted file mode 100755 index 30f719e73..000000000 --- a/build-v2ray.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -e - -echo "=> Get gomobile.." -cd V2RayControl -PATH=$PATH:~/go/bin -go get golang.org/x/mobile/cmd/gomobile - -echo "=> Build iOS library.." -OUT_XCFRAMEWORK=../Frameworks/V2RayControl.xcframework -gomobile bind -trimpath -ldflags "-s -w" --target=ios -o ${OUT_XCFRAMEWORK} -echo "=> iOS build completed (out: ${OUT_XCFRAMEWORK})" -echo " !!!!!!!!!!!!!!!! " -echo " NOTE! The iOS project required the 'libresolv.tbd' library to be added to the project when using ${OUT_XCFRAMEWORK}" -echo " (Project->Build Phases->Link Binary With Libraries->Add Other->/usr/lib/libresolv.tbd)" -echo " !!!!!!!!!!!!!!!! " \ No newline at end of file diff --git a/wireguard-tunnel-provider/PacketTunnelProvider.swift b/wireguard-tunnel-provider/PacketTunnelProvider.swift index 081948476..b1709287a 100644 --- a/wireguard-tunnel-provider/PacketTunnelProvider.swift +++ b/wireguard-tunnel-provider/PacketTunnelProvider.swift @@ -27,6 +27,9 @@ import WireGuardKit import os import WidgetKit + + + enum PacketTunnelProviderError: String, Error { case savedProtocolConfigurationIsInvalid case dnsResolutionFailure @@ -41,6 +44,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider { private var networkMonitor: NWPathMonitor? private var ifname: String? private var updatedSettings: String? + private var v2rayHandle: Int32 = -1 + private var v2rayOutboundIp: String? + private var v2rayConfigJson: String? private var config: NETunnelProviderProtocol { return self.protocolConfiguration as! NETunnelProviderProtocol @@ -69,6 +75,39 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { + // Extract V2Ray settings from options or fallback to saved values for on-demand after reboot + var v2rayConfigString: String? = options?["v2rayConfig"] as? String + var v2rayOutboundIpOption: String? = options?["v2rayOutboundIp"] as? String + if v2rayConfigString == nil, UserDefaults.shared.isV2ray { + // Fallback to persisted values saved by the host app + let savedJson = UserDefaults.shared.string(forKey: UserDefaults.Key.v2rayConfigJson) + let savedOutbound = UserDefaults.shared.string(forKey: UserDefaults.Key.v2rayOutboundIpLast) + if let json = savedJson, !json.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + v2rayConfigString = json + v2rayOutboundIpOption = savedOutbound + wg_log(.info, message: "Using persisted V2Ray config due to missing options (on-demand)") + } + } + + if let v2rayConfigString = v2rayConfigString { + wg_log(.info, message: "V2Ray config detected, starting V2Ray first") + + // -> outbound ip + v2rayOutboundIp = v2rayOutboundIpOption + v2rayConfigJson = v2rayConfigString + + if let error = startV2Ray(jsonString: v2rayConfigString) { + wg_log(.error, message: "Failed to start V2Ray: \(error.localizedDescription)") + completionHandler(error) + return + } + wg_log(.info, message: "V2Ray started successfully, proceeding with WireGuard") + } else { + wg_log(.info, message: "No V2Ray config provided, starting WireGuard only") + v2rayOutboundIp = nil + v2rayConfigJson = nil + } + guard let addresses = UserDefaults.shared.isIPv6 ? KeyChain.wgIpAddresses : KeyChain.wgIpAddress, let wgPrivateKey = KeyChain.wgPrivateKey else { tunnelSetupFailed() completionHandler(PacketTunnelProviderError.couldNotStartBackend) @@ -123,6 +162,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider { override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { wg_log(.info, message: "Stopping tunnel") + // Stop V2Ray first + let _ = stopV2Ray() + networkMonitor?.cancel() networkMonitor = nil @@ -216,20 +258,39 @@ class PacketTunnelProvider: NEPacketTunnelProvider { // IPv4 settings let validatedIPv4Addresses = validatedAddresses.filter { $0.addressType == .IPv4 } if validatedIPv4Addresses.count > 0 { - let ipv4Settings = NEIPv4Settings(addresses: validatedIPv4Addresses.map { $0.ipAddress }, subnetMasks: validatedIPv4Addresses.map { $0.subnetString }) - ipv4Settings.includedRoutes = [NEIPv4Route.default()] - ipv4Settings.excludedRoutes = validatedEndpoints.filter { $0.addressType == .IPv4 }.map { - NEIPv4Route(destinationAddress: $0.ipAddress, subnetMask: "255.255.255.255")} - - newSettings.ipv4Settings = ipv4Settings - } + let ipv4Settings = NEIPv4Settings(addresses: validatedIPv4Addresses.map { $0.ipAddress }, subnetMasks: validatedIPv4Addresses.map { $0.subnetString }) + ipv4Settings.includedRoutes = [NEIPv4Route.default()] + var excludedIPv4Routes = validatedEndpoints.filter { $0.addressType == .IPv4 }.map { + NEIPv4Route(destinationAddress: $0.ipAddress, subnetMask: "255.255.255.255")} + + // Add V2Ray server IP to bypass routes (prevents circular routing) -> similar to android impl + if let v2rayOutboundIp = v2rayOutboundIp, !v2rayOutboundIp.isEmpty { + // add V2Ray server IP as /32 route that bypasses the VPN tunnel + let v2rayRoute = NEIPv4Route(destinationAddress: v2rayOutboundIp, subnetMask: "255.255.255.255") + excludedIPv4Routes.append(v2rayRoute) + wg_log(.info, message: "Added V2Ray server IP to bypass routes: \(v2rayOutboundIp)") + } + + ipv4Settings.excludedRoutes = excludedIPv4Routes + + newSettings.ipv4Settings = ipv4Settings + } // IPv6 settings let validatedIPv6Addresses = validatedAddresses.filter { $0.addressType == .IPv6 } if validatedIPv6Addresses.count > 0 { let ipv6Settings = NEIPv6Settings(addresses: validatedIPv6Addresses.map { $0.ipAddress }, networkPrefixLengths: validatedIPv6Addresses.map { NSNumber(value: $0.subnet) }) ipv6Settings.includedRoutes = [NEIPv6Route.default()] - ipv6Settings.excludedRoutes = validatedEndpoints.filter { $0.addressType == .IPv6 }.map { NEIPv6Route(destinationAddress: $0.ipAddress, networkPrefixLength: 128) } + var excludedIPv6Routes = validatedEndpoints.filter { $0.addressType == .IPv6 }.map { NEIPv6Route(destinationAddress: $0.ipAddress, networkPrefixLength: 128) } + + // Add V2Ray server IPv6 to bypass routes if device prefers IPv6 and outbound has AAAA + if let v2rayOutboundIp = v2rayOutboundIp, !v2rayOutboundIp.isEmpty, v2rayOutboundIp.contains(":") { + let v2rayIPv6Route = NEIPv6Route(destinationAddress: v2rayOutboundIp, networkPrefixLength: 128) + excludedIPv6Routes.append(v2rayIPv6Route) + wg_log(.info, message: "Added V2Ray IPv6 to bypass routes: \(v2rayOutboundIp)") + } + + ipv6Settings.excludedRoutes = excludedIPv6Routes newSettings.ipv6Settings = ipv6Settings } @@ -282,7 +343,55 @@ class PacketTunnelProvider: NEPacketTunnelProvider { private func pathUpdate(path: Network.NWPath) { guard let handle = handle else { return } wg_log(.info, message: "Network change detected: \(path.debugDescription)") + // If V2Ray is active, restart it to rebind sockets on the new path + if v2rayHandle >= 0 { + wg_log(.info, message: "Restarting V2Ray due to network change") + let _ = stopV2Ray() + if let json = v2rayConfigJson { + if let error = startV2Ray(jsonString: json) { + wg_log(.error, message: "Failed to restart V2Ray after path change: \(error.localizedDescription)") + } else { + wg_log(.info, message: "V2Ray restarted successfully after path change") + } + } + } wgSetConfig(handle, settings) } + // MARK: - V2Ray Control -> Exported + + func startV2Ray(jsonString: String) -> Error? { + let _ = stopV2Ray() + + var handle: Int32 = -1 + jsonString.withCString { cstr in + handle = wgV2rayStart(cstr) + } + + if handle < 0 { + return NSError(domain: "wg.v2ray", code: Int(handle), userInfo: [NSLocalizedDescriptionKey: "Failed to start V2Ray"]) + } + + v2rayHandle = handle + wg_log(.info, message: "V2Ray started with handle: \(handle)") + return nil + } + + func stopV2Ray() -> Error? { + if v2rayHandle >= 0 { + let rc = wgV2rayStop(v2rayHandle) + let oldHandle = v2rayHandle + v2rayHandle = -1 + + if rc != 0 { + return NSError(domain: "wg.v2ray", code: Int(rc), userInfo: [NSLocalizedDescriptionKey: "Failed to stop V2Ray"]) + } + + wg_log(.info, message: "V2Ray stopped for handle: \(oldHandle)") + } + return nil + } + + + }