From 8bc751299eab19408b9c2774e680458a5f0ed68c Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Tue, 4 Mar 2025 19:36:21 +0100 Subject: [PATCH] Update On Tue Mar 4 19:36:21 CET 2025 --- .github/update.log | 1 + china-ip/china_ip_list.txt | 2033 +++++++++++------ clash-nyanpasu/backend/Cargo.lock | 4 +- clash-nyanpasu/frontend/nyanpasu/package.json | 2 +- clash-nyanpasu/manifest/version.json | 8 +- clash-nyanpasu/package.json | 2 +- clash-nyanpasu/pnpm-lock.yaml | 150 +- .../scripts/deno/upload-macos-updater.ts | 8 +- clash-verge-rev/src-tauri/Cargo.lock | 27 +- clash-verge-rev/src-tauri/Cargo.toml | 6 + clash-verge-rev/src-tauri/src/cmd/app.rs | 45 +- clash-verge-rev/src-tauri/src/cmd/proxy.rs | 45 +- clash-verge-rev/src-tauri/src/cmd/system.rs | 3 +- .../src-tauri/src/config/api/mihomo.rs | 1 - .../src-tauri/src/config/api/mod.rs | 1 - clash-verge-rev/src-tauri/src/config/mod.rs | 3 - .../src-tauri/src/core/clash_api.rs | 2 +- .../src-tauri/src/crate_mihomo_api/Cargo.toml | 14 + .../src-tauri/src/crate_mihomo_api/src/lib.rs | 76 + .../src/crate_mihomo_api/src/model.rs | 27 + .../crate_mihomo_api/tests/test_mihomo_api.rs | 28 + clash-verge-rev/src-tauri/src/lib.rs | 1 - .../src-tauri/src/model/api/common.rs | 20 - .../src-tauri/src/model/api/mihomo.rs | 5 - .../src-tauri/src/model/api/mod.rs | 2 - clash-verge-rev/src-tauri/src/model/mod.rs | 2 - .../src-tauri/src/model/sysinfo.rs | 18 - .../src-tauri/src/module/api/common.rs | 70 - .../src-tauri/src/module/api/mihomo.rs | 108 - .../src-tauri/src/module/api/mod.rs | 2 - .../src-tauri/src/module/mihomo.rs | 158 -- clash-verge-rev/src-tauri/src/module/mod.rs | 4 +- .../src-tauri/src/module/sysinfo.rs | 43 +- .../components/setting/mods/layout-viewer.tsx | 33 +- .../src/components/setting/setting-system.tsx | 12 +- clash-verge-rev/src/pages/_layout.tsx | 9 +- clash-verge-rev/src/services/cmds.ts | 14 +- .../arch/arm64/boot/dts/rockchip/rk3528.dtsi | 3 +- ...ockchip-naneng-combphy-fix-phy-reset.patch | 9 +- ...i-of-dwcmshc-pcie-support-for-rk3528.patch | 97 - ...inno-usb2-add-phy-support-for-rk3528.patch | 23 +- ...i-of-dwcmshc-pcie-support-for-rk3528.patch | 93 - ...i-of-dwcmshc-pcie-support-for-rk3528.patch | 97 - mieru/cmd/mieru/mieru.go | 1 + mieru/cmd/mita/mita.go | 1 + mieru/pkg/appctl/apptime.go | 43 + mieru/pkg/cli/client.go | 1 + mieru/pkg/cli/server.go | 2 + .../Auto compile with openwrt sdk.yml | 1 - .../luasrc/model/cbi/passwall/client/rule.lua | 47 +- .../luci-app-passwall/po/zh-cn/passwall.po | 10 +- .../root/usr/share/passwall/0_default_config | 2 + .../root/usr/share/passwall/app.sh | 23 +- .../share/passwall/helper_chinadns_add.lua | 2 +- .../share/passwall/helper_smartdns_add.lua | 2 +- .../root/usr/share/passwall/rule_update.lua | 4 +- shadowsocks-rust/Cargo.lock | 12 +- small/luci-app-nikki/Makefile | 2 +- .../luci-static/resources/tools/nikki.js | 2 +- small/luci-app-passwall/Makefile | 8 +- .../model/cbi/passwall/client/other.lua | 36 - .../luasrc/model/cbi/passwall/client/rule.lua | 47 +- .../luasrc/passwall/util_sing-box.lua | 116 +- small/luci-app-passwall/po/zh-cn/passwall.po | 28 +- .../root/usr/share/passwall/0_default_config | 6 +- .../root/usr/share/passwall/app.sh | 21 +- .../share/passwall/helper_chinadns_add.lua | 2 +- .../share/passwall/helper_smartdns_add.lua | 2 +- .../root/usr/share/passwall/rule_update.lua | 4 +- v2rayn/v2rayN/AmazTool/Program.cs | 21 +- v2rayn/v2rayN/AmazTool/UpgradeApp.cs | 169 +- v2rayn/v2rayN/AmazTool/Utils.cs | 10 +- v2rayn/v2rayN/Directory.Build.props | 2 +- v2rayn/v2rayN/ServiceLib/Global.cs | 3 +- .../ServiceLib/Handler/AutoStartupHandler.cs | 2 +- .../v2rayN/ServiceLib/Models/V2rayConfig.cs | 2 + .../CoreConfig/CoreConfigV2rayService.cs | 3 +- v2rayng/AndroidLibXrayLite/go.mod | 6 +- v2rayng/AndroidLibXrayLite/go.sum | 16 +- v2rayng/V2rayNG/app/build.gradle.kts | 9 +- .../v2ray/ang/service/V2RayServiceManager.kt | 26 +- .../java/com/v2ray/ang/ui/AboutActivity.kt | 72 +- .../java/com/v2ray/ang/ui/MainActivity.kt | 164 +- .../com/v2ray/ang/ui/MainRecyclerAdapter.kt | 18 +- .../com/v2ray/ang/ui/PerAppProxyActivity.kt | 137 +- .../v2ray/ang/ui/RoutingSettingActivity.kt | 28 +- .../com/v2ray/ang/ui/ScScannerActivity.kt | 26 +- .../java/com/v2ray/ang/ui/ScannerActivity.kt | 74 +- .../com/v2ray/ang/ui/UserAssetActivity.kt | 66 +- .../java/com/v2ray/ang/util/AppManagerUtil.kt | 45 +- v2rayng/V2rayNG/gradle/libs.versions.toml | 20 +- xray-core/app/proxyman/inbound/worker.go | 1 + xray-core/common/mux/server.go | 2 +- xray-core/common/protocol/http/sniff.go | 2 +- xray-core/common/session/context.go | 12 +- xray-core/common/session/session.go | 39 +- xray-core/infra/conf/transport_internet.go | 8 +- yt-dlp/yt_dlp/extractor/_extractors.py | 1 + yt-dlp/yt_dlp/extractor/magellantv.py | 46 +- yt-dlp/yt_dlp/extractor/n1.py | 56 +- yt-dlp/yt_dlp/extractor/rtp.py | 226 +- yt-dlp/yt_dlp/extractor/tvw.py | 117 + 102 files changed, 2790 insertions(+), 2373 deletions(-) delete mode 100644 clash-verge-rev/src-tauri/src/config/api/mihomo.rs delete mode 100644 clash-verge-rev/src-tauri/src/config/api/mod.rs create mode 100644 clash-verge-rev/src-tauri/src/crate_mihomo_api/Cargo.toml create mode 100644 clash-verge-rev/src-tauri/src/crate_mihomo_api/src/lib.rs create mode 100644 clash-verge-rev/src-tauri/src/crate_mihomo_api/src/model.rs create mode 100644 clash-verge-rev/src-tauri/src/crate_mihomo_api/tests/test_mihomo_api.rs delete mode 100644 clash-verge-rev/src-tauri/src/model/api/common.rs delete mode 100644 clash-verge-rev/src-tauri/src/model/api/mihomo.rs delete mode 100644 clash-verge-rev/src-tauri/src/model/api/mod.rs delete mode 100644 clash-verge-rev/src-tauri/src/model/mod.rs delete mode 100644 clash-verge-rev/src-tauri/src/model/sysinfo.rs delete mode 100644 clash-verge-rev/src-tauri/src/module/api/common.rs delete mode 100644 clash-verge-rev/src-tauri/src/module/api/mihomo.rs delete mode 100644 clash-verge-rev/src-tauri/src/module/api/mod.rs delete mode 100644 clash-verge-rev/src-tauri/src/module/mihomo.rs create mode 100644 mieru/pkg/appctl/apptime.go create mode 100644 yt-dlp/yt_dlp/extractor/tvw.py diff --git a/.github/update.log b/.github/update.log index 74729b326a..9f1c6027e7 100644 --- a/.github/update.log +++ b/.github/update.log @@ -931,3 +931,4 @@ Update On Fri Feb 28 19:34:20 CET 2025 Update On Sat Mar 1 19:31:26 CET 2025 Update On Sun Mar 2 19:33:02 CET 2025 Update On Mon Mar 3 19:34:32 CET 2025 +Update On Tue Mar 4 19:36:12 CET 2025 diff --git a/china-ip/china_ip_list.txt b/china-ip/china_ip_list.txt index 0cda593ce1..ee3e8b8ced 100644 --- a/china-ip/china_ip_list.txt +++ b/china-ip/china_ip_list.txt @@ -5,7 +5,9 @@ 1.1.0.0/24 1.1.2.0/23 1.1.4.0/22 -1.1.8.0/21 +1.1.9.0/24 +1.1.10.0/23 +1.1.12.0/22 1.1.16.0/20 1.1.32.0/19 1.2.0.0/23 @@ -53,8 +55,6 @@ 1.118.4.0/22 1.118.8.0/21 1.118.16.0/20 -1.118.33.0/24 -1.118.34.0/23 1.118.36.0/22 1.118.40.0/21 1.118.48.0/20 @@ -69,9 +69,25 @@ 1.204.0.0/14 5.154.155.54/31 5.154.155.58/31 +5.154.156.38/31 +5.154.156.42/31 5.154.156.50/31 5.154.156.54/31 -8.128.0.0/10 +8.128.0.0/12 +8.144.0.0/14 +8.148.0.0/19 +8.148.32.0/22 +8.148.36.0/23 +8.148.38.0/24 +8.148.42.0/24 +8.148.44.0/22 +8.148.48.0/20 +8.148.64.0/18 +8.148.128.0/17 +8.149.0.0/16 +8.150.0.0/15 +8.152.0.0/13 +8.160.0.0/11 13.104.184.80/28 14.0.0.0/21 14.0.12.0/22 @@ -80,8 +96,7 @@ 14.1.108.0/22 14.16.0.0/12 14.102.128.0/22 -14.102.181.0/24 -14.102.182.0/23 +14.102.180.0/22 14.103.0.0/16 14.104.0.0/13 14.112.0.0/12 @@ -94,9 +109,21 @@ 14.196.0.0/15 14.204.0.0/15 14.208.0.0/12 +15.32.104.0/23 +15.36.64.0/22 +15.36.75.0/24 +15.36.76.0/22 +15.36.101.0/24 +15.36.102.0/24 +15.36.116.0/23 +15.40.80.0/23 +15.40.83.0/24 +15.79.88.0/22 +15.89.164.0/22 15.230.41.0/24 15.230.49.0/24 15.230.141.0/24 +15.248.5.228/30 16.2.142.0/23 17.85.6.64/29 17.85.34.0/25 @@ -106,7 +133,7 @@ 17.87.0.0/21 17.87.9.0/24 17.87.10.0/23 -17.87.12.0/22 +17.87.12.0/23 17.87.16.32/27 17.87.16.64/26 17.87.16.128/25 @@ -115,9 +142,11 @@ 17.87.20.0/22 17.87.24.0/21 17.87.72.224/31 -17.87.80.0/21 17.87.112.0/21 17.87.138.160/31 +17.87.144.16/28 +17.87.145.192/27 +17.87.245.0/24 17.88.2.16/28 17.88.73.0/31 17.88.75.0/24 @@ -126,6 +155,7 @@ 17.88.104.64/31 17.88.108.0/23 17.88.112.126/31 +17.88.118.0/27 17.88.207.192/32 17.93.8.0/21 17.93.24.0/21 @@ -154,7 +184,6 @@ 17.127.128.0/23 17.127.130.0/24 17.235.160.0/20 -20.139.160.0/20 27.0.128.0/21 27.0.160.0/21 27.0.188.0/22 @@ -172,7 +201,6 @@ 27.54.192.0/18 27.98.208.0/20 27.98.224.0/19 -27.99.128.0/17 27.103.0.0/16 27.106.128.0/18 27.106.204.0/22 @@ -195,10 +223,10 @@ 27.192.0.0/11 27.224.0.0/14 36.0.0.0/22 +36.0.8.0/21 36.0.16.0/20 36.0.32.0/19 36.0.64.0/18 -36.0.128.0/17 36.1.0.0/16 36.4.0.0/14 36.16.0.0/12 @@ -216,11 +244,11 @@ 36.51.0.0/17 36.51.128.0/18 36.51.192.0/19 +36.51.227.0/24 36.51.228.0/22 -36.51.232.0/22 -36.51.236.0/23 -36.51.238.0/24 +36.51.232.0/21 36.51.240.0/21 +36.51.249.0/24 36.51.250.0/23 36.51.252.0/23 36.56.0.0/13 @@ -232,9 +260,9 @@ 36.255.116.0/22 36.255.128.0/22 36.255.164.0/22 -36.255.173.0/24 -36.255.174.0/23 -36.255.176.0/22 +36.255.172.0/22 +36.255.176.0/23 +36.255.179.0/24 39.0.0.0/24 39.0.2.0/23 39.0.4.0/22 @@ -255,7 +283,6 @@ 39.100.0.0/14 39.104.0.0/14 39.108.0.0/16 -39.109.120.0/23 39.128.0.0/10 40.0.176.0/20 40.0.248.0/21 @@ -265,6 +292,7 @@ 40.77.254.64/27 40.125.128.0/17 40.126.64.0/18 +40.162.0.0/16 40.198.10.0/24 40.198.16.0/21 40.198.24.0/23 @@ -275,11 +303,11 @@ 42.0.16.0/21 42.0.24.0/22 42.0.32.0/19 -42.0.128.0/17 42.1.0.0/19 42.1.32.0/20 42.1.48.0/21 42.1.56.0/22 +42.1.128.0/17 42.4.0.0/14 42.48.0.0/13 42.56.0.0/14 @@ -295,9 +323,8 @@ 42.83.88.0/21 42.83.96.0/19 42.83.128.0/23 -42.83.137.0/24 -42.83.138.0/23 -42.83.140.0/22 +42.83.135.0/24 +42.83.136.0/21 42.83.144.0/20 42.83.160.0/19 42.83.192.0/18 @@ -329,14 +356,27 @@ 42.156.40.0/21 42.156.48.0/20 42.156.64.0/18 -42.156.128.0/17 -42.157.0.0/21 -42.157.8.0/22 -42.157.14.0/23 -42.157.16.0/20 -42.157.32.0/19 -42.157.64.0/18 -42.157.128.0/17 +42.156.128.0/18 +42.156.192.0/19 +42.156.224.0/20 +42.156.240.0/21 +42.156.248.0/22 +42.156.252.0/26 +42.156.252.64/27 +42.156.252.96/29 +42.156.252.106/31 +42.156.252.110/31 +42.156.252.112/31 +42.156.252.116/30 +42.156.252.120/29 +42.156.252.128/26 +42.156.252.192/27 +42.156.252.224/30 +42.156.252.232/29 +42.156.252.240/28 +42.156.253.0/24 +42.156.254.0/23 +42.157.0.0/16 42.158.0.0/15 42.160.0.0/12 42.176.0.0/13 @@ -369,50 +409,49 @@ 43.96.6.0/24 43.96.30.0/23 43.96.37.0/24 -43.96.38.0/23 -43.96.40.0/21 +43.96.38.0/24 +43.96.41.0/24 +43.96.42.0/23 +43.96.44.0/22 43.96.48.0/20 -43.96.78.0/23 -43.96.81.0/24 -43.96.82.0/23 -43.96.84.0/22 -43.96.88.0/21 -43.96.96.0/19 +43.96.79.0/24 +43.96.82.0/24 +43.96.86.0/23 +43.96.89.0/24 +43.96.90.0/23 +43.96.92.0/22 +43.96.98.0/23 +43.96.100.0/22 +43.96.104.0/21 +43.96.112.0/20 43.96.128.0/17 43.97.0.0/16 43.98.0.0/15 43.100.0.0/14 43.104.0.0/13 43.112.0.0/12 -43.131.160.0/19 43.135.224.0/19 43.136.0.0/13 43.144.0.0/13 43.152.16.0/24 -43.152.30.0/24 43.152.38.0/23 43.152.46.0/24 43.152.48.0/24 -43.152.116.0/22 +43.152.118.0/23 43.152.120.0/21 43.152.141.0/24 -43.152.150.0/24 -43.152.164.0/23 +43.152.165.0/24 43.152.167.0/24 -43.152.172.0/23 -43.152.174.0/24 43.152.189.0/24 43.152.191.0/24 43.159.66.0/24 43.159.68.0/24 -43.159.70.0/23 -43.159.72.0/23 43.159.75.0/24 43.159.76.0/24 43.159.92.0/24 43.159.101.0/24 -43.163.128.0/18 -43.164.0.0/14 +43.164.64.0/18 +43.166.192.0/19 43.168.0.0/14 43.172.0.0/21 43.172.8.0/22 @@ -422,44 +461,18 @@ 43.172.32.0/19 43.172.64.0/18 43.172.128.0/17 -43.173.0.0/16 -43.174.0.0/16 -43.175.0.0/21 -43.175.9.0/24 -43.175.10.0/23 -43.175.13.0/24 -43.175.14.0/23 -43.175.20.0/23 -43.175.23.0/24 -43.175.26.0/23 -43.175.31.0/24 -43.175.35.0/24 -43.175.38.0/24 -43.175.41.0/24 -43.175.42.0/24 -43.175.51.0/24 -43.175.59.0/24 -43.175.62.0/23 -43.175.64.0/24 -43.175.70.0/24 -43.175.72.0/24 -43.175.76.0/23 -43.175.105.0/24 -43.175.106.0/24 -43.175.109.0/24 -43.175.110.0/23 -43.175.126.0/23 -43.175.128.0/22 -43.175.132.0/23 -43.175.137.0/24 -43.175.138.0/23 -43.175.140.0/22 -43.175.144.0/20 -43.175.160.0/19 -43.175.192.0/19 -43.175.241.0/24 -43.175.244.0/22 -43.175.248.0/21 +43.174.107.0/24 +43.174.108.0/22 +43.174.112.0/20 +43.174.128.0/18 +43.174.202.0/24 +43.174.208.0/20 +43.174.226.0/23 +43.174.228.0/22 +43.174.232.0/21 +43.174.240.0/21 +43.174.252.0/22 +43.175.223.0/24 43.176.0.0/12 43.192.0.0/14 43.196.0.0/15 @@ -472,8 +485,7 @@ 43.224.72.0/22 43.224.80.0/22 43.224.100.0/22 -43.224.144.0/22 -43.224.161.0/24 +43.224.160.0/22 43.224.176.0/22 43.224.184.0/22 43.224.200.0/21 @@ -492,10 +504,7 @@ 43.225.252.0/22 43.226.32.0/19 43.226.64.0/19 -43.226.96.0/21 -43.226.104.0/22 -43.226.109.0/24 -43.226.110.0/24 +43.226.96.0/20 43.226.112.0/21 43.226.120.0/22 43.226.128.0/18 @@ -554,33 +563,39 @@ 43.231.144.0/20 43.231.160.0/20 43.231.176.0/21 -43.236.0.0/18 -43.236.64.0/19 -43.236.96.0/21 -43.236.104.0/24 -43.236.106.0/23 -43.236.108.0/22 -43.236.112.0/20 -43.236.128.0/17 +43.236.0.0/17 +43.236.128.0/18 +43.236.192.0/19 +43.236.224.0/20 +43.236.240.0/21 +43.236.248.0/22 +43.236.253.0/24 +43.236.254.0/23 43.237.0.0/21 -43.237.8.0/24 -43.237.10.0/23 +43.237.11.0/24 43.237.12.0/22 43.237.16.0/20 43.237.32.0/22 -43.237.36.0/23 -43.237.39.0/24 +43.237.37.0/24 43.237.40.0/21 43.237.48.0/20 43.237.64.0/18 43.237.128.0/18 -43.237.192.0/20 +43.237.192.0/22 +43.237.200.0/21 43.237.208.0/21 43.237.217.0/24 -43.237.218.0/23 +43.237.219.0/24 43.237.220.0/22 43.237.224.0/19 -43.238.0.0/16 +43.238.0.0/17 +43.238.128.0/20 +43.238.145.0/24 +43.238.146.0/23 +43.238.148.0/22 +43.238.152.0/21 +43.238.160.0/19 +43.238.192.0/18 43.239.0.0/19 43.239.32.0/20 43.239.48.0/22 @@ -598,10 +613,7 @@ 43.240.156.0/22 43.240.160.0/19 43.240.192.0/19 -43.240.240.0/22 -43.240.245.0/24 -43.240.246.0/23 -43.240.248.0/21 +43.240.240.0/20 43.241.0.0/20 43.241.16.0/21 43.241.48.0/22 @@ -626,6 +638,7 @@ 43.242.96.0/22 43.242.144.0/20 43.242.160.0/21 +43.242.168.0/22 43.242.180.0/22 43.242.188.0/22 43.242.192.0/21 @@ -676,7 +689,10 @@ 43.248.96.0/19 43.248.128.0/20 43.248.144.0/21 -43.248.176.0/20 +43.248.177.0/24 +43.248.178.0/23 +43.248.180.0/22 +43.248.184.0/21 43.248.192.0/20 43.248.208.0/22 43.248.228.0/22 @@ -716,11 +732,11 @@ 43.250.15.0/24 43.250.16.0/21 43.250.28.0/22 -43.250.32.0/22 +43.250.32.0/21 43.250.96.0/21 +43.250.107.0/24 43.250.108.0/22 43.250.112.0/22 -43.250.118.0/23 43.250.128.0/22 43.250.144.0/21 43.250.160.0/22 @@ -732,13 +748,14 @@ 43.250.236.0/22 43.250.244.0/22 43.251.4.0/22 +43.251.9.0/24 +43.251.10.0/23 43.251.36.0/22 43.251.192.0/22 43.251.232.0/22 43.251.244.0/22 43.252.48.0/22 43.252.56.0/22 -43.252.224.0/22 43.254.0.0/21 43.254.8.0/22 43.254.24.0/22 @@ -752,13 +769,12 @@ 43.254.100.0/22 43.254.104.0/22 43.254.112.0/21 -43.254.128.0/22 43.254.136.0/21 43.254.144.0/20 43.254.168.0/21 43.254.180.0/22 43.254.184.0/21 -43.254.192.0/22 +43.254.192.0/21 43.254.200.0/22 43.254.208.0/22 43.254.220.0/22 @@ -787,16 +803,34 @@ 45.65.16.0/20 45.112.132.0/22 45.112.188.0/22 -45.112.208.0/20 +45.112.208.0/21 +45.112.216.0/22 +45.112.220.0/23 +45.112.222.0/26 +45.112.222.64/27 +45.112.222.96/29 +45.112.222.106/31 +45.112.222.108/30 +45.112.222.112/28 +45.112.222.130/31 +45.112.222.132/30 +45.112.222.136/29 +45.112.222.146/31 +45.112.222.150/31 +45.112.222.152/29 +45.112.222.160/27 +45.112.222.192/26 +45.112.223.0/24 45.112.228.0/22 45.112.232.0/21 45.113.12.0/22 45.113.16.0/20 45.113.40.0/22 -45.113.52.0/22 +45.113.56.0/22 45.113.72.0/22 45.113.144.0/21 45.113.168.0/22 +45.113.176.0/22 45.113.184.0/22 45.113.200.0/21 45.113.208.0/20 @@ -804,6 +838,7 @@ 45.113.252.0/22 45.114.0.0/22 45.114.32.0/22 +45.114.40.0/22 45.114.52.0/22 45.114.96.0/22 45.114.136.0/22 @@ -826,7 +861,7 @@ 45.116.24.0/22 45.116.32.0/21 45.116.52.0/22 -45.116.100.0/22 +45.116.96.0/21 45.116.140.0/22 45.116.152.0/22 45.116.208.0/22 @@ -845,7 +880,7 @@ 45.120.140.0/22 45.120.164.0/22 45.120.180.128/27 -45.120.182.0/23 +45.120.182.0/24 45.120.240.0/24 45.120.242.0/23 45.121.52.0/22 @@ -909,6 +944,7 @@ 45.125.136.0/23 45.125.138.0/24 45.126.48.0/21 +45.126.100.0/22 45.126.108.0/22 45.126.112.0/21 45.126.120.0/22 @@ -919,7 +955,7 @@ 45.127.144.0/21 45.127.156.0/22 45.248.8.0/22 -45.248.80.0/22 +45.248.80.0/21 45.248.88.0/22 45.248.96.0/20 45.248.128.0/21 @@ -954,7 +990,7 @@ 45.251.0.0/22 45.251.8.0/22 45.251.16.0/21 -45.251.52.0/22 +45.251.54.0/23 45.251.84.0/22 45.251.88.0/21 45.251.96.0/21 @@ -1004,6 +1040,7 @@ 45.254.192.0/19 45.254.224.0/21 45.254.236.0/22 +45.254.240.0/22 45.254.248.0/22 45.255.0.0/18 45.255.64.0/19 @@ -1017,12 +1054,16 @@ 45.255.224.0/20 45.255.240.0/21 45.255.248.0/22 -46.3.111.0/24 46.248.24.0/23 47.92.0.0/14 47.96.0.0/11 49.4.0.0/17 -49.4.160.0/19 +49.4.128.0/22 +49.4.160.0/20 +49.4.178.0/23 +49.4.180.0/22 +49.4.184.0/21 +49.4.192.0/18 49.5.0.0/16 49.6.0.0/15 49.51.57.0/24 @@ -1044,6 +1085,11 @@ 49.232.0.0/14 49.239.0.0/18 49.239.192.0/18 +49.246.224.0/23 +49.246.228.0/22 +49.246.232.0/23 +49.246.236.0/22 +49.246.240.0/20 52.80.0.0/14 52.93.242.120/29 52.93.242.128/25 @@ -1052,13 +1098,20 @@ 54.222.0.0/15 54.240.224.0/24 57.176.0.0/15 -58.14.0.0/15 +58.14.0.0/21 +58.14.16.0/20 +58.14.32.0/19 +58.14.64.0/18 +58.14.128.0/17 +58.15.0.0/16 58.16.0.0/13 58.24.0.0/15 58.30.0.0/15 58.32.0.0/11 58.65.232.0/21 -58.66.0.0/15 +58.66.0.0/18 +58.66.192.0/18 +58.67.0.0/16 58.68.128.0/19 58.68.160.0/21 58.68.200.0/21 @@ -1077,17 +1130,10 @@ 58.240.0.0/12 59.32.0.0/11 59.64.0.0/12 -59.80.0.0/15 -59.82.0.0/16 -59.83.0.0/18 -59.83.144.0/20 -59.83.160.0/20 -59.83.180.0/22 -59.83.184.0/21 -59.83.192.0/19 -59.83.224.0/21 -59.83.232.0/22 -59.107.0.0/16 +59.80.0.0/14 +59.107.0.0/17 +59.107.128.0/18 +59.107.252.0/22 59.108.0.0/14 59.151.0.0/17 59.152.16.0/20 @@ -1096,7 +1142,6 @@ 59.152.112.0/21 59.153.4.0/22 59.153.32.0/22 -59.153.60.0/22 59.153.64.0/21 59.153.72.0/22 59.153.92.0/22 @@ -1124,10 +1169,7 @@ 60.252.0.0/16 60.253.128.0/17 60.255.0.0/16 -61.4.81.0/24 -61.4.82.0/23 -61.4.84.0/22 -61.4.88.0/21 +61.4.80.0/20 61.4.176.0/20 61.8.160.0/20 61.14.212.0/22 @@ -1158,6 +1200,9 @@ 61.236.0.0/15 61.240.0.0/14 62.234.0.0/16 +64.235.230.152/30 +65.97.55.248/29 +66.119.149.0/24 67.220.137.144/28 68.79.0.0/18 69.230.192.0/18 @@ -1174,7 +1219,11 @@ 82.156.0.0/15 87.254.207.0/24 93.113.109.8/29 +93.113.109.24/29 +93.113.109.104/29 93.113.109.136/29 +93.113.109.152/29 +93.113.109.232/29 93.183.14.0/24 93.183.18.0/24 94.191.0.0/17 @@ -1187,14 +1236,15 @@ 101.34.0.0/15 101.36.0.0/18 101.36.64.0/20 +101.36.82.0/23 +101.36.85.0/24 +101.36.86.0/23 101.36.88.0/21 101.36.128.0/17 101.37.0.0/16 101.38.0.0/15 101.40.0.0/14 -101.46.96.0/20 -101.48.192.0/18 -101.49.0.0/16 +101.48.0.0/15 101.50.8.0/21 101.50.56.0/22 101.52.0.0/16 @@ -1237,14 +1287,7 @@ 101.129.0.0/16 101.130.0.0/15 101.132.0.0/15 -101.134.0.0/17 -101.134.128.0/19 -101.134.160.0/20 -101.134.176.0/21 -101.134.184.0/22 -101.134.189.0/24 -101.134.190.0/23 -101.134.192.0/18 +101.134.0.0/16 101.135.0.0/19 101.135.32.0/24 101.135.34.0/23 @@ -1256,22 +1299,19 @@ 101.144.0.0/12 101.192.0.0/14 101.196.0.0/16 -101.198.0.0/22 -101.198.128.0/24 +101.198.0.0/17 +101.198.128.0/19 101.198.170.0/23 101.198.172.0/22 101.198.176.0/21 101.198.184.0/22 101.198.189.0/24 101.198.190.0/23 -101.198.194.0/24 101.198.196.0/22 -101.198.200.0/22 +101.198.200.0/21 +101.198.208.0/20 101.198.224.0/19 -101.199.0.0/19 -101.199.48.0/20 -101.199.64.0/18 -101.199.128.0/17 +101.199.0.0/16 101.200.0.0/15 101.203.128.0/19 101.203.160.0/21 @@ -1298,6 +1338,7 @@ 103.1.8.0/22 103.1.20.0/22 103.1.24.0/22 +103.1.72.0/22 103.1.88.0/22 103.1.168.0/22 103.2.108.0/22 @@ -1313,12 +1354,11 @@ 103.3.148.0/22 103.3.152.0/21 103.4.56.0/22 -103.4.169.0/24 -103.4.170.0/23 +103.4.168.0/22 103.4.184.0/22 103.4.224.0/22 103.5.36.0/22 -103.5.52.0/24 +103.5.52.0/23 103.5.56.0/22 103.5.152.0/22 103.5.168.0/22 @@ -1338,8 +1378,7 @@ 103.8.68.0/22 103.8.108.0/22 103.8.156.0/22 -103.8.200.0/23 -103.8.204.0/22 +103.8.200.0/21 103.8.220.0/22 103.9.8.0/22 103.9.24.0/22 @@ -1381,7 +1420,7 @@ 103.16.124.0/22 103.17.40.0/22 103.17.64.0/22 -103.17.120.0/23 +103.17.120.0/22 103.17.136.0/22 103.17.160.0/22 103.17.204.0/22 @@ -1408,19 +1447,19 @@ 103.21.112.0/21 103.21.140.0/22 103.21.176.0/22 -103.21.240.0/24 -103.21.242.0/23 +103.21.240.0/22 103.22.0.0/18 103.22.64.0/19 103.22.100.0/22 103.22.104.0/21 103.22.112.0/20 +103.22.157.0/24 103.22.188.0/22 103.22.228.0/22 103.22.252.0/22 103.23.8.0/22 103.23.56.0/22 -103.23.160.0/22 +103.23.160.0/21 103.23.176.0/22 103.23.228.0/22 103.24.24.0/22 @@ -1477,14 +1516,14 @@ 103.30.228.0/22 103.30.236.0/22 103.31.0.0/22 -103.31.48.0/21 -103.31.60.0/22 +103.31.48.0/20 103.31.64.0/21 -103.31.72.0/24 103.31.148.0/22 103.31.160.0/22 103.31.168.0/22 103.31.200.0/22 +103.31.237.0/24 +103.31.239.0/24 103.31.242.0/23 103.32.0.0/15 103.34.0.0/16 @@ -1501,7 +1540,10 @@ 103.36.96.0/22 103.36.132.0/22 103.36.136.0/22 -103.36.160.0/19 +103.36.160.0/21 +103.36.168.0/23 +103.36.172.0/22 +103.36.176.0/20 103.36.192.0/19 103.36.224.0/20 103.36.240.0/21 @@ -1518,12 +1560,14 @@ 103.37.144.0/20 103.37.160.0/21 103.37.172.0/22 +103.37.176.0/22 103.37.188.0/22 103.37.208.0/20 103.37.252.0/22 103.38.0.0/22 103.38.32.0/22 103.38.40.0/21 +103.38.56.0/22 103.38.76.0/22 103.38.84.0/22 103.38.92.0/22 @@ -1558,7 +1602,18 @@ 103.41.52.0/22 103.41.116.0/22 103.41.127.0/24 -103.41.140.0/22 +103.41.140.0/25 +103.41.140.128/28 +103.41.140.144/29 +103.41.140.154/31 +103.41.140.158/31 +103.41.140.162/31 +103.41.140.166/31 +103.41.140.168/29 +103.41.140.176/28 +103.41.140.192/26 +103.41.141.0/24 +103.41.142.0/23 103.41.148.0/22 103.41.152.0/22 103.41.160.0/21 @@ -1572,7 +1627,8 @@ 103.42.76.0/22 103.42.232.0/22 103.43.96.0/21 -103.43.104.0/22 +103.43.105.0/24 +103.43.106.0/23 103.43.124.0/22 103.43.132.0/22 103.43.184.0/22 @@ -1594,7 +1650,12 @@ 103.44.224.0/22 103.44.236.0/22 103.44.240.0/20 -103.45.0.0/18 +103.45.0.0/19 +103.45.32.0/21 +103.45.41.0/24 +103.45.42.0/23 +103.45.44.0/22 +103.45.48.0/20 103.45.72.0/21 103.45.80.0/20 103.45.96.0/19 @@ -1638,10 +1699,8 @@ 103.49.72.0/21 103.49.96.0/22 103.49.108.0/22 -103.49.130.240/30 -103.49.131.237/32 -103.49.131.240/29 103.49.176.0/21 +103.49.197.0/24 103.49.212.0/24 103.49.214.0/24 103.50.36.0/22 @@ -1662,7 +1721,72 @@ 103.50.240.0/21 103.50.248.0/22 103.52.40.0/22 -103.52.72.0/21 +103.52.72.0/23 +103.52.74.0/25 +103.52.74.128/26 +103.52.74.192/27 +103.52.74.224/28 +103.52.74.240/30 +103.52.74.252/30 +103.52.75.0/24 +103.52.76.0/30 +103.52.76.8/29 +103.52.76.20/30 +103.52.76.32/29 +103.52.76.40/30 +103.52.76.44/31 +103.52.76.48/29 +103.52.76.56/30 +103.52.76.64/26 +103.52.76.128/26 +103.52.76.192/27 +103.52.76.224/29 +103.52.76.232/30 +103.52.76.244/30 +103.52.76.248/29 +103.52.77.0/28 +103.52.77.16/29 +103.52.77.24/30 +103.52.77.32/27 +103.52.77.64/28 +103.52.77.80/29 +103.52.77.92/30 +103.52.77.96/27 +103.52.77.128/27 +103.52.77.160/28 +103.52.77.176/29 +103.52.77.188/30 +103.52.77.192/26 +103.52.78.4/30 +103.52.78.8/29 +103.52.78.16/28 +103.52.78.32/29 +103.52.78.40/30 +103.52.78.48/30 +103.52.78.56/29 +103.52.78.64/30 +103.52.78.76/30 +103.52.78.80/28 +103.52.78.96/29 +103.52.78.104/30 +103.52.78.112/28 +103.52.78.128/28 +103.52.78.144/29 +103.52.78.156/30 +103.52.78.160/29 +103.52.78.168/30 +103.52.78.176/28 +103.52.78.192/28 +103.52.78.212/30 +103.52.78.216/29 +103.52.78.232/29 +103.52.78.240/28 +103.52.79.0/27 +103.52.79.32/29 +103.52.79.40/30 +103.52.79.48/28 +103.52.79.64/26 +103.52.79.128/25 103.52.80.0/21 103.52.96.0/21 103.52.104.0/22 @@ -1673,10 +1797,12 @@ 103.52.196.0/22 103.53.64.0/21 103.53.92.0/22 +103.53.100.0/22 103.53.124.0/22 103.53.128.0/20 103.53.144.0/22 -103.53.180.0/22 +103.53.181.0/24 +103.53.182.0/23 103.53.204.0/22 103.53.208.0/21 103.53.236.0/22 @@ -1686,6 +1812,8 @@ 103.54.160.0/21 103.54.212.0/22 103.54.240.0/22 +103.55.5.35/32 +103.55.5.73/32 103.55.80.0/22 103.55.120.0/22 103.55.152.0/22 @@ -1701,6 +1829,7 @@ 103.56.94.0/23 103.56.100.0/22 103.56.104.0/22 +103.56.140.0/22 103.56.152.0/22 103.56.184.0/22 103.56.200.0/22 @@ -1713,7 +1842,7 @@ 103.58.24.0/22 103.59.76.0/22 103.59.112.0/21 -103.59.120.0/24 +103.59.120.0/23 103.59.124.0/22 103.59.128.0/22 103.59.148.0/22 @@ -1825,6 +1954,7 @@ 103.72.224.0/19 103.73.0.0/19 103.73.48.0/22 +103.73.99.0/24 103.73.116.0/22 103.73.120.0/22 103.73.128.0/20 @@ -1833,6 +1963,7 @@ 103.73.176.0/22 103.73.204.0/22 103.73.208.0/22 +103.73.244.0/22 103.73.248.0/22 103.74.24.0/21 103.74.32.0/20 @@ -1844,7 +1975,7 @@ 103.74.152.0/21 103.74.204.0/22 103.74.232.0/22 -103.75.82.0/23 +103.75.83.0/24 103.75.88.0/21 103.75.104.0/21 103.75.112.0/22 @@ -1882,7 +2013,7 @@ 103.79.188.0/22 103.79.192.0/20 103.79.208.0/21 -103.79.228.0/24 +103.79.228.0/23 103.80.44.0/22 103.80.72.0/22 103.80.176.0/21 @@ -1891,6 +2022,8 @@ 103.80.200.0/22 103.80.232.0/22 103.81.4.0/22 +103.81.8.0/22 +103.81.16.0/21 103.81.44.0/22 103.81.48.0/22 103.81.96.0/22 @@ -1910,10 +2043,10 @@ 103.83.60.0/22 103.83.72.0/22 103.83.112.0/22 +103.83.180.0/22 103.84.0.0/22 103.84.12.0/22 -103.84.20.0/22 -103.84.24.0/21 +103.84.16.0/20 103.84.48.0/22 103.84.64.0/22 103.84.72.0/22 @@ -1953,13 +2086,15 @@ 103.88.212.0/22 103.89.28.0/22 103.89.96.0/20 -103.89.112.0/22 +103.89.112.0/21 103.89.148.0/22 103.89.172.0/22 103.89.184.0/21 103.89.192.0/19 103.89.224.0/21 +103.90.51.0/24 103.90.52.0/22 +103.90.56.0/23 103.90.92.0/22 103.90.100.0/22 103.90.104.0/21 @@ -1981,13 +2116,18 @@ 103.91.200.0/22 103.91.208.0/21 103.91.236.0/22 +103.91.252.0/22 +103.92.0.0/21 +103.92.8.0/22 +103.92.12.0/23 103.92.48.0/20 103.92.64.0/20 103.92.80.0/22 103.92.88.0/22 103.92.108.0/22 103.92.124.0/22 -103.92.132.0/22 +103.92.132.0/24 +103.92.134.0/23 103.92.156.0/22 103.92.164.0/22 103.92.168.0/21 @@ -2029,14 +2169,15 @@ 103.96.208.0/21 103.96.216.0/22 103.96.224.0/23 +103.97.16.0/20 103.97.40.0/22 103.97.60.0/23 +103.97.64.0/21 103.97.112.0/21 -103.97.148.0/22 +103.97.144.0/21 103.97.188.0/22 103.97.192.0/22 103.98.0.0/23 -103.98.28.0/23 103.98.40.0/21 103.98.48.0/22 103.98.56.0/22 @@ -2075,7 +2216,6 @@ 103.100.144.0/22 103.100.240.0/22 103.100.248.0/21 -103.101.4.0/22 103.101.8.0/21 103.101.60.0/22 103.101.121.0/24 @@ -2097,13 +2237,21 @@ 103.103.12.0/22 103.103.16.0/22 103.103.36.0/22 +103.103.68.0/22 103.103.72.0/22 103.103.188.0/22 103.103.200.0/21 +103.103.221.0/24 +103.103.222.0/23 +103.103.224.0/21 +103.103.232.0/22 +103.103.248.0/21 +103.104.0.0/21 103.104.36.0/22 103.104.40.0/22 103.104.64.0/22 103.104.152.0/22 +103.104.188.0/22 103.104.252.0/22 103.105.0.0/21 103.105.12.0/22 @@ -2135,7 +2283,7 @@ 103.107.192.0/22 103.107.208.0/20 103.108.52.0/22 -103.108.160.0/22 +103.108.160.0/21 103.108.196.0/22 103.108.208.0/21 103.108.224.0/22 @@ -2145,6 +2293,7 @@ 103.109.88.0/22 103.109.248.0/22 103.110.92.0/22 +103.110.116.0/23 103.110.119.0/24 103.110.132.0/22 103.110.136.0/22 @@ -2160,14 +2309,13 @@ 103.112.112.0/22 103.112.140.0/22 103.113.4.0/22 -103.113.144.0/22 103.113.220.0/22 103.113.232.0/21 103.114.4.0/22 +103.114.28.0/22 103.114.68.0/22 103.114.100.0/22 103.114.148.0/22 -103.114.156.0/23 103.114.176.0/22 103.114.212.0/22 103.114.236.0/22 @@ -2178,6 +2326,7 @@ 103.115.120.0/22 103.115.148.0/22 103.115.248.0/22 +103.116.42.0/24 103.116.76.0/22 103.116.92.0/22 103.116.120.0/22 @@ -2187,6 +2336,8 @@ 103.116.220.0/22 103.116.224.0/21 103.117.16.0/22 +103.117.73.0/24 +103.117.74.0/23 103.117.88.0/22 103.117.188.0/22 103.117.220.0/22 @@ -2196,6 +2347,7 @@ 103.118.72.0/22 103.118.88.0/22 103.118.173.0/24 +103.119.28.0/22 103.119.115.0/24 103.119.156.0/22 103.119.180.0/22 @@ -2234,11 +2386,14 @@ 103.125.164.0/22 103.125.196.0/22 103.125.236.0/22 +103.125.249.0/24 +103.125.250.0/23 103.126.0.0/22 103.126.16.0/23 103.126.44.0/22 103.126.124.0/22 103.126.128.0/22 +103.129.55.0/24 103.130.132.0/22 103.130.160.0/22 103.130.228.0/22 @@ -2278,7 +2433,6 @@ 103.137.58.0/23 103.137.60.0/24 103.137.136.0/23 -103.137.149.0/24 103.137.180.0/22 103.137.236.0/22 103.138.2.0/23 @@ -2293,7 +2447,6 @@ 103.139.212.0/23 103.140.14.0/23 103.140.140.0/23 -103.140.144.0/23 103.140.192.0/23 103.141.10.0/23 103.141.58.0/23 @@ -2308,12 +2461,12 @@ 103.142.128.0/23 103.142.154.0/23 103.142.156.0/23 +103.142.172.0/23 103.142.180.0/23 103.142.186.0/23 103.142.234.0/23 103.142.238.0/23 103.143.16.0/22 -103.143.31.0/24 103.143.74.0/23 103.143.124.0/23 103.143.132.0/22 @@ -2325,10 +2478,10 @@ 103.144.136.0/23 103.144.158.0/23 103.145.42.0/23 -103.145.94.0/23 103.145.98.0/23 103.145.188.0/23 103.146.72.0/23 +103.146.91.0/24 103.146.126.0/23 103.146.138.0/23 103.146.236.0/23 @@ -2372,7 +2525,6 @@ 103.152.208.0/23 103.152.224.0/23 103.152.250.0/23 -103.153.99.0/24 103.153.114.0/23 103.153.122.0/23 103.153.132.0/23 @@ -2390,6 +2542,7 @@ 103.155.34.0/23 103.155.48.0/23 103.155.76.0/23 +103.155.120.0/23 103.155.248.0/23 103.156.28.0/23 103.156.68.0/23 @@ -2408,12 +2561,15 @@ 103.158.8.0/23 103.158.16.0/23 103.158.200.0/23 +103.158.222.241/32 103.158.224.0/23 +103.159.80.0/23 103.159.122.0/23 103.159.124.0/23 103.159.134.0/23 103.159.142.0/23 -103.160.32.0/22 +103.160.33.0/24 +103.160.34.0/23 103.160.112.0/22 103.160.244.0/23 103.160.254.0/23 @@ -2441,11 +2597,11 @@ 103.165.52.0/23 103.165.82.0/23 103.165.110.0/23 +103.166.20.0/23 103.166.50.0/23 103.166.52.0/22 103.166.84.0/23 103.166.138.0/23 -103.166.242.0/23 103.167.0.0/23 103.167.36.0/23 103.167.100.0/23 @@ -2512,6 +2668,7 @@ 103.185.80.0/23 103.186.4.0/23 103.186.108.0/23 +103.186.158.0/23 103.186.228.0/23 103.189.92.0/23 103.189.152.0/22 @@ -2530,8 +2687,7 @@ 103.192.96.0/20 103.192.112.0/22 103.192.128.0/21 -103.192.137.0/24 -103.192.138.0/23 +103.192.139.0/24 103.192.140.0/22 103.192.144.0/22 103.192.164.0/22 @@ -2539,7 +2695,6 @@ 103.192.208.0/21 103.192.216.0/22 103.192.252.0/22 -103.193.41.0/24 103.193.42.0/23 103.193.44.0/22 103.193.120.0/22 @@ -2550,7 +2705,6 @@ 103.193.212.0/22 103.193.216.0/21 103.193.224.0/20 -103.194.17.0/24 103.194.18.0/23 103.195.112.0/22 103.195.152.0/22 @@ -2572,7 +2726,7 @@ 103.198.196.0/22 103.198.216.0/21 103.198.224.0/20 -103.198.244.0/22 +103.198.240.0/21 103.199.164.0/22 103.199.196.0/22 103.199.228.0/22 @@ -2665,7 +2819,8 @@ 103.209.136.0/22 103.209.201.0/24 103.209.202.0/23 -103.209.208.0/22 +103.209.209.0/24 +103.209.210.0/23 103.209.216.0/22 103.210.96.0/22 103.210.156.0/22 @@ -2678,7 +2833,7 @@ 103.211.96.0/23 103.211.98.0/24 103.211.156.0/22 -103.211.165.0/24 +103.211.164.0/22 103.211.220.0/22 103.211.248.0/22 103.212.0.0/20 @@ -2686,6 +2841,7 @@ 103.212.48.0/22 103.212.84.0/22 103.212.100.0/22 +103.212.109.0/24 103.212.148.0/22 103.212.164.0/22 103.212.196.0/22 @@ -2699,8 +2855,8 @@ 103.213.136.0/21 103.213.144.0/20 103.213.160.0/19 +103.213.196.0/22 103.213.226.0/23 -103.213.232.0/23 103.214.48.0/22 103.214.84.0/22 103.214.212.0/22 @@ -2708,7 +2864,7 @@ 103.215.28.0/22 103.215.32.0/21 103.215.44.0/22 -103.215.100.0/23 +103.215.100.0/22 103.215.108.0/22 103.215.116.0/22 103.215.120.0/22 @@ -2752,6 +2908,8 @@ 103.220.64.0/22 103.220.92.0/22 103.220.96.0/22 +103.220.100.0/24 +103.220.102.0/23 103.220.104.0/21 103.220.116.0/22 103.220.120.0/21 @@ -2764,7 +2922,6 @@ 103.220.240.0/20 103.221.0.0/19 103.221.32.0/20 -103.221.49.0/24 103.221.50.0/23 103.221.88.0/22 103.221.92.0/23 @@ -2806,9 +2963,8 @@ 103.224.232.0/22 103.225.18.0/24 103.226.40.0/22 -103.226.56.0/21 +103.226.56.0/22 103.226.80.0/22 -103.226.116.0/23 103.226.132.0/22 103.226.156.0/22 103.226.180.0/22 @@ -2854,8 +3010,8 @@ 103.230.236.0/22 103.231.16.0/21 103.231.64.0/21 -103.231.144.0/22 103.231.180.0/22 +103.231.186.0/24 103.231.244.0/22 103.232.4.0/22 103.232.17.168/29 @@ -2876,12 +3032,13 @@ 103.234.172.0/22 103.234.180.0/22 103.234.244.0/22 +103.235.48.0/22 103.235.56.0/21 103.235.80.0/22 103.235.85.0/24 103.235.87.0/24 -103.235.132.0/22 -103.235.136.0/21 +103.235.100.0/22 +103.235.128.0/20 103.235.144.0/21 103.235.184.0/22 103.235.192.0/22 @@ -2889,17 +3046,15 @@ 103.235.220.0/22 103.235.224.0/19 103.236.0.0/18 -103.236.64.0/21 -103.236.72.0/22 -103.236.77.0/24 -103.236.78.0/23 -103.236.80.0/20 +103.236.64.0/19 103.236.96.0/22 103.236.116.0/23 103.236.120.0/22 103.236.184.0/22 -103.236.220.0/22 -103.236.240.0/20 +103.236.240.0/21 +103.236.248.0/23 +103.236.250.0/24 +103.236.252.0/22 103.237.0.0/20 103.237.24.0/21 103.237.68.0/22 @@ -2920,11 +3075,7 @@ 103.238.140.0/22 103.238.144.0/22 103.238.152.0/23 -103.238.160.0/22 -103.238.165.0/24 -103.238.166.0/23 -103.238.168.0/21 -103.238.176.0/20 +103.238.160.0/19 103.238.196.0/22 103.238.204.0/22 103.238.252.0/22 @@ -2956,12 +3107,12 @@ 103.241.172.0/23 103.241.184.0/21 103.241.220.0/22 -103.242.64.0/23 +103.242.64.0/22 103.242.128.0/24 +103.242.131.0/24 103.242.160.0/22 103.242.168.0/21 -103.242.177.0/24 -103.242.178.0/23 +103.242.176.0/22 103.242.200.0/22 103.242.212.0/22 103.242.220.0/22 @@ -2974,6 +3125,7 @@ 103.244.60.0/22 103.244.64.0/20 103.244.80.0/21 +103.244.119.0/24 103.244.164.0/22 103.244.232.0/22 103.244.252.0/22 @@ -2992,6 +3144,7 @@ 103.247.191.0/24 103.247.200.0/22 103.247.212.0/22 +103.248.0.0/24 103.248.64.0/23 103.248.100.0/22 103.248.124.0/22 @@ -3009,7 +3162,6 @@ 103.249.168.0/21 103.249.176.0/22 103.249.188.0/22 -103.249.192.0/22 103.249.244.0/22 103.249.252.0/22 103.250.32.0/22 @@ -3025,6 +3177,8 @@ 103.251.84.0/22 103.251.96.0/22 103.251.124.0/22 +103.251.129.0/24 +103.251.131.0/24 103.251.160.0/22 103.251.192.0/22 103.251.204.0/22 @@ -3057,7 +3211,7 @@ 103.255.136.0/21 103.255.184.0/22 103.255.200.0/22 -103.255.208.0/23 +103.255.212.0/22 103.255.228.0/22 104.28.9.46/31 104.28.9.48/32 @@ -3132,8 +3286,10 @@ 104.28.120.98/31 104.28.120.100/30 104.28.120.104/30 +104.28.143.54/31 104.28.148.204/32 104.28.156.204/32 +104.28.162.190/31 104.28.192.13/32 104.28.192.14/31 104.28.192.16/30 @@ -3348,7 +3504,7 @@ 104.28.255.200/30 104.28.255.204/31 104.28.255.206/32 -104.30.133.172/32 +104.30.161.11/32 104.44.213.0/31 104.212.68.57/32 104.212.68.58/32 @@ -3363,8 +3519,7 @@ 106.0.44.0/22 106.0.64.0/18 106.2.0.0/16 -106.3.16.0/20 -106.3.32.0/19 +106.3.0.0/18 106.3.64.0/20 106.3.80.0/22 106.3.88.0/21 @@ -3378,40 +3533,46 @@ 106.3.192.0/18 106.4.0.0/14 106.8.0.0/15 -106.11.0.0/16 +106.11.0.0/18 +106.11.64.0/21 +106.11.72.0/30 +106.11.72.8/29 +106.11.72.16/28 +106.11.72.32/27 +106.11.72.64/26 +106.11.72.128/29 +106.11.72.136/32 +106.11.72.141/32 +106.11.72.142/31 +106.11.72.144/28 +106.11.72.160/32 +106.11.72.163/32 +106.11.72.164/30 +106.11.72.180/31 +106.11.72.184/29 +106.11.72.192/30 +106.11.72.208/29 +106.11.72.220/30 +106.11.72.224/29 +106.11.72.240/30 +106.11.72.252/30 +106.11.73.0/24 +106.11.74.0/23 +106.11.76.0/22 +106.11.80.0/20 +106.11.96.0/19 +106.11.128.0/17 106.12.0.0/14 106.16.0.0/12 106.32.0.0/12 -106.48.0.0/21 -106.48.8.0/22 -106.48.16.0/20 -106.48.32.0/20 -106.48.57.0/24 -106.48.60.0/24 -106.48.63.0/24 -106.48.64.0/18 -106.48.128.0/17 -106.49.1.0/24 -106.49.2.0/23 -106.49.4.0/22 -106.49.8.0/21 -106.49.16.0/20 -106.49.32.0/19 -106.49.64.0/19 -106.49.96.0/24 -106.49.98.0/23 -106.49.100.0/22 -106.49.104.0/21 -106.49.112.0/20 -106.49.128.0/17 +106.48.0.0/15 106.50.0.0/16 106.52.0.0/14 106.56.0.0/13 106.74.0.0/16 106.75.0.0/17 106.75.128.0/18 -106.75.201.0/24 -106.75.204.0/22 +106.75.200.0/21 106.75.208.0/20 106.75.224.0/19 106.80.0.0/12 @@ -3441,7 +3602,8 @@ 110.41.224.0/19 110.42.0.0/15 110.44.12.0/22 -110.48.0.0/16 +110.48.0.0/17 +110.48.128.0/19 110.51.0.0/16 110.52.0.0/15 110.56.0.0/13 @@ -3467,11 +3629,17 @@ 110.96.0.0/11 110.152.0.0/14 110.156.0.0/15 +110.165.37.0/24 +110.165.38.0/23 +110.165.40.0/21 +110.165.48.0/20 110.166.0.0/15 -110.172.192.0/18 +110.172.200.0/21 +110.172.208.0/20 +110.172.224.0/19 110.173.0.0/19 110.173.32.0/20 -110.173.64.0/19 +110.173.64.0/18 110.173.192.0/19 110.176.0.0/12 110.192.0.0/11 @@ -3495,14 +3663,12 @@ 111.66.184.0/21 111.66.192.0/18 111.67.192.0/20 -111.68.64.0/19 111.72.0.0/13 111.85.0.0/16 -111.91.192.0/19 111.92.248.0/21 111.112.0.0/14 111.116.0.0/15 -111.118.200.0/23 +111.118.200.0/24 111.118.202.0/24 111.118.204.0/22 111.119.64.0/18 @@ -3536,6 +3702,7 @@ 112.0.0.0/10 112.64.0.0/14 112.73.64.0/18 +112.73.128.0/17 112.74.0.0/15 112.80.0.0/12 112.96.0.0/13 @@ -3556,11 +3723,14 @@ 113.12.0.0/14 113.16.0.0/15 113.18.0.0/16 -113.21.232.0/23 -113.21.234.0/24 -113.21.236.0/22 +113.21.232.0/21 113.24.0.0/14 -113.31.0.0/16 +113.31.88.0/23 +113.31.96.0/19 +113.31.136.0/21 +113.31.144.0/20 +113.31.160.0/19 +113.31.192.0/18 113.44.0.0/14 113.48.0.0/14 113.52.160.0/19 @@ -3578,7 +3748,7 @@ 113.132.0.0/14 113.136.0.0/13 113.192.40.0/23 -113.192.56.0/23 +113.192.57.0/24 113.194.0.0/15 113.197.100.0/23 113.197.102.0/24 @@ -3602,21 +3772,31 @@ 114.28.0.0/17 114.28.128.0/18 114.28.194.0/23 -114.28.196.0/22 -114.28.200.0/21 -114.28.208.0/20 +114.28.196.0/24 +114.28.200.0/23 +114.28.209.0/24 +114.28.211.0/24 +114.28.212.0/22 +114.28.216.0/21 114.28.232.0/23 114.28.234.0/24 -114.28.240.0/20 +114.28.236.0/22 +114.28.240.0/21 +114.28.248.0/22 +114.28.252.0/24 +114.28.254.0/23 114.31.64.0/21 114.54.0.0/15 114.60.0.0/14 114.64.0.0/15 -114.66.0.0/18 -114.66.64.0/20 -114.66.80.0/22 -114.66.120.0/21 -114.66.236.0/22 +114.66.0.0/17 +114.66.128.0/20 +114.66.144.0/21 +114.66.152.0/22 +114.66.176.0/20 +114.66.192.0/19 +114.66.228.0/22 +114.66.232.0/21 114.66.240.0/20 114.67.0.0/16 114.68.0.0/16 @@ -3630,6 +3810,7 @@ 114.111.160.0/19 114.112.4.0/22 114.112.8.0/22 +114.112.22.0/24 114.112.24.0/21 114.112.32.0/19 114.112.64.0/19 @@ -3660,7 +3841,7 @@ 114.141.64.0/21 114.141.80.0/21 114.141.128.0/18 -114.142.136.0/24 +114.142.136.0/21 114.196.0.0/15 114.198.248.0/21 114.208.0.0/12 @@ -3675,7 +3856,6 @@ 115.48.0.0/12 115.69.64.0/20 115.84.0.0/18 -115.84.192.0/19 115.85.192.0/18 115.100.0.0/14 115.104.0.0/14 @@ -3719,14 +3899,11 @@ 116.58.128.0/20 116.58.208.0/20 116.60.0.0/14 -116.66.0.0/18 -116.66.64.0/19 -116.66.96.0/20 -116.66.120.0/22 +116.66.0.0/17 116.68.136.0/21 116.68.176.0/21 116.69.0.0/16 -116.70.0.0/17 +116.70.64.0/18 116.76.0.0/14 116.85.0.0/17 116.85.128.0/18 @@ -3751,16 +3928,9 @@ 116.196.0.0/21 116.196.8.0/22 116.196.12.0/23 -116.196.16.0/20 116.196.32.0/19 116.196.64.0/18 -116.196.128.0/18 -116.196.192.0/21 -116.196.201.0/24 -116.196.203.0/24 -116.196.204.0/22 -116.196.208.0/20 -116.196.224.0/19 +116.196.128.0/17 116.197.160.0/21 116.198.0.0/16 116.199.0.0/17 @@ -3770,6 +3940,7 @@ 116.207.0.0/16 116.208.0.0/14 116.212.160.0/20 +116.213.46.0/23 116.213.64.0/18 116.213.128.0/17 116.214.32.0/19 @@ -3781,15 +3952,371 @@ 116.242.0.0/15 116.244.0.0/14 116.248.0.0/15 +116.251.65.140/31 +116.251.66.42/31 +116.251.68.15/32 +116.251.79.12/31 +116.251.84.168/30 +116.251.84.180/30 +116.251.84.184/29 +116.251.84.192/27 +116.251.84.226/31 +116.251.84.228/30 +116.251.84.232/29 +116.251.84.240/29 +116.251.84.248/30 +116.251.88.36/30 +116.251.88.40/29 +116.251.88.48/29 +116.251.88.58/31 +116.251.88.60/30 +116.251.88.64/30 +116.251.88.70/31 +116.251.88.72/29 +116.251.88.80/29 +116.251.88.88/31 +116.251.88.92/31 +116.251.88.96/28 +116.251.88.112/29 +116.251.88.122/31 +116.251.88.124/30 +116.251.88.128/27 +116.251.88.162/31 +116.251.88.164/30 +116.251.88.170/31 +116.251.88.174/31 +116.251.88.176/29 +116.251.88.186/31 +116.251.88.188/30 +116.251.88.192/30 +116.251.88.198/31 +116.251.88.200/29 +116.251.88.208/30 +116.251.88.212/31 +116.251.88.218/31 +116.251.88.224/30 +116.251.88.230/31 +116.251.88.234/31 +116.251.88.240/31 +116.251.88.244/30 +116.251.88.248/31 +116.251.88.252/30 +116.251.89.0/31 +116.251.89.4/30 +116.251.89.8/30 +116.251.89.12/31 +116.251.89.16/29 +116.251.89.36/30 +116.251.89.40/31 +116.251.89.44/30 +116.251.89.48/29 +116.251.89.56/30 +116.251.89.60/31 +116.251.89.64/29 +116.251.89.72/30 +116.251.89.76/31 +116.251.89.80/31 +116.251.89.84/30 +116.251.89.88/29 +116.251.89.96/27 +116.251.89.128/27 +116.251.89.160/28 +116.251.89.176/31 +116.251.89.180/30 +116.251.89.184/29 +116.251.89.192/27 +116.251.89.224/28 +116.251.89.240/29 +116.251.89.248/30 +116.251.90.0/27 +116.251.90.32/29 +116.251.90.40/30 +116.251.90.48/29 +116.251.90.60/30 +116.251.90.66/31 +116.251.90.72/30 +116.251.90.80/28 +116.251.90.96/27 +116.251.90.128/28 +116.251.90.144/30 +116.251.90.168/29 +116.251.90.176/28 +116.251.90.192/27 +116.251.90.224/28 +116.251.90.244/30 +116.251.91.16/28 +116.251.91.32/28 +116.251.91.56/29 +116.251.91.64/26 +116.251.91.128/28 +116.251.91.144/29 +116.251.91.156/31 +116.251.91.166/31 +116.251.91.170/31 +116.251.91.182/31 +116.251.91.186/31 +116.251.91.198/31 +116.251.91.202/31 +116.251.91.206/31 +116.251.91.210/31 +116.251.91.212/30 +116.251.91.216/29 +116.251.91.224/28 +116.251.91.240/29 +116.251.91.248/30 +116.251.92.0/31 +116.251.92.4/31 +116.251.93.10/31 +116.251.93.30/31 +116.251.93.34/31 +116.251.93.38/31 +116.251.93.44/30 +116.251.93.48/29 +116.251.93.72/30 +116.251.93.88/30 +116.251.93.104/29 +116.251.93.112/28 +116.251.93.128/29 +116.251.93.136/30 +116.251.93.152/29 +116.251.93.160/29 +116.251.93.168/30 +116.251.93.176/29 +116.251.93.200/29 +116.251.93.208/28 +116.251.94.4/30 +116.251.94.8/29 +116.251.94.16/28 +116.251.94.32/27 +116.251.94.64/26 +116.251.94.128/27 +116.251.94.160/28 +116.251.94.176/29 +116.251.94.186/31 +116.251.94.188/30 +116.251.94.192/26 +116.251.95.0/24 +116.251.100.4/30 +116.251.100.8/31 +116.251.100.20/31 +116.251.100.24/31 +116.251.100.72/31 +116.251.100.84/31 +116.251.100.90/31 +116.251.100.92/31 +116.251.100.98/31 +116.251.100.100/31 +116.251.100.104/31 +116.251.100.118/31 +116.251.100.122/31 +116.251.100.124/31 +116.251.100.136/31 +116.251.100.181/32 +116.251.100.182/31 +116.251.100.184/29 +116.251.100.211/32 +116.251.100.212/30 +116.251.100.220/31 +116.251.100.224/32 +116.251.100.226/32 +116.251.100.234/31 +116.251.100.242/31 +116.251.100.244/30 +116.251.100.253/32 +116.251.100.254/31 +116.251.101.4/30 +116.251.101.8/30 +116.251.101.12/31 +116.251.101.18/31 +116.251.101.20/31 +116.251.101.24/31 +116.251.101.32/30 +116.251.101.52/31 +116.251.101.62/31 +116.251.101.72/31 +116.251.101.78/31 +116.251.101.84/31 +116.251.101.90/31 +116.251.101.92/31 +116.251.101.98/31 +116.251.101.100/31 +116.251.101.104/30 +116.251.101.108/31 +116.251.101.118/31 +116.251.101.122/31 +116.251.101.124/31 +116.251.101.146/31 +116.251.101.148/30 +116.251.101.152/30 +116.251.101.160/31 +116.251.101.176/28 +116.251.101.210/31 +116.251.101.212/30 +116.251.101.220/31 +116.251.101.234/31 +116.251.101.236/30 +116.251.101.242/31 +116.251.101.244/30 +116.251.101.248/29 +116.251.102.0/23 +116.251.104.0/27 +116.251.104.32/28 +116.251.104.48/30 +116.251.104.52/31 +116.251.104.58/31 +116.251.104.60/30 +116.251.104.64/26 +116.251.104.128/25 +116.251.105.0/24 +116.251.106.0/25 +116.251.106.128/27 +116.251.106.160/30 +116.251.106.166/31 +116.251.106.170/31 +116.251.106.174/31 +116.251.106.176/28 +116.251.106.192/26 +116.251.107.0/28 +116.251.107.16/30 +116.251.107.22/31 +116.251.107.26/31 +116.251.107.28/30 +116.251.107.34/31 +116.251.107.36/30 +116.251.107.40/29 +116.251.107.48/28 +116.251.107.64/28 +116.251.107.80/30 +116.251.107.92/30 +116.251.107.96/29 +116.251.107.104/30 +116.251.107.112/28 +116.251.107.128/26 +116.251.107.192/27 +116.251.107.224/28 +116.251.107.240/29 +116.251.107.248/30 +116.251.108.0/26 +116.251.108.64/28 +116.251.108.80/29 +116.251.108.96/30 +116.251.108.104/29 +116.251.108.112/30 +116.251.108.144/28 +116.251.108.160/28 +116.251.108.176/29 +116.251.108.188/30 +116.251.108.194/31 +116.251.108.196/30 +116.251.108.200/29 +116.251.109.33/32 +116.251.109.34/31 +116.251.109.36/30 +116.251.109.40/31 +116.251.109.42/32 +116.251.109.63/32 +116.251.109.64/31 +116.251.109.66/32 +116.251.109.80/30 +116.251.109.87/32 +116.251.109.88/30 +116.251.109.95/32 +116.251.109.96/30 +116.251.109.108/30 +116.251.109.120/30 +116.251.109.131/32 +116.251.109.132/30 +116.251.109.136/30 +116.251.109.143/32 +116.251.109.144/30 +116.251.109.151/32 +116.251.109.152/29 +116.251.109.160/30 +116.251.109.167/32 +116.251.109.168/29 +116.251.109.176/30 +116.251.109.187/32 +116.251.109.188/30 +116.251.109.192/30 +116.251.109.204/30 +116.251.109.208/29 +116.251.109.216/30 +116.251.109.231/32 +116.251.109.232/30 +116.251.109.243/32 +116.251.109.244/30 +116.251.109.248/30 +116.251.110.16/28 +116.251.110.32/28 +116.251.110.48/29 +116.251.110.56/31 +116.251.110.62/31 +116.251.110.64/27 +116.251.110.96/28 +116.251.110.112/29 +116.251.110.124/30 +116.251.110.128/26 +116.251.110.192/27 +116.251.110.224/31 +116.251.110.230/31 +116.251.110.232/29 +116.251.110.240/28 +116.251.111.0/29 +116.251.111.8/30 +116.251.111.16/30 +116.251.111.32/29 +116.251.111.48/30 +116.251.111.52/31 +116.251.111.76/30 +116.251.111.84/30 +116.251.111.88/30 +116.251.111.112/30 +116.251.111.148/30 +116.251.111.164/31 +116.251.111.196/30 +116.251.111.200/30 +116.251.111.214/31 +116.251.111.218/31 +116.251.111.220/31 +116.251.111.234/31 +116.251.111.236/31 +116.251.112.0/22 +116.251.116.0/26 +116.251.116.68/30 +116.251.116.72/29 +116.251.116.80/28 +116.251.116.96/27 +116.251.116.128/26 +116.251.116.192/28 +116.251.116.208/29 +116.251.116.216/30 +116.251.116.222/31 +116.251.116.226/31 +116.251.116.230/31 +116.251.116.232/29 +116.251.116.240/28 +116.251.117.0/24 +116.251.118.0/25 +116.251.118.128/27 +116.251.118.160/29 +116.251.118.168/31 +116.251.118.172/31 +116.251.118.176/28 +116.251.118.192/30 +116.251.118.212/30 +116.251.118.216/29 +116.251.118.224/27 +116.251.119.0/24 +116.251.120.4/30 +116.251.120.12/30 +116.251.120.16/28 +116.251.120.32/27 +116.251.120.64/26 +116.251.120.128/25 +116.251.124.0/22 116.252.0.0/15 116.254.104.0/21 -116.254.129.0/24 -116.254.130.0/23 -116.254.132.0/22 -116.254.136.0/21 -116.254.144.0/20 -116.254.160.0/19 -116.254.192.0/18 +116.254.128.0/17 116.255.128.0/17 117.8.0.0/13 117.21.0.0/16 @@ -3798,7 +4325,34 @@ 117.32.0.0/13 117.40.0.0/14 117.44.0.0/15 -117.48.0.0/15 +117.48.0.0/16 +117.49.0.0/19 +117.49.32.0/20 +117.49.48.0/23 +117.49.50.0/24 +117.49.51.0/25 +117.49.51.128/28 +117.49.51.144/30 +117.49.51.148/31 +117.49.51.152/29 +117.49.51.160/27 +117.49.51.192/26 +117.49.52.0/22 +117.49.56.0/22 +117.49.60.0/24 +117.49.61.0/28 +117.49.61.20/30 +117.49.61.24/29 +117.49.61.32/29 +117.49.61.48/28 +117.49.61.64/27 +117.49.61.96/28 +117.49.61.112/29 +117.49.61.120/30 +117.49.61.128/25 +117.49.62.0/23 +117.49.64.0/18 +117.49.128.0/17 117.50.0.0/16 117.51.128.0/23 117.51.131.0/24 @@ -3812,7 +4366,12 @@ 117.57.0.0/16 117.58.0.0/17 117.59.0.0/16 -117.60.0.0/14 +117.60.0.0/16 +117.61.0.0/17 +117.61.128.0/18 +117.61.192.0/19 +117.61.240.0/20 +117.62.0.0/15 117.64.0.0/13 117.72.0.0/15 117.74.64.0/19 @@ -3829,8 +4388,13 @@ 117.106.0.0/15 117.112.0.0/13 117.120.64.0/18 -117.120.128.0/17 -117.121.0.0/17 +117.121.0.0/19 +117.121.32.0/21 +117.121.40.0/22 +117.121.44.0/23 +117.121.46.0/24 +117.121.48.0/20 +117.121.64.0/18 117.121.128.0/20 117.121.148.0/22 117.121.152.0/21 @@ -3842,7 +4406,7 @@ 118.24.0.0/15 118.26.0.0/19 118.26.40.0/21 -118.26.48.0/20 +118.26.48.0/21 118.26.64.0/19 118.26.96.0/21 118.26.112.0/21 @@ -3853,32 +4417,67 @@ 118.26.133.0/24 118.26.134.0/23 118.26.136.0/21 -118.26.150.0/23 -118.26.159.2/31 -118.26.159.4/30 -118.26.159.8/31 -118.26.159.16/29 -118.26.159.30/31 -118.26.159.34/31 -118.26.159.36/30 -118.26.159.40/29 -118.26.159.48/28 -118.26.159.64/26 -118.26.159.128/25 -118.26.160.0/19 +118.26.160.0/20 +118.26.188.0/22 118.26.192.0/18 -118.28.0.0/15 -118.31.0.0/16 +118.28.0.0/14 118.64.0.0/15 118.66.0.0/16 118.67.112.0/20 118.72.0.0/13 118.80.0.0/15 -118.84.0.0/15 +118.84.0.0/24 +118.84.1.0/26 +118.84.1.64/28 +118.84.1.80/30 +118.84.1.86/31 +118.84.1.88/29 +118.84.1.96/27 +118.84.1.128/25 +118.84.2.0/23 +118.84.5.0/24 +118.84.6.0/23 +118.84.8.0/21 +118.84.16.0/20 +118.84.32.0/19 +118.84.64.0/18 +118.84.128.0/17 +118.85.0.0/17 +118.85.128.0/21 +118.85.136.0/29 +118.85.136.8/30 +118.85.136.14/31 +118.85.136.16/29 +118.85.136.24/31 +118.85.136.28/30 +118.85.136.32/27 +118.85.136.64/26 +118.85.136.128/25 +118.85.137.0/24 +118.85.138.0/23 +118.85.140.0/22 +118.85.144.0/20 +118.85.160.0/19 +118.85.192.0/21 +118.85.200.0/22 +118.85.207.0/24 +118.85.208.0/24 +118.85.209.0/27 +118.85.209.32/29 +118.85.209.40/30 +118.85.209.46/31 +118.85.209.48/28 +118.85.209.64/26 +118.85.209.128/25 +118.85.210.0/23 +118.85.212.0/22 +118.85.216.0/21 +118.85.224.0/19 118.88.32.0/19 118.88.64.0/18 118.88.128.0/17 118.89.0.0/16 +118.91.240.0/20 118.102.16.0/20 118.102.32.0/21 118.103.164.0/22 @@ -3887,24 +4486,32 @@ 118.112.0.0/13 118.120.0.0/14 118.124.0.0/15 -118.126.1.0/24 -118.126.2.0/23 -118.126.4.0/22 -118.126.8.0/21 -118.126.16.0/23 -118.126.18.0/24 -118.126.32.0/19 -118.126.64.0/18 -118.126.128.0/17 +118.126.0.0/16 118.127.128.0/19 118.132.0.0/14 118.144.0.0/14 118.178.0.0/16 118.180.0.0/14 -118.184.5.0/24 -118.184.128.0/18 -118.184.192.0/19 -118.184.240.0/20 +118.184.4.0/22 +118.184.12.0/22 +118.184.16.0/22 +118.184.20.0/23 +118.184.23.0/24 +118.184.24.0/22 +118.184.28.0/23 +118.184.31.0/24 +118.184.32.0/21 +118.184.53.0/24 +118.184.54.0/23 +118.184.56.0/21 +118.184.65.0/24 +118.184.70.0/23 +118.184.74.0/23 +118.184.80.0/24 +118.184.89.0/24 +118.184.90.0/23 +118.184.108.0/22 +118.184.128.0/17 118.186.0.0/15 118.188.0.0/22 118.188.8.0/21 @@ -3914,23 +4521,51 @@ 118.188.160.0/19 118.188.192.0/18 118.190.0.0/16 -118.191.0.0/20 -118.191.16.0/21 -118.191.32.0/19 -118.191.64.0/18 +118.191.0.0/21 +118.191.8.0/22 +118.191.12.0/24 +118.191.17.0/24 +118.191.18.0/23 +118.191.20.0/22 +118.191.48.0/20 +118.191.64.0/20 +118.191.80.0/22 +118.191.132.0/22 +118.191.136.0/21 118.191.144.0/21 118.191.153.0/24 118.191.154.0/23 118.191.156.0/22 -118.191.160.0/19 +118.191.176.0/20 118.191.192.0/20 -118.191.209.0/24 -118.191.210.0/23 -118.191.212.0/22 +118.191.217.0/24 +118.191.218.0/23 +118.191.242.0/23 +118.191.244.0/22 118.191.248.0/21 118.192.0.0/16 118.193.0.0/22 +118.193.8.0/21 +118.193.48.0/22 +118.193.52.0/23 +118.193.54.0/24 118.193.96.0/19 +118.193.130.0/23 +118.193.132.0/22 +118.193.137.0/24 +118.193.139.0/24 +118.193.140.0/24 +118.193.149.0/24 +118.193.150.0/23 +118.193.163.0/24 +118.193.169.0/24 +118.193.170.0/24 +118.193.172.0/24 +118.193.177.0/24 +118.193.178.0/23 +118.193.180.0/22 +118.193.184.0/22 +118.193.192.0/18 118.194.0.0/17 118.194.128.0/18 118.194.192.0/19 @@ -3976,7 +4611,23 @@ 119.38.136.0/21 119.38.144.0/20 119.38.160.0/19 -119.38.192.0/18 +119.38.192.0/20 +119.38.208.0/22 +119.38.212.0/23 +119.38.214.0/27 +119.38.214.56/29 +119.38.214.64/26 +119.38.214.128/25 +119.38.215.0/27 +119.38.215.32/28 +119.38.215.48/29 +119.38.215.56/30 +119.38.215.76/30 +119.38.215.80/28 +119.38.215.96/27 +119.38.215.128/25 +119.38.216.0/21 +119.38.224.0/19 119.39.0.0/16 119.40.0.0/18 119.40.64.0/20 @@ -3989,7 +4640,11 @@ 119.48.0.0/13 119.57.0.0/16 119.58.0.0/16 -119.59.128.0/17 +119.59.128.0/18 +119.59.208.0/22 +119.59.220.0/22 +119.59.236.0/22 +119.59.244.0/22 119.60.0.0/15 119.62.0.0/16 119.63.32.0/19 @@ -3998,28 +4653,7 @@ 119.80.0.0/16 119.82.208.0/20 119.84.0.0/14 -119.88.0.0/16 -119.89.0.0/17 -119.89.128.0/21 -119.89.136.0/23 -119.89.139.0/24 -119.89.140.0/22 -119.89.144.0/20 -119.89.160.0/20 -119.89.176.0/22 -119.89.180.0/23 -119.89.183.0/24 -119.89.184.0/21 -119.89.192.0/23 -119.89.194.0/24 -119.89.196.0/22 -119.89.200.0/21 -119.89.208.0/21 -119.89.217.0/24 -119.89.218.0/23 -119.89.220.0/22 -119.89.224.0/19 -119.90.0.0/15 +119.88.0.0/14 119.96.0.0/13 119.108.0.0/15 119.112.0.0/12 @@ -4029,16 +4663,15 @@ 119.151.192.0/18 119.160.200.0/21 119.161.120.0/21 -119.161.128.0/21 119.161.160.0/19 119.161.192.0/18 119.162.0.0/15 119.164.0.0/14 119.176.0.0/12 -119.224.96.0/19 119.232.0.0/15 119.235.128.0/19 119.235.160.0/20 +119.235.181.0/24 119.235.184.0/22 119.248.0.0/14 119.252.96.0/21 @@ -4068,9 +4701,7 @@ 120.53.56.0/21 120.53.64.0/18 120.53.128.0/17 -120.54.0.0/18 -120.54.128.0/17 -120.55.0.0/16 +120.54.0.0/15 120.64.0.0/13 120.72.32.0/19 120.72.128.0/17 @@ -4078,13 +4709,7 @@ 120.80.0.0/13 120.88.8.0/21 120.90.0.0/15 -120.92.0.0/17 -120.92.128.0/18 -120.92.192.0/22 -120.92.198.0/23 -120.92.200.0/21 -120.92.208.0/20 -120.92.224.0/19 +120.92.0.0/16 120.94.0.0/15 120.128.0.0/13 120.136.16.0/21 @@ -4140,39 +4765,6 @@ 121.59.96.0/22 121.59.102.0/23 121.59.104.0/24 -121.59.105.0/31 -121.59.105.4/31 -121.59.105.8/31 -121.59.105.12/30 -121.59.105.20/31 -121.59.105.26/31 -121.59.105.30/31 -121.59.105.32/31 -121.59.105.36/30 -121.59.105.42/31 -121.59.105.48/30 -121.59.105.52/31 -121.59.105.60/31 -121.59.105.64/28 -121.59.105.80/31 -121.59.105.90/31 -121.59.105.92/30 -121.59.105.96/28 -121.59.105.112/30 -121.59.105.116/31 -121.59.105.120/29 -121.59.105.128/30 -121.59.105.132/31 -121.59.105.136/31 -121.59.105.148/30 -121.59.105.152/29 -121.59.105.162/31 -121.59.105.164/30 -121.59.105.168/29 -121.59.105.178/31 -121.59.105.180/30 -121.59.105.184/29 -121.59.105.192/26 121.59.108.0/24 121.59.110.0/23 121.59.112.0/21 @@ -4188,28 +4780,30 @@ 121.79.128.0/18 121.89.0.0/16 121.91.104.0/21 -121.100.128.0/18 +121.100.128.0/17 121.101.0.0/18 121.101.208.0/20 121.192.0.0/13 -121.200.192.0/23 -121.200.194.0/24 -121.200.196.0/22 +121.200.192.0/21 121.201.0.0/16 121.204.0.0/14 121.224.0.0/12 121.248.0.0/14 121.255.0.0/16 122.0.64.0/18 -122.0.128.0/17 122.4.0.0/14 +122.8.0.0/24 +122.8.23.0/24 +122.8.70.0/23 +122.8.72.0/22 +122.8.116.0/22 122.8.192.0/18 122.9.0.0/16 122.10.132.0/23 122.10.136.0/23 122.10.164.0/22 122.10.168.0/21 -122.10.192.0/22 +122.10.194.0/23 122.10.200.0/22 122.10.205.0/24 122.10.206.0/23 @@ -4220,9 +4814,16 @@ 122.10.228.0/22 122.10.232.0/21 122.10.240.0/22 -122.11.0.0/17 +122.11.32.0/19 122.12.0.0/15 122.14.0.0/17 +122.14.128.0/21 +122.14.172.0/24 +122.14.174.0/23 +122.14.176.0/21 +122.14.184.0/22 +122.14.188.0/23 +122.14.190.0/24 122.14.192.0/18 122.48.0.0/16 122.49.0.0/18 @@ -4233,7 +4834,6 @@ 122.102.64.0/19 122.112.0.0/18 122.112.64.0/19 -122.112.96.0/22 122.112.118.0/24 122.112.122.0/24 122.112.125.0/24 @@ -4260,7 +4860,12 @@ 122.156.0.0/14 122.188.0.0/14 122.192.0.0/14 -122.198.0.0/16 +122.198.0.0/18 +122.198.68.0/22 +122.198.72.0/21 +122.198.80.0/20 +122.198.96.0/19 +122.198.128.0/17 122.200.40.0/21 122.200.64.0/18 122.201.48.0/20 @@ -4270,41 +4875,14 @@ 122.248.24.0/21 122.248.48.0/20 122.255.64.0/21 -123.0.128.0/23 -123.0.131.0/24 -123.0.132.0/22 -123.0.136.0/23 -123.0.141.0/24 -123.0.142.0/23 -123.0.144.0/21 -123.0.153.0/24 -123.0.154.0/24 -123.0.156.0/22 -123.0.161.0/24 -123.0.162.0/23 -123.0.164.0/22 -123.0.168.0/21 -123.0.176.0/21 -123.0.184.0/22 -123.0.188.0/23 -123.0.190.0/24 +123.0.128.0/18 123.4.0.0/14 123.8.0.0/13 -123.49.130.0/23 -123.49.132.0/22 -123.49.136.0/22 -123.49.152.0/21 -123.49.160.0/19 -123.49.192.0/18 +123.49.128.0/17 123.50.160.0/19 123.52.0.0/14 123.56.0.0/15 -123.58.0.0/18 -123.58.64.0/20 -123.58.80.0/21 -123.58.88.0/22 -123.58.92.0/24 -123.58.96.0/19 +123.58.0.0/17 123.58.128.0/18 123.58.224.0/19 123.59.0.0/16 @@ -4312,39 +4890,36 @@ 123.62.0.0/16 123.64.0.0/11 123.96.0.0/15 -123.98.0.0/20 +123.98.4.0/22 +123.98.8.0/22 123.98.16.0/21 123.98.28.0/22 123.98.32.0/22 123.98.40.0/21 123.98.48.0/22 123.98.56.0/21 +123.98.68.0/22 +123.98.76.0/22 +123.98.80.0/21 123.98.88.0/22 -123.98.104.0/22 +123.98.96.0/22 +123.98.104.0/21 123.98.112.0/21 -123.98.124.0/22 -123.99.128.0/20 -123.99.144.0/22 -123.99.148.0/23 -123.99.151.0/24 -123.99.152.0/21 +123.98.120.0/22 +123.99.128.0/19 123.99.160.0/22 123.99.164.0/24 123.99.166.0/23 123.99.168.0/21 -123.99.176.0/21 -123.99.184.0/22 -123.99.188.0/24 -123.99.190.0/23 +123.99.176.0/20 123.99.192.0/18 123.100.0.0/19 123.101.0.0/16 123.103.0.0/17 123.108.88.0/23 -123.108.134.0/24 -123.108.138.0/23 -123.108.140.0/24 -123.108.142.0/24 +123.108.130.0/23 +123.108.132.0/22 +123.108.136.0/21 123.108.208.0/20 123.112.0.0/12 123.128.0.0/13 @@ -4362,7 +4937,6 @@ 123.199.128.0/17 123.206.0.0/15 123.232.0.0/14 -123.242.0.0/17 123.242.192.0/21 123.244.0.0/14 123.249.0.0/17 @@ -4371,16 +4945,6 @@ 124.6.64.0/18 124.14.0.0/15 124.16.0.0/15 -124.20.0.0/24 -124.20.2.0/23 -124.20.4.0/22 -124.20.8.0/21 -124.20.16.0/20 -124.20.32.0/19 -124.20.64.0/18 -124.20.128.0/17 -124.21.96.0/19 -124.21.128.0/17 124.22.0.0/15 124.28.192.0/18 124.29.0.0/17 @@ -4394,25 +4958,13 @@ 124.64.0.0/15 124.66.0.0/17 124.67.0.0/16 -124.68.0.0/19 -124.68.32.0/20 -124.68.48.0/21 -124.68.56.0/22 -124.68.60.0/23 -124.68.63.0/24 -124.68.64.0/18 +124.68.0.0/17 124.68.128.0/18 124.68.192.0/19 -124.68.224.0/22 -124.68.228.0/24 -124.68.230.0/23 -124.68.232.0/21 -124.68.240.0/23 -124.68.242.0/24 -124.68.244.0/23 -124.68.247.0/24 -124.68.248.0/23 -124.68.250.0/24 +124.68.224.0/20 +124.68.240.0/21 +124.68.248.0/22 +124.68.254.0/23 124.69.0.0/16 124.70.0.0/16 124.71.0.0/17 @@ -4420,6 +4972,7 @@ 124.71.192.0/19 124.71.224.0/20 124.71.240.0/21 +124.71.250.0/23 124.71.254.0/23 124.72.0.0/13 124.88.0.0/13 @@ -4431,14 +4984,14 @@ 124.112.0.0/13 124.126.0.0/15 124.128.0.0/13 -124.147.128.0/17 124.150.137.0/24 124.151.0.0/16 124.152.0.0/16 124.160.0.0/13 124.172.0.0/15 124.174.0.0/16 -124.175.0.0/18 +124.175.0.0/17 +124.175.160.0/19 124.192.0.0/15 124.196.0.0/16 124.200.0.0/13 @@ -4497,7 +5050,6 @@ 134.175.0.0/16 137.59.59.0/24 137.59.88.0/22 -138.32.244.0/24 139.5.56.0/21 139.5.80.0/22 139.5.92.0/22 @@ -4513,6 +5065,7 @@ 139.9.104.0/21 139.9.112.0/20 139.9.128.0/17 +139.95.4.34/32 139.129.0.0/16 139.138.238.0/28 139.148.0.0/16 @@ -4538,12 +5091,6 @@ 139.183.104.0/21 139.183.112.0/20 139.183.128.0/18 -139.183.192.0/20 -139.183.208.0/23 -139.183.211.0/24 -139.183.212.0/22 -139.183.216.0/21 -139.183.224.0/19 139.186.0.0/16 139.189.0.0/16 139.196.0.0/15 @@ -4557,10 +5104,7 @@ 139.198.116.0/22 139.198.122.0/23 139.198.124.0/22 -139.198.128.0/18 -139.198.192.0/21 -139.198.208.0/20 -139.198.224.0/19 +139.198.128.0/17 139.199.0.0/16 139.200.0.0/13 139.208.0.0/13 @@ -4572,7 +5116,34 @@ 140.75.0.0/16 140.143.0.0/16 140.179.0.0/16 -140.205.0.0/16 +140.205.0.0/24 +140.205.2.0/23 +140.205.4.0/22 +140.205.8.0/21 +140.205.16.0/22 +140.205.20.0/23 +140.205.22.0/27 +140.205.22.32/31 +140.205.22.36/30 +140.205.22.42/31 +140.205.22.44/30 +140.205.22.48/28 +140.205.22.64/26 +140.205.22.128/25 +140.205.23.0/24 +140.205.24.0/26 +140.205.24.64/31 +140.205.24.68/30 +140.205.24.72/29 +140.205.24.80/28 +140.205.24.96/27 +140.205.24.128/25 +140.205.25.0/24 +140.205.26.0/23 +140.205.28.0/22 +140.205.32.0/19 +140.205.64.0/18 +140.205.128.0/17 140.206.0.0/15 140.210.0.0/16 140.224.0.0/16 @@ -4603,8 +5174,6 @@ 144.52.0.0/16 144.123.0.0/16 144.178.30.48/28 -144.211.80.0/24 -144.211.138.0/24 144.255.0.0/16 146.56.192.0/18 146.75.187.2/31 @@ -4615,16 +5184,15 @@ 146.196.92.0/22 146.196.112.0/21 146.196.124.0/22 -146.217.137.0/24 146.222.79.0/24 146.222.81.0/24 146.222.94.0/24 -147.243.14.32/27 147.243.29.192/26 147.243.30.64/26 147.243.30.128/27 147.243.103.0/25 148.70.0.0/16 +149.41.0.0/16 150.0.0.0/16 150.115.0.0/16 150.121.0.0/16 @@ -4654,6 +5222,7 @@ 150.242.168.0/22 150.242.184.0/21 150.242.192.0/22 +150.242.212.0/24 150.242.226.0/23 150.242.232.0/21 150.242.240.0/21 @@ -4677,6 +5246,7 @@ 156.107.181.0/24 156.154.62.0/23 157.0.0.0/16 +157.10.35.0/24 157.10.36.0/23 157.10.112.0/23 157.10.118.0/23 @@ -4688,17 +5258,16 @@ 157.15.94.0/23 157.15.100.0/22 157.15.104.0/23 -157.15.200.0/23 157.18.0.0/16 157.20.33.0/24 157.20.136.0/23 157.20.194.0/23 157.20.246.0/23 157.61.0.0/16 -157.66.42.0/23 157.66.70.0/23 157.66.88.0/21 -157.119.0.0/22 +157.66.164.0/23 +157.66.244.0/23 157.119.8.0/21 157.119.16.0/22 157.119.28.0/22 @@ -4713,12 +5282,11 @@ 157.122.0.0/16 157.133.186.0/23 157.133.192.0/21 -157.133.212.0/24 -157.133.236.0/24 157.148.0.0/16 157.156.0.0/16 157.255.0.0/16 158.26.192.0/24 +158.26.194.0/24 158.60.0.0/16 158.79.0.0/24 158.79.2.0/23 @@ -4728,15 +5296,38 @@ 158.79.32.0/19 158.79.64.0/18 158.79.128.0/17 -158.140.252.0/22 +158.140.252.0/23 159.27.0.0/16 159.75.0.0/16 159.226.0.0/16 +160.19.76.0/23 +160.19.82.0/23 160.19.208.0/21 160.19.216.0/22 +160.20.16.0/22 160.20.48.0/22 -160.83.109.0/24 -160.83.110.0/23 +160.20.130.0/23 +160.22.58.0/23 +160.22.82.0/23 +160.22.148.0/23 +160.22.188.0/23 +160.22.224.0/23 +160.22.230.0/23 +160.22.244.0/22 +160.25.10.0/23 +160.25.12.0/23 +160.25.194.0/23 +160.30.40.0/23 +160.30.150.0/23 +160.30.194.0/23 +160.30.196.0/22 +160.30.230.0/23 +160.83.110.0/24 +160.187.223.0/24 +160.187.252.0/22 +160.191.0.0/23 +160.191.104.0/23 +160.191.110.0/23 160.202.60.0/23 160.202.62.0/24 160.202.148.0/22 @@ -4744,26 +5335,46 @@ 160.202.212.0/22 160.202.216.0/21 160.202.224.0/19 +160.250.14.0/23 +160.250.16.0/22 +160.250.24.0/23 +160.250.84.0/23 +160.250.90.0/23 +160.250.102.0/23 +160.250.104.0/23 +160.250.160.0/23 +160.250.170.0/23 +160.250.214.0/23 +160.250.252.0/23 161.120.0.0/16 161.163.0.0/21 161.163.28.0/23 161.189.0.0/16 161.207.0.0/16 +161.248.20.0/23 +161.248.42.0/23 +161.248.84.0/23 +161.248.92.0/23 +161.248.136.0/24 162.14.0.0/20 162.14.16.0/21 162.14.26.0/23 162.14.28.0/22 162.14.32.0/21 162.14.40.0/22 -162.14.48.0/20 +162.14.52.0/22 +162.14.56.0/21 162.14.64.0/18 162.14.128.0/17 +162.62.240.0/23 +162.62.242.0/24 162.105.0.0/16 163.0.0.0/16 163.47.4.0/22 163.53.0.0/20 163.53.36.0/22 163.53.40.0/22 +163.53.44.0/24 163.53.48.0/20 163.53.64.0/22 163.53.88.0/21 @@ -4772,8 +5383,11 @@ 163.53.136.0/22 163.53.160.0/20 163.53.188.0/22 -163.53.220.0/22 163.53.240.0/22 +163.61.63.0/24 +163.61.178.0/23 +163.61.202.0/23 +163.61.214.0/23 163.125.0.0/16 163.142.0.0/16 163.177.0.0/16 @@ -4783,7 +5397,6 @@ 163.244.246.0/24 164.52.74.0/24 164.52.80.0/24 -165.156.30.0/24 166.111.0.0/16 167.139.0.0/16 167.189.0.0/16 @@ -4794,8 +5407,6 @@ 168.159.158.0/24 168.160.0.0/16 170.179.0.0/16 -170.225.224.0/23 -170.252.152.0/21 171.8.0.0/13 171.34.0.0/15 171.36.0.0/14 @@ -4838,13 +5449,13 @@ 175.158.96.0/22 175.160.0.0/12 175.176.156.0/22 +175.176.176.0/22 175.176.188.0/22 175.178.0.0/16 175.184.128.0/18 175.185.0.0/16 175.186.0.0/15 175.188.0.0/14 -178.173.240.0/24 180.76.16.0/20 180.76.32.0/19 180.76.64.0/18 @@ -4868,8 +5479,7 @@ 180.148.216.0/21 180.148.224.0/19 180.149.128.0/19 -180.150.160.0/21 -180.150.176.0/20 +180.150.160.0/19 180.152.0.0/13 180.160.0.0/12 180.178.112.0/21 @@ -4882,10 +5492,18 @@ 180.202.0.0/15 180.208.0.0/15 180.210.212.0/22 -180.210.233.0/24 -180.210.236.0/22 +180.210.228.0/22 +180.210.232.0/21 180.212.0.0/15 180.222.224.0/19 +180.223.0.0/19 +180.223.40.0/21 +180.223.48.0/20 +180.223.128.0/20 +180.223.144.0/22 +180.223.152.0/21 +180.223.160.0/19 +180.223.212.0/22 180.233.0.0/18 180.233.64.0/19 180.233.144.0/22 @@ -4931,7 +5549,7 @@ 182.254.1.24/30 182.254.1.28/31 182.254.1.34/31 -182.254.1.36/30 +182.254.1.36/31 182.254.1.40/29 182.254.1.48/28 182.254.1.64/26 @@ -4945,7 +5563,9 @@ 182.254.128.0/17 183.0.0.0/10 183.64.0.0/13 -183.78.160.0/21 +183.78.161.0/24 +183.78.162.0/23 +183.78.164.0/22 183.78.180.0/22 183.81.180.0/22 183.84.0.0/15 @@ -4958,15 +5578,21 @@ 183.168.0.0/15 183.170.0.0/16 183.172.0.0/14 +183.182.0.0/21 +183.182.8.0/23 +183.182.12.0/22 +183.182.16.0/23 +183.182.23.0/24 +183.182.24.0/23 +183.182.26.0/24 +183.182.28.0/22 183.184.0.0/13 183.192.0.0/10 -185.241.211.0/24 188.131.128.0/17 192.23.191.0/24 -192.55.10.0/23 -192.55.40.0/24 192.55.46.0/23 192.55.68.0/22 +192.56.99.0/24 192.102.204.0/22 192.124.154.0/24 192.137.31.0/24 @@ -4979,9 +5605,18 @@ 192.144.128.0/17 192.163.11.0/24 192.232.97.0/24 -193.17.120.0/22 -193.20.64.0/22 193.112.0.0/16 +193.119.0.0/21 +193.119.8.0/23 +193.119.11.0/24 +193.119.12.0/24 +193.119.14.0/23 +193.119.16.0/22 +193.119.21.0/24 +193.119.22.0/23 +193.119.24.0/22 +193.119.28.0/23 +193.119.31.0/24 193.200.222.160/28 194.61.237.0/25 194.138.136.0/24 @@ -4995,20 +5630,14 @@ 198.208.63.0/24 198.208.67.0/24 198.208.112.0/23 -199.7.72.0/24 199.65.192.0/21 199.244.144.0/24 202.0.100.0/23 202.0.122.0/23 -202.1.64.0/23 -202.1.68.0/23 -202.1.72.0/21 -202.1.80.0/22 202.1.86.0/23 -202.1.88.0/21 -202.1.96.0/23 -202.1.100.0/22 -202.1.104.0/22 +202.1.90.0/23 +202.1.105.0/24 +202.1.106.0/24 202.1.110.0/23 202.1.112.0/23 202.3.128.0/23 @@ -5050,7 +5679,7 @@ 202.12.1.0/24 202.12.2.0/24 202.12.17.0/24 -202.12.18.0/23 +202.12.18.0/24 202.12.72.0/24 202.12.84.0/23 202.12.96.0/24 @@ -5119,7 +5748,6 @@ 202.21.152.0/23 202.21.154.0/24 202.21.156.0/24 -202.21.208.0/24 202.22.248.0/21 202.27.12.0/24 202.27.14.0/24 @@ -5131,7 +5759,6 @@ 202.38.64.0/18 202.38.128.0/21 202.38.136.0/23 -202.38.138.0/24 202.38.140.0/22 202.38.146.0/23 202.38.149.0/24 @@ -5139,9 +5766,9 @@ 202.38.152.0/22 202.38.156.0/24 202.38.158.0/23 -202.38.160.0/23 202.38.164.0/22 -202.38.168.0/22 +202.38.168.0/23 +202.38.170.0/24 202.38.176.0/23 202.38.184.0/21 202.38.192.0/18 @@ -5186,6 +5813,7 @@ 202.46.16.0/23 202.46.18.0/24 202.46.20.0/23 +202.46.40.0/24 202.46.128.0/24 202.46.224.0/20 202.47.82.0/23 @@ -5193,10 +5821,17 @@ 202.47.126.0/24 202.47.128.0/24 202.47.130.0/23 +202.52.33.0/24 202.52.34.0/24 +202.52.47.0/24 202.52.143.0/24 202.53.140.0/24 202.53.143.0/24 +202.57.192.0/22 +202.57.196.0/23 +202.57.201.0/24 +202.57.202.0/23 +202.57.206.0/23 202.57.212.0/22 202.57.216.0/22 202.57.240.0/20 @@ -5227,6 +5862,8 @@ 202.63.253.0/24 202.65.0.0/21 202.65.8.0/23 +202.65.100.0/22 +202.65.104.0/21 202.66.169.0/24 202.66.170.0/23 202.67.0.0/22 @@ -5260,8 +5897,7 @@ 202.81.0.0/22 202.81.176.0/20 202.83.252.0/22 -202.84.4.0/22 -202.84.8.0/21 +202.84.0.0/20 202.84.16.0/23 202.84.22.0/24 202.84.24.0/21 @@ -5274,7 +5910,6 @@ 202.89.108.0/22 202.89.119.0/24 202.89.232.0/21 -202.90.0.0/22 202.90.16.0/20 202.90.37.0/24 202.90.96.0/19 @@ -5284,23 +5919,17 @@ 202.90.224.0/20 202.91.0.0/22 202.91.96.0/20 -202.91.128.0/22 202.91.176.0/20 202.91.224.0/19 -202.92.0.0/22 202.92.8.0/21 202.92.48.0/20 202.92.252.0/22 -202.93.0.0/23 -202.93.3.0/24 202.93.252.0/22 -202.94.0.0/19 202.94.74.0/24 202.94.81.0/24 202.94.92.0/22 202.95.3.0/24 202.95.240.0/21 -202.95.252.0/22 202.96.0.0/12 202.112.0.0/13 202.120.0.0/15 @@ -5308,7 +5937,6 @@ 202.122.32.0/21 202.122.64.0/19 202.122.112.0/20 -202.122.128.0/24 202.122.132.0/24 202.123.96.0/20 202.123.116.0/22 @@ -5326,9 +5954,7 @@ 202.127.48.0/20 202.127.112.0/20 202.127.128.0/19 -202.127.160.0/21 202.127.192.0/20 -202.127.208.0/23 202.127.212.0/22 202.127.216.0/21 202.127.224.0/19 @@ -5337,7 +5963,9 @@ 202.130.39.0/24 202.130.224.0/19 202.131.16.0/21 -202.131.59.0/24 +202.131.48.0/22 +202.131.54.0/23 +202.131.56.0/21 202.131.208.0/20 202.133.32.0/20 202.134.58.0/24 @@ -5347,7 +5975,7 @@ 202.136.208.0/20 202.136.224.0/20 202.136.248.0/22 -202.136.254.0/23 +202.136.255.0/24 202.137.231.0/24 202.140.140.0/22 202.140.144.0/20 @@ -5370,13 +5998,18 @@ 202.148.64.0/18 202.149.32.0/19 202.149.160.0/19 -202.149.224.0/19 +202.149.224.0/20 +202.149.240.0/21 +202.149.248.0/22 +202.149.252.0/23 +202.149.255.0/24 202.150.16.0/20 202.150.32.0/20 202.150.56.0/22 202.150.192.0/20 202.150.224.0/19 202.151.0.0/22 +202.151.33.0/24 202.151.128.0/19 202.152.176.0/20 202.153.0.0/22 @@ -5389,6 +6022,8 @@ 202.160.156.0/22 202.162.67.0/24 202.162.75.0/24 +202.163.1.160/28 +202.163.8.80/30 202.164.0.0/20 202.164.96.0/19 202.165.176.0/20 @@ -5650,7 +6285,6 @@ 203.14.114.0/23 203.14.118.0/24 203.14.162.0/24 -203.14.184.0/21 203.14.192.0/24 203.14.194.0/23 203.14.214.0/24 @@ -5772,7 +6406,6 @@ 203.20.122.0/24 203.20.126.0/23 203.20.135.0/24 -203.20.140.0/22 203.20.150.0/24 203.20.230.0/24 203.20.232.0/24 @@ -5809,14 +6442,6 @@ 203.22.163.0/24 203.22.166.0/24 203.22.170.0/24 -203.22.178.82/31 -203.22.178.86/31 -203.22.178.90/31 -203.22.178.94/31 -203.22.178.102/31 -203.22.178.166/31 -203.22.178.170/31 -203.22.178.174/31 203.22.194.0/24 203.22.242.0/23 203.22.245.0/24 @@ -6093,7 +6718,6 @@ 203.32.204.0/23 203.32.212.0/24 203.33.4.0/24 -203.33.7.0/24 203.33.12.0/23 203.33.21.0/24 203.33.26.0/24 @@ -6270,10 +6894,8 @@ 203.86.254.0/23 203.88.32.0/19 203.88.192.0/19 -203.89.0.0/22 203.89.136.0/22 203.89.144.0/24 -203.90.0.0/22 203.90.8.0/21 203.90.128.0/18 203.90.192.0/19 @@ -6287,11 +6909,7 @@ 203.94.0.0/19 203.95.0.0/21 203.95.96.0/19 -203.95.130.0/23 -203.95.132.0/22 -203.95.136.0/21 -203.95.144.0/20 -203.95.160.0/19 +203.95.128.0/18 203.95.200.0/21 203.95.208.0/22 203.95.224.0/19 @@ -6327,9 +6945,7 @@ 203.118.192.0/19 203.118.241.0/24 203.118.248.0/22 -203.119.24.0/22 -203.119.28.0/23 -203.119.30.0/24 +203.119.24.0/21 203.119.32.0/24 203.119.34.0/23 203.119.80.0/22 @@ -6341,22 +6957,21 @@ 203.123.58.0/24 203.128.32.0/19 203.128.96.0/19 -203.128.128.0/24 203.130.32.0/20 203.130.49.0/24 -203.130.51.0/24 +203.130.50.0/23 203.130.52.0/22 -203.130.56.0/22 -203.130.60.0/23 -203.130.63.0/24 +203.130.56.0/21 203.132.32.0/19 203.134.240.0/21 203.135.96.0/19 203.135.160.0/20 -203.142.12.0/23 203.142.219.0/24 203.142.224.0/19 -203.144.96.0/19 +203.144.96.0/24 +203.144.107.0/24 +203.144.108.0/22 +203.144.112.0/20 203.145.0.0/19 203.148.0.0/18 203.148.64.0/20 @@ -6385,13 +7000,14 @@ 203.171.224.0/20 203.174.4.0/24 203.174.6.0/24 -203.174.96.0/20 +203.174.96.0/19 203.175.128.0/19 203.175.192.0/18 203.176.0.0/18 203.176.64.0/19 203.176.168.0/21 203.184.80.0/20 +203.185.189.0/24 203.187.160.0/19 203.189.0.0/23 203.189.6.0/23 @@ -6404,8 +7020,8 @@ 203.191.2.0/24 203.191.5.0/24 203.191.7.0/24 -203.191.29.0/24 -203.191.31.0/24 +203.191.16.0/21 +203.191.28.0/22 203.191.64.0/18 203.191.133.0/24 203.191.144.0/20 @@ -6419,24 +7035,41 @@ 203.201.182.0/24 203.202.236.0/22 203.205.64.0/19 +203.205.130.0/23 +203.205.132.0/23 +203.205.148.0/22 +203.205.152.0/23 +203.205.154.0/24 +203.205.158.0/24 +203.205.160.0/20 +203.205.176.0/21 +203.205.184.0/22 +203.205.189.0/24 +203.205.190.0/24 +203.205.200.0/21 +203.205.208.0/21 +203.205.216.0/23 +203.205.225.0/24 +203.205.226.0/23 +203.205.228.0/22 +203.205.243.0/24 +203.205.244.0/22 203.207.64.0/18 203.207.128.0/17 -203.208.0.0/20 -203.208.16.0/22 203.208.32.0/19 203.209.224.0/19 203.212.0.0/20 203.212.80.0/20 203.217.164.0/22 -203.223.0.0/20 204.55.160.0/24 -204.74.96.0/24 -204.114.176.0/23 +204.79.135.24/32 210.2.0.0/23 210.2.2.0/24 210.2.5.0/24 210.2.6.0/23 210.2.8.0/21 +210.2.16.0/22 +210.2.20.0/23 210.2.24.0/21 210.5.0.0/19 210.5.128.0/19 @@ -6447,19 +7080,7 @@ 210.14.128.0/17 210.15.0.0/17 210.15.128.0/18 -210.16.128.0/21 -210.16.136.0/22 -210.16.156.0/22 -210.16.160.0/24 -210.16.162.0/23 -210.16.164.0/22 -210.16.168.0/21 -210.16.176.0/22 -210.16.180.0/23 -210.16.182.0/24 -210.16.185.0/24 -210.16.186.0/23 -210.16.188.0/22 +210.16.128.0/18 210.21.0.0/16 210.22.0.0/16 210.23.32.0/19 @@ -6508,17 +7129,14 @@ 210.53.124.0/23 210.53.128.0/17 210.56.192.0/19 -210.72.0.0/14 +210.72.0.0/15 +210.74.0.0/16 +210.75.0.0/17 +210.75.160.0/19 +210.75.192.0/18 210.76.0.0/15 210.78.0.0/16 -210.79.64.0/22 -210.79.72.0/22 -210.79.80.0/21 -210.79.92.0/22 -210.79.96.0/22 -210.79.108.0/22 -210.79.116.0/22 -210.79.120.0/22 +210.79.64.0/18 210.79.224.0/19 210.82.0.0/15 210.87.72.0/23 @@ -6528,25 +7146,14 @@ 210.192.96.0/19 211.64.0.0/13 211.80.0.0/12 -211.96.0.0/14 -211.100.0.0/17 -211.100.128.0/19 -211.100.160.0/20 -211.100.184.0/21 -211.100.192.0/18 -211.101.0.0/16 -211.102.0.0/15 +211.96.0.0/13 211.136.0.0/13 211.144.0.0/14 211.148.0.0/16 -211.149.0.0/19 -211.149.32.0/22 -211.149.40.0/21 -211.149.52.0/22 -211.149.60.0/22 +211.149.0.0/18 211.149.64.0/21 211.149.72.0/22 -211.149.92.0/22 +211.149.80.0/20 211.149.96.0/19 211.149.128.0/17 211.150.0.0/15 @@ -6558,14 +7165,10 @@ 211.152.160.0/19 211.152.192.0/18 211.153.0.0/16 -211.154.0.0/19 -211.154.32.0/20 -211.154.48.0/21 -211.154.64.0/18 -211.154.128.0/17 +211.154.0.0/16 211.155.0.0/18 211.155.67.0/24 -211.155.68.0/24 +211.155.68.0/22 211.155.72.0/21 211.155.80.0/20 211.155.96.0/20 @@ -6587,7 +7190,6 @@ 212.64.0.0/17 212.129.128.0/17 213.199.169.0/24 -213.255.231.0/24 218.0.0.0/12 218.16.0.0/13 218.24.0.0/14 @@ -6615,12 +7217,15 @@ 218.97.64.0/18 218.97.128.0/17 218.98.0.0/18 -218.98.77.0/24 -218.98.78.0/23 +218.98.64.0/22 +218.98.68.0/24 +218.98.73.0/24 +218.98.74.0/23 +218.98.76.0/22 +218.98.86.0/23 +218.98.88.0/21 218.98.96.0/19 218.98.128.0/17 -218.99.0.0/16 -218.100.91.0/24 218.100.96.0/19 218.100.128.0/17 218.104.0.0/14 @@ -6634,14 +7239,10 @@ 218.246.48.0/21 218.246.56.0/23 218.246.58.0/24 -218.246.61.0/24 -218.246.62.0/23 +218.246.60.0/22 218.246.64.0/18 -218.246.129.0/24 -218.246.131.0/24 -218.246.132.0/23 -218.246.134.0/24 -218.246.139.0/24 +218.246.128.0/21 +218.246.136.0/22 218.246.144.0/20 218.246.160.0/19 218.246.192.0/18 @@ -6658,9 +7259,6 @@ 219.216.0.0/13 219.224.0.0/13 219.232.0.0/15 -219.234.1.0/24 -219.234.2.0/23 -219.234.4.0/22 219.234.10.0/23 219.234.12.0/22 219.234.32.0/19 @@ -6692,78 +7290,48 @@ 220.231.128.0/17 220.232.64.0/18 220.234.0.0/16 -220.242.0.0/23 +220.242.0.0/22 +220.242.4.0/23 220.242.6.0/24 -220.242.8.0/24 -220.242.10.0/24 -220.242.12.0/23 -220.242.14.0/24 +220.242.8.0/21 220.242.17.0/24 220.242.18.0/23 -220.242.20.0/24 +220.242.20.0/22 +220.242.24.0/21 220.242.32.0/19 -220.242.64.0/19 -220.242.96.0/20 -220.242.112.0/21 -220.242.120.0/22 -220.242.124.0/23 -220.242.126.0/24 -220.242.128.0/23 -220.242.131.0/24 -220.242.134.0/23 -220.242.136.0/24 -220.242.141.0/24 -220.242.142.0/23 -220.242.144.0/24 -220.242.146.0/23 -220.242.148.0/24 -220.242.150.0/23 -220.242.158.0/23 -220.242.161.0/24 -220.242.163.0/24 -220.242.164.0/24 -220.242.168.0/23 -220.242.173.0/24 -220.242.178.0/24 -220.242.183.0/24 +220.242.64.0/18 +220.242.128.0/20 +220.242.144.0/21 +220.242.152.0/24 +220.242.154.0/23 +220.242.156.0/22 +220.242.160.0/20 +220.242.176.0/21 220.242.184.0/23 220.242.186.0/24 -220.242.188.0/23 -220.242.190.0/24 -220.242.192.0/23 -220.242.196.0/22 +220.242.188.0/22 +220.242.192.0/21 220.242.200.0/24 220.242.202.0/23 -220.242.204.0/22 -220.242.209.0/24 -220.242.210.0/23 -220.242.214.0/24 -220.242.216.0/21 +220.242.205.0/24 +220.242.206.0/23 +220.242.208.0/20 220.242.224.0/19 220.243.0.0/17 220.243.128.0/18 -220.243.192.0/23 -220.243.196.0/22 -220.243.200.0/23 -220.243.203.0/24 -220.243.204.0/23 -220.243.212.0/24 -220.243.214.0/23 +220.243.192.0/20 +220.243.208.0/21 220.243.216.0/23 220.243.218.0/24 -220.243.220.0/23 -220.243.223.0/24 +220.243.220.0/22 220.243.224.0/20 +220.243.240.0/23 220.243.243.0/24 220.243.244.0/22 -220.243.248.0/23 -220.243.250.0/24 -220.243.252.0/24 -220.243.254.0/23 -220.247.136.0/21 +220.243.248.0/21 +220.247.136.0/23 220.248.0.0/14 -220.252.64.0/18 -220.252.192.0/18 +220.252.0.0/16 221.0.0.0/13 221.8.0.0/14 221.12.0.0/17 @@ -6771,10 +7339,13 @@ 221.13.0.0/16 221.14.0.0/15 221.122.0.0/15 -221.128.128.0/17 221.129.0.0/16 221.130.0.0/15 -221.133.224.0/19 +221.133.225.0/24 +221.133.226.0/24 +221.133.228.0/22 +221.133.232.0/22 +221.133.240.0/20 221.136.0.0/15 221.172.0.0/14 221.176.0.0/19 @@ -6802,7 +7373,11 @@ 222.32.0.0/11 222.64.0.0/11 222.125.0.0/16 -222.126.128.0/19 +222.126.128.0/21 +222.126.136.0/23 +222.126.139.0/24 +222.126.140.0/22 +222.126.144.0/20 222.126.160.0/21 222.126.168.0/22 222.126.172.0/23 @@ -6854,6 +7429,8 @@ 223.20.0.0/15 223.27.184.0/22 223.29.208.0/22 +223.29.252.0/24 +223.29.255.0/24 223.64.0.0/11 223.96.0.0/12 223.112.0.0/14 @@ -6864,12 +7441,7 @@ 223.166.0.0/15 223.192.0.0/15 223.198.0.0/15 -223.201.0.0/22 -223.201.8.0/21 -223.201.16.0/20 -223.201.32.0/19 -223.201.64.0/18 -223.201.128.0/17 +223.201.0.0/16 223.202.0.0/15 223.208.0.0/13 223.220.0.0/15 @@ -6878,8 +7450,7 @@ 223.240.0.0/13 223.248.0.0/14 223.252.128.0/19 -223.252.192.0/18 -223.254.0.0/16 +223.252.192.0/19 223.255.0.0/17 223.255.236.0/22 223.255.252.0/23 diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index 371992e63e..62b9920fab 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -9247,9 +9247,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "indexmap 2.7.1", "itoa 1.0.14", diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index a445944a28..51275f2867 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -53,7 +53,7 @@ "@csstools/normalize.css": "12.1.1", "@emotion/babel-plugin": "11.13.5", "@emotion/react": "11.14.0", - "@iconify/json": "2.2.312", + "@iconify/json": "2.2.313", "@monaco-editor/react": "4.7.0", "@tanstack/react-query": "5.66.11", "@tanstack/react-router": "1.112.0", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index bf317f31c8..fdaf6a2537 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -1,11 +1,11 @@ { "manifest_version": 1, "latest": { - "mihomo": "v1.19.2", - "mihomo_alpha": "alpha-a7e56f1", + "mihomo": "v1.19.3", + "mihomo_alpha": "alpha-8bc6f77", "clash_rs": "v0.7.6", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.7.6-alpha+sha.14e7d32" + "clash_rs_alpha": "0.7.6-alpha+sha.167eccd" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-03-02T22:21:03.218Z" + "updated_at": "2025-03-03T22:31:23.606Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index f126cecafd..07f7107c8b 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -65,7 +65,7 @@ "@tauri-apps/cli": "2.2.7", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.13.8", + "@types/node": "22.13.9", "@typescript-eslint/eslint-plugin": "8.25.0", "@typescript-eslint/parser": "8.25.0", "autoprefixer": "10.4.20", diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 9f3b6dd612..ea11e85ee2 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: devDependencies: '@commitlint/cli': specifier: 19.7.1 - version: 19.7.1(@types/node@22.13.8)(typescript@5.8.2) + version: 19.7.1(@types/node@22.13.9)(typescript@5.8.2) '@commitlint/config-conventional': specifier: 19.7.1 version: 19.7.1 @@ -43,8 +43,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 22.13.8 - version: 22.13.8 + specifier: 22.13.9 + version: 22.13.9 '@typescript-eslint/eslint-plugin': specifier: 8.25.0 version: 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2) @@ -104,7 +104,7 @@ importers: version: 16.0.0 knip: specifier: 5.45.0 - version: 5.45.0(@types/node@22.13.8)(typescript@5.8.2) + version: 5.45.0(@types/node@22.13.9)(typescript@5.8.2) lint-staged: specifier: 15.4.3 version: 15.4.3 @@ -333,8 +333,8 @@ importers: specifier: 11.14.0 version: 11.14.0(@types/react@19.0.10)(react@19.0.0) '@iconify/json': - specifier: 2.2.312 - version: 2.2.312 + specifier: 2.2.313 + version: 2.2.313 '@monaco-editor/react': specifier: 4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -349,7 +349,7 @@ importers: version: 1.112.6(@tanstack/react-router@1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(csstype@3.1.3)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/router-plugin': specifier: 1.112.3 - version: 1.112.3(@tanstack/react-router@1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 1.112.3(@tanstack/react-router@1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.2.1 version: 2.2.1 @@ -385,13 +385,13 @@ importers: version: 13.12.2 '@vitejs/plugin-legacy': specifier: 6.0.2 - version: 6.0.2(terser@5.36.0)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 6.0.2(terser@5.36.0)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) '@vitejs/plugin-react': specifier: 4.3.4 - version: 4.3.4(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.3.4(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) '@vitejs/plugin-react-swc': specifier: 3.8.0 - version: 3.8.0(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 3.8.0(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) change-case: specifier: 5.4.4 version: 5.4.4 @@ -430,19 +430,19 @@ importers: version: 13.12.0 vite: specifier: 6.2.0 - version: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + version: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) vite-plugin-html: specifier: 3.2.2 - version: 3.2.2(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 3.2.2(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) vite-plugin-sass-dts: specifier: 1.3.30 - version: 1.3.30(postcss@8.5.3)(prettier@3.5.2)(sass-embedded@1.85.1)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 1.3.30(postcss@8.5.3)(prettier@3.5.2)(sass-embedded@1.85.1)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) vite-plugin-svgr: specifier: 4.3.0 - version: 4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) zod: specifier: 3.24.2 version: 3.24.2 @@ -478,7 +478,7 @@ importers: version: 19.0.10 '@vitejs/plugin-react': specifier: 4.3.4 - version: 4.3.4(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.3.4(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) ahooks: specifier: 3.8.4 version: 3.8.4(react@19.0.0) @@ -508,10 +508,10 @@ importers: version: 4.0.9 vite: specifier: 6.2.0 - version: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + version: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) devDependencies: '@emotion/react': specifier: 11.14.0 @@ -536,7 +536,7 @@ importers: version: 5.1.0(typescript@5.8.2) vite-plugin-dts: specifier: 4.5.3 - version: 4.5.3(@types/node@22.13.8)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) + version: 4.5.3(@types/node@22.13.9)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)) scripts: dependencies: @@ -1666,8 +1666,8 @@ packages: '@vue/compiler-sfc': optional: true - '@iconify/json@2.2.312': - resolution: {integrity: sha512-sujKsprCACPMVZHeNaxvc7HyONW916tUVw4zfEK+GmT7PkH73PdplmW1w2UWC07IC6oUYPZ2EE0pfdWHhWHjpQ==} + '@iconify/json@2.2.313': + resolution: {integrity: sha512-lzZ0KFpb0/IN4TVp/9lkUQQx6pmDqe6UD6lWiwkjnPMUVfFXYFMOfy6Qna5zb2cKwVQLTcOUgKk82Ah4qilKlw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -3122,8 +3122,8 @@ packages: '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} - '@types/node@22.13.8': - resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==} + '@types/node@22.13.9': + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -9005,11 +9005,11 @@ snapshots: '@bufbuild/protobuf@2.2.3': {} - '@commitlint/cli@19.7.1(@types/node@22.13.8)(typescript@5.8.2)': + '@commitlint/cli@19.7.1(@types/node@22.13.9)(typescript@5.8.2)': dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.7.1 - '@commitlint/load': 19.6.1(@types/node@22.13.8)(typescript@5.8.2) + '@commitlint/load': 19.6.1(@types/node@22.13.9)(typescript@5.8.2) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 tinyexec: 0.3.1 @@ -9056,7 +9056,7 @@ snapshots: '@commitlint/rules': 19.6.0 '@commitlint/types': 19.5.0 - '@commitlint/load@19.6.1(@types/node@22.13.8)(typescript@5.8.2)': + '@commitlint/load@19.6.1(@types/node@22.13.9)(typescript@5.8.2)': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/execute-rule': 19.5.0 @@ -9064,7 +9064,7 @@ snapshots: '@commitlint/types': 19.5.0 chalk: 5.4.1 cosmiconfig: 9.0.0(typescript@5.8.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@22.13.8)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.13.9)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -9426,7 +9426,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/json@2.2.312': + '@iconify/json@2.2.313': dependencies: '@iconify/types': 2.0.0 pathe: 1.1.2 @@ -9489,23 +9489,23 @@ snapshots: '@material/material-color-utilities@0.3.0': {} - '@microsoft/api-extractor-model@7.30.3(@types/node@22.13.8)': + '@microsoft/api-extractor-model@7.30.3(@types/node@22.13.9)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.11.0(@types/node@22.13.8) + '@rushstack/node-core-library': 5.11.0(@types/node@22.13.9) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.51.0(@types/node@22.13.8)': + '@microsoft/api-extractor@7.51.0(@types/node@22.13.9)': dependencies: - '@microsoft/api-extractor-model': 7.30.3(@types/node@22.13.8) + '@microsoft/api-extractor-model': 7.30.3(@types/node@22.13.9) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.11.0(@types/node@22.13.8) + '@rushstack/node-core-library': 5.11.0(@types/node@22.13.9) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.0(@types/node@22.13.8) - '@rushstack/ts-command-line': 4.23.5(@types/node@22.13.8) + '@rushstack/terminal': 0.15.0(@types/node@22.13.9) + '@rushstack/ts-command-line': 4.23.5(@types/node@22.13.9) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -10175,7 +10175,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.11.0(@types/node@22.13.8)': + '@rushstack/node-core-library@5.11.0(@types/node@22.13.9)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -10186,23 +10186,23 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.0(@types/node@22.13.8)': + '@rushstack/terminal@0.15.0(@types/node@22.13.9)': dependencies: - '@rushstack/node-core-library': 5.11.0(@types/node@22.13.8) + '@rushstack/node-core-library': 5.11.0(@types/node@22.13.9) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 - '@rushstack/ts-command-line@4.23.5(@types/node@22.13.8)': + '@rushstack/ts-command-line@4.23.5(@types/node@22.13.9)': dependencies: - '@rushstack/terminal': 0.15.0(@types/node@22.13.8) + '@rushstack/terminal': 0.15.0(@types/node@22.13.9) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -10519,7 +10519,7 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/router-plugin@1.112.3(@tanstack/react-router@1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': + '@tanstack/router-plugin@1.112.3(@tanstack/react-router@1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) @@ -10540,7 +10540,7 @@ snapshots: zod: 3.24.2 optionalDependencies: '@tanstack/react-router': 1.112.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -10693,12 +10693,12 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/responselike': 1.0.3 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/d3-array@3.2.1': {} @@ -10834,7 +10834,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/geojson@7946.0.14': {} @@ -10852,11 +10852,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/keyv@3.1.4': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/lodash-es@4.17.12': dependencies: @@ -10876,7 +10876,7 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/node@22.13.8': + '@types/node@22.13.9': dependencies: undici-types: 6.20.0 @@ -10906,7 +10906,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/retry@0.12.2': {} @@ -10926,7 +10926,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 optional: true '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.21.0(jiti@2.4.2))(typescript@5.8.2)': @@ -11045,7 +11045,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-legacy@6.0.2(terser@5.36.0)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': + '@vitejs/plugin-legacy@6.0.2(terser@5.36.0)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.9 '@babel/preset-env': 7.26.9(@babel/core@7.26.9) @@ -11056,25 +11056,25 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.36.0 - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react-swc@3.8.0(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': + '@vitejs/plugin-react-swc@3.8.0(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@swc/core': 1.10.15 - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.4(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -11717,9 +11717,9 @@ snapshots: core-js@3.41.0: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@22.13.8)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2): + cosmiconfig-typescript-loader@6.1.0(@types/node@22.13.9)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2): dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 cosmiconfig: 9.0.0(typescript@5.8.2) jiti: 2.4.2 typescript: 5.8.2 @@ -13699,11 +13699,11 @@ snapshots: kind-of@6.0.3: {} - knip@5.45.0(@types/node@22.13.8)(typescript@5.8.2): + knip@5.45.0(@types/node@22.13.9)(typescript@5.8.2): dependencies: '@nodelib/fs.walk': 3.0.1 '@snyk/github-codeowners': 1.1.0 - '@types/node': 22.13.8 + '@types/node': 22.13.9 easy-table: 1.2.0 enhanced-resolve: 5.18.1 fast-glob: 3.3.3 @@ -16206,9 +16206,9 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.3(@types/node@22.13.8)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-dts@4.5.3(@types/node@22.13.9)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): dependencies: - '@microsoft/api-extractor': 7.51.0(@types/node@22.13.8) + '@microsoft/api-extractor': 7.51.0(@types/node@22.13.9) '@rollup/pluginutils': 5.1.4(rollup@4.34.3) '@volar/typescript': 2.4.11 '@vue/language-core': 2.2.0(typescript@5.8.2) @@ -16219,13 +16219,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.8.2 optionalDependencies: - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-html@3.2.2(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -16239,45 +16239,45 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) - vite-plugin-sass-dts@1.3.30(postcss@8.5.3)(prettier@3.5.2)(sass-embedded@1.85.1)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-sass-dts@1.3.30(postcss@8.5.3)(prettier@3.5.2)(sass-embedded@1.85.1)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): dependencies: postcss: 8.5.3 postcss-js: 4.0.1(postcss@8.5.3) prettier: 3.5.2 sass-embedded: 1.85.1 - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) - vite-plugin-svgr@4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): + vite-plugin-svgr@4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.34.3) '@svgr/core': 8.1.0(typescript@5.8.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2)) - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.8.2) optionalDependencies: - vite: 6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript - vite@6.2.0(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0): + vite@6.2.0(@types/node@22.13.9)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.1)(sass-embedded@1.85.1)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0): dependencies: esbuild: 0.25.0 postcss: 8.5.3 rollup: 4.34.3 optionalDependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 fsevents: 2.3.3 jiti: 2.4.2 less: 4.2.0 diff --git a/clash-nyanpasu/scripts/deno/upload-macos-updater.ts b/clash-nyanpasu/scripts/deno/upload-macos-updater.ts index c87ac8f279..bd5ad90fb4 100644 --- a/clash-nyanpasu/scripts/deno/upload-macos-updater.ts +++ b/clash-nyanpasu/scripts/deno/upload-macos-updater.ts @@ -2,7 +2,7 @@ import * as path from 'jsr:@std/path' import { globby } from 'npm:globby' import { consola } from './utils/logger.ts' -const WORKSPACE_ROOT = path.join(Deno.cwd(), '../..') +const WORKSPACE_ROOT = path.join(import.meta.dirname!, '../..') consola.info(`WORKSPACE_ROOT: ${WORKSPACE_ROOT}`) const GITHUB_TOKEN = Deno.env.get('GITHUB_TOKEN') || Deno.env.get('GH_TOKEN') @@ -29,8 +29,10 @@ for (let file of files) { file = path.join(BACKEND_BUILD_DIR, file) const p = path.parse(file) consola.info(`Found file: ${p.base}`) - if (p.base.endsWith('.app.tar.gz')) { - const newName = p.name.split('.')[0] + `.${TARGET_ARCH}.app.tar.gz` + if (p.base.includes('.app')) { + const components = p.base.split('.') + const newName = + components[0] + `.${TARGET_ARCH}.${components.slice(1).join('.')}` const newPath = path.join(p.dir, newName) consola.info(`Renaming ${file} to ${newPath}`) await Deno.rename(file, newPath) diff --git a/clash-verge-rev/src-tauri/Cargo.lock b/clash-verge-rev/src-tauri/Cargo.lock index c3e605b801..5830c57de8 100644 --- a/clash-verge-rev/src-tauri/Cargo.lock +++ b/clash-verge-rev/src-tauri/Cargo.lock @@ -1078,6 +1078,7 @@ dependencies = [ "imageproc", "log", "log4rs", + "mihomo_api", "mockito", "nanoid", "network-interface", @@ -3723,9 +3724,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" dependencies = [ "serde", ] @@ -3896,6 +3897,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mihomo_api" +version = "0.0.0" +dependencies = [ + "reqwest", + "serde", + "serde_json", + "tokio", +] + [[package]] name = "mime" version = "0.3.17" @@ -5996,9 +6007,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -6038,9 +6049,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -6060,9 +6071,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa 1.0.14", "memchr", diff --git a/clash-verge-rev/src-tauri/Cargo.toml b/clash-verge-rev/src-tauri/Cargo.toml index 24808a490d..cb71a46f84 100755 --- a/clash-verge-rev/src-tauri/Cargo.toml +++ b/clash-verge-rev/src-tauri/Cargo.toml @@ -68,6 +68,7 @@ tokio-tungstenite = "0.26.1" futures = "0.3" sys-locale = "0.3.1" async-trait = "0.1.86" +mihomo_api = { path = "./src/crate_mihomo_api" } [target.'cfg(windows)'.dependencies] runas = "=1.2.0" @@ -126,3 +127,8 @@ crate-type = ["staticlib", "cdylib", "rlib"] env_logger = "0.11.0" mockito = "1.2.0" tempfile = "3.17.1" + +[workspace] +members = [ + "src/crate_mihomo_api" +] diff --git a/clash-verge-rev/src-tauri/src/cmd/app.rs b/clash-verge-rev/src-tauri/src/cmd/app.rs index f9e447b26d..eefd4c3e65 100644 --- a/clash-verge-rev/src-tauri/src/cmd/app.rs +++ b/clash-verge-rev/src-tauri/src/cmd/app.rs @@ -1,9 +1,5 @@ -use crate::{ - utils::dirs, - feat, - wrap_err, -}; use super::CmdResult; +use crate::{feat, utils::dirs, wrap_err}; use tauri::Manager; /// 打开应用程序所在目录 @@ -93,26 +89,47 @@ pub async fn download_icon_cache(url: String, name: String) -> CmdResult Ok(icon_path.to_string_lossy().to_string()) } +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct IconInfo { + name: String, + previous_t: String, + current_t: String, +} + /// 复制图标文件 #[tauri::command] -pub fn copy_icon_file(path: String, name: String) -> CmdResult { - let file_path = std::path::Path::new(&path); +pub fn copy_icon_file(path: String, icon_info: IconInfo) -> CmdResult { + use std::fs; + use std::path::Path; + + let file_path = Path::new(&path); + let icon_dir = wrap_err!(dirs::app_home_dir())?.join("icons"); if !icon_dir.exists() { - let _ = std::fs::create_dir_all(&icon_dir); + let _ = fs::create_dir_all(&icon_dir); } let ext = match file_path.extension() { Some(e) => e.to_string_lossy().to_string(), None => "ico".to_string(), }; - let png_dest_path = icon_dir.join(format!("{name}.png")); - let ico_dest_path = icon_dir.join(format!("{name}.ico")); - let dest_path = icon_dir.join(format!("{name}.{ext}")); + let dest_path = icon_dir.join(format!( + "{0}-{1}.{ext}", + icon_info.name, icon_info.current_t + )); if file_path.exists() { - std::fs::remove_file(png_dest_path).unwrap_or_default(); - std::fs::remove_file(ico_dest_path).unwrap_or_default(); - match std::fs::copy(file_path, &dest_path) { + if icon_info.previous_t.trim() != "" { + fs::remove_file( + icon_dir.join(format!("{0}-{1}.png", icon_info.name, icon_info.previous_t)), + ) + .unwrap_or_default(); + fs::remove_file( + icon_dir.join(format!("{0}-{1}.ico", icon_info.name, icon_info.previous_t)), + ) + .unwrap_or_default(); + } + + match fs::copy(file_path, &dest_path) { Ok(_) => Ok(dest_path.to_string_lossy().to_string()), Err(err) => Err(err.to_string()), } diff --git a/clash-verge-rev/src-tauri/src/cmd/proxy.rs b/clash-verge-rev/src-tauri/src/cmd/proxy.rs index e2ddf7713d..3e0f0823a2 100644 --- a/clash-verge-rev/src-tauri/src/cmd/proxy.rs +++ b/clash-verge-rev/src-tauri/src/cmd/proxy.rs @@ -1,35 +1,26 @@ use super::CmdResult; -use crate::module::mihomo::MihomoManager; -use tauri::async_runtime; +use crate::core; +use mihomo_api; + #[tauri::command] pub async fn get_proxies() -> CmdResult { - let proxies = async_runtime::spawn_blocking(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - let manager = MihomoManager::new(); - { - let mut write_guard = manager.write(); - rt.block_on(write_guard.refresh_proxies()); - } - let read_guard = manager.read(); - read_guard.fetch_proxies().clone() - }) - .await.map_err(|e| e.to_string())?; - Ok(proxies) + let (mihomo_server, _) = core::clash_api::clash_client_info().unwrap(); + let mihomo = mihomo_api::MihomoManager::new(mihomo_server); + Ok(mihomo + .refresh_proxies() + .await + .unwrap() + .get_proxies()) } #[tauri::command] pub async fn get_providers_proxies() -> CmdResult { - let providers_proxies = async_runtime::spawn_blocking(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - let manager = MihomoManager::new(); - { - let mut write_guard = manager.write(); - rt.block_on(write_guard.refresh_providers_proxies()); - } - let read_guard = manager.read(); - read_guard.fetch_providers_proxies().clone() - }) - .await.map_err(|e| e.to_string())?; - Ok(providers_proxies) -} \ No newline at end of file + let (mihomo_server, _) = core::clash_api::clash_client_info().unwrap(); + let mihomo = mihomo_api::MihomoManager::new(mihomo_server); + Ok(mihomo + .refresh_providers_proxies() + .await + .unwrap() + .get_providers_proxies()) +} diff --git a/clash-verge-rev/src-tauri/src/cmd/system.rs b/clash-verge-rev/src-tauri/src/cmd/system.rs index 2c875e77b4..2ec266e047 100644 --- a/clash-verge-rev/src-tauri/src/cmd/system.rs +++ b/clash-verge-rev/src-tauri/src/cmd/system.rs @@ -1,5 +1,6 @@ use super::CmdResult; -use crate::{core::handle, model::sysinfo::PlatformSpecification}; +use crate::core::handle; +use crate::module::sysinfo::PlatformSpecification; use tauri_plugin_clipboard_manager::ClipboardExt; use crate::{core::{self, CoreManager, service}, wrap_err}; diff --git a/clash-verge-rev/src-tauri/src/config/api/mihomo.rs b/clash-verge-rev/src-tauri/src/config/api/mihomo.rs deleted file mode 100644 index 46873b9654..0000000000 --- a/clash-verge-rev/src-tauri/src/config/api/mihomo.rs +++ /dev/null @@ -1 +0,0 @@ -pub const MIHOMO_URL: &str = concat!("http://", "127.0.0.1", ":", "9097"); diff --git a/clash-verge-rev/src-tauri/src/config/api/mod.rs b/clash-verge-rev/src-tauri/src/config/api/mod.rs deleted file mode 100644 index 0f3c805716..0000000000 --- a/clash-verge-rev/src-tauri/src/config/api/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod mihomo; diff --git a/clash-verge-rev/src-tauri/src/config/mod.rs b/clash-verge-rev/src-tauri/src/config/mod.rs index a3ddace0cc..69b1b1236d 100644 --- a/clash-verge-rev/src-tauri/src/config/mod.rs +++ b/clash-verge-rev/src-tauri/src/config/mod.rs @@ -21,6 +21,3 @@ pub const DEFAULT_PAC: &str = r#"function FindProxyForURL(url, host) { return "PROXY 127.0.0.1:%mixed-port%; SOCKS5 127.0.0.1:%mixed-port%; DIRECT;"; } "#; - - -pub mod api; \ No newline at end of file diff --git a/clash-verge-rev/src-tauri/src/core/clash_api.rs b/clash-verge-rev/src-tauri/src/core/clash_api.rs index 60af1204f5..d6115b4e41 100644 --- a/clash-verge-rev/src-tauri/src/core/clash_api.rs +++ b/clash-verge-rev/src-tauri/src/core/clash_api.rs @@ -76,7 +76,7 @@ pub async fn get_proxy_delay( } /// 根据clash info获取clash服务地址和请求头 -fn clash_client_info() -> Result<(String, HeaderMap)> { +pub fn clash_client_info() -> Result<(String, HeaderMap)> { let client = { Config::clash().data().get_client_info() }; let server = format!("http://{}", client.server); diff --git a/clash-verge-rev/src-tauri/src/crate_mihomo_api/Cargo.toml b/clash-verge-rev/src-tauri/src/crate_mihomo_api/Cargo.toml new file mode 100644 index 0000000000..1a3ac3bfc6 --- /dev/null +++ b/clash-verge-rev/src-tauri/src/crate_mihomo_api/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "mihomo_api" +edition = "2024" + +[features] +debug = [] + +[dependencies] +reqwest = { version = "0.12.12", features = ["json"] } +serde = { version = "1.0.218", features = ["derive"] } +serde_json = "1.0.140" + +[dev-dependencies] +tokio = { version = "1.43.0", features = ["rt", "macros"] } \ No newline at end of file diff --git a/clash-verge-rev/src-tauri/src/crate_mihomo_api/src/lib.rs b/clash-verge-rev/src-tauri/src/crate_mihomo_api/src/lib.rs new file mode 100644 index 0000000000..0b50365013 --- /dev/null +++ b/clash-verge-rev/src-tauri/src/crate_mihomo_api/src/lib.rs @@ -0,0 +1,76 @@ +use std::{ + sync::{Arc, Mutex}, + time::Duration, +}; +pub mod model; +pub use model::{MihomoData, MihomoManager}; + +impl MihomoManager { + pub fn new(mihomo_server: String) -> Self { + Self { + mihomo_server, + data: Arc::new(Mutex::new(MihomoData { + proxies: serde_json::Value::Null, + providers_proxies: serde_json::Value::Null, + })), + } + } + + fn update_proxies(&self, proxies: serde_json::Value) { + let mut data = self.data.lock().unwrap(); + data.proxies = proxies; + } + + fn update_providers_proxies(&self, providers_proxies: serde_json::Value) { + let mut data = self.data.lock().unwrap(); + data.providers_proxies = providers_proxies; + } + + pub fn get_proxies(&self) -> serde_json::Value { + let data = self.data.lock().unwrap(); + data.proxies.clone() + } + + pub fn get_providers_proxies(&self) -> serde_json::Value { + let data = self.data.lock().unwrap(); + data.providers_proxies.clone() + } + + pub async fn refresh_proxies(&self) -> Result<&Self, String> { + let url = format!("{}/proxies", self.mihomo_server); + let response = reqwest::ClientBuilder::new() + .no_proxy() + .timeout(Duration::from_secs(3)) + .build() + .map_err(|e| e.to_string())? + .get(url) + .send() + .await + .map_err(|e| e.to_string())? + .json::() + .await + .map_err(|e| e.to_string())?; + let proxies = response; + self.update_proxies(proxies); + Ok(self) + } + + pub async fn refresh_providers_proxies(&self) -> Result<&Self, String> { + let url = format!("{}/providers/proxies", self.mihomo_server); + let response = reqwest::ClientBuilder::new() + .no_proxy() + .timeout(Duration::from_secs(3)) + .build() + .map_err(|e| e.to_string())? + .get(url) + .send() + .await + .map_err(|e| e.to_string())? + .json::() + .await + .map_err(|e| e.to_string())?; + let proxies = response; + self.update_providers_proxies(proxies); + Ok(self) + } +} diff --git a/clash-verge-rev/src-tauri/src/crate_mihomo_api/src/model.rs b/clash-verge-rev/src-tauri/src/crate_mihomo_api/src/model.rs new file mode 100644 index 0000000000..4af4b1bec4 --- /dev/null +++ b/clash-verge-rev/src-tauri/src/crate_mihomo_api/src/model.rs @@ -0,0 +1,27 @@ +use std::sync::{Arc, Mutex}; + +pub struct MihomoData { + pub(crate) proxies: serde_json::Value, + pub(crate) providers_proxies: serde_json::Value, +} + +#[derive(Clone)] +pub struct MihomoManager { + pub(crate) mihomo_server: String, + pub(crate) data: Arc>, +} + +#[cfg(feature = "debug")] +impl Drop for MihomoData { + fn drop(&mut self) { + println!("Dropping MihomoData"); + } +} + +#[cfg(feature = "debug")] +impl Drop for MihomoManager { + fn drop(&mut self) { + println!("Dropping MihomoManager"); + } + +} \ No newline at end of file diff --git a/clash-verge-rev/src-tauri/src/crate_mihomo_api/tests/test_mihomo_api.rs b/clash-verge-rev/src-tauri/src/crate_mihomo_api/tests/test_mihomo_api.rs new file mode 100644 index 0000000000..681c6b1075 --- /dev/null +++ b/clash-verge-rev/src-tauri/src/crate_mihomo_api/tests/test_mihomo_api.rs @@ -0,0 +1,28 @@ +use mihomo_api; + +#[test] +fn test_mihomo_manager_init() { + let manager = mihomo_api::MihomoManager::new("url".into()); + assert_eq!(manager.get_proxies(), serde_json::Value::Null); + assert_eq!(manager.get_providers_proxies(), serde_json::Value::Null); +} + +#[tokio::test] +async fn test_refresh_proxies() { + let manager = mihomo_api::MihomoManager::new("http://127.0.0.1:9097".into()); + let manager = manager.refresh_proxies().await.unwrap(); + let proxies = manager.get_proxies(); + let providers = manager.get_providers_proxies(); + assert_ne!(proxies, serde_json::Value::Null); + assert_eq!(providers, serde_json::Value::Null); +} + +#[tokio::test] +async fn test_refresh_providers_proxies() { + let manager = mihomo_api::MihomoManager::new("http://127.0.0.1:9097".into()); + let manager = manager.refresh_providers_proxies().await.unwrap(); + let proxies = manager.get_proxies(); + let providers = manager.get_providers_proxies(); + assert_eq!(proxies, serde_json::Value::Null); + assert_ne!(providers, serde_json::Value::Null); +} \ No newline at end of file diff --git a/clash-verge-rev/src-tauri/src/lib.rs b/clash-verge-rev/src-tauri/src/lib.rs index ccfddebe63..b8a9ee333f 100644 --- a/clash-verge-rev/src-tauri/src/lib.rs +++ b/clash-verge-rev/src-tauri/src/lib.rs @@ -4,7 +4,6 @@ mod core; mod enhance; mod feat; mod utils; -mod model; mod module; use crate::core::hotkey; use crate::utils::{resolve, resolve::resolve_scheme, server}; diff --git a/clash-verge-rev/src-tauri/src/model/api/common.rs b/clash-verge-rev/src-tauri/src/model/api/common.rs deleted file mode 100644 index cd83945cbe..0000000000 --- a/clash-verge-rev/src-tauri/src/model/api/common.rs +++ /dev/null @@ -1,20 +0,0 @@ -use reqwest::Client; - -#[allow(unused)] -pub(crate) struct ApiCaller<'a> { - pub(crate) url: &'a str, - pub(crate) client: Client, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_api_caller() { - let _api_caller = ApiCaller { - url: "https://example.com", - client: Client::new(), - }; - } -} diff --git a/clash-verge-rev/src-tauri/src/model/api/mihomo.rs b/clash-verge-rev/src-tauri/src/model/api/mihomo.rs deleted file mode 100644 index ad14be62f5..0000000000 --- a/clash-verge-rev/src-tauri/src/model/api/mihomo.rs +++ /dev/null @@ -1,5 +0,0 @@ -use super::common::ApiCaller; - -pub struct MihomoAPICaller { - pub(crate) caller: ApiCaller<'static>, -} diff --git a/clash-verge-rev/src-tauri/src/model/api/mod.rs b/clash-verge-rev/src-tauri/src/model/api/mod.rs deleted file mode 100644 index bee8fa981c..0000000000 --- a/clash-verge-rev/src-tauri/src/model/api/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod common; -pub mod mihomo; diff --git a/clash-verge-rev/src-tauri/src/model/mod.rs b/clash-verge-rev/src-tauri/src/model/mod.rs deleted file mode 100644 index e11af71e02..0000000000 --- a/clash-verge-rev/src-tauri/src/model/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod api; -pub mod sysinfo; diff --git a/clash-verge-rev/src-tauri/src/model/sysinfo.rs b/clash-verge-rev/src-tauri/src/model/sysinfo.rs deleted file mode 100644 index b626181d2c..0000000000 --- a/clash-verge-rev/src-tauri/src/model/sysinfo.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::fmt::{self, Debug, Formatter}; - -pub struct PlatformSpecification { - pub system_name: String, - pub system_version: String, - pub system_kernel_version: String, - pub system_arch: String, -} - -impl Debug for PlatformSpecification { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!( - f, - "System Name: {}\nSystem Version: {}\nSystem kernel Version: {}\nSystem Arch: {}", - self.system_name, self.system_version, self.system_kernel_version, self.system_arch - ) - } -} \ No newline at end of file diff --git a/clash-verge-rev/src-tauri/src/module/api/common.rs b/clash-verge-rev/src-tauri/src/module/api/common.rs deleted file mode 100644 index dab4cc6966..0000000000 --- a/clash-verge-rev/src-tauri/src/module/api/common.rs +++ /dev/null @@ -1,70 +0,0 @@ -use crate::model::api::common::ApiCaller; -use async_trait::async_trait; -use reqwest::{ - header::{HeaderMap, HeaderName, HeaderValue}, - RequestBuilder, -}; -use serde::de::DeserializeOwned; - -impl<'a> ApiCaller<'a> { - pub async fn send_request( - &self, - method: &str, - path: &str, - body: Option<&str>, - headers: Option>, - ) -> Result { - let full_url = format!("{}{}", self.url, path); // 拼接完整 URL - let mut request: RequestBuilder = match method { - "GET" => self.client.get(&full_url), - "POST" => self - .client - .post(&full_url) - .body(body.unwrap_or("").to_string()), - "PUT" => self - .client - .put(&full_url) - .body(body.unwrap_or("").to_string()), - "DELETE" => self.client.delete(&full_url), - _ => return Err("Unsupported HTTP method".to_string()), - }; - - // 处理 headers - if let Some(hdrs) = headers { - let mut header_map = HeaderMap::new(); - for (key, value) in hdrs { - if let (Ok(header_name), Ok(header_value)) = ( - HeaderName::from_bytes(key.as_bytes()), - HeaderValue::from_str(value), - ) { - header_map.insert(header_name, header_value); - } - } - request = request.headers(header_map); - } - - let response = request.send().await.map_err(|e| e.to_string())?; - response.text().await.map_err(|e| e.to_string()) - } -} - -#[allow(unused)] -#[async_trait] -pub trait ApiCallerTrait: Send + Sync { - async fn call_api( - &self, - method: &str, - path: &str, - body: Option<&str>, - headers: Option> - ) -> Result - where - T: DeserializeOwned + Send + Sync; - - fn parse_json_response(json_str: &str) -> Result - where - T: DeserializeOwned, - { - serde_json::from_str(json_str).map_err(|e| e.to_string()) - } -} diff --git a/clash-verge-rev/src-tauri/src/module/api/mihomo.rs b/clash-verge-rev/src-tauri/src/module/api/mihomo.rs deleted file mode 100644 index 09b6d0faed..0000000000 --- a/clash-verge-rev/src-tauri/src/module/api/mihomo.rs +++ /dev/null @@ -1,108 +0,0 @@ -use super::common::ApiCallerTrait; -use crate::config::api::mihomo::MIHOMO_URL; -use crate::model::api::common::ApiCaller; -use crate::model::api::mihomo::MihomoAPICaller; - -use async_trait::async_trait; -use once_cell::sync::OnceCell; -use parking_lot::RwLock; -use reqwest::Client; -use serde::de::DeserializeOwned; -use std::sync::Arc; - -impl MihomoAPICaller { - #[allow(dead_code)] - pub fn new() -> Arc> { - static INSTANCE: OnceCell>> = OnceCell::new(); - INSTANCE - .get_or_init(|| { - let client = Client::new(); - Arc::new(RwLock::new(MihomoAPICaller { - caller: ApiCaller { - url: MIHOMO_URL, - client, - }, - })) - }) - .clone() - } -} - -#[async_trait] -impl ApiCallerTrait for MihomoAPICaller { - async fn call_api( - &self, - method: &str, - path: &str, - body: Option<&str>, - headers: Option>, - ) -> Result - where - T: DeserializeOwned + Send + Sync, - { - let response = self - .caller - .send_request(method, path, body, headers) - .await - .map_err(|e| e.to_string())?; - Self::parse_json_response::(&response) - } -} - -#[allow(unused)] -impl MihomoAPICaller { - pub async fn get_proxies() -> Result { - Self::new() - .read() - .call_api("GET", "/proxies", None, None) - .await - } - - pub async fn get_providers_proxies() -> Result { - Self::new() - .read() - .call_api("GET", "/providers/proxies", None, None) - .await - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[tokio::test] - async fn test_mihomo_api_singleton() { - let mihomo_api_caller1 = MihomoAPICaller::new(); - let mihomo_api_caller2 = MihomoAPICaller::new(); - assert!(Arc::ptr_eq(&mihomo_api_caller1, &mihomo_api_caller2)); - } - - #[tokio::test] - async fn test_mihomo_api_version() { - let mihomo_caller = MihomoAPICaller::new(); - let response: Result = mihomo_caller - .read() - .call_api("GET", "/version", None, None) - .await; - assert!(response.is_ok()); - } - - #[tokio::test] - async fn test_mihomo_get_proxies() { - let response = MihomoAPICaller::get_proxies().await; - assert!(response.is_ok()); - if let Ok(proxies) = &response { - assert!(!proxies.get("proxies").is_none()); - } - } - - #[tokio::test] - async fn test_mihomo_get_providers_proxies() { - let response = MihomoAPICaller::get_providers_proxies().await; - println!("{:?}", response); - assert!(response.is_ok()); - if let Ok(providers_proxies) = &response { - assert!(!providers_proxies.get("providers").is_none()); - } - } -} diff --git a/clash-verge-rev/src-tauri/src/module/api/mod.rs b/clash-verge-rev/src-tauri/src/module/api/mod.rs deleted file mode 100644 index bee8fa981c..0000000000 --- a/clash-verge-rev/src-tauri/src/module/api/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod common; -pub mod mihomo; diff --git a/clash-verge-rev/src-tauri/src/module/mihomo.rs b/clash-verge-rev/src-tauri/src/module/mihomo.rs deleted file mode 100644 index c1201d91ce..0000000000 --- a/clash-verge-rev/src-tauri/src/module/mihomo.rs +++ /dev/null @@ -1,158 +0,0 @@ -use crate::model::api::mihomo::MihomoAPICaller; -use once_cell::sync::OnceCell; -use parking_lot::RwLock; -use std::sync::Arc; - -#[allow(unused)] -pub struct MihomoManager { - proxies: serde_json::Value, - providers_proxies: serde_json::Value, -} - -#[allow(unused)] -impl MihomoManager { - pub fn new() -> Arc> { - static INSTANCE: OnceCell>> = OnceCell::new(); - INSTANCE - .get_or_init(|| { - Arc::new(RwLock::new(MihomoManager { - proxies: serde_json::Value::Null, - providers_proxies: serde_json::Value::Null, - })) - }) - .clone() - } - - pub fn fetch_proxies(&self) -> &serde_json::Value { - &self.proxies - } - - pub fn fetch_providers_proxies(&self) -> &serde_json::Value { - &self.providers_proxies - } - - pub async fn refresh_proxies(&mut self) { - match MihomoAPICaller::get_proxies().await { - Ok(proxies) => { - self.proxies = proxies; - } - Err(e) => { - log::error!("Failed to get proxies: {}", e); - } - } - } - - pub async fn refresh_providers_proxies(&mut self) { - match MihomoAPICaller::get_providers_proxies().await { - Ok(providers_proxies) => { - self.providers_proxies = providers_proxies; - }, - Err(e) => { - log::error!("Failed to get providers proxies: {}", e); - }, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - #[tokio::test] - async fn test_mihomo_manager_singleton() { - let manager1 = MihomoManager::new(); - let manager2 = MihomoManager::new(); - - assert!( - Arc::ptr_eq(&manager1, &manager2), - "Should return same instance" - ); - - let manager = manager1.read(); - assert!(manager.proxies.is_null()); - assert!(manager.providers_proxies.is_null()); - } - - #[tokio::test] - async fn test_refresh_proxies() { - let manager = MihomoManager::new(); - - // Test initial state - { - let data = manager.read(); - assert!(data.proxies.is_null()); - } - - // Test refresh - { - let mut data = manager.write(); - data.refresh_proxies().await; - // Note: Since this depends on external API call, - // we can only verify that the refresh call completes - // without panicking. For more thorough testing, - // we would need to mock the API caller. - } - } - - #[tokio::test] - async fn test_refresh_providers_proxies() { - let manager = MihomoManager::new(); - - // Test initial state - { - let data = manager.read(); - assert!(data.providers_proxies.is_null()); - } - - // Test refresh - { - let mut data = manager.write(); - data.refresh_providers_proxies().await; - // Note: Since this depends on external API call, - // we can only verify that the refresh call completes - // without panicking. For more thorough testing, - // we would need to mock the API caller. - } - } - - #[tokio::test] - async fn test_fetch_proxies() { - let manager = MihomoManager::new(); - - // Test initial state - { - let data = manager.read(); - let proxies = data.fetch_proxies(); - assert!(proxies.is_null()); - } - - // Test after refresh - { - let mut data = manager.write(); - data.refresh_proxies().await; - let _proxies = data.fetch_proxies(); - // Can only verify the method returns without panicking - // Would need API mocking for more thorough testing - } - } - - #[tokio::test] - async fn test_fetch_providers_proxies() { - let manager = MihomoManager::new(); - - // Test initial state - { - let data = manager.read(); - let providers_proxies = data.fetch_providers_proxies(); - assert!(providers_proxies.is_null()); - } - - // Test after refresh - { - let mut data = manager.write(); - data.refresh_providers_proxies().await; - let _providers_proxies = data.fetch_providers_proxies(); - // Can only verify the method returns without panicking - // Would need API mocking for more thorough testing - } - } -} diff --git a/clash-verge-rev/src-tauri/src/module/mod.rs b/clash-verge-rev/src-tauri/src/module/mod.rs index 0692611ce4..f146b31013 100644 --- a/clash-verge-rev/src-tauri/src/module/mod.rs +++ b/clash-verge-rev/src-tauri/src/module/mod.rs @@ -1,3 +1 @@ -pub mod api; -pub mod sysinfo; -pub mod mihomo; \ No newline at end of file +pub mod sysinfo; \ No newline at end of file diff --git a/clash-verge-rev/src-tauri/src/module/sysinfo.rs b/clash-verge-rev/src-tauri/src/module/sysinfo.rs index 9908f6ccb1..54e0b5bc7c 100644 --- a/clash-verge-rev/src-tauri/src/module/sysinfo.rs +++ b/clash-verge-rev/src-tauri/src/module/sysinfo.rs @@ -1,7 +1,26 @@ -use crate::model::sysinfo::PlatformSpecification; - +use crate::core::{handle, CoreManager}; +use std::fmt::{self, Debug, Formatter}; use sysinfo::System; +pub struct PlatformSpecification { + system_name: String, + system_version: String, + system_kernel_version: String, + system_arch: String, + verge_version: String, + running_mode: String, +} + +impl Debug for PlatformSpecification { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!( + f, + "System Name: {}\nSystem Version: {}\nSystem kernel Version: {}\nSystem Arch: {}\nVerge Version: {}\nRunning Mode: {}", + self.system_name, self.system_version, self.system_kernel_version, self.system_arch, self.verge_version, self.running_mode + ) + } +} + impl PlatformSpecification { pub fn new() -> Self { let system_name = System::name().unwrap_or("Null".into()); @@ -9,11 +28,29 @@ impl PlatformSpecification { let system_kernel_version = System::kernel_version().unwrap_or("Null".into()); let system_arch = std::env::consts::ARCH.to_string(); + let handler = handle::Handle::global().app_handle().unwrap(); + let config = handler.config(); + let verge_version = config.version.clone().unwrap_or("Null".into()); + + // Get running mode asynchronously + let running_mode = tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(async { + match CoreManager::global().get_running_mode().await { + crate::core::RunningMode::Service => "Service".to_string(), + crate::core::RunningMode::Sidecar => "Sidecar".to_string(), + crate::core::RunningMode::NotRunning => "Not Running".to_string(), + } + }) + }); + + Self { system_name, system_version, system_kernel_version, - system_arch + system_arch, + verge_version, + running_mode, } } } diff --git a/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx b/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx index 21f79f5e5a..e76706ee04 100644 --- a/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx +++ b/clash-verge-rev/src/components/setting/mods/layout-viewer.tsx @@ -22,6 +22,18 @@ import getSystem from "@/utils/get-system"; const OS = getSystem(); +const getIcons = async (icon_dir: string, name: string) => { + const updateTime = localStorage.getItem(`icon_${name}_update_time`) || ""; + + const icon_png = await join(icon_dir, `${name}-${updateTime}.png`); + const icon_ico = await join(icon_dir, `${name}-${updateTime}.ico`); + + return { + icon_png, + icon_ico, + }; +}; + export const LayoutViewer = forwardRef((props, ref) => { const { t } = useTranslation(); const { verge, patchVerge, mutateVerge } = useVerge(); @@ -37,13 +49,20 @@ export const LayoutViewer = forwardRef((props, ref) => { async function initIconPath() { const appDir = await getAppDir(); + const icon_dir = await join(appDir, "icons"); - const common_icon_png = await join(icon_dir, "common.png"); - const common_icon_ico = await join(icon_dir, "common.ico"); - const sysproxy_icon_png = await join(icon_dir, "sysproxy.png"); - const sysproxy_icon_ico = await join(icon_dir, "sysproxy.ico"); - const tun_icon_png = await join(icon_dir, "tun.png"); - const tun_icon_ico = await join(icon_dir, "tun.ico"); + + const { icon_png: common_icon_png, icon_ico: common_icon_ico } = + await getIcons(icon_dir, "common"); + + const { icon_png: sysproxy_icon_png, icon_ico: sysproxy_icon_ico } = + await getIcons(icon_dir, "sysproxy"); + + const { icon_png: tun_icon_png, icon_ico: tun_icon_ico } = await getIcons( + icon_dir, + "tun", + ); + if (await exists(common_icon_ico)) { setCommonIcon(common_icon_ico); } else { @@ -212,11 +231,13 @@ export const LayoutViewer = forwardRef((props, ref) => { }, ], }); + if (selected) { await copyIconFile(`${selected}`, "common"); await initIconPath(); onChangeData({ common_tray_icon: true }); patchVerge({ common_tray_icon: true }); + console.log(); } } }} diff --git a/clash-verge-rev/src/components/setting/setting-system.tsx b/clash-verge-rev/src/components/setting/setting-system.tsx index fdb4325b40..69c088553d 100644 --- a/clash-verge-rev/src/components/setting/setting-system.tsx +++ b/clash-verge-rev/src/components/setting/setting-system.tsx @@ -54,10 +54,6 @@ const SettingSystem = ({ onError }: Props) => { proxy_auto_config, } = verge ?? {}; - const isProxyEnabled = proxy_auto_config - ? autoproxy?.enable - : sysproxy?.enable; - const onSwitchFormat = (_e: any, value: boolean) => value; const onChangeData = (patch: Partial) => { mutateVerge({ ...verge, ...patch }, false); @@ -149,7 +145,13 @@ const SettingSystem = ({ onError }: Props) => { icon={SettingsRounded} onClick={() => sysproxyRef.current?.open()} /> - {isProxyEnabled ? ( + {proxy_auto_config ? ( + autoproxy?.enable ? ( + + ) : ( + + ) + ) : sysproxy?.enable ? ( ) : ( diff --git a/clash-verge-rev/src/pages/_layout.tsx b/clash-verge-rev/src/pages/_layout.tsx index d5b935731c..b9a9eadfda 100644 --- a/clash-verge-rev/src/pages/_layout.tsx +++ b/clash-verge-rev/src/pages/_layout.tsx @@ -166,9 +166,12 @@ const Layout = () => { }), // verge 配置更新监听 - addListener("verge://refresh-verge-config", () => - mutate("getVergeConfig"), - ), + addListener("verge://refresh-verge-config", () => { + mutate("getVergeConfig"); + // 添加对系统代理状态的刷新 + mutate("getSystemProxy"); + mutate("getAutotemProxy"); + }), // 通知消息监听 addListener("verge://notice-message", ({ payload }) => diff --git a/clash-verge-rev/src/services/cmds.ts b/clash-verge-rev/src/services/cmds.ts index 3104183f0e..9338406d46 100644 --- a/clash-verge-rev/src/services/cmds.ts +++ b/clash-verge-rev/src/services/cmds.ts @@ -199,7 +199,19 @@ export async function copyIconFile( path: string, name: "common" | "sysproxy" | "tun", ) { - return invoke("copy_icon_file", { path, name }); + const key = `icon_${name}_update_time`; + const previousTime = localStorage.getItem(key) || ""; + + const currentTime = String(Date.now()); + localStorage.setItem(key, currentTime); + + const iconInfo = { + name, + previous_t: previousTime, + current_t: currentTime, + }; + + return invoke("copy_icon_file", { path, iconInfo }); } export async function downloadIconCache(url: string, name: string) { diff --git a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3528.dtsi b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3528.dtsi index c43d379b7c..87c1519329 100644 --- a/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3528.dtsi +++ b/lede/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3528.dtsi @@ -1219,7 +1219,8 @@ }; sdhci: mmc@ffbf0000 { - compatible = "rockchip,rk3528-dwcmshc"; + compatible = "rockchip,rk3528-dwcmshc", + "rockchip,rk3588-dwcmshc"; reg = <0x0 0xffbf0000 0x0 0x10000>; interrupts = ; assigned-clocks = <&cru BCLK_EMMC>, <&cru TCLK_EMMC>, <&cru CCLK_SRC_EMMC>; diff --git a/lede/target/linux/rockchip/patches-6.1/220-phy-rockchip-naneng-combphy-fix-phy-reset.patch b/lede/target/linux/rockchip/patches-6.1/220-phy-rockchip-naneng-combphy-fix-phy-reset.patch index a272403869..0fc571bdbd 100644 --- a/lede/target/linux/rockchip/patches-6.1/220-phy-rockchip-naneng-combphy-fix-phy-reset.patch +++ b/lede/target/linux/rockchip/patches-6.1/220-phy-rockchip-naneng-combphy-fix-phy-reset.patch @@ -28,12 +28,15 @@ #phy-cells = <1>; --- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c +++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c -@@ -299,7 +299,7 @@ static int rockchip_combphy_parse_dt(str +@@ -299,7 +299,10 @@ static int rockchip_combphy_parse_dt(str priv->ext_refclk = device_property_present(dev, "rockchip,ext-refclk"); -- priv->phy_rst = devm_reset_control_array_get_exclusive(dev); -+ priv->phy_rst = devm_reset_control_get(dev, "phy"); +- priv->phy_rst = devm_reset_control_get(dev, "phy"); ++ priv->phy_rst = devm_reset_control_get_exclusive(dev, "phy"); ++ /* fallback to old behaviour */ ++ if (PTR_ERR(priv->phy_rst) == -ENOENT) ++ priv->phy_rst = devm_reset_control_array_get_exclusive(dev); if (IS_ERR(priv->phy_rst)) return dev_err_probe(dev, PTR_ERR(priv->phy_rst), "failed to get phy reset\n"); diff --git a/lede/target/linux/rockchip/patches-6.1/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch b/lede/target/linux/rockchip/patches-6.1/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch index ea040ade76..9ffd29a01c 100644 --- a/lede/target/linux/rockchip/patches-6.1/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch +++ b/lede/target/linux/rockchip/patches-6.1/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch @@ -1,100 +1,3 @@ ---- a/drivers/mmc/host/sdhci-of-dwcmshc.c -+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c -@@ -295,19 +295,20 @@ static void dwcmshc_rk3568_set_clock(str - 0x3 << 19; /* post-change delay */ - sdhci_writel(host, extra, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL); - -- if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 || -- host->mmc->ios.timing == MMC_TIMING_MMC_HS400) -+ if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200) - txclk_tapnum = priv->txclk_tapnum; - -- if ((priv->devtype == DWCMSHC_RK3588) && host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { -+ if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { - txclk_tapnum = DLL_TXCLK_TAPNUM_90_DEGREES; - -- extra = DLL_CMDOUT_SRC_CLK_NEG | -- DLL_CMDOUT_EN_SRC_CLK_NEG | -- DWCMSHC_EMMC_DLL_DLYENA | -- DLL_CMDOUT_TAPNUM_90_DEGREES | -- DLL_CMDOUT_TAPNUM_FROM_SW; -- sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); -+ if (priv->devtype != DWCMSHC_RK3568) { -+ extra = DLL_CMDOUT_SRC_CLK_NEG | -+ DLL_CMDOUT_EN_SRC_CLK_NEG | -+ DWCMSHC_EMMC_DLL_DLYENA | -+ DLL_CMDOUT_TAPNUM_90_DEGREES | -+ DLL_CMDOUT_TAPNUM_FROM_SW; -+ sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); -+ } - } - - extra = DWCMSHC_EMMC_DLL_DLYENA | -@@ -355,6 +356,15 @@ static const struct sdhci_ops sdhci_dwcm - .adma_write_desc = dwcmshc_adma_write_desc, - }; - -+static const struct sdhci_ops sdhci_dwcmshc_rk3528_ops = { -+ .set_clock = dwcmshc_rk3568_set_clock, -+ .set_bus_width = sdhci_set_bus_width, -+ .set_uhs_signaling = dwcmshc_set_uhs_signaling, -+ .get_max_clock = sdhci_pltfm_clk_get_max_clock, -+ .reset = rk35xx_sdhci_reset, -+ .adma_write_desc = dwcmshc_adma_write_desc, -+}; -+ - static const struct sdhci_pltfm_data sdhci_dwcmshc_pdata = { - .ops = &sdhci_dwcmshc_ops, - .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN, -@@ -378,6 +388,14 @@ static const struct sdhci_pltfm_data sdh - SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, - }; - -+static const struct sdhci_pltfm_data sdhci_dwcmshc_rk3528_pdata = { -+ .ops = &sdhci_dwcmshc_rk3528_ops, -+ .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN | -+ SDHCI_QUIRK_BROKEN_TIMEOUT_VAL, -+ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | -+ SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, -+}; -+ - static int dwcmshc_rk35xx_init(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv) - { - int err; -@@ -443,6 +461,10 @@ static const struct of_device_id sdhci_d - .data = &sdhci_dwcmshc_rk35xx_pdata, - }, - { -+ .compatible = "rockchip,rk3528-dwcmshc", -+ .data = &sdhci_dwcmshc_rk3528_pdata, -+ }, -+ { - .compatible = "snps,dwcmshc-sdhci", - .data = &sdhci_dwcmshc_pdata, - }, -@@ -521,17 +543,18 @@ static int dwcmshc_probe(struct platform - host->mmc_host_ops.request = dwcmshc_request; - host->mmc_host_ops.hs400_enhanced_strobe = dwcmshc_hs400_enhanced_strobe; - -- if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) { -+ if ((pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) || -+ (pltfm_data == &sdhci_dwcmshc_rk3528_pdata)) { - rk_priv = devm_kzalloc(&pdev->dev, sizeof(struct rk35xx_priv), GFP_KERNEL); - if (!rk_priv) { - err = -ENOMEM; - goto err_clk; - } - -- if (of_device_is_compatible(pdev->dev.of_node, "rockchip,rk3588-dwcmshc")) -- rk_priv->devtype = DWCMSHC_RK3588; -- else -+ if (of_device_is_compatible(pdev->dev.of_node, "rockchip,rk3568-dwcmshc")) - rk_priv->devtype = DWCMSHC_RK3568; -+ else -+ rk_priv->devtype = DWCMSHC_RK3588; - - priv->priv = rk_priv; - --- a/drivers/pci/controller/dwc/Makefile +++ b/drivers/pci/controller/dwc/Makefile @@ -16,6 +16,7 @@ obj-$(CONFIG_PCIE_QCOM_EP) += pcie-qcom- diff --git a/lede/target/linux/rockchip/patches-6.12/307-phy-rockchip-inno-usb2-add-phy-support-for-rk3528.patch b/lede/target/linux/rockchip/patches-6.12/307-phy-rockchip-inno-usb2-add-phy-support-for-rk3528.patch index 9f2d0d25e7..09337aa71d 100644 --- a/lede/target/linux/rockchip/patches-6.12/307-phy-rockchip-inno-usb2-add-phy-support-for-rk3528.patch +++ b/lede/target/linux/rockchip/patches-6.12/307-phy-rockchip-inno-usb2-add-phy-support-for-rk3528.patch @@ -1,3 +1,16 @@ +From 7c24d9902e1dab659e020798f0d682e0cd650a88 Mon Sep 17 00:00:00 2001 +From: Jianwei Zheng +Date: Sun, 9 Oct 2022 11:22:44 +0800 +Subject: [PATCH] phy: rockchip: inno-usb2: add usb2 phy support for rk3528 + +This patch add usb2 phy support for rk3528. + +Signed-off-by: Jianwei Zheng +Change-Id: Ia4a861bccd6a37db4e1ba42cede66a6b07947b5d +--- + drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 51 ++++++++++++++++ + 1 file changed, 51 insertions(+) + --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c @@ -1905,6 +1905,56 @@ static const struct rockchip_usb2phy_cfg @@ -11,10 +24,10 @@ + .clkout_ctl = { 0x041c, 7, 2, 0, 0x27 }, + .port_cfgs = { + [USB2PHY_PORT_OTG] = { -+ .phy_sus = { 0x6004c, 15, 0, 0, 0x1d1 }, -+ .bvalid_det_en = { 0x60074, 3, 2, 0, 3 }, -+ .bvalid_det_st = { 0x60078, 3, 2, 0, 3 }, -+ .bvalid_det_clr = { 0x6007c, 3, 2, 0, 3 }, ++ .phy_sus = { 0x6004c, 8, 0, 0, 0x1d1 }, ++ .bvalid_det_en = { 0x60074, 2, 2, 0, 1 }, ++ .bvalid_det_st = { 0x60078, 2, 2, 0, 1 }, ++ .bvalid_det_clr = { 0x6007c, 2, 2, 0, 1 }, + .idfall_det_en = { 0x60074, 5, 5, 0, 1 }, + .idfall_det_st = { 0x60078, 5, 5, 0, 1 }, + .idfall_det_clr = { 0x6007c, 5, 5, 0, 1 }, @@ -30,7 +43,7 @@ + .utmi_ls = { 0x6006c, 5, 4, 0, 1 }, + }, + [USB2PHY_PORT_HOST] = { -+ .phy_sus = { 0x6005c, 15, 0, 0x1d2, 0x1d1 }, ++ .phy_sus = { 0x6005c, 8, 0, 0x1d2, 0x1d1 }, + .ls_det_en = { 0x60090, 0, 0, 0, 1 }, + .ls_det_st = { 0x60094, 0, 0, 0, 1 }, + .ls_det_clr = { 0x60098, 0, 0, 0, 1 }, diff --git a/lede/target/linux/rockchip/patches-6.12/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch b/lede/target/linux/rockchip/patches-6.12/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch index b6a5ab5683..202d949873 100644 --- a/lede/target/linux/rockchip/patches-6.12/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch +++ b/lede/target/linux/rockchip/patches-6.12/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch @@ -1,96 +1,3 @@ ---- a/drivers/mmc/host/sdhci-of-dwcmshc.c -+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c -@@ -688,19 +688,20 @@ static void dwcmshc_rk3568_set_clock(str - 0x3 << 19; /* post-change delay */ - sdhci_writel(host, extra, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL); - -- if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 || -- host->mmc->ios.timing == MMC_TIMING_MMC_HS400) -+ if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200) - txclk_tapnum = priv->txclk_tapnum; - -- if ((priv->devtype == DWCMSHC_RK3588) && host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { -+ if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { - txclk_tapnum = DLL_TXCLK_TAPNUM_90_DEGREES; - -- extra = DLL_CMDOUT_SRC_CLK_NEG | -- DLL_CMDOUT_EN_SRC_CLK_NEG | -- DWCMSHC_EMMC_DLL_DLYENA | -- DLL_CMDOUT_TAPNUM_90_DEGREES | -- DLL_CMDOUT_TAPNUM_FROM_SW; -- sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); -+ if (priv->devtype != DWCMSHC_RK3568) { -+ extra = DLL_CMDOUT_SRC_CLK_NEG | -+ DLL_CMDOUT_EN_SRC_CLK_NEG | -+ DWCMSHC_EMMC_DLL_DLYENA | -+ DLL_CMDOUT_TAPNUM_90_DEGREES | -+ DLL_CMDOUT_TAPNUM_FROM_SW; -+ sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); -+ } - } - - extra = DWCMSHC_EMMC_DLL_DLYENA | -@@ -741,10 +742,10 @@ static int dwcmshc_rk35xx_init(struct de - if (!priv) - return -ENOMEM; - -- if (of_device_is_compatible(dev->of_node, "rockchip,rk3588-dwcmshc")) -- priv->devtype = DWCMSHC_RK3588; -- else -+ if (of_device_is_compatible(dev->of_node, "rockchip,rk3568-dwcmshc")) - priv->devtype = DWCMSHC_RK3568; -+ else -+ priv->devtype = DWCMSHC_RK3588; - - priv->reset = devm_reset_control_array_get_optional_exclusive(mmc_dev(host->mmc)); - if (IS_ERR(priv->reset)) { -@@ -1156,6 +1157,16 @@ static const struct sdhci_ops sdhci_dwcm - .irq = dwcmshc_cqe_irq_handler, - }; - -+static const struct sdhci_ops sdhci_dwcmshc_rk3528_ops = { -+ .set_clock = dwcmshc_rk3568_set_clock, -+ .set_bus_width = sdhci_set_bus_width, -+ .set_uhs_signaling = dwcmshc_set_uhs_signaling, -+ .get_max_clock = sdhci_pltfm_clk_get_max_clock, -+ .reset = rk35xx_sdhci_reset, -+ .adma_write_desc = dwcmshc_adma_write_desc, -+ .irq = dwcmshc_cqe_irq_handler, -+}; -+ - static const struct sdhci_ops sdhci_dwcmshc_th1520_ops = { - .set_clock = sdhci_set_clock, - .set_bus_width = sdhci_set_bus_width, -@@ -1218,6 +1229,18 @@ static const struct dwcmshc_pltfm_data s - .postinit = dwcmshc_rk35xx_postinit, - }; - -+static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk3528_pdata = { -+ .pdata = { -+ .ops = &sdhci_dwcmshc_rk3528_ops, -+ .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN | -+ SDHCI_QUIRK_BROKEN_TIMEOUT_VAL, -+ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | -+ SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, -+ }, -+ .init = dwcmshc_rk35xx_init, -+ .postinit = dwcmshc_rk35xx_postinit, -+}; -+ - static const struct dwcmshc_pltfm_data sdhci_dwcmshc_th1520_pdata = { - .pdata = { - .ops = &sdhci_dwcmshc_th1520_ops, -@@ -1320,6 +1343,10 @@ static const struct of_device_id sdhci_d - .compatible = "rockchip,rk3568-dwcmshc", - .data = &sdhci_dwcmshc_rk35xx_pdata, - }, -+ { -+ .compatible = "rockchip,rk3528-dwcmshc", -+ .data = &sdhci_dwcmshc_rk3528_pdata, -+ }, - { - .compatible = "snps,dwcmshc-sdhci", - .data = &sdhci_dwcmshc_pdata, --- a/drivers/pci/controller/dwc/Makefile +++ b/drivers/pci/controller/dwc/Makefile @@ -18,6 +18,7 @@ obj-$(CONFIG_PCIE_QCOM_EP) += pcie-qcom- diff --git a/lede/target/linux/rockchip/patches-6.6/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch b/lede/target/linux/rockchip/patches-6.6/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch index 2f636b814a..a629c9e054 100644 --- a/lede/target/linux/rockchip/patches-6.6/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch +++ b/lede/target/linux/rockchip/patches-6.6/309-mmc-sdhci-of-dwcmshc-pcie-support-for-rk3528.patch @@ -1,100 +1,3 @@ ---- a/drivers/mmc/host/sdhci-of-dwcmshc.c -+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c -@@ -296,19 +296,20 @@ static void dwcmshc_rk3568_set_clock(str - 0x3 << 19; /* post-change delay */ - sdhci_writel(host, extra, dwc_priv->vendor_specific_area1 + DWCMSHC_EMMC_ATCTRL); - -- if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200 || -- host->mmc->ios.timing == MMC_TIMING_MMC_HS400) -+ if (host->mmc->ios.timing == MMC_TIMING_MMC_HS200) - txclk_tapnum = priv->txclk_tapnum; - -- if ((priv->devtype == DWCMSHC_RK3588) && host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { -+ if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400) { - txclk_tapnum = DLL_TXCLK_TAPNUM_90_DEGREES; - -- extra = DLL_CMDOUT_SRC_CLK_NEG | -- DLL_CMDOUT_EN_SRC_CLK_NEG | -- DWCMSHC_EMMC_DLL_DLYENA | -- DLL_CMDOUT_TAPNUM_90_DEGREES | -- DLL_CMDOUT_TAPNUM_FROM_SW; -- sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); -+ if (priv->devtype != DWCMSHC_RK3568) { -+ extra = DLL_CMDOUT_SRC_CLK_NEG | -+ DLL_CMDOUT_EN_SRC_CLK_NEG | -+ DWCMSHC_EMMC_DLL_DLYENA | -+ DLL_CMDOUT_TAPNUM_90_DEGREES | -+ DLL_CMDOUT_TAPNUM_FROM_SW; -+ sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); -+ } - } - - extra = DWCMSHC_EMMC_DLL_DLYENA | -@@ -356,6 +357,15 @@ static const struct sdhci_ops sdhci_dwcm - .adma_write_desc = dwcmshc_adma_write_desc, - }; - -+static const struct sdhci_ops sdhci_dwcmshc_rk3528_ops = { -+ .set_clock = dwcmshc_rk3568_set_clock, -+ .set_bus_width = sdhci_set_bus_width, -+ .set_uhs_signaling = dwcmshc_set_uhs_signaling, -+ .get_max_clock = sdhci_pltfm_clk_get_max_clock, -+ .reset = rk35xx_sdhci_reset, -+ .adma_write_desc = dwcmshc_adma_write_desc, -+}; -+ - static const struct sdhci_pltfm_data sdhci_dwcmshc_pdata = { - .ops = &sdhci_dwcmshc_ops, - .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN, -@@ -379,6 +389,14 @@ static const struct sdhci_pltfm_data sdh - SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, - }; - -+static const struct sdhci_pltfm_data sdhci_dwcmshc_rk3528_pdata = { -+ .ops = &sdhci_dwcmshc_rk3528_ops, -+ .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN | -+ SDHCI_QUIRK_BROKEN_TIMEOUT_VAL, -+ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | -+ SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN, -+}; -+ - static int dwcmshc_rk35xx_init(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv) - { - int err; -@@ -444,6 +462,10 @@ static const struct of_device_id sdhci_d - .data = &sdhci_dwcmshc_rk35xx_pdata, - }, - { -+ .compatible = "rockchip,rk3528-dwcmshc", -+ .data = &sdhci_dwcmshc_rk3528_pdata, -+ }, -+ { - .compatible = "snps,dwcmshc-sdhci", - .data = &sdhci_dwcmshc_pdata, - }, -@@ -523,17 +545,18 @@ static int dwcmshc_probe(struct platform - host->mmc_host_ops.request = dwcmshc_request; - host->mmc_host_ops.hs400_enhanced_strobe = dwcmshc_hs400_enhanced_strobe; - -- if (pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) { -+ if ((pltfm_data == &sdhci_dwcmshc_rk35xx_pdata) || -+ (pltfm_data == &sdhci_dwcmshc_rk3528_pdata)) { - rk_priv = devm_kzalloc(&pdev->dev, sizeof(struct rk35xx_priv), GFP_KERNEL); - if (!rk_priv) { - err = -ENOMEM; - goto err_clk; - } - -- if (of_device_is_compatible(pdev->dev.of_node, "rockchip,rk3588-dwcmshc")) -- rk_priv->devtype = DWCMSHC_RK3588; -- else -+ if (of_device_is_compatible(pdev->dev.of_node, "rockchip,rk3568-dwcmshc")) - rk_priv->devtype = DWCMSHC_RK3568; -+ else -+ rk_priv->devtype = DWCMSHC_RK3588; - - priv->priv = rk_priv; - --- a/drivers/pci/controller/dwc/Makefile +++ b/drivers/pci/controller/dwc/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_PCIE_QCOM_EP) += pcie-qcom- diff --git a/mieru/cmd/mieru/mieru.go b/mieru/cmd/mieru/mieru.go index d71e4ac02c..901ba7812e 100644 --- a/mieru/cmd/mieru/mieru.go +++ b/mieru/cmd/mieru/mieru.go @@ -25,6 +25,7 @@ import ( ) func main() { + appctl.RecordAppStartTime() appctl.SetAppType(appctl.CLIENT_APP) debug.SetGCPercent(90) cli.RegisterClientCommands() diff --git a/mieru/cmd/mita/mita.go b/mieru/cmd/mita/mita.go index 7d59424433..17e643c886 100644 --- a/mieru/cmd/mita/mita.go +++ b/mieru/cmd/mita/mita.go @@ -25,6 +25,7 @@ import ( ) func main() { + appctl.RecordAppStartTime() appctl.SetAppType(appctl.SERVER_APP) debug.SetGCPercent(90) cli.RegisterServerCommands() diff --git a/mieru/pkg/appctl/apptime.go b/mieru/pkg/appctl/apptime.go new file mode 100644 index 0000000000..4a693daeb8 --- /dev/null +++ b/mieru/pkg/appctl/apptime.go @@ -0,0 +1,43 @@ +// Copyright (C) 2025 mieru authors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package appctl + +import ( + "sync" + "time" +) + +var ( + appStartTime time.Time + appStartTimeOnce sync.Once +) + +// RecordAppStartTime record the app start time. +// This function does nothing after the first use. +func RecordAppStartTime() { + appStartTimeOnce.Do(func() { + appStartTime = time.Now() + }) +} + +// Elapsed returns the how long the app has been started. +// It panics if the start time is not recorded. +func Elapsed() time.Duration { + if appStartTime.IsZero() { + panic("app start time is not recorded") + } + return time.Since(appStartTime).Truncate(time.Microsecond) +} diff --git a/mieru/pkg/cli/client.go b/mieru/pkg/cli/client.go index f4ead13eaf..b0cf286149 100644 --- a/mieru/pkg/cli/client.go +++ b/mieru/pkg/cli/client.go @@ -682,6 +682,7 @@ var clientRunFunc = func(s []string) error { metrics.EnableLogging() appctl.SetAppStatus(appctlpb.AppStatus_RUNNING) + log.Debugf("Started proxy after %v", appctl.Elapsed()) wg.Wait() // Stop CPU profiling, if previously started. diff --git a/mieru/pkg/cli/server.go b/mieru/pkg/cli/server.go index 0700f7bf39..c43f57b4e4 100644 --- a/mieru/pkg/cli/server.go +++ b/mieru/pkg/cli/server.go @@ -474,8 +474,10 @@ var serverRunFunc = func(s []string) error { initProxyTasks.Wait() metrics.EnableLogging() appctl.SetAppStatus(appctlpb.AppStatus_RUNNING) + log.Debugf("Started proxy after %v", appctl.Elapsed()) proxyTasks.Wait() } + // If fails to validate server configuration, do nothing. // Most likely the server configuration is empty. // It will be set by new RPC calls. diff --git a/openwrt-passwall/.github/workflows/Auto compile with openwrt sdk.yml b/openwrt-passwall/.github/workflows/Auto compile with openwrt sdk.yml index 583f5d5620..c80e3bbfc0 100644 --- a/openwrt-passwall/.github/workflows/Auto compile with openwrt sdk.yml +++ b/openwrt-passwall/.github/workflows/Auto compile with openwrt sdk.yml @@ -293,7 +293,6 @@ jobs: echo "CONFIG_PACKAGE_luci-app-passwall=m" >> .config echo "CONFIG_PACKAGE_luci-app-passwall_Iptables_Transparent_Proxy=y" >> .config echo "CONFIG_PACKAGE_luci-app-passwall_Nftables_Transparent_Proxy=y" >> .config - echo "CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Geoview=y" >> .config echo "CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Haproxy=y" >> .config echo "CONFIG_PACKAGE_luci-app-passwall_INCLUDE_Hysteria=y" >> .config echo "CONFIG_PACKAGE_luci-app-passwall_INCLUDE_NaiveProxy=y" >> .config diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua index 483953529b..592823e3d3 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua @@ -45,7 +45,34 @@ o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/chi o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/apple-cn.txt", translate("Loyalsoldier/apple-cn")) o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/google-cn.txt", translate("Loyalsoldier/google-cn")) -s:append(Template(appname .. "/rule/rule_version")) +if has_xray or has_singbox then + o = s:option(ListValue, "geoip_url", translate("GeoIP Update URL")) + o:value("https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest", translate("Loyalsoldier/geoip")) + o:value("https://api.github.com/repos/MetaCubeX/meta-rules-dat/releases/latest", translate("MetaCubeX/geoip")) + o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" + + o = s:option(ListValue, "geosite_url", translate("Geosite Update URL")) + o:value("https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest", translate("Loyalsoldier/geosite")) + o:value("https://api.github.com/repos/MetaCubeX/meta-rules-dat/releases/latest", translate("MetaCubeX/geosite")) + o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" + + o = s:option(Value, "v2ray_location_asset", translate("Location of Geo rule files"), translate("This variable specifies a directory where geoip.dat and geosite.dat files are.")) + o.default = "/usr/share/v2ray/" + o.placeholder = "/usr/share/v2ray/" + o.rmempty = false + + if api.is_finded("geoview") then + o = s:option(Flag, "enable_geoview", translate("Enable Geo Data Parsing")) + o.default = 0 + o.rmempty = false + o.description = "
    " + .. "
  • " .. translate("Experimental feature.") .. "
  • " + .. "
  • " .. "1." .. translate("Analyzes and preloads GeoIP/Geosite data to enhance the shunt performance of Sing-box/Xray.") .. "
  • " + .. "
  • " .. "2." .. translate("Once enabled, the rule list can support GeoIP/Geosite rules.") .. "
  • " + .. "
  • " .. translate("Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.") .. "
  • " + .. "
" + end +end ---- Auto Update o = s:option(Flag, "auto_update", translate("Enable auto update rules")) @@ -88,23 +115,9 @@ o.default = 2 o:depends("week_update", "8") o.rmempty = true +s:append(Template(appname .. "/rule/rule_version")) + if has_xray or has_singbox then - o = s:option(Value, "v2ray_location_asset", translate("Location of V2ray/Xray asset"), translate("This variable specifies a directory where geoip.dat and geosite.dat files are.")) - o.default = "/usr/share/v2ray/" - o.rmempty = false - - if api.is_finded("geoview") then - o = s:option(Flag, "enable_geoview", translate("Enable Geo Data Parsing")) - o.default = 0 - o.rmempty = false - o.description = "
    " - .. "
  • " .. translate("Experimental feature.") .. "
  • " - .. "
  • " .. "1." .. translate("Analyzes and preloads GeoIP/Geosite data to enhance the shunt performance of Sing-box/Xray.") .. "
  • " - .. "
  • " .. "2." .. translate("Once enabled, the rule list can support GeoIP/Geosite rules.") .. "
  • " - .. "
  • " .. translate("Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.") .. "
  • " - .. "
" - end - s = m:section(TypedSection, "shunt_rules", "Sing-Box/Xray " .. translate("Shunt Rule"), "" .. translate("Please note attention to the priority, the higher the order, the higher the priority.") .. "") s.template = "cbi/tblsection" s.anonymous = false diff --git a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po index a831b1842c..929cd133b8 100644 --- a/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po +++ b/openwrt-passwall/luci-app-passwall/po/zh-cn/passwall.po @@ -937,8 +937,14 @@ msgstr "小时" msgid "Hour" msgstr "小时" -msgid "Location of V2ray/Xray asset" -msgstr "V2ray/Xray 资源文件目录" +msgid "GeoIP Update URL" +msgstr "GeoIP 更新URL" + +msgid "Geosite Update URL" +msgstr "Geosite 更新URL" + +msgid "Location of Geo rule files" +msgstr "Geo 规则文件目录" msgid "This variable specifies a directory where geoip.dat and geosite.dat files are." msgstr "此变量指定 geoip.dat 和 geosite.dat 文件所在的目录。" diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/0_default_config b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/0_default_config index a99cf333b6..d665ed8edc 100644 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/0_default_config +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/0_default_config @@ -72,6 +72,8 @@ config global_rules list chnlist_url 'https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf' list chnlist_url 'https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf' option v2ray_location_asset '/usr/share/v2ray/' + option geoip_url 'https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest' + option geosite_url 'https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest' config global_app option singbox_file '/usr/bin/sing-box' diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh index 189754cd06..d125bedc3b 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh @@ -350,8 +350,7 @@ parse_doh() { get_geoip() { local geoip_code="$1" local geoip_type_flag="" - local geoip_path="$(config_t_get global_rules v2ray_location_asset)" - geoip_path="${geoip_path%*/}/geoip.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" [ -s "$geoip_path" ] || { echo ""; return 1; } case "$2" in "ipv4") geoip_type_flag="-ipv6=false" ;; @@ -777,9 +776,8 @@ run_redir() { sing-box) local protocol=$(config_n_get $node protocol) [ "$protocol" = "_shunt" ] && { - local geo_path="$(config_t_get global_rules v2ray_location_asset)" - local geoip_path="${geo_path%*/}/geoip.dat" - local geosite_path="${geo_path%*/}/geosite.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,UDP Sing-Box分流节点无法正常使用!" fi @@ -789,9 +787,8 @@ run_redir() { xray) local protocol=$(config_n_get $node protocol) [ "$protocol" = "_shunt" ] && { - local geo_path="$(config_t_get global_rules v2ray_location_asset)" - local geoip_path="${geo_path%*/}/geoip.dat" - local geosite_path="${geo_path%*/}/geosite.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,UDP Xray分流节点无法正常使用!" fi @@ -896,9 +893,8 @@ run_redir() { } [ "$protocol" = "_shunt" ] && { - local geo_path="$(config_t_get global_rules v2ray_location_asset)" - local geoip_path="${geo_path%*/}/geoip.dat" - local geosite_path="${geo_path%*/}/geosite.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,TCP Sing-Box分流节点无法正常使用!" fi @@ -983,9 +979,8 @@ run_redir() { } [ "$protocol" = "_shunt" ] && { - local geo_path="$(config_t_get global_rules v2ray_location_asset)" - local geoip_path="${geo_path%*/}/geoip.dat" - local geosite_path="${geo_path%*/}/geosite.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,TCP Xray分流节点无法正常使用!" fi diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua index b7b06396f4..3542fc354a 100644 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua @@ -88,7 +88,7 @@ local function insert_array_after(array1, array2, target) --将array2插入到ar end local function get_geosite(list_arg, out_path) - local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") + local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat" if not is_file_nonzero(geosite_path) then return 1 end if api.is_finded("geoview") and list_arg and out_path then diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua index 3e71c5b273..97591ea8f4 100644 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua @@ -92,7 +92,7 @@ local function insert_array_after(array1, array2, target) --将array2插入到ar end local function get_geosite(list_arg, out_path) - local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") + local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat" if not is_file_nonzero(geosite_path) then return 1 end if api.is_finded("geoview") and list_arg and out_path then diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua index 6f077cbee0..b1aee97515 100755 --- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua +++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/rule_update.lua @@ -33,8 +33,8 @@ local gfwlist_url = uci:get(name, "@global_rules[0]", "gfwlist_url") or {"https: local chnroute_url = uci:get(name, "@global_rules[0]", "chnroute_url") or {"https://ispip.clang.cn/all_cn.txt"} local chnroute6_url = uci:get(name, "@global_rules[0]", "chnroute6_url") or {"https://ispip.clang.cn/all_cn_ipv6.txt"} local chnlist_url = uci:get(name, "@global_rules[0]", "chnlist_url") or {"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf","https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf","https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/google.china.conf"} -local geoip_api = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" -local geosite_api = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" +local geoip_api = uci:get(name, "@global_rules[0]", "geoip_url") or "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" +local geosite_api = uci:get(name, "@global_rules[0]", "geosite_url") or "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" local asset_location = uci:get(name, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" local use_nft = uci:get(name, "@global_forwarding[0]", "use_nft") or "0" diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index 4d64366e03..2848e90c5a 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -1471,9 +1471,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2412,18 +2412,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", diff --git a/small/luci-app-nikki/Makefile b/small/luci-app-nikki/Makefile index 7d0e8c107e..4e1663bda4 100644 --- a/small/luci-app-nikki/Makefile +++ b/small/luci-app-nikki/Makefile @@ -1,6 +1,6 @@ include $(TOPDIR)/rules.mk -PKG_VERSION:=1.20.0 +PKG_VERSION:=1.20.1 LUCI_TITLE:=LuCI Support for nikki LUCI_DEPENDS:=+luci-base +nikki diff --git a/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js b/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js index 3ce7104841..dc1fd7ca12 100644 --- a/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js +++ b/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js @@ -114,7 +114,7 @@ return baseclass.extend({ openDashboard: async function () { const uiName = uci.get('nikki', 'mixin', 'ui_name'); const apiListen = uci.get('nikki', 'mixin', 'api_listen'); - const apiSecret = encodeURIComponent(uci.get('nikki', 'mixin', 'api_secret') ?? ''); + const apiSecret = uci.get('nikki', 'mixin', 'api_secret') ?? ''; const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1); const params = { host: window.location.hostname, diff --git a/small/luci-app-passwall/Makefile b/small/luci-app-passwall/Makefile index aca3e70dff..f912cac514 100644 --- a/small/luci-app-passwall/Makefile +++ b/small/luci-app-passwall/Makefile @@ -12,7 +12,6 @@ PKG_RELEASE:=1 PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \ CONFIG_PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Geoview \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \ @@ -36,7 +35,7 @@ LUCI_PKGARCH:=all LUCI_DEPENDS:=+coreutils +coreutils-base64 +coreutils-nohup +curl \ +chinadns-ng +dns2socks +dnsmasq-full +ip-full \ +libuci-lua +lua +luci-compat +luci-lib-jsonc \ - +microsocks +resolveip +tcping + +microsocks +resolveip +tcping +geoview define Package/$(PKG_NAME)/config menu "Configuration" @@ -64,11 +63,6 @@ config PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy select PACKAGE_kmod-nft-nat default y if PACKAGE_firewall4 -config PACKAGE_$(PKG_NAME)_INCLUDE_Geoview - bool "Include Geoview" - select PACKAGE_geoview - default y if aarch64||arm||i386||x86_64 - config PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy bool "Include Haproxy" select PACKAGE_haproxy diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua index ff462fcdf0..87501e9cac 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua @@ -242,42 +242,6 @@ if has_singbox then o.default = 0 o.rmempty = false o.description = translate("Override the connection destination address with the sniffed domain.
When enabled, traffic will match only by domain, ignoring IP rules.
If using shunt nodes, configure the domain shunt rules correctly.") - - o = s:option(Value, "geoip_path", translate("Custom geoip Path")) - o.default = "/usr/share/singbox/geoip.db" - o.rmempty = false - - o = s:option(Value, "geoip_url", translate("Custom geoip URL")) - o.default = "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.db" - o:value("https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.db") - o:value("https://github.com/1715173329/sing-geoip/releases/latest/download/geoip.db") - o:value("https://github.com/lyc8503/sing-box-rules/releases/latest/download/geoip.db") - o.rmempty = false - - o = s:option(Value, "geosite_path", translate("Custom geosite Path")) - o.default = "/usr/share/singbox/geosite.db" - o.rmempty = false - - o = s:option(Value, "geosite_url", translate("Custom geosite URL")) - o.default = "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.db" - o:value("https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.db") - o:value("https://github.com/1715173329/sing-geosite/releases/latest/download/geosite.db") - o:value("https://github.com/lyc8503/sing-box-rules/releases/latest/download/geosite.db") - o.rmempty = false - - o = s:option(Button, "_remove_resource", translate("Remove resource files")) - o.description = translate("Sing-Box will automatically download resource files when starting, you can use this feature achieve upgrade resource files.") - o.inputstyle = "remove" - function o.write(self, section, value) - local geoip_path = s.fields["geoip_path"] and s.fields["geoip_path"]:formvalue(section) or nil - if geoip_path then - os.remove(geoip_path) - end - local geosite_path = s.fields["geosite_path"] and s.fields["geosite_path"]:formvalue(section) or nil - if geosite_path then - os.remove(geosite_path) - end - end end return m diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua index 483953529b..592823e3d3 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua @@ -45,7 +45,34 @@ o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/chi o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/apple-cn.txt", translate("Loyalsoldier/apple-cn")) o:value("https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/google-cn.txt", translate("Loyalsoldier/google-cn")) -s:append(Template(appname .. "/rule/rule_version")) +if has_xray or has_singbox then + o = s:option(ListValue, "geoip_url", translate("GeoIP Update URL")) + o:value("https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest", translate("Loyalsoldier/geoip")) + o:value("https://api.github.com/repos/MetaCubeX/meta-rules-dat/releases/latest", translate("MetaCubeX/geoip")) + o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" + + o = s:option(ListValue, "geosite_url", translate("Geosite Update URL")) + o:value("https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest", translate("Loyalsoldier/geosite")) + o:value("https://api.github.com/repos/MetaCubeX/meta-rules-dat/releases/latest", translate("MetaCubeX/geosite")) + o.default = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" + + o = s:option(Value, "v2ray_location_asset", translate("Location of Geo rule files"), translate("This variable specifies a directory where geoip.dat and geosite.dat files are.")) + o.default = "/usr/share/v2ray/" + o.placeholder = "/usr/share/v2ray/" + o.rmempty = false + + if api.is_finded("geoview") then + o = s:option(Flag, "enable_geoview", translate("Enable Geo Data Parsing")) + o.default = 0 + o.rmempty = false + o.description = "
    " + .. "
  • " .. translate("Experimental feature.") .. "
  • " + .. "
  • " .. "1." .. translate("Analyzes and preloads GeoIP/Geosite data to enhance the shunt performance of Sing-box/Xray.") .. "
  • " + .. "
  • " .. "2." .. translate("Once enabled, the rule list can support GeoIP/Geosite rules.") .. "
  • " + .. "
  • " .. translate("Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.") .. "
  • " + .. "
" + end +end ---- Auto Update o = s:option(Flag, "auto_update", translate("Enable auto update rules")) @@ -88,23 +115,9 @@ o.default = 2 o:depends("week_update", "8") o.rmempty = true +s:append(Template(appname .. "/rule/rule_version")) + if has_xray or has_singbox then - o = s:option(Value, "v2ray_location_asset", translate("Location of V2ray/Xray asset"), translate("This variable specifies a directory where geoip.dat and geosite.dat files are.")) - o.default = "/usr/share/v2ray/" - o.rmempty = false - - if api.is_finded("geoview") then - o = s:option(Flag, "enable_geoview", translate("Enable Geo Data Parsing")) - o.default = 0 - o.rmempty = false - o.description = "
    " - .. "
  • " .. translate("Experimental feature.") .. "
  • " - .. "
  • " .. "1." .. translate("Analyzes and preloads GeoIP/Geosite data to enhance the shunt performance of Sing-box/Xray.") .. "
  • " - .. "
  • " .. "2." .. translate("Once enabled, the rule list can support GeoIP/Geosite rules.") .. "
  • " - .. "
  • " .. translate("Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.") .. "
  • " - .. "
" - end - s = m:section(TypedSection, "shunt_rules", "Sing-Box/Xray " .. translate("Shunt Rule"), "" .. translate("Please note attention to the priority, the higher the order, the higher the priority.") .. "") s.template = "cbi/tblsection" s.anonymous = false diff --git a/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua index bd3a2688c6..c4a26a7617 100644 --- a/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/small/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -10,6 +10,41 @@ local split = api.split local local_version = api.get_app_version("singbox") local version_ge_1_11_0 = api.compare_versions(local_version:match("[^v]+"), ">=", "1.11.0") +local geosite_all_tag = {} +local geoip_all_tag = {} +local srss_path = "/tmp/etc/" .. appname .."/srss/" + +local function convert_geofile() + local geo_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" + local geosite_path = geo_path:match("^(.*)/") .. "/geosite.dat" + local geoip_path = geo_path:match("^(.*)/") .. "/geoip.dat" + if not api.is_finded("geoview") then + api.log("* 注意:缺少 geoview 组件,Sing-Box 分流将无法启用!") + return + end + if not fs.access(srss_path) then + fs.mkdir(srss_path) + end + if next(geosite_all_tag) and fs.access(geosite_path) then + for k,v in pairs(geosite_all_tag) do + local srs_file = srss_path .. "geosite-" .. k ..".srs" + if not fs.access(srs_file) then + sys.exec("geoview -type geosite -action convert -input " .. geosite_path .. " -list '" .. k .. "' -output " .. srs_file .. " -lowmem=true") + --api.log("* 转换geosite:" .. k .. " 到 Sing-Box 规则集二进制文件") + end + end + end + if next(geoip_all_tag) and fs.access(geoip_path) then + for k,v in pairs(geoip_all_tag) do + local srs_file = srss_path .. "geoip-" .. k ..".srs" + if not fs.access(srs_file) then + sys.exec("geoview -type geoip -action convert -input " .. geoip_path .. " -list '" .. k .. "' -output " .. srs_file .. " -lowmem=true") + --api.log("* 转换geoip:" .. k .. " 到 Sing-Box 规则集二进制文件") + end + end + end +end + local new_port local function get_new_port() @@ -802,17 +837,7 @@ function gen_config(var) local singbox_settings = uci:get_all(appname, "@global_singbox[0]") or {} local route = { - rules = {}, - geoip = { - path = singbox_settings.geoip_path or "/usr/share/singbox/geoip.db", - download_url = singbox_settings.geoip_url or nil, - download_detour = nil, - }, - geosite = { - path = singbox_settings.geosite_path or "/usr/share/singbox/geosite.db", - download_url = singbox_settings.geosite_url or nil, - download_detour = nil, - }, + rules = {} } local experimental = nil @@ -1183,17 +1208,21 @@ function gen_config(var) end if e.source then - local source_geoip = {} local source_ip_cidr = {} + local is_private = false string.gsub(e.source, '[^' .. " " .. ']+', function(w) if w:find("geoip") == 1 then - table.insert(source_geoip, w) + local _geoip = w:sub(1 + #"geoip:") --适配srs + if _geoip == "private" then + is_private = true + end else table.insert(source_ip_cidr, w) end end) - rule.source_geoip = #source_geoip > 0 and source_geoip or nil + rule.source_ip_is_private = is_private and true or nil rule.source_ip_cidr = #source_ip_cidr > 0 and source_ip_cidr or nil + if is_private or #source_ip_cidr > 0 then rule.rule_set_ip_cidr_match_source = true end end if e.sourcePort then @@ -1224,6 +1253,8 @@ function gen_config(var) rule.port_range = #port_range > 0 and port_range or nil end + local rule_set_tag = {} + if e.domain_list then local domain_table = { outboundTag = outboundTag, @@ -1231,12 +1262,15 @@ function gen_config(var) domain_suffix = {}, domain_keyword = {}, domain_regex = {}, - geosite = {}, + rule_set = {}, } string.gsub(e.domain_list, '[^' .. "\r\n" .. ']+', function(w) if w:find("#") == 1 then return end if w:find("geosite:") == 1 then - table.insert(domain_table.geosite, w:sub(1 + #"geosite:")) + local _geosite = w:sub(1 + #"geosite:") --适配srs + geosite_all_tag[_geosite] = true + table.insert(rule_set_tag, "geosite-" .. _geosite) + table.insert(domain_table.rule_set, "geosite-" .. _geosite) elseif w:find("regexp:") == 1 then table.insert(domain_table.domain_regex, w:sub(1 + #"regexp:")) elseif w:find("full:") == 1 then @@ -1251,7 +1285,6 @@ function gen_config(var) rule.domain_suffix = #domain_table.domain_suffix > 0 and domain_table.domain_suffix or nil rule.domain_keyword = #domain_table.domain_keyword > 0 and domain_table.domain_keyword or nil rule.domain_regex = #domain_table.domain_regex > 0 and domain_table.domain_regex or nil - rule.geosite = #domain_table.geosite > 0 and domain_table.geosite or nil if outboundTag then table.insert(dns_domain_rules, api.clone(domain_table)) @@ -1260,20 +1293,28 @@ function gen_config(var) if e.ip_list then local ip_cidr = {} - local geoip = {} + local is_private = false string.gsub(e.ip_list, '[^' .. "\r\n" .. ']+', function(w) if w:find("#") == 1 then return end if w:find("geoip:") == 1 then - table.insert(geoip, w:sub(1 + #"geoip:")) + local _geoip = w:sub(1 + #"geoip:") --适配srs + if _geoip == "private" then + is_private = true + else + geoip_all_tag[_geoip] = true + table.insert(rule_set_tag, "geoip-" .. _geoip) + end else table.insert(ip_cidr, w) end end) + rule.ip_is_private = is_private and true or nil rule.ip_cidr = #ip_cidr > 0 and ip_cidr or nil - rule.geoip = #geoip > 0 and geoip or nil end + rule.rule_set = #rule_set_tag > 0 and rule_set_tag or nil --适配srs + table.insert(rules, rule) end end) @@ -1281,6 +1322,34 @@ function gen_config(var) for index, value in ipairs(rules) do table.insert(route.rules, rules[index]) end + + local rule_set = {} --适配srs + if next(geosite_all_tag) then + for k,v in pairs(geosite_all_tag) do + local srs_file = srss_path .. "geosite-" .. k ..".srs" + local _rule_set = { + tag = "geosite-" .. k, + type = "local", + format = "binary", + path = srs_file + } + table.insert(rule_set, _rule_set) + end + end + if next(geoip_all_tag) then + for k,v in pairs(geoip_all_tag) do + local srs_file = srss_path .. "geoip-" .. k ..".srs" + local _rule_set = { + tag = "geoip-" .. k, + type = "local", + format = "binary", + path = srs_file + } + table.insert(rule_set, _rule_set) + end + end + route.rule_set = #rule_set >0 and rule_set or nil + elseif node.protocol == "_urltest" then if node.urltest_node then COMMON.default_outbound_tag = gen_urltest(node) @@ -1470,14 +1539,14 @@ function gen_config(var) --按分流顺序DNS if dns_domain_rules and #dns_domain_rules > 0 then for index, value in ipairs(dns_domain_rules) do - if value.outboundTag and (value.domain or value.domain_suffix or value.domain_keyword or value.domain_regex or value.geosite) then + if value.outboundTag and (value.domain or value.domain_suffix or value.domain_keyword or value.domain_regex or value.rule_set) then local dns_rule = { server = value.outboundTag, domain = (value.domain and #value.domain > 0) and value.domain or nil, domain_suffix = (value.domain_suffix and #value.domain_suffix > 0) and value.domain_suffix or nil, domain_keyword = (value.domain_keyword and #value.domain_keyword > 0) and value.domain_keyword or nil, domain_regex = (value.domain_regex and #value.domain_regex > 0) and value.domain_regex or nil, - geosite = (value.geosite and #value.geosite > 0) and value.geosite or nil, + rule_set = (value.rule_set and #value.rule_set > 0) and value.rule_set or nil, --适配srs disable_cache = false, } if value.outboundTag ~= "block" and value.outboundTag ~= "direct" then @@ -1737,5 +1806,8 @@ if arg[1] then local func =_G[arg[1]] if func then print(func(api.get_function_args(arg))) + if next(geosite_all_tag) or next(geoip_all_tag) then + convert_geofile() + end end end diff --git a/small/luci-app-passwall/po/zh-cn/passwall.po b/small/luci-app-passwall/po/zh-cn/passwall.po index 4c93e477c0..929cd133b8 100644 --- a/small/luci-app-passwall/po/zh-cn/passwall.po +++ b/small/luci-app-passwall/po/zh-cn/passwall.po @@ -937,8 +937,14 @@ msgstr "小时" msgid "Hour" msgstr "小时" -msgid "Location of V2ray/Xray asset" -msgstr "V2ray/Xray 资源文件目录" +msgid "GeoIP Update URL" +msgstr "GeoIP 更新URL" + +msgid "Geosite Update URL" +msgstr "Geosite 更新URL" + +msgid "Location of Geo rule files" +msgstr "Geo 规则文件目录" msgid "This variable specifies a directory where geoip.dat and geosite.dat files are." msgstr "此变量指定 geoip.dat 和 geosite.dat 文件所在的目录。" @@ -1633,24 +1639,6 @@ msgstr "端口跳跃额外端口" msgid "HeartbeatPeriod(second)" msgstr "心跳周期(单位:秒)" -msgid "Custom geoip Path" -msgstr "自定义 geoip 文件路径" - -msgid "Custom geoip URL" -msgstr "自定义 geoip 文件更新链接" - -msgid "Custom geosite Path" -msgstr "自定义 geosite 文件路径" - -msgid "Custom geosite URL" -msgstr "自定义 geosite 文件更新链接" - -msgid "Remove resource files" -msgstr "删除资源文件" - -msgid "Sing-Box will automatically download resource files when starting, you can use this feature achieve upgrade resource files." -msgstr "Sing-Box 会在启动时自动下载资源文件,您可以使用此功能实现升级资源文件。" - msgid "Override the connection destination address" msgstr "覆盖连接目标地址" diff --git a/small/luci-app-passwall/root/usr/share/passwall/0_default_config b/small/luci-app-passwall/root/usr/share/passwall/0_default_config index 2d4242e232..d665ed8edc 100644 --- a/small/luci-app-passwall/root/usr/share/passwall/0_default_config +++ b/small/luci-app-passwall/root/usr/share/passwall/0_default_config @@ -51,10 +51,6 @@ config global_xray config global_singbox option sniff_override_destination '0' - option geoip_path '/usr/share/singbox/geoip.db' - option geoip_url 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.db' - option geosite_path '/usr/share/singbox/geosite.db' - option geosite_url 'https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.db' config global_other option auto_detection_time 'tcping' @@ -76,6 +72,8 @@ config global_rules list chnlist_url 'https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf' list chnlist_url 'https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf' option v2ray_location_asset '/usr/share/v2ray/' + option geoip_url 'https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest' + option geosite_url 'https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest' config global_app option singbox_file '/usr/bin/sing-box' diff --git a/small/luci-app-passwall/root/usr/share/passwall/app.sh b/small/luci-app-passwall/root/usr/share/passwall/app.sh index 39d35af288..d125bedc3b 100755 --- a/small/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/small/luci-app-passwall/root/usr/share/passwall/app.sh @@ -350,8 +350,7 @@ parse_doh() { get_geoip() { local geoip_code="$1" local geoip_type_flag="" - local geoip_path="$(config_t_get global_rules v2ray_location_asset)" - geoip_path="${geoip_path%*/}/geoip.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" [ -s "$geoip_path" ] || { echo ""; return 1; } case "$2" in "ipv4") geoip_type_flag="-ipv6=false" ;; @@ -777,8 +776,8 @@ run_redir() { sing-box) local protocol=$(config_n_get $node protocol) [ "$protocol" = "_shunt" ] && { - local geoip_path="$(config_t_get global_singbox geoip_path)" - local geosite_path="$(config_t_get global_singbox geosite_path)" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,UDP Sing-Box分流节点无法正常使用!" fi @@ -788,9 +787,8 @@ run_redir() { xray) local protocol=$(config_n_get $node protocol) [ "$protocol" = "_shunt" ] && { - local geo_path="$(config_t_get global_rules v2ray_location_asset)" - local geoip_path="${geo_path%*/}/geoip.dat" - local geosite_path="${geo_path%*/}/geosite.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,UDP Xray分流节点无法正常使用!" fi @@ -895,8 +893,8 @@ run_redir() { } [ "$protocol" = "_shunt" ] && { - local geoip_path="$(config_t_get global_singbox geoip_path)" - local geosite_path="$(config_t_get global_singbox geosite_path)" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,TCP Sing-Box分流节点无法正常使用!" fi @@ -981,9 +979,8 @@ run_redir() { } [ "$protocol" = "_shunt" ] && { - local geo_path="$(config_t_get global_rules v2ray_location_asset)" - local geoip_path="${geo_path%*/}/geoip.dat" - local geosite_path="${geo_path%*/}/geosite.dat" + local geoip_path="${V2RAY_LOCATION_ASSET%*/}/geoip.dat" + local geosite_path="${V2RAY_LOCATION_ASSET%*/}/geosite.dat" if [ ! -s "$geoip_path" ] || [ ! -s "$geosite_path" ]; then echolog "* 缺少Geo规则文件,TCP Xray分流节点无法正常使用!" fi diff --git a/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua b/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua index b7b06396f4..3542fc354a 100644 --- a/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua +++ b/small/luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua @@ -88,7 +88,7 @@ local function insert_array_after(array1, array2, target) --将array2插入到ar end local function get_geosite(list_arg, out_path) - local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") + local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat" if not is_file_nonzero(geosite_path) then return 1 end if api.is_finded("geoview") and list_arg and out_path then diff --git a/small/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua b/small/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua index 3e71c5b273..97591ea8f4 100644 --- a/small/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua +++ b/small/luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua @@ -92,7 +92,7 @@ local function insert_array_after(array1, array2, target) --将array2插入到ar end local function get_geosite(list_arg, out_path) - local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") + local geosite_path = uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat" if not is_file_nonzero(geosite_path) then return 1 end if api.is_finded("geoview") and list_arg and out_path then diff --git a/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua b/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua index 6f077cbee0..b1aee97515 100755 --- a/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua +++ b/small/luci-app-passwall/root/usr/share/passwall/rule_update.lua @@ -33,8 +33,8 @@ local gfwlist_url = uci:get(name, "@global_rules[0]", "gfwlist_url") or {"https: local chnroute_url = uci:get(name, "@global_rules[0]", "chnroute_url") or {"https://ispip.clang.cn/all_cn.txt"} local chnroute6_url = uci:get(name, "@global_rules[0]", "chnroute6_url") or {"https://ispip.clang.cn/all_cn_ipv6.txt"} local chnlist_url = uci:get(name, "@global_rules[0]", "chnlist_url") or {"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf","https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf","https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/google.china.conf"} -local geoip_api = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" -local geosite_api = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" +local geoip_api = uci:get(name, "@global_rules[0]", "geoip_url") or "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" +local geosite_api = uci:get(name, "@global_rules[0]", "geosite_url") or "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest" local asset_location = uci:get(name, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/" local use_nft = uci:get(name, "@global_forwarding[0]", "use_nft") or "0" diff --git a/v2rayn/v2rayN/AmazTool/Program.cs b/v2rayn/v2rayN/AmazTool/Program.cs index 389fb6275c..07f151cf79 100644 --- a/v2rayn/v2rayN/AmazTool/Program.cs +++ b/v2rayn/v2rayN/AmazTool/Program.cs @@ -7,33 +7,20 @@ namespace AmazTool { if (args.Length == 0) { - Utils.WriteLine(Resx.Resource.Guidelines); - Utils.Waiting(5); + Console.WriteLine(Resx.Resource.Guidelines); + Thread.Sleep(5000); return; } var argData = Uri.UnescapeDataString(string.Join(" ", args)); if (argData.Equals("rebootas")) { - Utils.Waiting(1); + Thread.Sleep(1000); Utils.StartV2RayN(); return; } - - var tryTimes = 0; - UpgradeApp.Init(); - while (tryTimes++ < 3) - { - if (!UpgradeApp.Upgrade(argData)) - { - continue; - } - Utils.WriteLine(Resx.Resource.Restartv2rayN); - Utils.Waiting(3); - Utils.StartV2RayN(); - break; - } + UpgradeApp.Upgrade(argData); } } } diff --git a/v2rayn/v2rayN/AmazTool/UpgradeApp.cs b/v2rayn/v2rayN/AmazTool/UpgradeApp.cs index 38fd56312f..e1a76c3a6f 100644 --- a/v2rayn/v2rayN/AmazTool/UpgradeApp.cs +++ b/v2rayn/v2rayN/AmazTool/UpgradeApp.cs @@ -6,99 +6,19 @@ namespace AmazTool { internal class UpgradeApp { - public static bool Upgrade(string fileName) + public static void Upgrade(string fileName) { - Utils.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); - - if (!File.Exists(fileName)) - { - Utils.WriteLine(Resx.Resource.UpgradeFileNotFound); - return false; - } + Console.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); Utils.Waiting(5); - KillV2rayN(); - - Utils.WriteLine(Resx.Resource.StartUnzipping); - StringBuilder sb = new(); - try + if (!File.Exists(fileName)) { - var splitKey = "/"; - - using var archive = ZipFile.OpenRead(fileName); - foreach (var entry in archive.Entries) - { - try - { - if (entry.Length == 0) - { - continue; - } - - Utils.WriteLine(entry.FullName); - - var lst = entry.FullName.Split(splitKey); - if (lst.Length == 1) - { - continue; - } - - var fullName = string.Join(splitKey, lst[1..lst.Length]); - var entryOutputPath = Utils.GetPath(fullName); - Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!); - //In the bin folder, if the file already exists, it will be skipped - if (fullName.StartsWith("bin") && File.Exists(entryOutputPath)) - { - continue; - } - entry.ExtractToFile(entryOutputPath, true); - - Utils.WriteLine(entryOutputPath); - } - catch (Exception ex) - { - sb.Append(ex.Message); - sb.Append(ex.StackTrace); - } - } - } - catch (Exception ex) - { - sb.Append(Resx.Resource.FailedUpgrade + ex.StackTrace); + Console.WriteLine(Resx.Resource.UpgradeFileNotFound); + return; } - if (sb.Length <= 0) - { - return true; - } - - Utils.WriteLine(sb.ToString()); - Utils.WriteLine(Resx.Resource.FailedUpgrade); - return false; - } - - public static bool Init() - { - //Process temporary files generated by the last update - var files = Directory.GetFiles(Utils.GetPath(""), "*.tmp"); - foreach (var file in files) - { - if (file.Contains(Utils.AmazTool)) - { - File.Delete(file); - } - } - - var destFileName = $"{Utils.GetExePath()}{Guid.NewGuid().ToString("N")[..8]}.tmp"; - File.Move(Utils.GetExePath(), destFileName); - - return true; - } - - private static bool KillV2rayN() - { - Utils.WriteLine(Resx.Resource.TryTerminateProcess); + Console.WriteLine(Resx.Resource.TryTerminateProcess); try { var existing = Process.GetProcessesByName(Utils.V2rayN); @@ -115,10 +35,83 @@ namespace AmazTool catch (Exception ex) { // Access may be denied without admin right. The user may not be an administrator. - Utils.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); + Console.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); } - return true; + Console.WriteLine(Resx.Resource.StartUnzipping); + StringBuilder sb = new(); + try + { + var thisAppOldFile = $"{Utils.GetExePath()}.tmp"; + File.Delete(thisAppOldFile); + var splitKey = "/"; + + using var archive = ZipFile.OpenRead(fileName); + foreach (var entry in archive.Entries) + { + try + { + if (entry.Length == 0) + { + continue; + } + + Console.WriteLine(entry.FullName); + + var lst = entry.FullName.Split(splitKey); + if (lst.Length == 1) + { + continue; + } + + var fullName = string.Join(splitKey, lst[1..lst.Length]); + + if (string.Equals(Utils.GetExePath(), Utils.GetPath(fullName), StringComparison.OrdinalIgnoreCase)) + { + File.Move(Utils.GetExePath(), thisAppOldFile); + } + + var entryOutputPath = Utils.GetPath(fullName); + Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!); + //In the bin folder, if the file already exists, it will be skipped + if (fullName.StartsWith("bin") && File.Exists(entryOutputPath)) + { + continue; + } + + try + { + entry.ExtractToFile(entryOutputPath, true); + } + catch + { + Thread.Sleep(1000); + entry.ExtractToFile(entryOutputPath, true); + } + + Console.WriteLine(entryOutputPath); + } + catch (Exception ex) + { + sb.Append(ex.StackTrace); + } + } + } + catch (Exception ex) + { + Console.WriteLine(Resx.Resource.FailedUpgrade + ex.StackTrace); + //return; + } + if (sb.Length > 0) + { + Console.WriteLine(Resx.Resource.FailedUpgrade + sb.ToString()); + //return; + } + + Console.WriteLine(Resx.Resource.Restartv2rayN); + Utils.Waiting(2); + + Utils.StartV2RayN(); } } } diff --git a/v2rayn/v2rayN/AmazTool/Utils.cs b/v2rayn/v2rayN/AmazTool/Utils.cs index a447ff7922..d206f89876 100644 --- a/v2rayn/v2rayN/AmazTool/Utils.cs +++ b/v2rayn/v2rayN/AmazTool/Utils.cs @@ -14,7 +14,7 @@ namespace AmazTool return AppDomain.CurrentDomain.BaseDirectory; } - public static string GetPath(string? fileName) + public static string GetPath(string fileName) { var startupPath = StartupPath(); if (string.IsNullOrEmpty(fileName)) @@ -25,7 +25,6 @@ namespace AmazTool } public static string V2rayN => "v2rayN"; - public static string AmazTool => "AmazTool"; public static void StartV2RayN() { @@ -45,14 +44,9 @@ namespace AmazTool { for (var i = second; i > 0; i--) { - Utils.WriteLine(i); + Console.WriteLine(i); Thread.Sleep(1000); } } - - public static void WriteLine(object obj) - { - Console.WriteLine(obj); - } } } diff --git a/v2rayn/v2rayN/Directory.Build.props b/v2rayn/v2rayN/Directory.Build.props index b53a144c5d..d87fcc7fd3 100644 --- a/v2rayn/v2rayN/Directory.Build.props +++ b/v2rayn/v2rayN/Directory.Build.props @@ -1,7 +1,7 @@ - 7.10.1 + 7.10.3 diff --git a/v2rayn/v2rayN/ServiceLib/Global.cs b/v2rayn/v2rayN/ServiceLib/Global.cs index 48df5d2240..f962efe1a3 100644 --- a/v2rayn/v2rayN/ServiceLib/Global.cs +++ b/v2rayn/v2rayN/ServiceLib/Global.cs @@ -265,7 +265,8 @@ namespace ServiceLib "utp", "wechat-video", "dtls", - "wireguard" + "wireguard", + "dns" ]; public static readonly List CoreTypes = diff --git a/v2rayn/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs b/v2rayn/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs index 56896ad1f8..cb742d4c81 100644 --- a/v2rayn/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs +++ b/v2rayn/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs @@ -109,7 +109,7 @@ namespace ServiceLib.Handler task.Settings.RunOnlyIfIdle = false; task.Settings.IdleSettings.StopOnIdleEnd = false; task.Settings.ExecutionTimeLimit = TimeSpan.Zero; - task.Triggers.Add(new Microsoft.Win32.TaskScheduler.LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromSeconds(20) }); + task.Triggers.Add(new Microsoft.Win32.TaskScheduler.LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromSeconds(30) }); task.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest; task.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(fileName.AppendQuotes(), null, Path.GetDirectoryName(fileName))); diff --git a/v2rayn/v2rayN/ServiceLib/Models/V2rayConfig.cs b/v2rayn/v2rayN/ServiceLib/Models/V2rayConfig.cs index b6ecf52b4c..e3fa0fd3e8 100644 --- a/v2rayn/v2rayN/ServiceLib/Models/V2rayConfig.cs +++ b/v2rayn/v2rayN/ServiceLib/Models/V2rayConfig.cs @@ -291,6 +291,8 @@ namespace ServiceLib.Models public object request { get; set; } public object response { get; set; } + + public string? domain { get; set; } } public class KcpSettings4Ray diff --git a/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs b/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs index 46c99e97ce..f07a9c940b 100644 --- a/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs +++ b/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs @@ -915,7 +915,8 @@ namespace ServiceLib.Services.CoreConfig kcpSettings.writeBufferSize = _config.KcpItem.WriteBufferSize; kcpSettings.header = new Header4Ray { - type = node.HeaderType + type = node.HeaderType, + domain = host.IsNullOrEmpty() ? null : host }; if (Utils.IsNotEmpty(path)) { diff --git a/v2rayng/AndroidLibXrayLite/go.mod b/v2rayng/AndroidLibXrayLite/go.mod index 8065bdd18f..e8b1f7f0a9 100644 --- a/v2rayng/AndroidLibXrayLite/go.mod +++ b/v2rayng/AndroidLibXrayLite/go.mod @@ -3,7 +3,7 @@ module github.com/2dust/AndroidLibXrayLite go 1.24 require ( - github.com/xtls/xray-core v1.8.25-0.20250221075831-be43f66b63d5 + github.com/xtls/xray-core v1.8.25-0.20250303153022-e15dff94b5bd golang.org/x/mobile v0.0.0-20250218173827-cd096645fcd3 golang.org/x/sys v0.30.0 ) @@ -36,7 +36,7 @@ require ( github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463 // indirect go.uber.org/mock v0.5.0 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect - golang.org/x/crypto v0.33.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect golang.org/x/mod v0.23.0 // indirect golang.org/x/net v0.35.0 // indirect @@ -51,5 +51,5 @@ require ( google.golang.org/protobuf v1.36.5 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gvisor.dev/gvisor v0.0.0-20250215002057-313350f3e697 // indirect - lukechampine.com/blake3 v1.3.0 // indirect + lukechampine.com/blake3 v1.4.0 // indirect ) diff --git a/v2rayng/AndroidLibXrayLite/go.sum b/v2rayng/AndroidLibXrayLite/go.sum index 9684aa70bf..19e1e35605 100644 --- a/v2rayng/AndroidLibXrayLite/go.sum +++ b/v2rayng/AndroidLibXrayLite/go.sum @@ -24,8 +24,8 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/pprof v0.0.0-20250208200701-d0013a598941 h1:43XjGa6toxLpeksjcxs1jIoIyr+vUfOqY2c6HB4bpoc= github.com/google/pprof v0.0.0-20250208200701-d0013a598941/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -75,8 +75,8 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463 h1:g1Cj7d+my6k/HHxLAyxPwyX8i7FGRr6ulBDMkBzg2BM= github.com/xtls/reality v0.0.0-20240909153216-e26ae2305463/go.mod h1:BjIOLmkEEtAgloAiVUcYj0Mt+YU00JARZw8AEU0IwAg= -github.com/xtls/xray-core v1.8.25-0.20250221075831-be43f66b63d5 h1:x4pNCiwk/x/zS/dpZl8fdNzC0YP8NBIOVZOAA1in/Zo= -github.com/xtls/xray-core v1.8.25-0.20250221075831-be43f66b63d5/go.mod h1:bPLUPQGZ8ADeL1CANo0nIUNchY+SuhZCT+ItgprlPf4= +github.com/xtls/xray-core v1.8.25-0.20250303153022-e15dff94b5bd h1:xzZCYhdr1pL1kZe7GysAMuVNtlzXqsQKTFbc1xvR+bI= +github.com/xtls/xray-core v1.8.25-0.20250303153022-e15dff94b5bd/go.mod h1:0n4A2nJD1yZlxuXexV5rJODKcJJo8zpbTFcESVg8fgM= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= @@ -93,8 +93,8 @@ go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +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-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/mobile v0.0.0-20250218173827-cd096645fcd3 h1:0V/7Y1FEaFdAzb9DkVDh4QFp4vL4yYCiJ5cjk80lZyA= @@ -136,5 +136,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gvisor.dev/gvisor v0.0.0-20250215002057-313350f3e697 h1:3xb9C+AmVuRnDDAwJGJ8ZVAmcIourUD9DwHaAd5Ldyk= gvisor.dev/gvisor v0.0.0-20250215002057-313350f3e697/go.mod h1:5DMfjtclAbTIjbXqO1qCe2K5GKKxWz2JHvCChuTcJEM= -lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= -lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w= +lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0= diff --git a/v2rayng/V2rayNG/app/build.gradle.kts b/v2rayng/V2rayNG/app/build.gradle.kts index 0e88941a4a..92d5106627 100644 --- a/v2rayng/V2rayNG/app/build.gradle.kts +++ b/v2rayng/V2rayNG/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "com.v2ray.ang" minSdk = 21 targetSdk = 35 - versionCode = 634 - versionName = "1.9.37" + versionCode = 635 + versionName = "1.9.38" multiDexEnabled = true val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';') @@ -157,9 +157,8 @@ dependencies { implementation(libs.gson) // Reactive and Utility Libraries - implementation(libs.rxjava) - implementation(libs.rxandroid) - implementation(libs.rxpermissions) + implementation(libs.kotlinx.coroutines.android) + implementation(libs.kotlinx.coroutines.core) // Language and Processing Libraries implementation(libs.language.base) diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt index b94c7a103d..0de09c2fd6 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt @@ -31,10 +31,11 @@ import com.v2ray.ang.util.MessageUtil import com.v2ray.ang.util.PluginUtil import com.v2ray.ang.util.Utils import go.Seq -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.disposables.Disposable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import libv2ray.Libv2ray import libv2ray.V2RayPoint @@ -62,7 +63,7 @@ object V2RayServiceManager { private var lastQueryTime = 0L private var mBuilder: NotificationCompat.Builder? = null - private var mDisposable: Disposable? = null + private var speedNotificationJob: Job? = null private var mNotificationManager: NotificationManager? = null fun startV2Ray(context: Context) { @@ -365,8 +366,8 @@ object V2RayServiceManager { } mBuilder = null - mDisposable?.dispose() - mDisposable = null + speedNotificationJob?.cancel() + speedNotificationJob = null } private fun updateNotification(contentText: String?, proxyTraffic: Long, directTraffic: Long) { @@ -393,7 +394,7 @@ object V2RayServiceManager { } private fun startSpeedNotification() { - if (mDisposable == null && + if (speedNotificationJob == null && v2rayPoint.isRunning && MmkvManager.decodeSettingsBool(AppConfig.PREF_SPEED_ENABLED) == true ) { @@ -401,8 +402,8 @@ object V2RayServiceManager { val outboundTags = currentConfig?.getAllOutboundTags() outboundTags?.remove(TAG_DIRECT) - mDisposable = Observable.interval(3, java.util.concurrent.TimeUnit.SECONDS) - .subscribe { + speedNotificationJob = CoroutineScope(Dispatchers.IO).launch { + while (isActive) { val queryTime = System.currentTimeMillis() val sinceLastQueryInSeconds = (queryTime - lastQueryTime) / 1000.0 var proxyTotal = 0L @@ -430,7 +431,9 @@ object V2RayServiceManager { } lastZeroSpeed = zeroSpeed lastQueryTime = queryTime + delay(3000) } + } } } @@ -445,11 +448,10 @@ object V2RayServiceManager { } private fun stopSpeedNotification() { - mDisposable?.let { - it.dispose() //stop queryStats - mDisposable = null + speedNotificationJob?.let { + it.cancel() + speedNotificationJob = null updateNotification(currentConfig?.remarks, 0, 0) } } - } diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt index eacacb3558..806758afa6 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt @@ -5,15 +5,16 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.util.Log +import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.core.content.FileProvider -import com.tbruyelle.rxpermissions3.RxPermissions import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig import com.v2ray.ang.BuildConfig import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityAboutBinding -import com.v2ray.ang.extension.toast import com.v2ray.ang.util.SpeedtestUtil import com.v2ray.ang.util.Utils import com.v2ray.ang.util.ZipUtil @@ -21,11 +22,24 @@ import java.io.File import java.text.SimpleDateFormat import java.util.Locale - class AboutActivity : BaseActivity() { + private val binding by lazy { ActivityAboutBinding.inflate(layoutInflater) } private val extDir by lazy { File(Utils.backupPath(this)) } + private val requestPermissionLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> + if (isGranted) { + try { + showFileChooser() + } catch (e: Exception) { + e.printStackTrace() + } + } else { + toast(R.string.toast_permission_denied) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) @@ -33,6 +47,7 @@ class AboutActivity : BaseActivity() { title = getString(R.string.title_about) binding.tvBackupSummary.text = this.getString(R.string.summary_configuration_backup, extDir) + binding.layoutBackup.setOnClickListener { val ret = backupConfiguration(extDir.absolutePath) if (ret.first) { @@ -50,7 +65,8 @@ class AboutActivity : BaseActivity() { Intent(Intent.ACTION_SEND).setType("application/zip") .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .putExtra( - Intent.EXTRA_STREAM, FileProvider.getUriForFile( + Intent.EXTRA_STREAM, + FileProvider.getUriForFile( this, BuildConfig.APPLICATION_ID + ".cache", File(ret.second) ) ), getString(R.string.title_configuration_share) @@ -62,23 +78,22 @@ class AboutActivity : BaseActivity() { } binding.layoutRestore.setOnClickListener { - val permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - Manifest.permission.READ_MEDIA_IMAGES - } else { - Manifest.permission.READ_EXTERNAL_STORAGE - } - RxPermissions(this) - .request(permission) - .subscribe { - if (it) { - try { - showFileChooser() - } catch (e: Exception) { - e.printStackTrace() - } - } else - toast(R.string.toast_permission_denied) + val permission = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Manifest.permission.READ_MEDIA_IMAGES + } else { + Manifest.permission.READ_EXTERNAL_STORAGE } + + if (ContextCompat.checkSelfPermission(this, permission) == android.content.pm.PackageManager.PERMISSION_GRANTED) { + try { + showFileChooser() + } catch (e: Exception) { + e.printStackTrace() + } + } else { + requestPermissionLauncher.launch(permission) + } } binding.layoutSoureCcode.setOnClickListener { @@ -88,13 +103,15 @@ class AboutActivity : BaseActivity() { binding.layoutFeedback.setOnClickListener { Utils.openUri(this, AppConfig.v2rayNGIssues) } - binding.layoutOssLicenses.setOnClickListener{ + + binding.layoutOssLicenses.setOnClickListener { val webView = android.webkit.WebView(this); - webView.loadUrl("file:///android_asset/open_source_licenses.html"); + webView.loadUrl("file:///android_asset/open_source_licenses.html") android.app.AlertDialog.Builder(this) .setTitle("Open source licenses") .setView(webView) - .setPositiveButton("OK", android.content.DialogInterface.OnClickListener { dialog, whichButton -> dialog.dismiss() }).show() + .setPositiveButton("OK") { dialog, _ -> dialog.dismiss() } + .show() } binding.layoutTgChannel.setOnClickListener { @@ -157,9 +174,9 @@ class AboutActivity : BaseActivity() { } private val chooseFile = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - val uri = it.data?.data - if (it.resultCode == RESULT_OK && uri != null) { + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val uri = result.data?.data + if (result.resultCode == RESULT_OK && uri != null) { try { val targetFile = File(this.cacheDir.absolutePath, "${System.currentTimeMillis()}.zip") @@ -180,4 +197,7 @@ class AboutActivity : BaseActivity() { } } + private fun toast(messageResId: Int) { + Toast.makeText(this, getString(messageResId), Toast.LENGTH_SHORT).show() + } } \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index 53ae34ea4e..8b7b336c75 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -3,6 +3,7 @@ package com.v2ray.ang.ui import android.Manifest import android.content.ActivityNotFoundException import android.content.Intent +import android.content.pm.PackageManager import android.content.res.ColorStateList import android.net.Uri import android.net.VpnService @@ -27,7 +28,6 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.navigation.NavigationView import com.google.android.material.tabs.TabLayout -import com.tbruyelle.rxpermissions3.RxPermissions import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.VPN import com.v2ray.ang.R @@ -41,8 +41,6 @@ import com.v2ray.ang.helper.SimpleItemTouchHelperCallback import com.v2ray.ang.service.V2RayServiceManager import com.v2ray.ang.util.Utils import com.v2ray.ang.viewmodel.MainViewModel -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -81,6 +79,60 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList private var mItemTouchHelper: ItemTouchHelper? = null val mainViewModel: MainViewModel by viewModels() + // register activity result for requesting permission + private val requestPermissionLauncher = + registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted) { + when (pendingAction) { + Action.IMPORT_QR_CODE_CONFIG -> + scanQRCodeForConfig.launch(Intent(this, ScannerActivity::class.java)) + Action.IMPORT_QR_CODE_URL -> + scanQRCodeForUrlToCustomConfig.launch(Intent(this, ScannerActivity::class.java)) + Action.READ_CONTENT_FROM_URI -> + chooseFileForCustomConfig.launch(Intent.createChooser(Intent(Intent.ACTION_GET_CONTENT).apply { + type = "*/*" + addCategory(Intent.CATEGORY_OPENABLE) + }, getString(R.string.title_file_chooser))) + Action.POST_NOTIFICATIONS -> {} + else -> {} + } + } else { + toast(R.string.toast_permission_denied) + } + pendingAction = Action.NONE + } + + private var pendingAction: Action = Action.NONE + + enum class Action { + NONE, + IMPORT_QR_CODE_CONFIG, + IMPORT_QR_CODE_URL, + READ_CONTENT_FROM_URI, + POST_NOTIFICATIONS + } + + private val chooseFileForCustomConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val uri = it.data?.data + if (it.resultCode == RESULT_OK && uri != null) { + readContentFromUri(uri) + } + } + + private val scanQRCodeForConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + importBatchConfig(it.data?.getStringExtra("SCAN_RESULT")) + } + } + + private val scanQRCodeForUrlToCustomConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + importConfigCustomUrl(it.data?.getStringExtra("SCAN_RESULT")) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) @@ -129,12 +181,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList migrateLegacy() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - RxPermissions(this) - .request(Manifest.permission.POST_NOTIFICATIONS) - .subscribe { - if (!it) - toast(R.string.toast_permission_denied_notification) - } + if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + pendingAction = Action.POST_NOTIFICATIONS + requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } } onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { @@ -226,11 +276,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList if (mainViewModel.isRunning.value == true) { Utils.stopVService(this) } - Observable.timer(500, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - startV2Ray() - } + lifecycleScope.launch { + delay(500) + startV2Ray() + } } public override fun onResume() { @@ -462,38 +511,20 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList * import config from qrcode */ private fun importQRcode(forConfig: Boolean): Boolean { -// try { -// startActivityForResult(Intent("com.google.zxing.client.android.SCAN") -// .addCategory(Intent.CATEGORY_DEFAULT) -// .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), requestCode) -// } catch (e: Exception) { - RxPermissions(this) - .request(Manifest.permission.CAMERA) - .subscribe { - if (it) - if (forConfig) - scanQRCodeForConfig.launch(Intent(this, ScannerActivity::class.java)) - else - scanQRCodeForUrlToCustomConfig.launch(Intent(this, ScannerActivity::class.java)) - else - toast(R.string.toast_permission_denied) + val permission = Manifest.permission.CAMERA + if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) { + if (forConfig) { + scanQRCodeForConfig.launch(Intent(this, ScannerActivity::class.java)) + } else { + scanQRCodeForUrlToCustomConfig.launch(Intent(this, ScannerActivity::class.java)) } -// } + } else { + pendingAction = if (forConfig) Action.IMPORT_QR_CODE_CONFIG else Action.IMPORT_QR_CODE_URL + requestPermissionLauncher.launch(permission) + } return true } - private val scanQRCodeForConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK) { - importBatchConfig(it.data?.getStringExtra("SCAN_RESULT")) - } - } - - private val scanQRCodeForUrlToCustomConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK) { - importConfigCustomUrl(it.data?.getStringExtra("SCAN_RESULT")) - } - } - /** * import config from clipboard */ @@ -614,10 +645,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList * import config from sub */ private fun importConfigViaSub(): Boolean { -// val dialog = AlertDialog.Builder(this) -// .setView(LayoutProgressBinding.inflate(layoutInflater).root) -// .setCancelable(false) -// .show() binding.pbWaiting.show() lifecycleScope.launch(Dispatchers.IO) { @@ -630,7 +657,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } else { toast(R.string.toast_failure) } - //dialog.dismiss() binding.pbWaiting.hide() } } @@ -645,17 +671,17 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList intent.type = "*/*" intent.addCategory(Intent.CATEGORY_OPENABLE) - try { - chooseFileForCustomConfig.launch(Intent.createChooser(intent, getString(R.string.title_file_chooser))) - } catch (ex: ActivityNotFoundException) { - toast(R.string.toast_require_file_manager) + val permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + Manifest.permission.READ_MEDIA_IMAGES + } else { + Manifest.permission.READ_EXTERNAL_STORAGE } - } - private val chooseFileForCustomConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - val uri = it.data?.data - if (it.resultCode == RESULT_OK && uri != null) { - readContentFromUri(uri) + if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) { + pendingAction = Action.READ_CONTENT_FROM_URI + chooseFileForCustomConfig.launch(Intent.createChooser(intent, getString(R.string.title_file_chooser))) + } else { + requestPermissionLauncher.launch(permission) } } @@ -668,20 +694,18 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList } else { Manifest.permission.READ_EXTERNAL_STORAGE } - RxPermissions(this) - .request(permission) - .subscribe { - if (it) { - try { - contentResolver.openInputStream(uri).use { input -> - importCustomizeConfig(input?.bufferedReader()?.readText()) - } - } catch (e: Exception) { - e.printStackTrace() - } - } else - toast(R.string.toast_permission_denied) + + if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) { + try { + contentResolver.openInputStream(uri).use { input -> + importCustomizeConfig(input?.bufferedReader()?.readText()) + } + } catch (e: Exception) { + e.printStackTrace() } + } else { + requestPermissionLauncher.launch(permission) + } } /** @@ -763,4 +787,4 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList binding.drawerLayout.closeDrawer(GravityCompat.START) return true } -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt index 30bc3ed2bd..9801cd90df 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import com.v2ray.ang.AngApplication.Companion.application import com.v2ray.ang.AppConfig @@ -23,9 +24,9 @@ import com.v2ray.ang.helper.ItemTouchHelperAdapter import com.v2ray.ang.helper.ItemTouchHelperViewHolder import com.v2ray.ang.service.V2RayServiceManager import com.v2ray.ang.util.Utils -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers -import io.reactivex.rxjava3.core.Observable -import java.util.concurrent.TimeUnit +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import java.util.* class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter(), ItemTouchHelperAdapter { companion object { @@ -165,11 +166,14 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter - if (blacklist.contains(one.packageName)) { - one.isSelected = 1 - } else { - one.isSelected = 0 + lifecycleScope.launch { + try { + binding.pbWaiting.visibility = View.VISIBLE + val blacklist = MmkvManager.decodeSettingsStringSet(AppConfig.PREF_PER_APP_PROXY_SET) + val apps = withContext(Dispatchers.IO) { + val appsList = AppManagerUtil.loadNetworkAppList(this@PerAppProxyActivity) + + if (blacklist != null) { + appsList.forEach { app -> + app.isSelected = if (blacklist.contains(app.packageName)) 1 else 0 } - } - val comparator = Comparator { p1, p2 -> - when { - p1.isSelected > p2.isSelected -> -1 - p1.isSelected == p2.isSelected -> 0 - else -> 1 - } - } - it.sortedWith(comparator) - } else { - val comparator = object : Comparator { + appsList.sortedWith(Comparator { p1, p2 -> + when { + p1.isSelected > p2.isSelected -> -1 + p1.isSelected == p2.isSelected -> 0 + else -> 1 + } + }) + } else { val collator = Collator.getInstance() - override fun compare(o1: AppInfo, o2: AppInfo) = collator.compare(o1.appName, o2.appName) + appsList.sortedWith(compareBy(collator) { it.appName }) } - it.sortedWith(comparator) } - } -// .map { -// val comparator = object : Comparator { -// val collator = Collator.getInstance() -// override fun compare(o1: AppInfo, o2: AppInfo) = collator.compare(o1.appName, o2.appName) -// } -// it.sortedWith(comparator) -// } - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - appsAll = it - adapter = PerAppProxyAdapter(this, it, blacklist) + + appsAll = apps + adapter = PerAppProxyAdapter(this@PerAppProxyActivity, apps, blacklist) binding.recyclerView.adapter = adapter binding.pbWaiting.visibility = View.GONE + } catch (e: Exception) { + binding.pbWaiting.visibility = View.GONE + Log.e(ANG_PACKAGE, "Error loading apps", e) } - /*** - recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() { - var dst = 0 - val threshold = resources.getDimensionPixelSize(R.dimen.bypass_list_header_height) * 2 - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - dst += dy - if (dst > threshold) { - header_view.hide() - dst = 0 - } else if (dst < -20) { - header_view.show() - dst = 0 } - } - - var hiding = false - fun View.hide() { - val target = -height.toFloat() - if (hiding || translationY == target) return - animate() - .translationY(target) - .setInterpolator(AccelerateInterpolator(2F)) - .setListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { - hiding = false - } - }) - hiding = true - } - - var showing = false - fun View.show() { - val target = 0f - if (showing || translationY == target) return - animate() - .translationY(target) - .setInterpolator(DecelerateInterpolator(2F)) - .setListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { - showing = false - } - }) - showing = true - } - }) - ***/ binding.switchPerAppProxy.setOnCheckedChangeListener { _, isChecked -> MmkvManager.encodeSettings(AppConfig.PREF_PER_APP_PROXY, isChecked) @@ -140,36 +85,6 @@ class PerAppProxyActivity : BaseActivity() { MmkvManager.encodeSettings(AppConfig.PREF_BYPASS_APPS, isChecked) } binding.switchBypassApps.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_BYPASS_APPS, false) - - /*** - et_search.setOnEditorActionListener { v, actionId, event -> - if (actionId == EditorInfo.IME_ACTION_SEARCH) { - //hide - var imm: InputMethodManager = v.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS) - - val key = v.text.toString().toUpperCase() - val apps = ArrayList() - if (TextUtils.isEmpty(key)) { - appsAll?.forEach { - apps.add(it) - } - } else { - appsAll?.forEach { - if (it.appName.toUpperCase().indexOf(key) >= 0) { - apps.add(it) - } - } - } - adapter = PerAppProxyAdapter(this, apps, adapter?.blacklist) - recycler_view.adapter = adapter - adapter?.notifyDataSetChanged() - true - } else { - false - } - } - ***/ } override fun onPause() { diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingActivity.kt index 44410d6735..5681f75d0c 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingActivity.kt @@ -12,7 +12,6 @@ import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager -import com.tbruyelle.rxpermissions3.RxPermissions import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityRoutingSettingBinding @@ -39,6 +38,16 @@ class RoutingSettingActivity : BaseActivity() { private val preset_rulesets: Array by lazy { resources.getStringArray(R.array.preset_rulesets) } + + private val requestCameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted) { + scanQRcodeForRulesets.launch(Intent(this, ScannerActivity::class.java)) + } else { + toast(R.string.toast_permission_denied) + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -102,11 +111,9 @@ class RoutingSettingActivity : BaseActivity() { e.printStackTrace() } }.show() - - } .setNegativeButton(android.R.string.cancel) { _, _ -> - //do noting + //do nothing } .show() true @@ -142,18 +149,10 @@ class RoutingSettingActivity : BaseActivity() { } R.id.import_rulesets_from_qrcode -> { - RxPermissions(this) - .request(Manifest.permission.CAMERA) - .subscribe { - if (it) - scanQRcodeForRulesets.launch(Intent(this, ScannerActivity::class.java)) - else - toast(R.string.toast_permission_denied) - } + requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) true } - R.id.export_rulesets_to_clipboard -> { val rulesetList = MmkvManager.decodeRoutingRulesets() if (rulesetList.isNullOrEmpty()) { @@ -201,5 +200,4 @@ class RoutingSettingActivity : BaseActivity() { rulesets.addAll(MmkvManager.decodeRoutingRulesets() ?: mutableListOf()) adapter.notifyDataSetChanged() } - -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt index 187a6de3dc..0d9a7d2231 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt @@ -4,13 +4,23 @@ import android.Manifest import android.content.Intent import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts -import com.tbruyelle.rxpermissions3.RxPermissions import com.v2ray.ang.R import com.v2ray.ang.extension.toast import com.v2ray.ang.handler.AngConfigManager class ScScannerActivity : BaseActivity() { + private val requestCameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted) { + scanQRCode.launch(Intent(this, ScannerActivity::class.java)) + } else { + toast(R.string.toast_permission_denied) + finish() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_none) @@ -18,19 +28,10 @@ class ScScannerActivity : BaseActivity() { } fun importQRcode(): Boolean { - RxPermissions(this) - .request(Manifest.permission.CAMERA) - .subscribe { granted -> - if (granted) { - scanQRCode.launch(Intent(this, ScannerActivity::class.java)) - } else { - toast(R.string.toast_permission_denied) - } - } + requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) return true } - private val scanQRCode = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == RESULT_OK) { val scanResult = it.data?.getStringExtra("SCAN_RESULT").orEmpty() @@ -46,5 +47,4 @@ class ScScannerActivity : BaseActivity() { } finish() } - -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScannerActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScannerActivity.kt index 6402c5a255..829d345d29 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScannerActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScannerActivity.kt @@ -2,13 +2,15 @@ package com.v2ray.ang.ui import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.graphics.BitmapFactory import android.os.Build import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.activity.result.contract.ActivityResultContracts -import com.tbruyelle.rxpermissions3.RxPermissions +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import com.v2ray.ang.AppConfig import com.v2ray.ang.R import com.v2ray.ang.extension.toast @@ -21,6 +23,37 @@ import io.github.g00fy2.quickie.config.ScannerConfig class ScannerActivity : BaseActivity() { private val scanQrCode = registerForActivityResult(ScanCustomCode(), ::handleResult) + private val chooseFile = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val uri = it.data?.data + if (it.resultCode == RESULT_OK && uri != null) { + try { + val inputStream = contentResolver.openInputStream(uri) + val bitmap = BitmapFactory.decodeStream(inputStream) + inputStream?.close() + + val text = QRCodeDecoder.syncDecodeQRCode(bitmap) + if (text.isNullOrEmpty()) { + toast(R.string.toast_decoding_failed) + } else { + finished(text) + } + } catch (e: Exception) { + e.printStackTrace() + toast(R.string.toast_decoding_failed) + } + } + } + + private val requestPermissionLauncher = + registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted) { + showFileChooser() + } else { + toast(R.string.toast_permission_denied) + } + } public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -72,15 +105,12 @@ class ScannerActivity : BaseActivity() { } else { Manifest.permission.READ_EXTERNAL_STORAGE } - RxPermissions(this) - .request(permission) - .subscribe { granted -> - if (granted) { - showFileChooser() - } else { - toast(R.string.toast_permission_denied) - } - } + + if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) { + showFileChooser() + } else { + requestPermissionLauncher.launch(permission) + } true } @@ -100,26 +130,4 @@ class ScannerActivity : BaseActivity() { toast(R.string.toast_require_file_manager) } } - - private val chooseFile = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - val uri = it.data?.data - if (it.resultCode == RESULT_OK && uri != null) { - try { - val inputStream = contentResolver.openInputStream(uri) - val bitmap = BitmapFactory.decodeStream(inputStream) - inputStream?.close() - - val text = QRCodeDecoder.syncDecodeQRCode(bitmap) - if (text.isNullOrEmpty()) { - toast(R.string.toast_decoding_failed) - } else { - finished(text) - } - } catch (e: Exception) { - e.printStackTrace() - toast(R.string.toast_decoding_failed) - } - } - } - -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt index c59afe5b8c..06d371e605 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt @@ -19,7 +19,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.tbruyelle.rxpermissions3.RxPermissions import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.LOOPBACK import com.v2ray.ang.R @@ -50,6 +49,38 @@ class UserAssetActivity : BaseActivity() { val extDir by lazy { File(Utils.userAssetPath(this)) } val builtInGeoFiles = arrayOf("geosite.dat", "geoip.dat") + private val requestStoragePermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted) { + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.type = "*/*" + intent.addCategory(Intent.CATEGORY_OPENABLE) + + try { + chooseFile.launch( + Intent.createChooser( + intent, + getString(R.string.title_file_chooser) + ) + ) + } catch (ex: android.content.ActivityNotFoundException) { + toast(R.string.toast_require_file_manager) + } + } else { + toast(R.string.toast_permission_denied) + } + } + + private val requestCameraPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted) { + scanQRCodeForAssetURL.launch(Intent(this, ScannerActivity::class.java)) + } else { + toast(R.string.toast_permission_denied) + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -86,27 +117,7 @@ class UserAssetActivity : BaseActivity() { } else { Manifest.permission.READ_EXTERNAL_STORAGE } - RxPermissions(this) - .request(permission) - .subscribe { - if (it) { - val intent = Intent(Intent.ACTION_GET_CONTENT) - intent.type = "*/*" - intent.addCategory(Intent.CATEGORY_OPENABLE) - - try { - chooseFile.launch( - Intent.createChooser( - intent, - getString(R.string.title_file_chooser) - ) - ) - } catch (ex: android.content.ActivityNotFoundException) { - toast(R.string.toast_require_file_manager) - } - } else - toast(R.string.toast_permission_denied) - } + requestStoragePermissionLauncher.launch(permission) } val chooseFile = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> @@ -158,14 +169,7 @@ class UserAssetActivity : BaseActivity() { } private fun importAssetFromQRcode(): Boolean { - RxPermissions(this) - .request(Manifest.permission.CAMERA) - .subscribe { - if (it) - scanQRCodeForAssetURL.launch(Intent(this, ScannerActivity::class.java)) - else - toast(R.string.toast_permission_denied) - } + requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) return true } @@ -349,4 +353,4 @@ class UserAssetActivity : BaseActivity() { class UserAssetViewHolder(val itemUserAssetBinding: ItemRecyclerUserAssetBinding) : RecyclerView.ViewHolder(itemUserAssetBinding.root) -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt index 8ce94751ab..e2300512c8 100644 --- a/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt +++ b/v2rayng/V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt @@ -4,36 +4,27 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import com.v2ray.ang.dto.AppInfo -import io.reactivex.rxjava3.core.Observable +import kotlinx.coroutines.withContext +import kotlinx.coroutines.Dispatchers object AppManagerUtil { - private fun loadNetworkAppList(ctx: Context): ArrayList { - val packageManager = ctx.packageManager - val packages = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS) - val apps = ArrayList() + suspend fun loadNetworkAppList(context: Context): ArrayList = + withContext(Dispatchers.IO) { + val packageManager = context.packageManager + val packages = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS) + val apps = ArrayList() - for (pkg in packages) { - val applicationInfo = pkg.applicationInfo ?: continue + for (pkg in packages) { + val applicationInfo = pkg.applicationInfo ?: continue - val appName = applicationInfo.loadLabel(packageManager).toString() - val appIcon = applicationInfo.loadIcon(packageManager) ?: continue - val isSystemApp = (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) > 0 + val appName = applicationInfo.loadLabel(packageManager).toString() + val appIcon = applicationInfo.loadIcon(packageManager) ?: continue + val isSystemApp = (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) > 0 - val appInfo = AppInfo(appName, pkg.packageName, appIcon, isSystemApp, 0) - apps.add(appInfo) + val appInfo = AppInfo(appName, pkg.packageName, appIcon, isSystemApp, 0) + apps.add(appInfo) + } + + return@withContext apps } - - return apps - } - - fun rxLoadNetworkAppList(ctx: Context): Observable> = - Observable.unsafeCreate { - it.onNext(loadNetworkAppList(ctx)) - } - -// val PackageInfo.hasInternetPermission: Boolean -// get() { -// val permissions = requestedPermissions -// return permissions?.any { it == Manifest.permission.INTERNET } ?: false -// } -} +} \ No newline at end of file diff --git a/v2rayng/V2rayNG/gradle/libs.versions.toml b/v2rayng/V2rayNG/gradle/libs.versions.toml index 2a2de8f914..79a837dff4 100644 --- a/v2rayng/V2rayNG/gradle/libs.versions.toml +++ b/v2rayng/V2rayNG/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -agp = "8.8.1" -desugar_jdk_libs = "2.1.4" +agp = "8.8.2" +desugar_jdk_libs = "2.1.5" gradleLicensePlugin = "0.9.8" kotlin = "2.1.10" coreKtx = "1.15.0" @@ -9,14 +9,13 @@ junitVersion = "1.2.1" espressoCore = "3.6.1" appcompat = "1.7.0" material = "1.12.0" -activity = "1.10.0" -constraintlayout = "2.2.0" -mmkvStatic = "1.3.11" +activity = "1.10.1" +constraintlayout = "2.2.1" +mmkvStatic = "1.3.12" gson = "2.11.0" quickieFoss = "1.13.1" -rxjava = "3.1.10" -rxandroid = "3.0.2" -rxpermissions = "0.12" +kotlinx-coroutines-android = "1.10.1" +kotlinx-coroutines-core = "1.10.1" swiperefreshlayout = "1.1.0" toastcompat = "1.1.0" editorkit = "2.9.0" @@ -43,9 +42,8 @@ androidx-constraintlayout = { group = "androidx.constraintlayout", name = "const mmkv-static = { module = "com.tencent:mmkv-static", version.ref = "mmkvStatic" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } quickie-foss = { module = "com.github.T8RIN.QuickieExtended:quickie-foss", version.ref = "quickieFoss" } -rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" } -rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" } -rxpermissions = { module = "com.github.tbruyelle:rxpermissions", version.ref = "rxpermissions" } +kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version = "kotlinx-coroutines-android" } +kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version = "kotlinx-coroutines-core" } toastcompat = { module = "me.drakeet.support:toastcompat", version.ref = "toastcompat" } editorkit = { module = "com.blacksquircle.ui:editorkit", version.ref = "editorkit" } language-base = { module = "com.blacksquircle.ui:language-base", version.ref = "editorkit" } diff --git a/xray-core/app/proxyman/inbound/worker.go b/xray-core/app/proxyman/inbound/worker.go index a14a338f45..12e29876d6 100644 --- a/xray-core/app/proxyman/inbound/worker.go +++ b/xray-core/app/proxyman/inbound/worker.go @@ -324,6 +324,7 @@ func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest if w.sniffingConfig != nil { content.SniffingRequest.Enabled = w.sniffingConfig.Enabled content.SniffingRequest.OverrideDestinationForProtocol = w.sniffingConfig.DestinationOverride + content.SniffingRequest.ExcludeForDomain = w.sniffingConfig.DomainsExcluded content.SniffingRequest.MetadataOnly = w.sniffingConfig.MetadataOnly content.SniffingRequest.RouteOnly = w.sniffingConfig.RouteOnly } diff --git a/xray-core/common/mux/server.go b/xray-core/common/mux/server.go index 480175ba06..8fc0ae09ab 100644 --- a/xray-core/common/mux/server.go +++ b/xray-core/common/mux/server.go @@ -120,7 +120,7 @@ func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader *buf.Bu func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader *buf.BufferedReader) error { // deep-clone outbounds because it is going to be mutated concurrently // (Target and OriginalTarget) - ctx = session.ContextCloneOutbounds(ctx) + ctx = session.ContextCloneOutboundsAndContent(ctx) errors.LogInfo(ctx, "received request for ", meta.Target) { msg := &log.AccessMessage{ diff --git a/xray-core/common/protocol/http/sniff.go b/xray-core/common/protocol/http/sniff.go index 409682947d..e85a079201 100644 --- a/xray-core/common/protocol/http/sniff.go +++ b/xray-core/common/protocol/http/sniff.go @@ -63,7 +63,7 @@ func SniffHTTP(b []byte, c context.Context) (*SniffHeader, error) { ShouldSniffAttr := true // If content.Attributes have information, that means it comes from HTTP inbound PlainHTTP mode. // It will set attributes, so skip it. - if content == nil || content.AttributeLen() != 0 { + if content == nil || len(content.Attributes) != 0 { ShouldSniffAttr = false } if err := beginWithHTTPMethod(b); err != nil { diff --git a/xray-core/common/session/context.go b/xray-core/common/session/context.go index f2c8de7f27..0e2558c2c2 100644 --- a/xray-core/common/session/context.go +++ b/xray-core/common/session/context.go @@ -42,7 +42,7 @@ func ContextWithOutbounds(ctx context.Context, outbounds []*Outbound) context.Co return context.WithValue(ctx, outboundSessionKey, outbounds) } -func ContextCloneOutbounds(ctx context.Context) context.Context { +func ContextCloneOutboundsAndContent(ctx context.Context) context.Context { outbounds := OutboundsFromContext(ctx) newOutbounds := make([]*Outbound, len(outbounds)) for i, ob := range outbounds { @@ -55,7 +55,15 @@ func ContextCloneOutbounds(ctx context.Context) context.Context { newOutbounds[i] = &v } - return ContextWithOutbounds(ctx, newOutbounds) + content := ContentFromContext(ctx) + newContent := Content{} + if content != nil { + newContent = *content + if content.Attributes != nil { + panic("content.Attributes != nil") + } + } + return ContextWithContent(ContextWithOutbounds(ctx, newOutbounds), &newContent) } func OutboundsFromContext(ctx context.Context) []*Outbound { diff --git a/xray-core/common/session/session.go b/xray-core/common/session/session.go index cad15400b6..4de9737459 100644 --- a/xray-core/common/session/session.go +++ b/xray-core/common/session/session.go @@ -4,7 +4,6 @@ package session // import "github.com/xtls/xray-core/common/session" import ( "context" "math/rand" - "sync" c "github.com/xtls/xray-core/common/ctx" "github.com/xtls/xray-core/common/errors" @@ -75,8 +74,8 @@ type Outbound struct { // SniffingRequest controls the behavior of content sniffing. type SniffingRequest struct { - ExcludeForDomain []string - OverrideDestinationForProtocol []string + ExcludeForDomain []string // read-only once set + OverrideDestinationForProtocol []string // read-only once set Enabled bool MetadataOnly bool RouteOnly bool @@ -92,10 +91,6 @@ type Content struct { Attributes map[string]string SkipDNSResolve bool - - mu sync.Mutex - - isLocked bool } // Sockopt is the settings for socket connection. @@ -104,22 +99,8 @@ type Sockopt struct { Mark int32 } -// Some how when using mux, there will be a same ctx between different requests -// This will cause problem as it's designed for single request, like concurrent map writes -// Add a Mutex as a temp solution - // SetAttribute attaches additional string attributes to content. func (c *Content) SetAttribute(name string, value string) { - if c.isLocked { - errors.LogError(context.Background(), "Multiple goroutines are tring to access one routing content, tring to write ", name, ":", value) - } - c.mu.Lock() - c.isLocked = true - defer func() { - c.isLocked = false - c.mu.Unlock() - }() - if c.Attributes == nil { c.Attributes = make(map[string]string) } @@ -128,24 +109,8 @@ func (c *Content) SetAttribute(name string, value string) { // Attribute retrieves additional string attributes from content. func (c *Content) Attribute(name string) string { - c.mu.Lock() - c.isLocked = true - defer func() { - c.isLocked = false - c.mu.Unlock() - }() if c.Attributes == nil { return "" } return c.Attributes[name] } - -func (c *Content) AttributeLen() int { - c.mu.Lock() - c.isLocked = true - defer func() { - c.isLocked = false - c.mu.Unlock() - }() - return len(c.Attributes) -} diff --git a/xray-core/infra/conf/transport_internet.go b/xray-core/infra/conf/transport_internet.go index 0de5bfcc97..78bd76fe50 100644 --- a/xray-core/infra/conf/transport_internet.go +++ b/xray-core/infra/conf/transport_internet.go @@ -502,6 +502,7 @@ type REALITYConfig struct { Fingerprint string `json:"fingerprint"` ServerName string `json:"serverName"` + Password string `json:"password"` PublicKey string `json:"publicKey"` ShortId string `json:"shortId"` SpiderX string `json:"spiderX"` @@ -610,11 +611,14 @@ func (c *REALITYConfig) Build() (proto.Message, error) { if len(c.ServerNames) != 0 { return nil, errors.New(`non-empty "serverNames", please use "serverName" instead`) } + if c.Password != "" { + c.PublicKey = c.Password + } if c.PublicKey == "" { - return nil, errors.New(`empty "publicKey"`) + return nil, errors.New(`empty "password"`) } if config.PublicKey, err = base64.RawURLEncoding.DecodeString(c.PublicKey); err != nil || len(config.PublicKey) != 32 { - return nil, errors.New(`invalid "publicKey": `, c.PublicKey) + return nil, errors.New(`invalid "password": `, c.PublicKey) } if len(c.ShortIds) != 0 { return nil, errors.New(`non-empty "shortIds", please use "shortId" instead`) diff --git a/yt-dlp/yt_dlp/extractor/_extractors.py b/yt-dlp/yt_dlp/extractor/_extractors.py index 403e1f1f65..3ab0f5efa2 100644 --- a/yt-dlp/yt_dlp/extractor/_extractors.py +++ b/yt-dlp/yt_dlp/extractor/_extractors.py @@ -2224,6 +2224,7 @@ from .tvplay import ( TVPlayIE, ) from .tvplayer import TVPlayerIE +from .tvw import TvwIE from .tweakers import TweakersIE from .twentymin import TwentyMinutenIE from .twentythreevideo import TwentyThreeVideoIE diff --git a/yt-dlp/yt_dlp/extractor/magellantv.py b/yt-dlp/yt_dlp/extractor/magellantv.py index 6f2524ba22..e7ae709cfc 100644 --- a/yt-dlp/yt_dlp/extractor/magellantv.py +++ b/yt-dlp/yt_dlp/extractor/magellantv.py @@ -1,35 +1,36 @@ from .common import InfoExtractor -from ..utils import parse_age_limit, parse_duration, traverse_obj +from ..utils import parse_age_limit, parse_duration, url_or_none +from ..utils.traversal import traverse_obj class MagellanTVIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?magellantv\.com/(?:watch|video)/(?P[\w-]+)' _TESTS = [{ - 'url': 'https://www.magellantv.com/watch/my-dads-on-death-row?type=v', + 'url': 'https://www.magellantv.com/watch/incas-the-new-story?type=v', 'info_dict': { - 'id': 'my-dads-on-death-row', + 'id': 'incas-the-new-story', 'ext': 'mp4', - 'title': 'My Dad\'s On Death Row', - 'description': 'md5:33ba23b9f0651fc4537ed19b1d5b0d7a', - 'duration': 3780.0, + 'title': 'Incas: The New Story', + 'description': 'md5:936c7f6d711c02dfb9db22a067b586fe', 'age_limit': 14, - 'tags': ['Justice', 'Reality', 'United States', 'True Crime'], + 'duration': 3060.0, + 'tags': ['Ancient History', 'Archaeology', 'Anthropology'], }, 'params': {'skip_download': 'm3u8'}, }, { - 'url': 'https://www.magellantv.com/video/james-bulger-the-new-revelations', + 'url': 'https://www.magellantv.com/video/tortured-to-death-murdering-the-nanny', 'info_dict': { - 'id': 'james-bulger-the-new-revelations', + 'id': 'tortured-to-death-murdering-the-nanny', 'ext': 'mp4', - 'title': 'James Bulger: The New Revelations', - 'description': 'md5:7b97922038bad1d0fe8d0470d8a189f2', + 'title': 'Tortured to Death: Murdering the Nanny', + 'description': 'md5:d87033594fa218af2b1a8b49f52511e5', + 'age_limit': 14, 'duration': 2640.0, - 'age_limit': 0, - 'tags': ['Investigation', 'True Crime', 'Justice', 'Europe'], + 'tags': ['True Crime', 'Murder'], }, 'params': {'skip_download': 'm3u8'}, }, { - 'url': 'https://www.magellantv.com/watch/celebration-nation', + 'url': 'https://www.magellantv.com/watch/celebration-nation?type=s', 'info_dict': { 'id': 'celebration-nation', 'ext': 'mp4', @@ -43,10 +44,19 @@ class MagellanTVIE(InfoExtractor): def _real_extract(self, url): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id) - data = traverse_obj(self._search_nextjs_data(webpage, video_id), ( - 'props', 'pageProps', 'reactContext', - (('video', 'detail'), ('series', 'currentEpisode')), {dict}), get_all=False) - formats, subtitles = self._extract_m3u8_formats_and_subtitles(data['jwpVideoUrl'], video_id) + context = self._search_nextjs_data(webpage, video_id)['props']['pageProps']['reactContext'] + data = traverse_obj(context, ((('video', 'detail'), ('series', 'currentEpisode')), {dict}, any)) + + formats, subtitles = [], {} + for m3u8_url in set(traverse_obj(data, ((('manifests', ..., 'hls'), 'jwp_video_url'), {url_or_none}))): + fmts, subs = self._extract_m3u8_formats_and_subtitles( + m3u8_url, video_id, 'mp4', m3u8_id='hls', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + if not formats and (error := traverse_obj(context, ('errorDetailPage', 'errorMessage', {str}))): + if 'available in your country' in error: + self.raise_geo_restricted(msg=error) + self.raise_no_formats(f'{self.IE_NAME} said: {error}', expected=True) return { 'id': video_id, diff --git a/yt-dlp/yt_dlp/extractor/n1.py b/yt-dlp/yt_dlp/extractor/n1.py index bbb327e750..e0e49161bd 100644 --- a/yt-dlp/yt_dlp/extractor/n1.py +++ b/yt-dlp/yt_dlp/extractor/n1.py @@ -4,7 +4,9 @@ from .common import InfoExtractor from ..utils import ( extract_attributes, unified_timestamp, + url_or_none, ) +from ..utils.traversal import traverse_obj class N1InfoAssetIE(InfoExtractor): @@ -35,9 +37,9 @@ class N1InfoIIE(InfoExtractor): IE_NAME = 'N1Info:article' _VALID_URL = r'https?://(?:(?:\w+\.)?n1info\.\w+|nova\.rs)/(?:[^/?#]+/){1,2}(?P[^/?#]+)' _TESTS = [{ - # Youtube embedded + # YouTube embedded 'url': 'https://rs.n1info.com/sport-klub/tenis/kako-je-djokovic-propustio-istorijsku-priliku-video/', - 'md5': '01ddb6646d0fd9c4c7d990aa77fe1c5a', + 'md5': '987ce6fd72acfecc453281e066b87973', 'info_dict': { 'id': 'L5Hd4hQVUpk', 'ext': 'mp4', @@ -45,7 +47,26 @@ class N1InfoIIE(InfoExtractor): 'title': 'Ozmo i USO21, ep. 13: Novak Đoković – Danil Medvedev | Ključevi Poraza, Budućnost | SPORT KLUB TENIS', 'description': 'md5:467f330af1effedd2e290f10dc31bb8e', 'uploader': 'Sport Klub', - 'uploader_id': 'sportklub', + 'uploader_id': '@sportklub', + 'uploader_url': 'https://www.youtube.com/@sportklub', + 'channel': 'Sport Klub', + 'channel_id': 'UChpzBje9Ro6CComXe3BgNaw', + 'channel_url': 'https://www.youtube.com/channel/UChpzBje9Ro6CComXe3BgNaw', + 'channel_is_verified': True, + 'channel_follower_count': int, + 'comment_count': int, + 'view_count': int, + 'like_count': int, + 'age_limit': 0, + 'duration': 1049, + 'thumbnail': 'https://i.ytimg.com/vi/L5Hd4hQVUpk/maxresdefault.jpg', + 'chapters': 'count:9', + 'categories': ['Sports'], + 'tags': 'count:10', + 'timestamp': 1631522787, + 'playable_in_embed': True, + 'availability': 'public', + 'live_status': 'not_live', }, }, { 'url': 'https://rs.n1info.com/vesti/djilas-los-plan-za-metro-nece-resiti-nijedan-saobracajni-problem/', @@ -55,6 +76,7 @@ class N1InfoIIE(InfoExtractor): 'title': 'Đilas: Predlog izgradnje metroa besmislen; SNS odbacuje navode', 'upload_date': '20210924', 'timestamp': 1632481347, + 'thumbnail': 'http://n1info.rs/wp-content/themes/ucnewsportal-n1/dist/assets/images/placeholder-image-video.jpg', }, 'params': { 'skip_download': True, @@ -67,6 +89,7 @@ class N1InfoIIE(InfoExtractor): 'title': 'Zadnji dnevi na kopališču Ilirija: “Ilirija ni umrla, ubili so jo”', 'timestamp': 1632567630, 'upload_date': '20210925', + 'thumbnail': 'https://n1info.si/wp-content/uploads/2021/09/06/1630945843-tomaz3.png', }, 'params': { 'skip_download': True, @@ -81,6 +104,14 @@ class N1InfoIIE(InfoExtractor): 'upload_date': '20210924', 'timestamp': 1632448649.0, 'uploader': 'YouLotWhatDontStop', + 'display_id': 'pu9wbx', + 'channel_id': 'serbia', + 'comment_count': int, + 'like_count': int, + 'dislike_count': int, + 'age_limit': 0, + 'duration': 134, + 'thumbnail': 'https://external-preview.redd.it/5nmmawSeGx60miQM3Iq-ueC9oyCLTLjjqX-qqY8uRsc.png?format=pjpg&auto=webp&s=2f973400b04d23f871b608b178e47fc01f9b8f1d', }, 'params': { 'skip_download': True, @@ -93,6 +124,7 @@ class N1InfoIIE(InfoExtractor): 'title': 'Žaklina Tatalović Ani Brnabić: Pričate laži (VIDEO)', 'upload_date': '20211102', 'timestamp': 1635861677, + 'thumbnail': 'https://nova.rs/wp-content/uploads/2021/11/02/1635860298-TNJG_Ana_Brnabic_i_Zaklina_Tatalovic_100_dana_Vlade_GP.jpg', }, }, { 'url': 'https://n1info.rs/vesti/cuta-biti-u-kosovskoj-mitrovici-znaci-da-te-docekaju-eksplozivnim-napravama/', @@ -104,6 +136,16 @@ class N1InfoIIE(InfoExtractor): 'timestamp': 1687290536, 'thumbnail': 'https://cdn.brid.tv/live/partners/26827/snapshot/1332368_th_6492013a8356f_1687290170.jpg', }, + }, { + 'url': 'https://n1info.rs/vesti/vuciceva-turneja-po-srbiji-najavljuje-kontrarevoluciju-preti-svom-narodu-vredja-novinare/', + 'info_dict': { + 'id': '2025974', + 'ext': 'mp4', + 'title': 'Vučićeva turneja po Srbiji: Najavljuje kontrarevoluciju, preti svom narodu, vređa novinare', + 'thumbnail': 'https://cdn-uc.brid.tv/live/partners/26827/snapshot/2025974_fhd_67c4a23280a81_1740939826.jpg', + 'timestamp': 1740939936, + 'upload_date': '20250302', + }, }, { 'url': 'https://hr.n1info.com/vijesti/pravobraniteljica-o-ubojstvu-u-zagrebu-radi-se-o-doista-nezapamcenoj-situaciji/', 'only_matching': True, @@ -115,11 +157,11 @@ class N1InfoIIE(InfoExtractor): title = self._html_search_regex(r']+>(.+?)', webpage, 'title') timestamp = unified_timestamp(self._html_search_meta('article:published_time', webpage)) - plugin_data = self._html_search_meta('BridPlugin', webpage) + plugin_data = re.findall(r'\$bp\("(?:Brid|TargetVideo)_\d+",\s(.+)\);', webpage) entries = [] if plugin_data: site_id = self._html_search_regex(r'site:(\d+)', webpage, 'site id') - for video_data in re.findall(r'\$bp\("Brid_\d+", (.+)\);', webpage): + for video_data in plugin_data: video_id = self._parse_json(video_data, title)['video'] entries.append({ 'id': video_id, @@ -140,7 +182,7 @@ class N1InfoIIE(InfoExtractor): 'url': video_data.get('data-url'), 'id': video_data.get('id'), 'title': title, - 'thumbnail': video_data.get('data-thumbnail'), + 'thumbnail': traverse_obj(video_data, (('data-thumbnail', 'data-default_thumbnail'), {url_or_none}, any)), 'timestamp': timestamp, 'ie_key': 'N1InfoAsset', }) @@ -152,7 +194,7 @@ class N1InfoIIE(InfoExtractor): if url.startswith('https://www.youtube.com'): entries.append(self.url_result(url, ie='Youtube')) elif url.startswith('https://www.redditmedia.com'): - entries.append(self.url_result(url, ie='RedditR')) + entries.append(self.url_result(url, ie='Reddit')) return { '_type': 'playlist', diff --git a/yt-dlp/yt_dlp/extractor/rtp.py b/yt-dlp/yt_dlp/extractor/rtp.py index 26aec2e4cc..03e9859403 100644 --- a/yt-dlp/yt_dlp/extractor/rtp.py +++ b/yt-dlp/yt_dlp/extractor/rtp.py @@ -3,12 +3,20 @@ import json import re import urllib.parse -from .common import InfoExtractor -from ..utils import js_to_json +from .common import InfoExtractor, Request +from ..utils import ( + determine_ext, + int_or_none, + js_to_json, + parse_duration, + parse_iso8601, + url_or_none, +) +from ..utils.traversal import traverse_obj class RTPIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?rtp\.pt/play/(?:(?:estudoemcasa|palco|zigzag)/)?p(?P[0-9]+)/(?P[^/?#]+)' + _VALID_URL = r'https?://(?:www\.)?rtp\.pt/play/(?:[^/#?]+/)?p(?P\d+)/(?Pe\d+)' _TESTS = [{ 'url': 'http://www.rtp.pt/play/p405/e174042/paixoes-cruzadas', 'md5': 'e736ce0c665e459ddb818546220b4ef8', @@ -16,99 +24,173 @@ class RTPIE(InfoExtractor): 'id': 'e174042', 'ext': 'mp3', 'title': 'Paixões Cruzadas', - 'description': 'As paixões musicais de António Cartaxo e António Macedo', + 'description': 'md5:af979e58ba0ab73f78435fc943fdb070', 'thumbnail': r're:^https?://.*\.jpg', + 'series': 'Paixões Cruzadas', + 'duration': 2950.0, + 'modified_timestamp': 1553693464, + 'modified_date': '20190327', + 'timestamp': 1417219200, + 'upload_date': '20141129', }, }, { 'url': 'https://www.rtp.pt/play/zigzag/p13166/e757904/25-curiosidades-25-de-abril', - 'md5': '9a81ed53f2b2197cfa7ed455b12f8ade', + 'md5': '5b4859940e3adef61247a77dfb76046a', 'info_dict': { 'id': 'e757904', 'ext': 'mp4', - 'title': '25 Curiosidades, 25 de Abril', - 'description': 'Estudar ou não estudar - Em cada um dos episódios descobrimos uma curiosidade acerca de como era viver em Portugal antes da revolução do 25 de abr', + 'title': 'Estudar ou não estudar', + 'description': 'md5:3bfd7eb8bebfd5711a08df69c9c14c35', 'thumbnail': r're:^https?://.*\.jpg', + 'timestamp': 1711958401, + 'duration': 146.0, + 'upload_date': '20240401', + 'modified_timestamp': 1712242991, + 'series': '25 Curiosidades, 25 de Abril', + 'episode_number': 2, + 'episode': 'Estudar ou não estudar', + 'modified_date': '20240404', }, }, { - 'url': 'http://www.rtp.pt/play/p831/a-quimica-das-coisas', - 'only_matching': True, - }, { - 'url': 'https://www.rtp.pt/play/estudoemcasa/p7776/portugues-1-ano', - 'only_matching': True, - }, { - 'url': 'https://www.rtp.pt/play/palco/p13785/l7nnon', - 'only_matching': True, + # Episode not accessible through API + 'url': 'https://www.rtp.pt/play/estudoemcasa/p7776/e500050/portugues-1-ano', + 'md5': '57660c0b46db9f22118c52cbd65975e4', + 'info_dict': { + 'id': 'e500050', + 'ext': 'mp4', + 'title': 'Português - 1.º ano', + 'duration': 1669.0, + 'description': 'md5:be68925c81269f8c6886589f25fe83ea', + 'upload_date': '20201020', + 'timestamp': 1603180799, + 'thumbnail': 'https://cdn-images.rtp.pt/EPG/imagens/39482_59449_64850.png?v=3&w=860', + }, }] + _USER_AGENT = 'rtpplay/2.0.66 (pt.rtp.rtpplay; build:2066; iOS 15.8.3) Alamofire/5.9.1' + _AUTH_TOKEN = None + + def _fetch_auth_token(self): + if self._AUTH_TOKEN: + return self._AUTH_TOKEN + self._AUTH_TOKEN = traverse_obj(self._download_json(Request( + 'https://rtpplayapi.rtp.pt/play/api/2/token-manager', + headers={ + 'Accept': '*/*', + 'rtp-play-auth': 'RTPPLAY_MOBILE_IOS', + 'rtp-play-auth-hash': 'fac9c328b2f27e26e03d7f8942d66c05b3e59371e16c2a079f5c83cc801bd3ee', + 'rtp-play-auth-timestamp': '2145973229682', + 'User-Agent': self._USER_AGENT, + }, extensions={'keep_header_casing': True}), None, + note='Fetching guest auth token', errnote='Could not fetch guest auth token', + fatal=False), ('token', 'token', {str})) + return self._AUTH_TOKEN + + @staticmethod + def _cleanup_media_url(url): + if urllib.parse.urlparse(url).netloc == 'streaming-ondemand.rtp.pt': + return None + return url.replace('/drm-fps/', '/hls/').replace('/drm-dash/', '/dash/') + + def _extract_formats(self, media_urls, episode_id): + formats = [] + subtitles = {} + for media_url in set(traverse_obj(media_urls, (..., {url_or_none}, {self._cleanup_media_url}))): + ext = determine_ext(media_url) + if ext == 'm3u8': + fmts, subs = self._extract_m3u8_formats_and_subtitles( + media_url, episode_id, m3u8_id='hls', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + elif ext == 'mpd': + fmts, subs = self._extract_mpd_formats_and_subtitles( + media_url, episode_id, mpd_id='dash', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + else: + formats.append({ + 'url': media_url, + 'format_id': 'http', + }) + return formats, subtitles + + def _extract_from_api(self, program_id, episode_id): + auth_token = self._fetch_auth_token() + if not auth_token: + return + episode_data = traverse_obj(self._download_json( + f'https://www.rtp.pt/play/api/1/get-episode/{program_id}/{episode_id[1:]}', episode_id, + query={'include_assets': 'true', 'include_webparams': 'true'}, + headers={ + 'Accept': '*/*', + 'Authorization': f'Bearer {auth_token}', + 'User-Agent': self._USER_AGENT, + }, fatal=False), 'result', {dict}) + if not episode_data: + return + asset_urls = traverse_obj(episode_data, ('assets', 0, 'asset_url', {dict})) + media_urls = traverse_obj(asset_urls, ( + ((('hls', 'dash'), 'stream_url'), ('multibitrate', ('url_hls', 'url_dash'))),)) + formats, subtitles = self._extract_formats(media_urls, episode_id) + + for sub_data in traverse_obj(asset_urls, ('subtitles', 'vtt_list', lambda _, v: url_or_none(v['file']))): + subtitles.setdefault(sub_data.get('code') or 'pt', []).append({ + 'url': sub_data['file'], + 'name': sub_data.get('language'), + }) + + return { + 'id': episode_id, + 'formats': formats, + 'subtitles': subtitles, + 'thumbnail': traverse_obj(episode_data, ('assets', 0, 'asset_thumbnail', {url_or_none})), + **traverse_obj(episode_data, ('episode', { + 'title': (('episode_title', 'program_title'), {str}, filter, any), + 'alt_title': ('episode_subtitle', {str}, filter), + 'description': (('episode_description', 'episode_summary'), {str}, filter, any), + 'timestamp': ('episode_air_date', {parse_iso8601(delimiter=' ')}), + 'modified_timestamp': ('episode_lastchanged', {parse_iso8601(delimiter=' ')}), + 'duration': ('episode_duration_complete', {parse_duration}), + 'episode': ('episode_title', {str}, filter), + 'episode_number': ('episode_number', {int_or_none}), + 'season': ('program_season', {str}, filter), + 'series': ('program_title', {str}, filter), + })), + } + _RX_OBFUSCATION = re.compile(r'''(?xs) atob\s*\(\s*decodeURIComponent\s*\(\s* (\[[0-9A-Za-z%,'"]*\]) \s*\.\s*join\(\s*(?:""|'')\s*\)\s*\)\s*\) ''') - def __unobfuscate(self, data, *, video_id): - if data.startswith('{'): - data = self._RX_OBFUSCATION.sub( - lambda m: json.dumps( - base64.b64decode(urllib.parse.unquote( - ''.join(self._parse_json(m.group(1), video_id)), - )).decode('iso-8859-1')), - data) - return js_to_json(data) + def __unobfuscate(self, data): + return self._RX_OBFUSCATION.sub( + lambda m: json.dumps( + base64.b64decode(urllib.parse.unquote( + ''.join(json.loads(m.group(1))), + )).decode('iso-8859-1')), + data) - def _real_extract(self, url): - video_id = self._match_id(url) - - webpage = self._download_webpage(url, video_id) - title = self._html_search_meta( - 'twitter:title', webpage, display_name='title', fatal=True) - - f, config = self._search_regex( - r'''(?sx) - (?:var\s+f\s*=\s*(?P".*?"|{[^;]+?});\s*)? - var\s+player1\s+=\s+new\s+RTPPlayer\s*\((?P{(?:(?!\*/).)+?})\);(?!\s*\*/) - ''', webpage, - 'player config', group=('f', 'config')) - - config = self._parse_json( - config, video_id, - lambda data: self.__unobfuscate(data, video_id=video_id)) - f = config['file'] if not f else self._parse_json( - f, video_id, - lambda data: self.__unobfuscate(data, video_id=video_id)) + def _extract_from_html(self, url, episode_id): + webpage = self._download_webpage(url, episode_id) formats = [] - if isinstance(f, dict): - f_hls = f.get('hls') - if f_hls is not None: - formats.extend(self._extract_m3u8_formats( - f_hls, video_id, 'mp4', 'm3u8_native', m3u8_id='hls')) - - f_dash = f.get('dash') - if f_dash is not None: - formats.extend(self._extract_mpd_formats(f_dash, video_id, mpd_id='dash')) - else: - formats.append({ - 'format_id': 'f', - 'url': f, - 'vcodec': 'none' if config.get('mediaType') == 'audio' else None, - }) - subtitles = {} - - vtt = config.get('vtt') - if vtt is not None: - for lcode, lname, url in vtt: - subtitles.setdefault(lcode, []).append({ - 'name': lname, - 'url': url, - }) + media_urls = traverse_obj(re.findall(r'(?:var\s+f\s*=|RTPPlayer\({[^}]+file:)\s*({[^}]+}|"[^"]+")', webpage), ( + -1, (({self.__unobfuscate}, {js_to_json}, {json.loads}, {dict.values}, ...), {json.loads}))) + formats, subtitles = self._extract_formats(media_urls, episode_id) return { - 'id': video_id, - 'title': title, + 'id': episode_id, 'formats': formats, - 'description': self._html_search_meta(['description', 'twitter:description'], webpage), - 'thumbnail': config.get('poster') or self._og_search_thumbnail(webpage), 'subtitles': subtitles, + 'description': self._html_search_meta(['og:description', 'twitter:description'], webpage, default=None), + 'thumbnail': self._html_search_meta(['og:image', 'twitter:image'], webpage, default=None), + **self._search_json_ld(webpage, episode_id, default={}), + 'title': self._html_search_meta(['og:title', 'twitter:title'], webpage, default=None), } + + def _real_extract(self, url): + program_id, episode_id = self._match_valid_url(url).group('program_id', 'id') + return self._extract_from_api(program_id, episode_id) or self._extract_from_html(url, episode_id) diff --git a/yt-dlp/yt_dlp/extractor/tvw.py b/yt-dlp/yt_dlp/extractor/tvw.py new file mode 100644 index 0000000000..1c060cd7a0 --- /dev/null +++ b/yt-dlp/yt_dlp/extractor/tvw.py @@ -0,0 +1,117 @@ +import json + +from .common import InfoExtractor +from ..utils import clean_html, remove_end, unified_timestamp, url_or_none +from ..utils.traversal import traverse_obj + + +class TvwIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?tvw\.org/video/(?P[^/?#]+)' + + _TESTS = [{ + 'url': 'https://tvw.org/video/billy-frank-jr-statue-maquette-unveiling-ceremony-2024011211/', + 'md5': '9ceb94fe2bb7fd726f74f16356825703', + 'info_dict': { + 'id': '2024011211', + 'ext': 'mp4', + 'title': 'Billy Frank Jr. Statue Maquette Unveiling Ceremony', + 'thumbnail': r're:^https?://.*\.(?:jpe?g|png)$', + 'description': 'md5:58a8150017d985b4f377e11ee8f6f36e', + 'timestamp': 1704902400, + 'upload_date': '20240110', + 'location': 'Legislative Building', + 'display_id': 'billy-frank-jr-statue-maquette-unveiling-ceremony-2024011211', + 'categories': ['General Interest'], + }, + }, { + 'url': 'https://tvw.org/video/ebeys-landing-state-park-2024081007/', + 'md5': '71e87dae3deafd65d75ff3137b9a32fc', + 'info_dict': { + 'id': '2024081007', + 'ext': 'mp4', + 'title': 'Ebey\'s Landing State Park', + 'thumbnail': r're:^https?://.*\.(?:jpe?g|png)$', + 'description': 'md5:50c5bd73bde32fa6286a008dbc853386', + 'timestamp': 1724310900, + 'upload_date': '20240822', + 'location': 'Ebey’s Landing State Park', + 'display_id': 'ebeys-landing-state-park-2024081007', + 'categories': ['Washington State Parks'], + }, + }, { + 'url': 'https://tvw.org/video/home-warranties-workgroup-2', + 'md5': 'f678789bf94d07da89809f213cf37150', + 'info_dict': { + 'id': '1999121000', + 'ext': 'mp4', + 'title': 'Home Warranties Workgroup', + 'thumbnail': r're:^https?://.*\.(?:jpe?g|png)$', + 'description': 'md5:861396cc523c9641d0dce690bc5c35f3', + 'timestamp': 946389600, + 'upload_date': '19991228', + 'display_id': 'home-warranties-workgroup-2', + 'categories': ['Legislative'], + }, + }, { + 'url': 'https://tvw.org/video/washington-to-washington-a-new-space-race-2022041111/?eventID=2022041111', + 'md5': '6f5551090b351aba10c0d08a881b4f30', + 'info_dict': { + 'id': '2022041111', + 'ext': 'mp4', + 'title': 'Washington to Washington - A New Space Race', + 'thumbnail': r're:^https?://.*\.(?:jpe?g|png)$', + 'description': 'md5:f65a24eec56107afbcebb3aa5cd26341', + 'timestamp': 1650394800, + 'upload_date': '20220419', + 'location': 'Hayner Media Center', + 'display_id': 'washington-to-washington-a-new-space-race-2022041111', + 'categories': ['Washington to Washington', 'General Interest'], + }, + }] + + def _real_extract(self, url): + display_id = self._match_id(url) + webpage = self._download_webpage(url, display_id) + + client_id = self._html_search_meta('clientID', webpage, fatal=True) + video_id = self._html_search_meta('eventID', webpage, fatal=True) + + video_data = self._download_json( + 'https://api.v3.invintus.com/v2/Event/getDetailed', video_id, + headers={ + 'authorization': 'embedder', + 'wsc-api-key': '7WhiEBzijpritypp8bqcU7pfU9uicDR', + }, + data=json.dumps({ + 'clientID': client_id, + 'eventID': video_id, + 'showStreams': True, + }).encode())['data'] + + formats = [] + subtitles = {} + for stream_url in traverse_obj(video_data, ('streamingURIs', ..., {url_or_none})): + fmts, subs = self._extract_m3u8_formats_and_subtitles( + stream_url, video_id, 'mp4', m3u8_id='hls', fatal=False) + formats.extend(fmts) + self._merge_subtitles(subs, target=subtitles) + if caption_url := traverse_obj(video_data, ('captionPath', {url_or_none})): + subtitles.setdefault('en', []).append({'url': caption_url, 'ext': 'vtt'}) + + return { + 'id': video_id, + 'display_id': display_id, + 'formats': formats, + 'subtitles': subtitles, + 'title': remove_end(self._og_search_title(webpage, default=None), ' - TVW'), + 'description': self._og_search_description(webpage, default=None), + **traverse_obj(video_data, { + 'title': ('title', {str}), + 'description': ('description', {clean_html}), + 'categories': ('categories', ..., {str}), + 'thumbnail': ('videoThumbnail', {url_or_none}), + 'timestamp': ('startDateTime', {unified_timestamp}), + 'location': ('locationName', {str}), + 'is_live': ('eventStatus', {lambda x: x == 'live'}), + }), + }