mirror of
https://github.com/bolucat/Archive.git
synced 2026-04-22 16:07:49 +08:00
Update On Tue Sep 2 20:34:32 CEST 2025
This commit is contained in:
@@ -1108,3 +1108,4 @@ Update On Fri Aug 29 20:33:46 CEST 2025
|
||||
Update On Sat Aug 30 20:36:28 CEST 2025
|
||||
Update On Sun Aug 31 20:34:00 CEST 2025
|
||||
Update On Mon Sep 1 20:35:55 CEST 2025
|
||||
Update On Tue Sep 2 20:34:24 CEST 2025
|
||||
|
||||
+2
-1
@@ -139,9 +139,10 @@ class ProfileManager(private val context: Context) : IProfileManager,
|
||||
suspend fun updateFlow(old: Imported) {
|
||||
val client = OkHttpClient()
|
||||
try {
|
||||
val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName
|
||||
val request = Request.Builder()
|
||||
.url(old.source)
|
||||
.header("User-Agent", "ClashforWindows/0.19.23")
|
||||
.header("User-Agent", "ClashMetaForAndroid/$versionName")
|
||||
.build()
|
||||
|
||||
client.newCall(request).execute().use { response ->
|
||||
|
||||
+2
-1
@@ -76,9 +76,10 @@ object ProfileProcessor {
|
||||
if (snapshot?.type == Profile.Type.Url) {
|
||||
if (snapshot.source.startsWith("https://", true)) {
|
||||
val client = OkHttpClient()
|
||||
val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName
|
||||
val request = Request.Builder()
|
||||
.url(snapshot.source)
|
||||
.header("User-Agent", "ClashforWindows/0.19.23")
|
||||
.header("User-Agent", "ClashMetaForAndroid/$versionName")
|
||||
.build()
|
||||
|
||||
client.newCall(request).execute().use { response ->
|
||||
|
||||
@@ -87,26 +87,26 @@ type WireGuardPeerOption struct {
|
||||
}
|
||||
|
||||
type AmneziaWGOption struct {
|
||||
JC int `proxy:"jc,omitempty"`
|
||||
JMin int `proxy:"jmin,omitempty"`
|
||||
JMax int `proxy:"jmax,omitempty"`
|
||||
S1 int `proxy:"s1,omitempty"`
|
||||
S2 int `proxy:"s2,omitempty"`
|
||||
H1 uint32 `proxy:"h1,omitempty"`
|
||||
H2 uint32 `proxy:"h2,omitempty"`
|
||||
H3 uint32 `proxy:"h3,omitempty"`
|
||||
H4 uint32 `proxy:"h4,omitempty"`
|
||||
|
||||
// AmneziaWG v1.5
|
||||
I1 string `proxy:"i1,omitempty"`
|
||||
I2 string `proxy:"i2,omitempty"`
|
||||
I3 string `proxy:"i3,omitempty"`
|
||||
I4 string `proxy:"i4,omitempty"`
|
||||
I5 string `proxy:"i5,omitempty"`
|
||||
J1 string `proxy:"j1,omitempty"`
|
||||
J2 string `proxy:"j2,omitempty"`
|
||||
J3 string `proxy:"j3,omitempty"`
|
||||
Itime int64 `proxy:"itime,omitempty"`
|
||||
JC int `proxy:"jc,omitempty"`
|
||||
JMin int `proxy:"jmin,omitempty"`
|
||||
JMax int `proxy:"jmax,omitempty"`
|
||||
S1 int `proxy:"s1,omitempty"`
|
||||
S2 int `proxy:"s2,omitempty"`
|
||||
S3 int `proxy:"s3,omitempty"` // AmneziaWG v1.5 and v2
|
||||
S4 int `proxy:"s4,omitempty"` // AmneziaWG v1.5 and v2
|
||||
H1 string `proxy:"h1,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
H2 string `proxy:"h2,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
H3 string `proxy:"h3,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
H4 string `proxy:"h4,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
I1 string `proxy:"i1,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I2 string `proxy:"i2,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I3 string `proxy:"i3,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I4 string `proxy:"i4,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I5 string `proxy:"i5,omitempty"` // AmneziaWG v1.5 and v2
|
||||
J1 string `proxy:"j1,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
J2 string `proxy:"j2,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
J3 string `proxy:"j3,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
Itime int64 `proxy:"itime,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
}
|
||||
|
||||
type wgSingErrorHandler struct {
|
||||
@@ -412,17 +412,23 @@ func (w *WireGuard) genIpcConf(ctx context.Context, updateOnly bool) (string, er
|
||||
if w.option.AmneziaWGOption.S2 != 0 {
|
||||
ipcConf += "s2=" + strconv.Itoa(w.option.AmneziaWGOption.S2) + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H1 != 0 {
|
||||
ipcConf += "h1=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H1), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.S3 != 0 {
|
||||
ipcConf += "s3=" + strconv.Itoa(w.option.AmneziaWGOption.S3) + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H2 != 0 {
|
||||
ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.S4 != 0 {
|
||||
ipcConf += "s4=" + strconv.Itoa(w.option.AmneziaWGOption.S4) + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H3 != 0 {
|
||||
ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.H1 != "" {
|
||||
ipcConf += "h1=" + w.option.AmneziaWGOption.H1 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H4 != 0 {
|
||||
ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.H2 != "" {
|
||||
ipcConf += "h2=" + w.option.AmneziaWGOption.H2 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H3 != "" {
|
||||
ipcConf += "h3=" + w.option.AmneziaWGOption.H3 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H4 != "" {
|
||||
ipcConf += "h4=" + w.option.AmneziaWGOption.H4 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.I1 != "" {
|
||||
ipcConf += "i1=" + w.option.AmneziaWGOption.I1 + "\n"
|
||||
|
||||
+19
-14
@@ -862,20 +862,25 @@ proxies: # socks5
|
||||
# jmax: 501
|
||||
# s1: 30
|
||||
# s2: 40
|
||||
# h1: 123456
|
||||
# h2: 67543
|
||||
# h4: 32345
|
||||
# h3: 123123
|
||||
# # AmneziaWG v1.5
|
||||
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10>
|
||||
# i2: <b 0xf6ab3267fa><r 100>
|
||||
# i3: ""
|
||||
# i4: ""
|
||||
# i5: ""
|
||||
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10>
|
||||
# j2: <c><b 0xf6ab><t><wt 1000>
|
||||
# j3: <t><b 0xf6ab><c><r 10>
|
||||
# itime: 60
|
||||
# s3: 50 # AmneziaWG v1.5 and v2
|
||||
# s4: 5 # AmneziaWG v1.5 and v2
|
||||
# h1: 123456 # AmneziaWG v1.0 and v1.5
|
||||
# h2: 67543 # AmneziaWG v1.0 and v1.5
|
||||
# h3: 123123 # AmneziaWG v1.0 and v1.5
|
||||
# h4: 32345 # AmneziaWG v1.0 and v1.5
|
||||
# h1: 123456-123500 # AmneziaWG v2.0 only
|
||||
# h2: 67543-67550 # AmneziaWG v2.0 only
|
||||
# h3: 123123-123200 # AmneziaWG v2.0 only
|
||||
# h4: 32345-32350 # AmneziaWG v2.0 only
|
||||
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10> # AmneziaWG v1.5 and v2
|
||||
# i2: <b 0xf6ab3267fa><r 100> # AmneziaWG v1.5 and v2
|
||||
# i3: "" # AmneziaWG v1.5 and v2
|
||||
# i4: "" # AmneziaWG v1.5 and v2
|
||||
# i5: "" # AmneziaWG v1.5 and v2
|
||||
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10> # AmneziaWG v1.5 only (removed in v2)
|
||||
# j2: <c><b 0xf6ab><t><wt 1000> # AmneziaWG v1.5 only (removed in v2)
|
||||
# j3: <t><b 0xf6ab><c><r 10> # AmneziaWG v1.5 only (removed in v2)
|
||||
# itime: 60 # AmneziaWG v1.5 only (removed in v2)
|
||||
|
||||
# tuic
|
||||
- name: tuic
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ require (
|
||||
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905
|
||||
github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20
|
||||
github.com/mdlayher/netlink v1.7.2
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281
|
||||
github.com/metacubex/bart v0.20.5
|
||||
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b
|
||||
github.com/metacubex/blake3 v0.1.0
|
||||
|
||||
+2
-2
@@ -90,8 +90,8 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/
|
||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a h1:c1QSGpacSeQdBdWcEKZKGuWLcqIG2wxHEygAcXuDwS4=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 h1:09EM0sOLb2kfL0KETGhHujsBLB5iy5U/2yHRHsxf/pI=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
|
||||
github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM=
|
||||
github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc=
|
||||
github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM=
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
"build": "tsc"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tanstack/react-query": "5.85.5",
|
||||
"@tanstack/react-query": "5.85.6",
|
||||
"@tauri-apps/api": "2.6.0",
|
||||
"ahooks": "3.9.4",
|
||||
"dayjs": "1.11.13",
|
||||
"dayjs": "1.11.18",
|
||||
"lodash-es": "4.17.21",
|
||||
"ofetch": "1.4.1",
|
||||
"react": "19.1.1",
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"allotment": "1.20.4",
|
||||
"country-code-emoji": "2.3.0",
|
||||
"country-emoji": "1.5.6",
|
||||
"dayjs": "1.11.13",
|
||||
"dayjs": "1.11.18",
|
||||
"framer-motion": "12.23.12",
|
||||
"i18next": "25.4.2",
|
||||
"jotai": "2.13.1",
|
||||
@@ -58,10 +58,10 @@
|
||||
"@emotion/react": "11.14.0",
|
||||
"@iconify/json": "2.2.380",
|
||||
"@monaco-editor/react": "4.7.0",
|
||||
"@tanstack/react-query": "5.85.5",
|
||||
"@tanstack/react-router": "1.131.31",
|
||||
"@tanstack/react-router-devtools": "1.131.31",
|
||||
"@tanstack/router-plugin": "1.131.31",
|
||||
"@tanstack/react-query": "5.85.6",
|
||||
"@tanstack/react-router": "1.131.32",
|
||||
"@tanstack/react-router-devtools": "1.131.32",
|
||||
"@tanstack/router-plugin": "1.131.32",
|
||||
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
|
||||
"@tauri-apps/plugin-dialog": "2.3.0",
|
||||
"@tauri-apps/plugin-fs": "2.4.0",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
"manifest_version": 1,
|
||||
"latest": {
|
||||
"mihomo": "v1.19.13",
|
||||
"mihomo_alpha": "alpha-33cde65",
|
||||
"mihomo_alpha": "alpha-3b63fef",
|
||||
"clash_rs": "v0.9.0",
|
||||
"clash_premium": "2023-09-05-gdcc8d87",
|
||||
"clash_rs_alpha": "0.9.0-alpha+sha.117a718"
|
||||
"clash_rs_alpha": "0.9.0-alpha+sha.37539fb"
|
||||
},
|
||||
"arch_template": {
|
||||
"mihomo": {
|
||||
@@ -69,5 +69,5 @@
|
||||
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
|
||||
}
|
||||
},
|
||||
"updated_at": "2025-08-31T22:20:48.313Z"
|
||||
"updated_at": "2025-09-01T22:21:14.176Z"
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"typescript": "5.9.2",
|
||||
"typescript-eslint": "8.41.0"
|
||||
},
|
||||
"packageManager": "pnpm@10.15.0",
|
||||
"packageManager": "pnpm@10.15.1",
|
||||
"engines": {
|
||||
"node": "22.18.0"
|
||||
},
|
||||
|
||||
Generated
+69
-69
@@ -176,8 +176,8 @@ importers:
|
||||
frontend/interface:
|
||||
dependencies:
|
||||
'@tanstack/react-query':
|
||||
specifier: 5.85.5
|
||||
version: 5.85.5(react@19.1.1)
|
||||
specifier: 5.85.6
|
||||
version: 5.85.6(react@19.1.1)
|
||||
'@tauri-apps/api':
|
||||
specifier: 2.6.0
|
||||
version: 2.6.0
|
||||
@@ -185,8 +185,8 @@ importers:
|
||||
specifier: 3.9.4
|
||||
version: 3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
dayjs:
|
||||
specifier: 1.11.13
|
||||
version: 1.11.13
|
||||
specifier: 1.11.18
|
||||
version: 1.11.18
|
||||
lodash-es:
|
||||
specifier: 4.17.21
|
||||
version: 4.17.21
|
||||
@@ -238,7 +238,7 @@ importers:
|
||||
version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@mui/x-date-pickers':
|
||||
specifier: 8.10.2
|
||||
version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@nyanpasu/interface':
|
||||
specifier: workspace:^
|
||||
version: link:../interface
|
||||
@@ -250,7 +250,7 @@ importers:
|
||||
version: 4.1.12
|
||||
'@tanstack/router-zod-adapter':
|
||||
specifier: 1.81.5
|
||||
version: 1.81.5(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)
|
||||
version: 1.81.5(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)
|
||||
'@tauri-apps/api':
|
||||
specifier: 2.6.0
|
||||
version: 2.6.0
|
||||
@@ -270,8 +270,8 @@ importers:
|
||||
specifier: 1.5.6
|
||||
version: 1.5.6
|
||||
dayjs:
|
||||
specifier: 1.11.13
|
||||
version: 1.11.13
|
||||
specifier: 1.11.18
|
||||
version: 1.11.18
|
||||
framer-motion:
|
||||
specifier: 12.23.12
|
||||
version: 12.23.12(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
@@ -280,13 +280,13 @@ importers:
|
||||
version: 25.4.2(typescript@5.9.2)
|
||||
jotai:
|
||||
specifier: 2.13.1
|
||||
version: 2.13.1(@babel/core@7.26.10)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1)
|
||||
version: 2.13.1(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1)
|
||||
json-schema:
|
||||
specifier: 0.4.0
|
||||
version: 0.4.0
|
||||
material-react-table:
|
||||
specifier: npm:@greenhat616/material-react-table@4.0.0
|
||||
version: '@greenhat616/material-react-table@4.0.0(8c5184cacde5eaa7b33c3b8210f40105)'
|
||||
version: '@greenhat616/material-react-table@4.0.0(9173903a3b01e6e6c7f2384a2071a1b9)'
|
||||
monaco-editor:
|
||||
specifier: 0.52.2
|
||||
version: 0.52.2
|
||||
@@ -307,7 +307,7 @@ importers:
|
||||
version: 1.6.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
react-hook-form-mui:
|
||||
specifier: 7.6.2
|
||||
version: 7.6.2(58abb2a4187b63d3bc2ea3bcc4bbaf7a)
|
||||
version: 7.6.2(82e2072ebaeb0c3b1c2692596120d0e5)
|
||||
react-i18next:
|
||||
specifier: 15.7.2
|
||||
version: 15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)
|
||||
@@ -349,17 +349,17 @@ importers:
|
||||
specifier: 4.7.0
|
||||
version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/react-query':
|
||||
specifier: 5.85.5
|
||||
version: 5.85.5(react@19.1.1)
|
||||
specifier: 5.85.6
|
||||
version: 5.85.6(react@19.1.1)
|
||||
'@tanstack/react-router':
|
||||
specifier: 1.131.31
|
||||
version: 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
specifier: 1.131.32
|
||||
version: 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/react-router-devtools':
|
||||
specifier: 1.131.31
|
||||
version: 1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.30)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)
|
||||
specifier: 1.131.32
|
||||
version: 1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.32)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)
|
||||
'@tanstack/router-plugin':
|
||||
specifier: 1.131.31
|
||||
version: 1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))
|
||||
specifier: 1.131.32
|
||||
version: 1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))
|
||||
'@tauri-apps/plugin-clipboard-manager':
|
||||
specifier: 2.3.0
|
||||
version: 2.3.0
|
||||
@@ -3019,24 +3019,24 @@ packages:
|
||||
resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@tanstack/query-core@5.85.5':
|
||||
resolution: {integrity: sha512-KO0WTob4JEApv69iYp1eGvfMSUkgw//IpMnq+//cORBzXf0smyRwPLrUvEe5qtAEGjwZTXrjxg+oJNP/C00t6w==}
|
||||
'@tanstack/query-core@5.85.6':
|
||||
resolution: {integrity: sha512-hCj0TktzdCv2bCepIdfwqVwUVWb+GSHm1Jnn8w+40lfhQ3m7lCO7ADRUJy+2unxQ/nzjh2ipC6ye69NDW3l73g==}
|
||||
|
||||
'@tanstack/react-query@5.85.5':
|
||||
resolution: {integrity: sha512-/X4EFNcnPiSs8wM2v+b6DqS5mmGeuJQvxBglmDxl6ZQb5V26ouD2SJYAcC3VjbNwqhY2zjxVD15rDA5nGbMn3A==}
|
||||
'@tanstack/react-query@5.85.6':
|
||||
resolution: {integrity: sha512-VUAag4ERjh+qlmg0wNivQIVCZUrYndqYu3/wPCVZd4r0E+1IqotbeyGTc+ICroL/PqbpSaGZg02zSWYfcvxbdA==}
|
||||
peerDependencies:
|
||||
react: ^18 || ^19
|
||||
|
||||
'@tanstack/react-router-devtools@1.131.31':
|
||||
resolution: {integrity: sha512-M6zWv5d3BAleBFBgqqHGsGOzfaAVCRcLGaWxDdCFEF9RnJU7WvdUiIrAoFwS1Byg6MTd2IW/9LnjOxrR9xlCWQ==}
|
||||
'@tanstack/react-router-devtools@1.131.32':
|
||||
resolution: {integrity: sha512-7Pf25kSEJfAUqYlxuQb+Nquy7YUO1rOsrbYeeU1rv0WYSiyB0dOAOZmcRmQ0zl2TCtEkZnepcL5Hbmb5CamMBA==}
|
||||
engines: {node: '>=12'}
|
||||
peerDependencies:
|
||||
'@tanstack/react-router': ^1.131.31
|
||||
'@tanstack/react-router': ^1.131.32
|
||||
react: '>=18.0.0 || >=19.0.0'
|
||||
react-dom: '>=18.0.0 || >=19.0.0'
|
||||
|
||||
'@tanstack/react-router@1.131.31':
|
||||
resolution: {integrity: sha512-fN71d3BfRD46fpPwaoTf1hcuVWU9bJV5x6y2yyzaz9qDttwZR5RmPK/oi5zSo7o3kvWp4CND9bVjBzSK1BaUcg==}
|
||||
'@tanstack/react-router@1.131.32':
|
||||
resolution: {integrity: sha512-QvT7vV8ic7jOh3U8c2FkzdnHZ7eejPaneNQacJm4Op28aSpkFRwIU3S15pPYqyiLr8DnG5L75ADfSqlJ18ZGpw==}
|
||||
engines: {node: '>=12'}
|
||||
peerDependencies:
|
||||
react: '>=18.0.0 || >=19.0.0'
|
||||
@@ -3061,15 +3061,15 @@ packages:
|
||||
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||
|
||||
'@tanstack/router-core@1.131.30':
|
||||
resolution: {integrity: sha512-fBHn6MSqodYZfky7Z4UyXaxYdIom2QpwaBmra9eM9SRUHmbSCQJ2CESQzGzxFDENtvtyXGsSpGbe7k7GTJctKw==}
|
||||
'@tanstack/router-core@1.131.32':
|
||||
resolution: {integrity: sha512-6pIX4ZS6tyxVTQKAKsGE6xl6S7OekyPPRqEbOTmIxUJ5vBL0iAu3ir7YTk5a7PEM6lDe/nUI2oVV5zkarEEiPQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@tanstack/router-devtools-core@1.131.30':
|
||||
resolution: {integrity: sha512-DA1QwJbH58b4rQEZ3UYyHnOsEfN59yT8Oyl7t4q3orahp4qc0Y1BIFcIeI2sYhVs/+7iMsQ7eLaR1j55vl0TwQ==}
|
||||
'@tanstack/router-devtools-core@1.131.32':
|
||||
resolution: {integrity: sha512-VQPAA/B9L68hl16KyIonUEooJOfL75rJJjfashcVGDRsssGCCfCjvHS8Cw0mSYeVJ0iawgKPdIUyCZAqGycYAg==}
|
||||
engines: {node: '>=12'}
|
||||
peerDependencies:
|
||||
'@tanstack/router-core': ^1.131.30
|
||||
'@tanstack/router-core': ^1.131.32
|
||||
csstype: ^3.0.10
|
||||
solid-js: '>=1.9.5'
|
||||
tiny-invariant: ^1.3.3
|
||||
@@ -3077,16 +3077,16 @@ packages:
|
||||
csstype:
|
||||
optional: true
|
||||
|
||||
'@tanstack/router-generator@1.131.30':
|
||||
resolution: {integrity: sha512-6mK+xiQEWn5vgL+EAJkTU7FMvYJstJ+GL0aP/O4YHcxxgQd0kkEaKT4NfwfNKFnBEYE3qIkLbsPi0W2OUK1JaQ==}
|
||||
'@tanstack/router-generator@1.131.32':
|
||||
resolution: {integrity: sha512-HQVnytwHBFr4frvsqwl4hLNYtvXp73ttoQOZyLwhxqUdMSoQ4F26sJ1RYKPGGhRaLfBqnGbTX6tLq5hm/ePBVQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
'@tanstack/router-plugin@1.131.31':
|
||||
resolution: {integrity: sha512-S06efeEC8VM+LkC5JbYgA+aYxe3INwAzVZFU4Omy1yvYNPrYCSLq0gEu8vqC+zjQdJh8y6ReqVEgLse8br4DWw==}
|
||||
'@tanstack/router-plugin@1.131.32':
|
||||
resolution: {integrity: sha512-HKrBXnlRkhvXGWYPaRl1ASj3Y++7Y0nGKeTFgHSc2nIzlcuPTHr5DROr3nC2DsfPxAkvUzPVpUNpMb0cbMcqHw==}
|
||||
engines: {node: '>=12'}
|
||||
peerDependencies:
|
||||
'@rsbuild/core': '>=1.0.2'
|
||||
'@tanstack/react-router': ^1.131.31
|
||||
'@tanstack/react-router': ^1.131.32
|
||||
vite: '>=5.0.0 || >=6.0.0'
|
||||
vite-plugin-solid: ^2.11.2
|
||||
webpack: '>=5.92.0'
|
||||
@@ -4556,8 +4556,8 @@ packages:
|
||||
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
dayjs@1.11.13:
|
||||
resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
|
||||
dayjs@1.11.18:
|
||||
resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
|
||||
|
||||
de-indent@1.0.2:
|
||||
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
|
||||
@@ -10148,13 +10148,13 @@ snapshots:
|
||||
|
||||
'@fastify/busboy@2.1.1': {}
|
||||
|
||||
'@greenhat616/material-react-table@4.0.0(8c5184cacde5eaa7b33c3b8210f40105)':
|
||||
'@greenhat616/material-react-table@4.0.0(9173903a3b01e6e6c7f2384a2071a1b9)':
|
||||
dependencies:
|
||||
'@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
|
||||
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
|
||||
'@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
|
||||
'@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/match-sorter-utils': 8.19.4
|
||||
'@tanstack/react-table': 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/react-virtual': 3.13.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
@@ -10404,7 +10404,7 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@types/react': 19.1.12
|
||||
|
||||
'@mui/x-date-pickers@8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
|
||||
'@mui/x-date-pickers@8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.28.2
|
||||
'@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
@@ -10420,7 +10420,7 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@emotion/react': 11.14.0(@types/react@19.1.12)(react@19.1.1)
|
||||
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
|
||||
dayjs: 1.11.13
|
||||
dayjs: 1.11.18
|
||||
transitivePeerDependencies:
|
||||
- '@types/react'
|
||||
|
||||
@@ -11304,17 +11304,17 @@ snapshots:
|
||||
dependencies:
|
||||
remove-accents: 0.5.0
|
||||
|
||||
'@tanstack/query-core@5.85.5': {}
|
||||
'@tanstack/query-core@5.85.6': {}
|
||||
|
||||
'@tanstack/react-query@5.85.5(react@19.1.1)':
|
||||
'@tanstack/react-query@5.85.6(react@19.1.1)':
|
||||
dependencies:
|
||||
'@tanstack/query-core': 5.85.5
|
||||
'@tanstack/query-core': 5.85.6
|
||||
react: 19.1.1
|
||||
|
||||
'@tanstack/react-router-devtools@1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.30)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
|
||||
'@tanstack/react-router-devtools@1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.32)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
|
||||
dependencies:
|
||||
'@tanstack/react-router': 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/router-devtools-core': 1.131.30(@tanstack/router-core@1.131.30)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
|
||||
'@tanstack/react-router': 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/router-devtools-core': 1.131.32(@tanstack/router-core@1.131.32)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
|
||||
react: 19.1.1
|
||||
react-dom: 19.1.1(react@19.1.1)
|
||||
transitivePeerDependencies:
|
||||
@@ -11323,11 +11323,11 @@ snapshots:
|
||||
- solid-js
|
||||
- tiny-invariant
|
||||
|
||||
'@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
|
||||
'@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)':
|
||||
dependencies:
|
||||
'@tanstack/history': 1.131.2
|
||||
'@tanstack/react-store': 0.7.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/router-core': 1.131.30
|
||||
'@tanstack/router-core': 1.131.32
|
||||
isbot: 5.1.28
|
||||
react: 19.1.1
|
||||
react-dom: 19.1.1(react@19.1.1)
|
||||
@@ -11353,7 +11353,7 @@ snapshots:
|
||||
react: 19.1.1
|
||||
react-dom: 19.1.1(react@19.1.1)
|
||||
|
||||
'@tanstack/router-core@1.131.30':
|
||||
'@tanstack/router-core@1.131.32':
|
||||
dependencies:
|
||||
'@tanstack/history': 1.131.2
|
||||
'@tanstack/store': 0.7.0
|
||||
@@ -11363,9 +11363,9 @@ snapshots:
|
||||
tiny-invariant: 1.3.3
|
||||
tiny-warning: 1.0.3
|
||||
|
||||
'@tanstack/router-devtools-core@1.131.30(@tanstack/router-core@1.131.30)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
|
||||
'@tanstack/router-devtools-core@1.131.32(@tanstack/router-core@1.131.32)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
|
||||
dependencies:
|
||||
'@tanstack/router-core': 1.131.30
|
||||
'@tanstack/router-core': 1.131.32
|
||||
clsx: 2.1.1
|
||||
goober: 2.1.16(csstype@3.1.3)
|
||||
solid-js: 1.9.5
|
||||
@@ -11373,9 +11373,9 @@ snapshots:
|
||||
optionalDependencies:
|
||||
csstype: 3.1.3
|
||||
|
||||
'@tanstack/router-generator@1.131.30':
|
||||
'@tanstack/router-generator@1.131.32':
|
||||
dependencies:
|
||||
'@tanstack/router-core': 1.131.30
|
||||
'@tanstack/router-core': 1.131.32
|
||||
'@tanstack/router-utils': 1.131.2
|
||||
'@tanstack/virtual-file-routes': 1.131.2
|
||||
prettier: 3.6.2
|
||||
@@ -11386,7 +11386,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@tanstack/router-plugin@1.131.31(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))':
|
||||
'@tanstack/router-plugin@1.131.32(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))':
|
||||
dependencies:
|
||||
'@babel/core': 7.28.3
|
||||
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3)
|
||||
@@ -11394,8 +11394,8 @@ snapshots:
|
||||
'@babel/template': 7.27.2
|
||||
'@babel/traverse': 7.28.3
|
||||
'@babel/types': 7.28.2
|
||||
'@tanstack/router-core': 1.131.30
|
||||
'@tanstack/router-generator': 1.131.30
|
||||
'@tanstack/router-core': 1.131.32
|
||||
'@tanstack/router-generator': 1.131.32
|
||||
'@tanstack/router-utils': 1.131.2
|
||||
'@tanstack/virtual-file-routes': 1.131.2
|
||||
babel-dead-code-elimination: 1.0.10
|
||||
@@ -11403,7 +11403,7 @@ snapshots:
|
||||
unplugin: 2.3.9
|
||||
zod: 3.25.76
|
||||
optionalDependencies:
|
||||
'@tanstack/react-router': 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/react-router': 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.90.0)(sass@1.90.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
@@ -11419,9 +11419,9 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)':
|
||||
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(zod@4.0.17)':
|
||||
dependencies:
|
||||
'@tanstack/react-router': 1.131.31(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@tanstack/react-router': 1.131.32(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
zod: 4.0.17
|
||||
|
||||
'@tanstack/store@0.7.0': {}
|
||||
@@ -12133,7 +12133,7 @@ snapshots:
|
||||
ahooks@3.9.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.28.2
|
||||
dayjs: 1.11.13
|
||||
dayjs: 1.11.18
|
||||
intersection-observer: 0.12.2
|
||||
js-cookie: 3.0.5
|
||||
lodash: 4.17.21
|
||||
@@ -13023,7 +13023,7 @@ snapshots:
|
||||
es-errors: 1.3.0
|
||||
is-data-view: 1.0.2
|
||||
|
||||
dayjs@1.11.13: {}
|
||||
dayjs@1.11.18: {}
|
||||
|
||||
de-indent@1.0.2: {}
|
||||
|
||||
@@ -14747,9 +14747,9 @@ snapshots:
|
||||
|
||||
jju@1.4.0: {}
|
||||
|
||||
jotai@2.13.1(@babel/core@7.26.10)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1):
|
||||
jotai@2.13.1(@babel/core@7.28.3)(@babel/template@7.27.2)(@types/react@19.1.12)(react@19.1.1):
|
||||
optionalDependencies:
|
||||
'@babel/core': 7.26.10
|
||||
'@babel/core': 7.28.3
|
||||
'@babel/template': 7.27.2
|
||||
'@types/react': 19.1.12
|
||||
react: 19.1.1
|
||||
@@ -16017,14 +16017,14 @@ snapshots:
|
||||
react: 19.1.1
|
||||
react-dom: 19.1.1(react@19.1.1)
|
||||
|
||||
react-hook-form-mui@7.6.2(58abb2a4187b63d3bc2ea3bcc4bbaf7a):
|
||||
react-hook-form-mui@7.6.2(82e2072ebaeb0c3b1c2692596120d0e5):
|
||||
dependencies:
|
||||
'@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
react: 19.1.1
|
||||
react-hook-form: 7.52.1(react@19.1.1)
|
||||
optionalDependencies:
|
||||
'@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.12)(react@19.1.1)
|
||||
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
'@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(react@19.1.1))(@types/react@19.1.12)(dayjs@1.11.18)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)
|
||||
|
||||
react-hook-form@7.52.1(react@19.1.1):
|
||||
dependencies:
|
||||
|
||||
+3
-3
@@ -35,7 +35,7 @@ it on BCM4708 family.
|
||||
/* called during probe() after chip reset completes */
|
||||
--- a/drivers/usb/host/xhci.c
|
||||
+++ b/drivers/usb/host/xhci.c
|
||||
@@ -162,6 +162,49 @@ int xhci_start(struct xhci_hcd *xhci)
|
||||
@@ -163,6 +163,49 @@ int xhci_start(struct xhci_hcd *xhci)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ it on BCM4708 family.
|
||||
+ }
|
||||
+
|
||||
+ /* Free virt device */
|
||||
+ xhci_free_virt_device(xhci, slot_id);
|
||||
+ xhci_disable_and_free_slot(xhci, slot_id);
|
||||
+
|
||||
+ /* We're done if controller is already running */
|
||||
+ if (readl(&xhci->op_regs->command) & CMD_RUN)
|
||||
@@ -85,7 +85,7 @@ it on BCM4708 family.
|
||||
/*
|
||||
* Reset a halted HC.
|
||||
*
|
||||
@@ -498,6 +541,15 @@ static int xhci_run_finished(struct xhci
|
||||
@@ -500,6 +543,15 @@ static int xhci_run_finished(struct xhci
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ Link: https://lore.kernel.org/linux-mtd/20231002140458.147605-1-mmkurbanov@salut
|
||||
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
|
||||
--- a/drivers/mtd/nand/spi/core.c
|
||||
+++ b/drivers/mtd/nand/spi/core.c
|
||||
@@ -940,6 +940,7 @@ static const struct spinand_manufacturer
|
||||
@@ -943,6 +943,7 @@ static const struct spinand_manufacturer
|
||||
&alliancememory_spinand_manufacturer,
|
||||
&ato_spinand_manufacturer,
|
||||
&esmt_c8_spinand_manufacturer,
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
From: wangzijie <wangzijie1@honor.com>
|
||||
To: <akpm@linux-foundation.org>, <brauner@kernel.org>,
|
||||
<viro@zeniv.linux.org.uk>, <adobriyan@gmail.com>,
|
||||
<rick.p.edgecombe@intel.com>, <ast@kernel.org>,
|
||||
<k.shutemov@gmail.com>, <jirislaby@kernel.org>,
|
||||
<linux-fsdevel@vger.kernel.org>
|
||||
Cc: <polynomial-c@gmx.de>, <gregkh@linuxfoundation.org>,
|
||||
<stable@vger.kernel.org>, <regressions@lists.linux.dev>,
|
||||
wangzijie <wangzijie1@honor.com>
|
||||
Subject: [PATCH v3] proc: fix missing pde_set_flags() for net proc files
|
||||
Date: Thu, 21 Aug 2025 18:58:06 +0800 [thread overview]
|
||||
Message-ID: <20250821105806.1453833-1-wangzijie1@honor.com> (raw)
|
||||
|
||||
To avoid potential UAF issues during module removal races, we use pde_set_flags()
|
||||
to save proc_ops flags in PDE itself before proc_register(), and then use
|
||||
pde_has_proc_*() helpers instead of directly dereferencing pde->proc_ops->*.
|
||||
|
||||
However, the pde_set_flags() call was missing when creating net related proc files.
|
||||
This omission caused incorrect behavior which FMODE_LSEEK was being cleared
|
||||
inappropriately in proc_reg_open() for net proc files. Lars reported it in this link[1].
|
||||
|
||||
Fix this by ensuring pde_set_flags() is called when register proc entry, and add
|
||||
NULL check for proc_ops in pde_set_flags().
|
||||
|
||||
[1]: https://lore.kernel.org/all/20250815195616.64497967@chagall.paradoxon.rec/
|
||||
|
||||
Fixes: ff7ec8dc1b64 ("proc: use the same treatment to check proc_lseek as ones for proc_read_iter et.al")
|
||||
Cc: stable@vger.kernel.org
|
||||
Reported-by: Lars Wendler <polynomial-c@gmx.de>
|
||||
Signed-off-by: wangzijie <wangzijie1@honor.com>
|
||||
---
|
||||
v3:
|
||||
- followed by Christian's suggestion to stash pde->proc_ops in a local const variable
|
||||
v2:
|
||||
- followed by Jiri's suggestion to refractor code and reformat commit message
|
||||
---
|
||||
fs/proc/generic.c | 38 +++++++++++++++++++++-----------------
|
||||
1 file changed, 21 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/fs/proc/generic.c
|
||||
+++ b/fs/proc/generic.c
|
||||
@@ -362,6 +362,25 @@ static const struct inode_operations pro
|
||||
.setattr = proc_notify_change,
|
||||
};
|
||||
|
||||
+static void pde_set_flags(struct proc_dir_entry *pde)
|
||||
+{
|
||||
+ const struct proc_ops *proc_ops = pde->proc_ops;
|
||||
+
|
||||
+ if (!proc_ops)
|
||||
+ return;
|
||||
+
|
||||
+ if (proc_ops->proc_flags & PROC_ENTRY_PERMANENT)
|
||||
+ pde->flags |= PROC_ENTRY_PERMANENT;
|
||||
+ if (proc_ops->proc_read_iter)
|
||||
+ pde->flags |= PROC_ENTRY_proc_read_iter;
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ if (proc_ops->proc_compat_ioctl)
|
||||
+ pde->flags |= PROC_ENTRY_proc_compat_ioctl;
|
||||
+#endif
|
||||
+ if (proc_ops->proc_lseek)
|
||||
+ pde->flags |= PROC_ENTRY_proc_lseek;
|
||||
+}
|
||||
+
|
||||
/* returns the registered entry, or frees dp and returns NULL on failure */
|
||||
struct proc_dir_entry *proc_register(struct proc_dir_entry *dir,
|
||||
struct proc_dir_entry *dp)
|
||||
@@ -369,6 +388,8 @@ struct proc_dir_entry *proc_register(str
|
||||
if (proc_alloc_inum(&dp->low_ino))
|
||||
goto out_free_entry;
|
||||
|
||||
+ pde_set_flags(dp);
|
||||
+
|
||||
write_lock(&proc_subdir_lock);
|
||||
dp->parent = dir;
|
||||
if (pde_subdir_insert(dir, dp) == false) {
|
||||
@@ -557,20 +578,6 @@ struct proc_dir_entry *proc_create_reg(c
|
||||
return p;
|
||||
}
|
||||
|
||||
-static void pde_set_flags(struct proc_dir_entry *pde)
|
||||
-{
|
||||
- if (pde->proc_ops->proc_flags & PROC_ENTRY_PERMANENT)
|
||||
- pde->flags |= PROC_ENTRY_PERMANENT;
|
||||
- if (pde->proc_ops->proc_read_iter)
|
||||
- pde->flags |= PROC_ENTRY_proc_read_iter;
|
||||
-#ifdef CONFIG_COMPAT
|
||||
- if (pde->proc_ops->proc_compat_ioctl)
|
||||
- pde->flags |= PROC_ENTRY_proc_compat_ioctl;
|
||||
-#endif
|
||||
- if (pde->proc_ops->proc_lseek)
|
||||
- pde->flags |= PROC_ENTRY_proc_lseek;
|
||||
-}
|
||||
-
|
||||
struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
|
||||
struct proc_dir_entry *parent,
|
||||
const struct proc_ops *proc_ops, void *data)
|
||||
@@ -581,7 +588,6 @@ struct proc_dir_entry *proc_create_data(
|
||||
if (!p)
|
||||
return NULL;
|
||||
p->proc_ops = proc_ops;
|
||||
- pde_set_flags(p);
|
||||
return proc_register(parent, p);
|
||||
}
|
||||
EXPORT_SYMBOL(proc_create_data);
|
||||
@@ -632,7 +638,6 @@ struct proc_dir_entry *proc_create_seq_p
|
||||
p->proc_ops = &proc_seq_ops;
|
||||
p->seq_ops = ops;
|
||||
p->state_size = state_size;
|
||||
- pde_set_flags(p);
|
||||
return proc_register(parent, p);
|
||||
}
|
||||
EXPORT_SYMBOL(proc_create_seq_private);
|
||||
@@ -663,7 +668,6 @@ struct proc_dir_entry *proc_create_singl
|
||||
return NULL;
|
||||
p->proc_ops = &proc_single_ops;
|
||||
p->single_show = show;
|
||||
- pde_set_flags(p);
|
||||
return proc_register(parent, p);
|
||||
}
|
||||
EXPORT_SYMBOL(proc_create_single_data);
|
||||
+2
-2
@@ -24,7 +24,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
|
||||
--- a/drivers/net/ppp/ppp_generic.c
|
||||
+++ b/drivers/net/ppp/ppp_generic.c
|
||||
@@ -3500,6 +3500,10 @@ ppp_connect_channel(struct channel *pch,
|
||||
@@ -3504,6 +3504,10 @@ ppp_connect_channel(struct channel *pch,
|
||||
ret = -ENOTCONN;
|
||||
goto outl;
|
||||
}
|
||||
@@ -47,7 +47,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||
if (error) {
|
||||
--- a/drivers/net/ppp/pptp.c
|
||||
+++ b/drivers/net/ppp/pptp.c
|
||||
@@ -465,6 +465,7 @@ static int pptp_connect(struct socket *s
|
||||
@@ -469,6 +469,7 @@ static int pptp_connect(struct socket *s
|
||||
po->chan.mtu -= PPTP_HEADER_OVERHEAD;
|
||||
|
||||
po->chan.hdrlen = 2 + sizeof(struct pptp_gre_header);
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
phy_unlock_mdio_bus(phydev);
|
||||
--- a/drivers/net/phy/mscc/mscc.h
|
||||
+++ b/drivers/net/phy/mscc/mscc.h
|
||||
@@ -416,6 +416,11 @@ struct vsc8531_private {
|
||||
@@ -428,6 +428,11 @@ struct vsc8531_private {
|
||||
* gpio_lock: used for PHC operations. Common for all PHYs as the load/save GPIO
|
||||
* is shared.
|
||||
*/
|
||||
|
||||
+1
-1
@@ -177,7 +177,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (type) {
|
||||
@@ -1916,9 +1916,9 @@ void mtk_wed_add_hw(struct device_node *
|
||||
@@ -1915,9 +1915,9 @@ void mtk_wed_add_hw(struct device_node *
|
||||
hw->wdma = wdma;
|
||||
hw->index = index;
|
||||
hw->irq = irq;
|
||||
|
||||
+2
-2
@@ -142,7 +142,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
return -ENOMEM;
|
||||
|
||||
wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
|
||||
@@ -1930,7 +1937,12 @@ void mtk_wed_add_hw(struct device_node *
|
||||
@@ -1929,7 +1936,12 @@ void mtk_wed_add_hw(struct device_node *
|
||||
hw->irq = irq;
|
||||
hw->version = eth->soc->version;
|
||||
|
||||
@@ -156,7 +156,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||
hw->mirror = syscon_regmap_lookup_by_phandle(eth_np,
|
||||
"mediatek,pcie-mirror");
|
||||
hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np,
|
||||
@@ -1944,6 +1956,8 @@ void mtk_wed_add_hw(struct device_node *
|
||||
@@ -1943,6 +1955,8 @@ void mtk_wed_add_hw(struct device_node *
|
||||
regmap_write(hw->mirror, 0, 0);
|
||||
regmap_write(hw->mirror, 4, 0);
|
||||
}
|
||||
|
||||
+2
-2
@@ -43,7 +43,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
|
||||
--- a/crypto/jitterentropy-kcapi.c
|
||||
+++ b/crypto/jitterentropy-kcapi.c
|
||||
@@ -245,7 +245,7 @@ static int jent_kcapi_init(struct crypto
|
||||
@@ -246,7 +246,7 @@ static int jent_kcapi_init(struct crypto
|
||||
crypto_shash_init(sdesc);
|
||||
rng->sdesc = sdesc;
|
||||
|
||||
@@ -52,7 +52,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
if (!rng->entropy_collector) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
@@ -334,7 +334,7 @@ static int __init jent_mod_init(void)
|
||||
@@ -335,7 +335,7 @@ static int __init jent_mod_init(void)
|
||||
|
||||
desc->tfm = tfm;
|
||||
crypto_shash_init(desc);
|
||||
|
||||
+2
-2
@@ -53,7 +53,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
depends on CRYPTO_JITTERENTROPY
|
||||
--- a/crypto/jitterentropy-kcapi.c
|
||||
+++ b/crypto/jitterentropy-kcapi.c
|
||||
@@ -256,7 +256,9 @@ static int jent_kcapi_init(struct crypto
|
||||
@@ -257,7 +257,9 @@ static int jent_kcapi_init(struct crypto
|
||||
crypto_shash_init(sdesc);
|
||||
rng->sdesc = sdesc;
|
||||
|
||||
@@ -64,7 +64,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
if (!rng->entropy_collector) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
@@ -345,7 +347,7 @@ static int __init jent_mod_init(void)
|
||||
@@ -346,7 +348,7 @@ static int __init jent_mod_init(void)
|
||||
|
||||
desc->tfm = tfm;
|
||||
crypto_shash_init(desc);
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
|
||||
--- a/crypto/jitterentropy-kcapi.c
|
||||
+++ b/crypto/jitterentropy-kcapi.c
|
||||
@@ -347,7 +347,7 @@ static int __init jent_mod_init(void)
|
||||
@@ -348,7 +348,7 @@ static int __init jent_mod_init(void)
|
||||
|
||||
desc->tfm = tfm;
|
||||
crypto_shash_init(desc);
|
||||
|
||||
@@ -102,7 +102,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
endif # MODULES
|
||||
--- a/kernel/module/main.c
|
||||
+++ b/kernel/module/main.c
|
||||
@@ -997,6 +997,7 @@ size_t modinfo_attrs_count = ARRAY_SIZE(
|
||||
@@ -999,6 +999,7 @@ size_t modinfo_attrs_count = ARRAY_SIZE(
|
||||
|
||||
static const char vermagic[] = VERMAGIC_STRING;
|
||||
|
||||
@@ -110,7 +110,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
int try_to_force_load(struct module *mod, const char *reason)
|
||||
{
|
||||
#ifdef CONFIG_MODULE_FORCE_LOAD
|
||||
@@ -1008,6 +1009,7 @@ int try_to_force_load(struct module *mod
|
||||
@@ -1010,6 +1011,7 @@ int try_to_force_load(struct module *mod
|
||||
return -ENOEXEC;
|
||||
#endif
|
||||
}
|
||||
@@ -118,7 +118,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
/* Parse tag=value strings from .modinfo section */
|
||||
char *module_next_tag_pair(char *string, unsigned long *secsize)
|
||||
@@ -2075,9 +2077,11 @@ static void module_augment_kernel_taints
|
||||
@@ -2077,9 +2079,11 @@ static void module_augment_kernel_taints
|
||||
|
||||
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
|
||||
{
|
||||
@@ -131,7 +131,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
|
||||
modmagic = NULL;
|
||||
|
||||
@@ -2091,6 +2095,7 @@ static int check_modinfo(struct module *
|
||||
@@ -2093,6 +2097,7 @@ static int check_modinfo(struct module *
|
||||
info->name, modmagic, vermagic);
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
|
||||
skb = codel_dequeue(sch, &sch->qstats.backlog, &q->cparams,
|
||||
&flow->cvars, &q->cstats, qdisc_pkt_len,
|
||||
codel_get_enqueue_time, drop_func, dequeue_func);
|
||||
+
|
||||
+
|
||||
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
|
||||
+ * parent class, dequeue in parent qdisc will do the same if we
|
||||
+ * return skb. Temporary increment qlen if we have skb.
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
|
||||
skb = codel_dequeue(sch, &sch->qstats.backlog, &q->cparams,
|
||||
&flow->cvars, &q->cstats, qdisc_pkt_len,
|
||||
codel_get_enqueue_time, drop_func, dequeue_func);
|
||||
+
|
||||
+
|
||||
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
|
||||
+ * parent class, dequeue in parent qdisc will do the same if we
|
||||
+ * return skb. Temporary increment qlen if we have skb.
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
|
||||
skb = codel_dequeue(sch, &sch->qstats.backlog, &q->cparams,
|
||||
&flow->cvars, &q->cstats, qdisc_pkt_len,
|
||||
codel_get_enqueue_time, drop_func, dequeue_func);
|
||||
+
|
||||
+
|
||||
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
|
||||
+ * parent class, dequeue in parent qdisc will do the same if we
|
||||
+ * return skb. Temporary increment qlen if we have skb.
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
/**
|
||||
@@ -258,6 +260,4 @@ static inline void *offset_to_ptr(const
|
||||
@@ -250,6 +252,4 @@ static inline void *offset_to_ptr(const
|
||||
*/
|
||||
#define prevent_tail_call_optimization() mb()
|
||||
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ Submitted-by: Daniel Danzberger <daniel@dd-wrt.com>
|
||||
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
|
||||
--- a/drivers/mtd/nand/spi/core.c
|
||||
+++ b/drivers/mtd/nand/spi/core.c
|
||||
@@ -940,6 +940,7 @@ static const struct spinand_manufacturer
|
||||
@@ -943,6 +943,7 @@ static const struct spinand_manufacturer
|
||||
&alliancememory_spinand_manufacturer,
|
||||
&ato_spinand_manufacturer,
|
||||
&esmt_c8_spinand_manufacturer,
|
||||
|
||||
@@ -230,7 +230,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
{
|
||||
--- a/net/ipv6/ip6_offload.c
|
||||
+++ b/net/ipv6/ip6_offload.c
|
||||
@@ -319,6 +319,7 @@ out:
|
||||
@@ -321,6 +321,7 @@ out:
|
||||
|
||||
return pp;
|
||||
}
|
||||
@@ -238,7 +238,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
static struct sk_buff *sit_ip6ip6_gro_receive(struct list_head *head,
|
||||
struct sk_buff *skb)
|
||||
@@ -401,6 +402,7 @@ INDIRECT_CALLABLE_SCOPE int ipv6_gro_com
|
||||
@@ -403,6 +404,7 @@ INDIRECT_CALLABLE_SCOPE int ipv6_gro_com
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- a/drivers/bus/mhi/host/main.c
|
||||
+++ b/drivers/bus/mhi/host/main.c
|
||||
@@ -906,6 +906,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_
|
||||
@@ -916,6 +916,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_
|
||||
switch (event) {
|
||||
case MHI_EE_SBL:
|
||||
st = DEV_ST_TRANSITION_SBL;
|
||||
|
||||
@@ -87,26 +87,26 @@ type WireGuardPeerOption struct {
|
||||
}
|
||||
|
||||
type AmneziaWGOption struct {
|
||||
JC int `proxy:"jc,omitempty"`
|
||||
JMin int `proxy:"jmin,omitempty"`
|
||||
JMax int `proxy:"jmax,omitempty"`
|
||||
S1 int `proxy:"s1,omitempty"`
|
||||
S2 int `proxy:"s2,omitempty"`
|
||||
H1 uint32 `proxy:"h1,omitempty"`
|
||||
H2 uint32 `proxy:"h2,omitempty"`
|
||||
H3 uint32 `proxy:"h3,omitempty"`
|
||||
H4 uint32 `proxy:"h4,omitempty"`
|
||||
|
||||
// AmneziaWG v1.5
|
||||
I1 string `proxy:"i1,omitempty"`
|
||||
I2 string `proxy:"i2,omitempty"`
|
||||
I3 string `proxy:"i3,omitempty"`
|
||||
I4 string `proxy:"i4,omitempty"`
|
||||
I5 string `proxy:"i5,omitempty"`
|
||||
J1 string `proxy:"j1,omitempty"`
|
||||
J2 string `proxy:"j2,omitempty"`
|
||||
J3 string `proxy:"j3,omitempty"`
|
||||
Itime int64 `proxy:"itime,omitempty"`
|
||||
JC int `proxy:"jc,omitempty"`
|
||||
JMin int `proxy:"jmin,omitempty"`
|
||||
JMax int `proxy:"jmax,omitempty"`
|
||||
S1 int `proxy:"s1,omitempty"`
|
||||
S2 int `proxy:"s2,omitempty"`
|
||||
S3 int `proxy:"s3,omitempty"` // AmneziaWG v1.5 and v2
|
||||
S4 int `proxy:"s4,omitempty"` // AmneziaWG v1.5 and v2
|
||||
H1 string `proxy:"h1,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
H2 string `proxy:"h2,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
H3 string `proxy:"h3,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
H4 string `proxy:"h4,omitempty"` // In AmneziaWG v1.x, it was uint32, but our WeaklyTypedInput can handle this situation
|
||||
I1 string `proxy:"i1,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I2 string `proxy:"i2,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I3 string `proxy:"i3,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I4 string `proxy:"i4,omitempty"` // AmneziaWG v1.5 and v2
|
||||
I5 string `proxy:"i5,omitempty"` // AmneziaWG v1.5 and v2
|
||||
J1 string `proxy:"j1,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
J2 string `proxy:"j2,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
J3 string `proxy:"j3,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
Itime int64 `proxy:"itime,omitempty"` // AmneziaWG v1.5 only (removed in v2)
|
||||
}
|
||||
|
||||
type wgSingErrorHandler struct {
|
||||
@@ -412,17 +412,23 @@ func (w *WireGuard) genIpcConf(ctx context.Context, updateOnly bool) (string, er
|
||||
if w.option.AmneziaWGOption.S2 != 0 {
|
||||
ipcConf += "s2=" + strconv.Itoa(w.option.AmneziaWGOption.S2) + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H1 != 0 {
|
||||
ipcConf += "h1=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H1), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.S3 != 0 {
|
||||
ipcConf += "s3=" + strconv.Itoa(w.option.AmneziaWGOption.S3) + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H2 != 0 {
|
||||
ipcConf += "h2=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H2), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.S4 != 0 {
|
||||
ipcConf += "s4=" + strconv.Itoa(w.option.AmneziaWGOption.S4) + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H3 != 0 {
|
||||
ipcConf += "h3=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H3), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.H1 != "" {
|
||||
ipcConf += "h1=" + w.option.AmneziaWGOption.H1 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H4 != 0 {
|
||||
ipcConf += "h4=" + strconv.FormatUint(uint64(w.option.AmneziaWGOption.H4), 10) + "\n"
|
||||
if w.option.AmneziaWGOption.H2 != "" {
|
||||
ipcConf += "h2=" + w.option.AmneziaWGOption.H2 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H3 != "" {
|
||||
ipcConf += "h3=" + w.option.AmneziaWGOption.H3 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.H4 != "" {
|
||||
ipcConf += "h4=" + w.option.AmneziaWGOption.H4 + "\n"
|
||||
}
|
||||
if w.option.AmneziaWGOption.I1 != "" {
|
||||
ipcConf += "i1=" + w.option.AmneziaWGOption.I1 + "\n"
|
||||
|
||||
+19
-14
@@ -862,20 +862,25 @@ proxies: # socks5
|
||||
# jmax: 501
|
||||
# s1: 30
|
||||
# s2: 40
|
||||
# h1: 123456
|
||||
# h2: 67543
|
||||
# h4: 32345
|
||||
# h3: 123123
|
||||
# # AmneziaWG v1.5
|
||||
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10>
|
||||
# i2: <b 0xf6ab3267fa><r 100>
|
||||
# i3: ""
|
||||
# i4: ""
|
||||
# i5: ""
|
||||
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10>
|
||||
# j2: <c><b 0xf6ab><t><wt 1000>
|
||||
# j3: <t><b 0xf6ab><c><r 10>
|
||||
# itime: 60
|
||||
# s3: 50 # AmneziaWG v1.5 and v2
|
||||
# s4: 5 # AmneziaWG v1.5 and v2
|
||||
# h1: 123456 # AmneziaWG v1.0 and v1.5
|
||||
# h2: 67543 # AmneziaWG v1.0 and v1.5
|
||||
# h3: 123123 # AmneziaWG v1.0 and v1.5
|
||||
# h4: 32345 # AmneziaWG v1.0 and v1.5
|
||||
# h1: 123456-123500 # AmneziaWG v2.0 only
|
||||
# h2: 67543-67550 # AmneziaWG v2.0 only
|
||||
# h3: 123123-123200 # AmneziaWG v2.0 only
|
||||
# h4: 32345-32350 # AmneziaWG v2.0 only
|
||||
# i1: <b 0xf6ab3267fa><c><b 0xf6ab><t><r 10><wt 10> # AmneziaWG v1.5 and v2
|
||||
# i2: <b 0xf6ab3267fa><r 100> # AmneziaWG v1.5 and v2
|
||||
# i3: "" # AmneziaWG v1.5 and v2
|
||||
# i4: "" # AmneziaWG v1.5 and v2
|
||||
# i5: "" # AmneziaWG v1.5 and v2
|
||||
# j1: <b 0xffffffff><c><b 0xf6ab><t><r 10> # AmneziaWG v1.5 only (removed in v2)
|
||||
# j2: <c><b 0xf6ab><t><wt 1000> # AmneziaWG v1.5 only (removed in v2)
|
||||
# j3: <t><b 0xf6ab><c><r 10> # AmneziaWG v1.5 only (removed in v2)
|
||||
# itime: 60 # AmneziaWG v1.5 only (removed in v2)
|
||||
|
||||
# tuic
|
||||
- name: tuic
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ require (
|
||||
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905
|
||||
github.com/klauspost/compress v1.17.9 // lastest version compatible with golang1.20
|
||||
github.com/mdlayher/netlink v1.7.2
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281
|
||||
github.com/metacubex/bart v0.20.5
|
||||
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b
|
||||
github.com/metacubex/blake3 v0.1.0
|
||||
|
||||
+2
-2
@@ -90,8 +90,8 @@ github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/
|
||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a h1:c1QSGpacSeQdBdWcEKZKGuWLcqIG2wxHEygAcXuDwS4=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250820070344-732c0c9d418a/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281 h1:09EM0sOLb2kfL0KETGhHujsBLB5iy5U/2yHRHsxf/pI=
|
||||
github.com/metacubex/amneziawg-go v0.0.0-20250902133113-a7f637c14281/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
|
||||
github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM=
|
||||
github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc=
|
||||
github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM=
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
name: Preview Build
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
jobs:
|
||||
libcore:
|
||||
name: Native Build (LibCore)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Golang Status
|
||||
run: find buildScript libcore/*.sh | xargs cat | sha1sum > golang_status
|
||||
- name: Libcore Status
|
||||
run: git ls-files libcore | xargs cat | sha1sum > libcore_status
|
||||
- name: LibCore Cache
|
||||
id: cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
app/libs/libcore.aar
|
||||
key: ${{ hashFiles('.github/workflows/*', 'golang_status', 'libcore_status') }}
|
||||
- name: Install Golang
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: ^1.24
|
||||
- name: Native Build
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
run: ./run lib core
|
||||
build:
|
||||
name: Build OSS APK
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- libcore
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Golang Status
|
||||
run: find buildScript libcore/*.sh | xargs cat | sha1sum > golang_status
|
||||
- name: Libcore Status
|
||||
run: git ls-files libcore | xargs cat | sha1sum > libcore_status
|
||||
- name: LibCore Cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
app/libs/libcore.aar
|
||||
key: ${{ hashFiles('.github/workflows/*', 'golang_status', 'libcore_status') }}
|
||||
- name: Gradle cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.gradle
|
||||
key: gradle-oss-${{ hashFiles('**/*.gradle.kts') }}
|
||||
- name: Gradle Build
|
||||
env:
|
||||
BUILD_PLUGIN: none
|
||||
run: |
|
||||
echo "sdk.dir=${ANDROID_HOME}" > local.properties
|
||||
echo "ndk.dir=${ANDROID_HOME}/ndk/25.0.8775105" >> local.properties
|
||||
export LOCAL_PROPERTIES="${{ secrets.LOCAL_PROPERTIES }}"
|
||||
./run init action gradle
|
||||
./gradlew app:assemblePreviewRelease
|
||||
APK=$(find app/build/outputs/apk -name '*arm64-v8a*.apk')
|
||||
APK=$(dirname $APK)
|
||||
echo "APK=$APK" >> $GITHUB_ENV
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: APKs
|
||||
path: ${{ env.APK }}
|
||||
@@ -382,4 +382,9 @@ com.openai.chatgpt
|
||||
mega.privacy.android.app
|
||||
com.taptap.global
|
||||
tw.com.gamer.android.animad
|
||||
com.microsoft.copilot
|
||||
com.microsoft.copilot
|
||||
com.google.android.apps.aiwallpapers
|
||||
ai.x.grok
|
||||
com.google.android.apps.weather
|
||||
com.metrolist.music
|
||||
com.google.android.apps.youtube.creator
|
||||
@@ -20,6 +20,8 @@ import go.Seq
|
||||
import io.nekohasekai.sagernet.bg.SagerConnection
|
||||
import io.nekohasekai.sagernet.database.DataStore
|
||||
import io.nekohasekai.sagernet.ktx.Logs
|
||||
import io.nekohasekai.sagernet.ktx.isOss
|
||||
import io.nekohasekai.sagernet.ktx.isPreview
|
||||
import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher
|
||||
import io.nekohasekai.sagernet.ui.MainActivity
|
||||
import io.nekohasekai.sagernet.utils.*
|
||||
@@ -194,6 +196,18 @@ class SagerNet : Application(),
|
||||
|
||||
var underlyingNetwork: Network? = null
|
||||
|
||||
var appVersionNameForDisplay = lazy {
|
||||
var n = BuildConfig.VERSION_NAME
|
||||
if (isPreview) {
|
||||
n += " " + BuildConfig.PRE_VERSION_NAME
|
||||
} else if (!isOss) {
|
||||
n += " ${BuildConfig.FLAVOR}"
|
||||
}
|
||||
if (BuildConfig.DEBUG) {
|
||||
n += " DEBUG"
|
||||
}
|
||||
n
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -162,12 +162,6 @@ fun buildConfig(
|
||||
external_controller = "127.0.0.1:9090"
|
||||
external_ui = "../files/yacd"
|
||||
}
|
||||
|
||||
cache_file = CacheFile().apply {
|
||||
enabled = true
|
||||
store_fakeip = true
|
||||
path = "../cache/clash.db"
|
||||
}
|
||||
}
|
||||
|
||||
log = LogOptions().apply {
|
||||
@@ -657,7 +651,27 @@ fun buildConfig(
|
||||
}
|
||||
}
|
||||
|
||||
// remote dns obj
|
||||
dns.servers.add(DNSServerOptions().apply {
|
||||
address = "rcode://success"
|
||||
tag = "dns-block"
|
||||
})
|
||||
|
||||
dns.servers.add(DNSServerOptions().apply {
|
||||
address = "local"
|
||||
tag = "dns-local"
|
||||
detour = TAG_DIRECT
|
||||
})
|
||||
|
||||
directDNS.firstOrNull().let {
|
||||
dns.servers.add(DNSServerOptions().apply {
|
||||
address = it ?: throw Exception("No direct DNS, check your settings!")
|
||||
tag = "dns-direct"
|
||||
detour = TAG_DIRECT
|
||||
address_resolver = "dns-local"
|
||||
strategy = autoDnsDomainStrategy(SingBoxOptionsUtil.domainStrategy(tag))
|
||||
})
|
||||
}
|
||||
|
||||
remoteDns.firstOrNull().let {
|
||||
// Always use direct DNS for urlTest
|
||||
if (!forTest) dns.servers.add(DNSServerOptions().apply {
|
||||
@@ -668,25 +682,7 @@ fun buildConfig(
|
||||
})
|
||||
}
|
||||
|
||||
// add directDNS objects here
|
||||
directDNS.firstOrNull().let {
|
||||
dns.servers.add(DNSServerOptions().apply {
|
||||
address = it ?: throw Exception("No direct DNS, check your settings!")
|
||||
tag = "dns-direct"
|
||||
detour = TAG_DIRECT
|
||||
address_resolver = "dns-local"
|
||||
strategy = autoDnsDomainStrategy(SingBoxOptionsUtil.domainStrategy(tag))
|
||||
})
|
||||
}
|
||||
dns.servers.add(DNSServerOptions().apply {
|
||||
address = "local"
|
||||
tag = "dns-local"
|
||||
detour = TAG_DIRECT
|
||||
})
|
||||
dns.servers.add(DNSServerOptions().apply {
|
||||
address = "rcode://success"
|
||||
tag = "dns-block"
|
||||
})
|
||||
dns.final_ = if (forTest) "dns-direct" else "dns-remote"
|
||||
|
||||
// dns object user rules
|
||||
if (enableDnsRouting) {
|
||||
|
||||
@@ -17,6 +17,7 @@ import io.nekohasekai.sagernet.fmt.v2ray.parseV2Ray
|
||||
import moe.matsuri.nb4a.proxy.anytls.parseAnytls
|
||||
import moe.matsuri.nb4a.utils.JavaUtil.gson
|
||||
import moe.matsuri.nb4a.utils.Util
|
||||
import okhttp3.HttpUrl
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
@@ -137,6 +138,14 @@ suspend fun parseProxies(text: String): List<AbstractBean> {
|
||||
entities.add(parseHttp(this))
|
||||
}.onFailure {
|
||||
Logs.w(it)
|
||||
val clashUrl = HttpUrl.Builder()
|
||||
.scheme("https")
|
||||
.host("install-config")
|
||||
.addQueryParameter("url", this)
|
||||
.build()
|
||||
.toString()
|
||||
.replaceFirst("https://", "clash://")
|
||||
throw (SubscriptionFoundException(clashUrl))
|
||||
}
|
||||
} else if (startsWith("vmess://")) {
|
||||
Logs.d("Try parse v2ray link: $this")
|
||||
|
||||
@@ -271,11 +271,9 @@ fun Context.getColorAttr(@AttrRes resId: Int): Int {
|
||||
}
|
||||
|
||||
val isExpert: Boolean by lazy { BuildConfig.DEBUG || DataStore.isExpert }
|
||||
|
||||
val isExpertFlavor = ((BuildConfig.FLAVOR == "expert") || BuildConfig.DEBUG)
|
||||
const val isOss = BuildConfig.FLAVOR == "oss"
|
||||
const val isFdroid = BuildConfig.FLAVOR == "fdroid"
|
||||
const val isPlay = BuildConfig.FLAVOR == "play"
|
||||
const val isPreview = BuildConfig.FLAVOR == "preview"
|
||||
|
||||
fun <T> Continuation<T>.tryResume(value: T) {
|
||||
try {
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.os.PowerManager
|
||||
import android.provider.Settings
|
||||
import android.text.util.Linkify
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.activity.result.component1
|
||||
import androidx.activity.result.component2
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
@@ -28,6 +29,12 @@ import io.nekohasekai.sagernet.utils.PackageCache
|
||||
import io.nekohasekai.sagernet.widget.ListListener
|
||||
import libcore.Libcore
|
||||
import moe.matsuri.nb4a.plugin.Plugins
|
||||
import androidx.core.net.toUri
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import io.nekohasekai.sagernet.SagerNet
|
||||
import io.nekohasekai.sagernet.database.DataStore
|
||||
import moe.matsuri.nb4a.utils.Util
|
||||
import org.json.JSONObject
|
||||
|
||||
class AboutFragment : ToolbarFragment(R.layout.layout_about) {
|
||||
|
||||
@@ -65,128 +72,133 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
|
||||
}
|
||||
|
||||
override fun getMaterialAboutList(activityContext: Context): MaterialAboutList {
|
||||
|
||||
var versionName = BuildConfig.VERSION_NAME
|
||||
if (!isOss) {
|
||||
versionName += " ${BuildConfig.FLAVOR}"
|
||||
}
|
||||
if (BuildConfig.DEBUG) {
|
||||
versionName += " DEBUG"
|
||||
}
|
||||
|
||||
return MaterialAboutList.Builder()
|
||||
.addCard(
|
||||
MaterialAboutCard.Builder()
|
||||
.outline(false)
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_update_24)
|
||||
.text(R.string.app_version)
|
||||
.subText(versionName)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://github.com/MatsuriDayo/NekoBoxForAndroid/releases"
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_layers_24)
|
||||
.text(getString(R.string.version_x, "sing-box"))
|
||||
.subText(Libcore.versionBox())
|
||||
.setOnClickAction { }
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_card_giftcard_24)
|
||||
.text(R.string.donate)
|
||||
.subText(R.string.donate_info)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://matsuridayo.github.io/index_docs/#donate"
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.apply {
|
||||
PackageCache.awaitLoadSync()
|
||||
for ((_, pkg) in PackageCache.installedPluginPackages) {
|
||||
try {
|
||||
val pluginId =
|
||||
pkg.providers?.get(0)?.loadString(Plugins.METADATA_KEY_ID)
|
||||
if (pluginId.isNullOrBlank()) continue
|
||||
addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_nfc_24)
|
||||
.text(
|
||||
getString(
|
||||
R.string.version_x,
|
||||
pluginId
|
||||
) + " (${Plugins.displayExeProvider(pkg.packageName)})"
|
||||
.outline(false)
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_update_24)
|
||||
.text(R.string.app_version)
|
||||
.subText(SagerNet.appVersionNameForDisplay.value)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://github.com/MatsuriDayo/NekoBoxForAndroid/releases"
|
||||
)
|
||||
.subText("v" + pkg.versionName)
|
||||
.setOnClickAction {
|
||||
startActivity(Intent().apply {
|
||||
action =
|
||||
Settings.ACTION_APPLICATION_DETAILS_SETTINGS
|
||||
data = Uri.fromParts(
|
||||
"package", pkg.packageName, null
|
||||
}
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.text(R.string.check_update_release)
|
||||
.setOnClickAction {
|
||||
checkUpdate(false)
|
||||
}
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.text(R.string.check_update_preview)
|
||||
.setOnClickAction {
|
||||
checkUpdate(true)
|
||||
}
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_layers_24)
|
||||
.text(getString(R.string.version_x, "sing-box"))
|
||||
.subText(Libcore.versionBox())
|
||||
.setOnClickAction { }
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_card_giftcard_24)
|
||||
.text(R.string.donate)
|
||||
.subText(R.string.donate_info)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://matsuridayo.github.io/index_docs/#donate"
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.apply {
|
||||
PackageCache.awaitLoadSync()
|
||||
for ((_, pkg) in PackageCache.installedPluginPackages) {
|
||||
try {
|
||||
val pluginId =
|
||||
pkg.providers?.get(0)?.loadString(Plugins.METADATA_KEY_ID)
|
||||
if (pluginId.isNullOrBlank()) continue
|
||||
addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_nfc_24)
|
||||
.text(
|
||||
getString(
|
||||
R.string.version_x,
|
||||
pluginId
|
||||
) + " (${Plugins.displayExeProvider(pkg.packageName)})"
|
||||
)
|
||||
})
|
||||
}
|
||||
.build())
|
||||
} catch (e: Exception) {
|
||||
Logs.w(e)
|
||||
.subText("v" + pkg.versionName)
|
||||
.setOnClickAction {
|
||||
startActivity(Intent().apply {
|
||||
action =
|
||||
Settings.ACTION_APPLICATION_DETAILS_SETTINGS
|
||||
data = Uri.fromParts(
|
||||
"package", pkg.packageName, null
|
||||
)
|
||||
})
|
||||
}
|
||||
.build())
|
||||
} catch (e: Exception) {
|
||||
Logs.w(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.apply {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
val pm = app.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||
if (!pm.isIgnoringBatteryOptimizations(app.packageName)) {
|
||||
addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_running_with_errors_24)
|
||||
.text(R.string.ignore_battery_optimizations)
|
||||
.subText(R.string.ignore_battery_optimizations_sum)
|
||||
.setOnClickAction {
|
||||
requestIgnoreBatteryOptimizations.launch(
|
||||
Intent(
|
||||
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
|
||||
Uri.parse("package:${app.packageName}")
|
||||
)
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.apply {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
val pm = app.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||
if (!pm.isIgnoringBatteryOptimizations(app.packageName)) {
|
||||
addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_running_with_errors_24)
|
||||
.text(R.string.ignore_battery_optimizations)
|
||||
.subText(R.string.ignore_battery_optimizations_sum)
|
||||
.setOnClickAction {
|
||||
requestIgnoreBatteryOptimizations.launch(
|
||||
Intent(
|
||||
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
|
||||
"package:${app.packageName}".toUri()
|
||||
)
|
||||
)
|
||||
}
|
||||
.build())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.build())
|
||||
.build())
|
||||
.addCard(
|
||||
MaterialAboutCard.Builder()
|
||||
.outline(false)
|
||||
.title(R.string.project)
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_sanitizer_24)
|
||||
.text(R.string.github)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://github.com/MatsuriDayo/NekoBoxForAndroid"
|
||||
.outline(false)
|
||||
.title(R.string.project)
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_baseline_sanitizer_24)
|
||||
.text(R.string.github)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://github.com/MatsuriDayo/NekoBoxForAndroid"
|
||||
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_qu_shadowsocks_foreground)
|
||||
.text(R.string.telegram)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://t.me/MatsuriDayo"
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.build())
|
||||
.addItem(
|
||||
MaterialAboutActionItem.Builder()
|
||||
.icon(R.drawable.ic_qu_shadowsocks_foreground)
|
||||
.text(R.string.telegram)
|
||||
.setOnClickAction {
|
||||
requireContext().launchCustomTab(
|
||||
"https://t.me/MatsuriDayo"
|
||||
)
|
||||
}
|
||||
.build())
|
||||
.build())
|
||||
.build()
|
||||
|
||||
}
|
||||
@@ -199,6 +211,69 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
|
||||
}
|
||||
}
|
||||
|
||||
fun checkUpdate(checkPreview: Boolean) {
|
||||
runOnIoDispatcher {
|
||||
try {
|
||||
val client = Libcore.newHttpClient().apply {
|
||||
modernTLS()
|
||||
keepAlive()
|
||||
trySocks5(DataStore.mixedPort)
|
||||
}
|
||||
val response = client.newRequest().apply {
|
||||
if (checkPreview) {
|
||||
setURL("https://api.github.com/repos/MatsuriDayo/NekoBoxForAndroid/releases/tags/preview")
|
||||
} else {
|
||||
setURL("https://api.github.com/repos/MatsuriDayo/NekoBoxForAndroid/releases/latest")
|
||||
}
|
||||
}.execute()
|
||||
val release = JSONObject(Util.getStringBox(response.contentString))
|
||||
val releaseName = release.getString("name")
|
||||
val releaseUrl = release.getString("html_url")
|
||||
var haveUpdate = releaseName.isNotBlank()
|
||||
haveUpdate = if (isPreview) {
|
||||
if (checkPreview) {
|
||||
haveUpdate && releaseName != BuildConfig.PRE_VERSION_NAME
|
||||
} else {
|
||||
// User: 1.3.9 pre-1.4.0 Stable: 1.3.9 -> No update
|
||||
haveUpdate && releaseName != BuildConfig.VERSION_NAME
|
||||
}
|
||||
} else {
|
||||
// User: 1.4.0 Preview: pre-1.4.0 -> No update
|
||||
// User: 1.4.0 Preview: pre-1.4.1 -> Update
|
||||
// User: 1.4.0 Stable: 1.4.0 -> No update
|
||||
// User: 1.4.0 Stable: 1.4.1 -> Update
|
||||
haveUpdate && !releaseName.contains(BuildConfig.VERSION_NAME)
|
||||
}
|
||||
runOnMainDispatcher {
|
||||
if (haveUpdate) {
|
||||
val context = requireContext()
|
||||
MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.update_dialog_title)
|
||||
.setMessage(
|
||||
context.getString(
|
||||
R.string.update_dialog_message,
|
||||
SagerNet.appVersionNameForDisplay.value,
|
||||
releaseName
|
||||
)
|
||||
)
|
||||
.setPositiveButton(R.string.yes) { _, _ ->
|
||||
val intent = Intent(Intent.ACTION_VIEW, releaseUrl.toUri())
|
||||
context.startActivity(intent)
|
||||
}
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show()
|
||||
} else {
|
||||
Toast.makeText(app, R.string.check_update_no, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
runOnMainDispatcher {
|
||||
Toast.makeText(app, e.readableMessage, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -41,6 +41,7 @@ import io.nekohasekai.sagernet.group.GroupInterfaceAdapter
|
||||
import io.nekohasekai.sagernet.group.GroupUpdater
|
||||
import io.nekohasekai.sagernet.ktx.alert
|
||||
import io.nekohasekai.sagernet.ktx.isPlay
|
||||
import io.nekohasekai.sagernet.ktx.isPreview
|
||||
import io.nekohasekai.sagernet.ktx.launchCustomTab
|
||||
import io.nekohasekai.sagernet.ktx.onMainDispatcher
|
||||
import io.nekohasekai.sagernet.ktx.parseProxies
|
||||
@@ -114,6 +115,13 @@ class MainActivity : ThemedActivity(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (isPreview) {
|
||||
MaterialAlertDialogBuilder(this).setTitle(R.string.preview_version)
|
||||
.setMessage(R.string.preview_version_hint)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
fun refreshNavMenu(clashApi: Boolean) {
|
||||
|
||||
@@ -4,7 +4,6 @@ import android.Manifest
|
||||
import android.content.Intent
|
||||
import android.content.pm.ShortcutManager
|
||||
import android.graphics.ImageDecoder
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.provider.MediaStore
|
||||
@@ -13,6 +12,7 @@ import android.view.MenuItem
|
||||
import android.widget.Toast
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.core.content.getSystemService
|
||||
import androidx.core.net.toUri
|
||||
import com.google.zxing.Result
|
||||
import com.king.zxing.CameraScan
|
||||
import com.king.zxing.DefaultCameraScan
|
||||
@@ -138,7 +138,7 @@ class ScannerActivity : ThemedActivity(),
|
||||
} catch (e: SubscriptionFoundException) {
|
||||
startActivity(Intent(this@ScannerActivity, MainActivity::class.java).apply {
|
||||
action = Intent.ACTION_VIEW
|
||||
data = Uri.parse(e.link)
|
||||
data = e.link.toUri()
|
||||
})
|
||||
} catch (e: Throwable) {
|
||||
Logs.w(e)
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.os.Build
|
||||
import android.util.Log
|
||||
import com.jakewharton.processphoenix.ProcessPhoenix
|
||||
import io.nekohasekai.sagernet.BuildConfig
|
||||
import io.nekohasekai.sagernet.SagerNet
|
||||
import io.nekohasekai.sagernet.database.preference.PublicDatabase
|
||||
import io.nekohasekai.sagernet.ktx.Logs
|
||||
import io.nekohasekai.sagernet.ktx.app
|
||||
@@ -61,7 +62,7 @@ object CrashHandler : Thread.UncaughtExceptionHandler {
|
||||
|
||||
fun buildReportHeader(): String {
|
||||
var report = ""
|
||||
report += "NekoBox for Andoird ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE}) ${BuildConfig.FLAVOR.uppercase()}\n"
|
||||
report += "NekoBox for Android ${SagerNet.appVersionNameForDisplay} (${BuildConfig.VERSION_CODE})\n"
|
||||
report += "Date: ${getCurrentMilliSecondUTCTimeStamp()}\n\n"
|
||||
report += "OS_VERSION: ${getSystemPropertyWithAndroidAPI("os.version")}\n"
|
||||
report += "SDK_INT: ${Build.VERSION.SDK_INT}\n"
|
||||
@@ -102,7 +103,7 @@ object CrashHandler : Thread.UncaughtExceptionHandler {
|
||||
report += "\n"
|
||||
report += pair.key + ": " + pair.toString()
|
||||
}
|
||||
}catch (e: Exception) {
|
||||
} catch (e: Exception) {
|
||||
report += "Export settings failed: " + formatThrowable(e)
|
||||
}
|
||||
|
||||
@@ -136,7 +137,8 @@ object CrashHandler : Thread.UncaughtExceptionHandler {
|
||||
if (matcher.matches()) {
|
||||
key = matcher.group(1)
|
||||
value = matcher.group(2)
|
||||
if (key != null && value != null && !key.isEmpty() && !value.isEmpty()) systemProperties[key] = value
|
||||
if (key != null && value != null && !key.isEmpty() && !value.isEmpty()) systemProperties[key] =
|
||||
value
|
||||
}
|
||||
}
|
||||
bufferedReader.close()
|
||||
|
||||
@@ -20,7 +20,6 @@ import androidx.preference.PreferenceViewHolder
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import io.nekohasekai.sagernet.R
|
||||
import io.nekohasekai.sagernet.ktx.getColorAttr
|
||||
import io.nekohasekai.sagernet.ktx.isExpertFlavor
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class ColorPickerPreference
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="abc_search_hint">Введите запрос</string>
|
||||
<string name="abc_searchview_description_clear">Удалить запрос</string>
|
||||
<string name="abc_searchview_description_search">Поиск</string>
|
||||
<string name="abc_searchview_description_submit">Отправить запрос</string>
|
||||
<string name="abc_searchview_description_voice">Голосовой поиск</string>
|
||||
<string name="abc_shareactionprovider_share_with">Поделиться с помощью</string>
|
||||
<string name="abc_toolbar_collapse_description">Свернуть</string>
|
||||
<string name="acquire_wake_lock">Использовать WakeLock</string>
|
||||
<string name="acquire_wake_lock_summary">Сохранять CPU включенным</string>
|
||||
<string name="action_download">СКАЧАТЬ</string>
|
||||
@@ -28,6 +35,8 @@
|
||||
<string name="always_show_address">Всегда показывать адрес</string>
|
||||
<string name="always_show_address_sum">Всегда отображать адрес сервера на карте конфигурации</string>
|
||||
<string name="app_desc">Универсальный набор инструментов прокси для Android, написанный на Kotlin.</string>
|
||||
<string name="app_name">NekoBox</string>
|
||||
<string name="app_name_long">NekoBox для Android</string>
|
||||
<string name="app_tls_version">Минимальная версия TLS протокола</string>
|
||||
<string name="app_version">Версия</string>
|
||||
<string name="append_http_proxy">Добавить HTTP-прокси к VPN</string>
|
||||
@@ -38,6 +47,8 @@
|
||||
<string name="auto">Авто</string>
|
||||
<string name="auto_connect">Автоматическое подключение</string>
|
||||
<string name="auto_connect_summary">Включить прокси при запуске/обновлении приложения, если он был запущен до этого</string>
|
||||
<string name="auto_select_proxy_apps">Автоматический выбор прокси-приложений</string>
|
||||
<string name="auto_select_proxy_apps_message">Автоматический выбор прокси-приложений приведет к очистке текущего выбора.</string>
|
||||
<string name="auto_update">Автоматическое обновление</string>
|
||||
<string name="auto_update_delay">Задержка автоматического обновления (в минутах)</string>
|
||||
<string name="backup">Бэкап</string>
|
||||
@@ -66,10 +77,10 @@
|
||||
<string name="character_counter_overflowed_content_description">Превышено ограничение на количество символов (%1$d из %2$d)</string>
|
||||
<string name="circular_reference">Циклическая ссылка</string>
|
||||
<string name="circular_reference_sum">Маршрут не может содержать сам себя.</string>
|
||||
<string name="clear_logcat">Очистить Logcat</string>
|
||||
<string name="clear_logcat">Очистить журнал</string>
|
||||
<string name="clear_profiles">Очистить</string>
|
||||
<string name="clear_profiles_message">Вы уверены, что хотите очистить эту группу?</string>
|
||||
<string name="clear_selections">Очистить выбор</string>
|
||||
<string name="clear_selections">Очистить выбранное</string>
|
||||
<string name="clear_text_end_icon_content_description">Очистить текстовое поле</string>
|
||||
<string name="clear_traffic_statistics">Очистить статистику трафика</string>
|
||||
<string name="cleartext_http_warning">Передача HTTP-трафика в виде открытого текста небезопасна</string>
|
||||
@@ -79,9 +90,8 @@
|
||||
<string name="confirm">Подтвердить</string>
|
||||
<string name="connect">Подключиться</string>
|
||||
<string name="connecting">Подключение…</string>
|
||||
<string name="connection_test">Тест подключения</string>
|
||||
<string name="connection_test_available">Успех: соединение HTTP заняло %d мс</string>
|
||||
<string name="connection_test_available_http">Успех: соединение HTTP заняло %d мс</string>
|
||||
<string name="connection_test_available">HTTPS-соединение установлено за %d мс</string>
|
||||
<string name="connection_test_available_http">HTTP-соединение установлено за %d мс</string>
|
||||
<string name="connection_test_clear_results">Очистить результаты теста</string>
|
||||
<string name="connection_test_delete_unavailable">Удалить недоступные</string>
|
||||
<string name="connection_test_domain_not_found">Домен не найден</string>
|
||||
@@ -139,6 +149,7 @@
|
||||
<string name="enable_mux">Включить мультиплексор</string>
|
||||
<string name="enc_method">Метод шифрования</string>
|
||||
<string name="encryption">Шифрование</string>
|
||||
<string name="error_a11y_label">Ошибка: недопустимое значение</string>
|
||||
<string name="error_icon_content_description">Ошибка</string>
|
||||
<string name="error_title">Ошибка</string>
|
||||
<string name="expand_button_title">Дополнительно</string>
|
||||
@@ -155,20 +166,20 @@
|
||||
<string name="generating">Создание…</string>
|
||||
<string name="github">Исходный код</string>
|
||||
<string name="global_allow_insecure">Всегда разрешать небезопасные</string>
|
||||
<string name="group_added">"\"Создано:
|
||||
%s\""</string>
|
||||
<string name="group_added">Добавлено:
|
||||
%s</string>
|
||||
<string name="group_basic">Базовый</string>
|
||||
<string name="group_changed">"\"Обновлено:
|
||||
%s\""</string>
|
||||
<string name="group_changed">Обновлено:
|
||||
%s</string>
|
||||
<string name="group_create">Создать группу</string>
|
||||
<string name="group_create_subscription">Создать подписку</string>
|
||||
<string name="group_default">Разгруппировано</string>
|
||||
<string name="group_delete_confirm_prompt">Вы уверены, что хотите удалить эту группу?</string>
|
||||
<string name="group_deleted">"\"Удалено:
|
||||
%s\""</string>
|
||||
<string name="group_deleted">Удалено:
|
||||
%s</string>
|
||||
<string name="group_diff">различия (%s)</string>
|
||||
<string name="group_duplicate">"\"Дубликат:
|
||||
%s\""</string>
|
||||
<string name="group_duplicate">Дубликат:
|
||||
%s</string>
|
||||
<string name="group_edit">Редактировать группу</string>
|
||||
<string name="group_edit_subscription">Редактировать подписку</string>
|
||||
<string name="group_filter">Фильтр</string>
|
||||
@@ -185,15 +196,18 @@
|
||||
<string name="group_status_empty">Пустая группа</string>
|
||||
<string name="group_status_empty_subscription">Еще не обновлено</string>
|
||||
<string name="group_status_proxies">%d прокси</string>
|
||||
<string name="group_status_proxies_subscription" formatted="false">%d Прокси | Обновлено %s</string>
|
||||
<string name="group_status_proxies_subscription">%d прокси | Обновлено %s</string>
|
||||
<string name="group_subscription_link">Ссылка для подписки</string>
|
||||
<string name="group_type">Тип группы</string>
|
||||
<string name="group_update">Обновить</string>
|
||||
<string name="group_updated" formatted="false">%s: Обновлено %d прокси</string>
|
||||
<string name="group_updated">%s: обновлено %d прокси</string>
|
||||
<string name="grpc_service_name">Имя службы gRPC</string>
|
||||
<string name="header_type">Тип заголовка</string>
|
||||
<string name="hop_interval">Интервал переключения портов(второй)</string>
|
||||
<string name="http_host">HTTP-хост</string>
|
||||
<string name="http_path">HTTP-путь</string>
|
||||
<string name="http_upgrade_host">HTTP-хост обновления</string>
|
||||
<string name="http_upgrade_path">HTTP-путь обновления</string>
|
||||
<string name="hysteria_auth_payload">Полезные данные аутентификации</string>
|
||||
<string name="hysteria_auth_type">Тип аутентификации</string>
|
||||
<string name="hysteria_connection_receive_window">Окно получения соединения QUIC</string>
|
||||
@@ -211,8 +225,9 @@
|
||||
<string name="install_from_play_store">Установить из Play Store</string>
|
||||
<string name="invalid_backup_file">Недействительный файл резервной копии</string>
|
||||
<string name="invalid_server">Неверное имя сервера</string>
|
||||
<string name="invert_selections">Инвертировать выбор</string>
|
||||
<string name="invert_selections">Инвертировать выбранное</string>
|
||||
<string name="ipv6">Маршрут IPv6</string>
|
||||
<string name="is_outbound_only">Сделать JSON исходящим</string>
|
||||
<string name="item_view_role_description">Вкладка</string>
|
||||
<string name="key_opt">Ключ (необязательно)</string>
|
||||
<string name="landing_proxy">Обратный прокси</string>
|
||||
@@ -221,11 +236,13 @@
|
||||
<string name="log_level">Тип журнала</string>
|
||||
<string name="log_level_help">Удерживайте для настройки размера буфера.</string>
|
||||
<string name="logcat">Экспорт отладочной информации</string>
|
||||
<string name="mal_close">Закрыть</string>
|
||||
<string name="material_clock_toggle_content_description">Выберите AM (до полудня) или PM (после полудня)</string>
|
||||
<string name="material_timepicker_am">AM</string>
|
||||
<string name="material_timepicker_pm">PM</string>
|
||||
<string name="menu_about">О приложении</string>
|
||||
<string name="menu_configuration">Конфигурация</string>
|
||||
<string name="menu_dashboard">Панель sing-box</string>
|
||||
<string name="menu_group">Группы</string>
|
||||
<string name="menu_log">Журналы</string>
|
||||
<string name="menu_route">Маршруты</string>
|
||||
@@ -236,31 +253,38 @@
|
||||
<string name="missing_plugin">Отсутствующий плагин</string>
|
||||
<string name="move">Переместить</string>
|
||||
<string name="mtrl_badge_numberless_content_description">Новое уведомление</string>
|
||||
<string name="mtrl_chip_close_icon_content_description">Удалить \"%1$s\"</string>
|
||||
<string name="mtrl_checkbox_state_description_checked">Флажок установлен.</string>
|
||||
<string name="mtrl_checkbox_state_description_indeterminate">Флажки установлены частично.</string>
|
||||
<string name="mtrl_checkbox_state_description_unchecked">Флажок не установлен.</string>
|
||||
<string name="mtrl_chip_close_icon_content_description">Удалить "%1$s"</string>
|
||||
<string name="mtrl_exceed_max_badge_number_content_description">Новых уведомлений больше %1$d</string>
|
||||
<string name="mtrl_picker_a11y_next_month">Перейти к следующему месяцу</string>
|
||||
<string name="mtrl_picker_a11y_prev_month">Перейти к предыдущему месяцу</string>
|
||||
<string name="mtrl_picker_cancel">Отмена</string>
|
||||
<string name="mtrl_picker_confirm">ОК</string>
|
||||
<string name="mtrl_picker_day_of_week_column_header">Столбец со днями недели: %1$s</string>
|
||||
<string name="mtrl_picker_navigate_to_current_year_description">Перейти к текущему году: %1$d</string>
|
||||
<string name="mtrl_picker_navigate_to_year_description">Перейти к %1$s году</string>
|
||||
<string name="mtrl_picker_save">Сохранить</string>
|
||||
<string name="mtrl_picker_toggle_to_calendar_input_mode">Перейти в режим выбора дней</string>
|
||||
<string name="mtrl_picker_toggle_to_day_selection">Нажмите, чтобы перейти к выбору дня</string>
|
||||
<string name="mtrl_picker_toggle_to_text_input_mode">Перейти в режим ввода текста</string>
|
||||
<string name="mtrl_picker_toggle_to_year_selection">Нажмите, чтобы перейти к выбору года</string>
|
||||
<string name="mtu_help">Удерживайте для настройки своего MTU.</string>
|
||||
<string name="mux_concurrency">Число одновременных подключений Mux</string>
|
||||
<string name="mux_preference">Мультиплекс</string>
|
||||
<string name="mux_sum">Протокол мультиплексирования предназначен для уменьшения задержки соединения TCP, а не для увеличения пропускной способности. Использование мультиплексирования для просмотра видео, загрузки или проверки скорости обычно неэффективно. Если сервер не поддерживает мультиплексирование, вы не сможете получить доступ к Интернету.</string>
|
||||
<string name="mux_type">Протокол мультиплексирования</string>
|
||||
<string name="naive_insecure_concurrency">Небезопасный параллелизм</string>
|
||||
<string name="naive_insecure_concurrency_summary">"\"Использовать N параллельных соединений для повышения отказоустойчивости в условиях ненадёжной сети. Большее число соединений увеличивает риск обнаружения туннелей и снижает безопасность. Этот проект стремится к максимальной защите от анализа трафика, следовательно, использование его небезопасным образом противоречит данной цели.
|
||||
<string name="naive_insecure_concurrency_summary">Использовать N параллельных соединений для повышения отказоустойчивости в условиях ненадёжной сети. Большее число соединений увеличивает риск обнаружения туннелей и снижает безопасность. Этот проект стремится к максимальной защите от анализа трафика, следовательно, использование его небезопасным образом противоречит данной цели.
|
||||
|
||||
Если придётся использовать данную функцию, попробуйте N=2, чтобы проверить, решит ли это проблему. Настоятельно не рекомендуется использовать более 4 соединений.\""</string>
|
||||
Если придётся использовать данную функцию, попробуйте N=2, чтобы проверить, решит ли это проблему. Настоятельно не рекомендуется использовать более 4 соединений.</string>
|
||||
<string name="nat_result_hint">Провести проверку NAT</string>
|
||||
<string name="nat_stun_server_hint">STUN сервер</string>
|
||||
<string name="need_reload">Перезагрузите прокси-сервис, чтобы применить изменения</string>
|
||||
<string name="need_restart">Перезапустите приложение для применения изменений</string>
|
||||
<string name="network">Сеть</string>
|
||||
<string name="network_change_reset_connections">Сбрасывать исходящие соединения при изменении сети</string>
|
||||
<string name="network_change_reset_connections">Сбросить исходящие соединения при изменении сети</string>
|
||||
<string name="night_mode">Ночной режим</string>
|
||||
<string name="no">Нет</string>
|
||||
<string name="no_proxies_found">В ссылке не найдено прокси-серверов</string>
|
||||
@@ -286,7 +310,7 @@
|
||||
<string name="plugin_auto_connect_unlock_only">Этот плагин может не работать с автоподключением</string>
|
||||
<string name="plugin_configure">Настроить…</string>
|
||||
<string name="plugin_disabled">Отключено</string>
|
||||
<string name="plugin_exists_but_on_shit_system" formatted="false">Профиль %s требует плагин %s, но поставщик вашего проприетарного оборудования (обычно это большие компании, занимающиеся слежкой и производители вредоносного ПО) изменил ваш Android, сделав плагин непригодным для использования.</string>
|
||||
<string name="plugin_exists_but_on_shit_system">Профиль %s требует плагин %s, но поставщик вашего проприетарного оборудования (обычно это большие компании, занимающиеся слежкой и производители вредоносного ПО) изменил ваш Android, сделав плагин непригодным для использования.</string>
|
||||
<string name="plugin_unknown">Неизвестный плагин %s</string>
|
||||
<string name="plugin_untrusted">Предупреждение: похоже, что этот плагин не из известного надежного источника.</string>
|
||||
<string name="port_http">Порт прокси HTTP</string>
|
||||
@@ -294,25 +318,27 @@
|
||||
<string name="port_proxy">Порт прокси SOCKS5</string>
|
||||
<string name="port_transproxy">Транспрокси-порт</string>
|
||||
<string name="prefer">Предпочитать</string>
|
||||
<string name="preference_copied">Текст \"%1$s\" скопирован в буфер обмена</string>
|
||||
<string name="preference_copied">Текст "%1$s" скопирован в буфер обмена</string>
|
||||
<string name="profile_config">Конфигурация профиля</string>
|
||||
<string name="profile_empty">Пожалуйста, выберите профиль</string>
|
||||
<string name="profile_import">Импортировать профиль</string>
|
||||
<string name="profile_import_message">Подтвердите, что хотите импортировать профиль %s?</string>
|
||||
<string name="profile_name">Имя профиля</string>
|
||||
<string name="profile_requiring_plugin" formatted="false">Профиль %s требует установки подключаемого модуля %s, но он не найден.</string>
|
||||
<string name="profile_requiring_plugin">Профиль %s требует установки подключаемого модуля %s, но он не найден.</string>
|
||||
<string name="profile_traffic_statistics">Статистика трафика профиля</string>
|
||||
<string name="profile_traffic_statistics_summary">Когда отключено, использованный трафик не будет отображаться</string>
|
||||
<string name="project">Проект</string>
|
||||
<string name="protocol">Протокол</string>
|
||||
<string name="protocol_param">Параметры протокола</string>
|
||||
<string name="protocol_settings">Настройки протокола</string>
|
||||
<string name="protocol_version">Версия протокола</string>
|
||||
<string name="proxied_apps">Режим VPN для приложений</string>
|
||||
<string name="proxied_apps_summary">Настроить режим VPN для выбранных приложений</string>
|
||||
<string name="proxy_cat">Настройки сервера</string>
|
||||
<string name="proxy_chain">Прокси-цепочка</string>
|
||||
<string name="quick_toggle">Переключить</string>
|
||||
<string name="reboot_required">Не удалось запустить службу VPN. Возможно, вам потребуется перезагрузить устройство.</string>
|
||||
<string name="release_wake_lock">Отключить WakeLock</string>
|
||||
<string name="remote_dns">Удаленный DNS</string>
|
||||
<string name="remove_duplicate">Удалить дубликаты серверов</string>
|
||||
<string name="reset_connections">Сбросить соединения</string>
|
||||
@@ -334,6 +360,7 @@
|
||||
<string name="route_not_asset">Не файл ресурса: ожидался .db, а не %s</string>
|
||||
<string name="route_opt_block_ads">Блокировать рекламу</string>
|
||||
<string name="route_opt_block_analysis">Блокировать аналитику</string>
|
||||
<string name="route_opt_block_quic">Блокировать QUIC</string>
|
||||
<string name="route_opt_bypass_lan">Обход LAN</string>
|
||||
<string name="route_play_store">Правило Play Store для %s</string>
|
||||
<string name="route_profile">Выбрать профиль…</string>
|
||||
@@ -345,6 +372,8 @@
|
||||
<string name="scanning">Сканирование…</string>
|
||||
<string name="search_apps">Поиск…</string>
|
||||
<string name="search_menu_title">Поиск</string>
|
||||
<string name="searchview_clear_text_content_description">Очистить текстовое поле</string>
|
||||
<string name="searchview_navigation_content_description">Назад</string>
|
||||
<string name="security">Шифрование транспортного уровня</string>
|
||||
<string name="security_settings">Настройки безопасности</string>
|
||||
<string name="select_apps">Выберите приложения</string>
|
||||
@@ -357,21 +386,25 @@
|
||||
<string name="service_proxy">Прокси-сервис</string>
|
||||
<string name="service_subscription">Служба обновления подписки</string>
|
||||
<string name="service_vpn">VPN-сервис</string>
|
||||
<string name="set_panel_url">Установить URL панель</string>
|
||||
<string name="settings">Настройки</string>
|
||||
<string name="shadowsocks_plugin_simple_obfs">Simple Obfs (плагин Shadowsocks для Android)</string>
|
||||
<string name="shadowsocks_plugin_v2ray">V2Ray (плагин Shadowsocks для Android)</string>
|
||||
<string name="share">Поделиться</string>
|
||||
<string name="share_qr_nfc">QR-код</string>
|
||||
<string name="share_subscription">Поделиться подпиской</string>
|
||||
<string name="show_bottom_bar">Показать нижнюю панель, как в SagerNet</string>
|
||||
<string name="show_direct_speed">Показать прямую скорость</string>
|
||||
<string name="show_direct_speed_sum">Также в уведомлении показывать скорость трафика без прокси</string>
|
||||
<string name="show_group_in_notification">Показывать название группы в уведомлении</string>
|
||||
<string name="show_system_apps">Показать системные приложения</string>
|
||||
<string name="sni">Server Name Indication (SNI)</string>
|
||||
<string name="side_sheet_accessibility_pane_title">Боковая панель</string>
|
||||
<string name="sni">SNI (индикация имени сервера)</string>
|
||||
<string name="sniff_override">Результат проверки для адрес назначения</string>
|
||||
<string name="sniff_routing">Перехватывать результат для Маршрутизации</string>
|
||||
<string name="speed">%s/с</string>
|
||||
<string name="speed_detail">"Прокси :%1$s↑ %2$s↓
|
||||
Прямой :%3$s↑%4$s↓"</string>
|
||||
<string name="speed_detail">Прокси :%1$s↑ %2$s↓
|
||||
Прямой :%3$s↑%4$s↓</string>
|
||||
<string name="speed_interval">Интервал обновления уведомлений о скорости</string>
|
||||
<string name="ss_cat">Настройки Shadowsocks</string>
|
||||
<string name="ssh_auth_type_none">Без аутентификации</string>
|
||||
@@ -380,40 +413,45 @@
|
||||
<string name="ssh_public_key">Открытый ключ</string>
|
||||
<string name="standard">Стандарт</string>
|
||||
<string name="start">Старт</string>
|
||||
<string name="status_bar_notification_info_overflow">>999</string>
|
||||
<string name="status_bar_notification_info_overflow">>999</string>
|
||||
<string name="stop">Остановить</string>
|
||||
<string name="stopping">Выключение…</string>
|
||||
<string name="stun_attest_loading">Пожалуйста, подождите…</string>
|
||||
<string name="stun_test">Обнаружение поведения NAT</string>
|
||||
<string name="stun_test_summary">Определить поведение сопоставления адресов NAT и поведение фильтрации NAT в соответствии с RFC 5780 при помощи STUN.</string>
|
||||
<string name="subscription">Подписка</string>
|
||||
<string name="subscription_expire">Истекает: %s</string>
|
||||
<string name="subscription_import">Импортировать подписку</string>
|
||||
<string name="subscription_import_message">Подтвердите, что хотите импортировать подписку %s? Если вы импортируете из ненадежного источника, это может привести к утечке вашего IP-адреса и такого поведения.</string>
|
||||
<string name="subscription_settings">Настройки подписки</string>
|
||||
<string name="subscription_traffic" formatted="false">%s Использовано / %s Осталось</string>
|
||||
<string name="subscription_traffic">%s Использовано / %s Осталось</string>
|
||||
<string name="subscription_type">Тип подписки</string>
|
||||
<string name="subscription_update">Обновление подписки</string>
|
||||
<string name="subscription_update_message">Обновление %s …</string>
|
||||
<string name="subscription_used">%s Использовано</string>
|
||||
<string name="subscription_user_agent">UserAgent</string>
|
||||
<string name="subscriptions">Подписки</string>
|
||||
<string name="summary_collapsed_preference_list">%1$s, %2$s</string>
|
||||
<string name="tcp_connections">%d TCP-соединений</string>
|
||||
<string name="tcp_keep_alive_interval">Интервал доставки пакетов TCP keep-alive</string>
|
||||
<string name="telegram">Канал обновлений в Telegram</string>
|
||||
<string name="test_concurrency">Число параллельных подключений</string>
|
||||
<string name="theme">Тема</string>
|
||||
<string name="tile_title">Переключатель</string>
|
||||
<string name="tls">Использовать TLS</string>
|
||||
<string name="tls_camouflage_settings">Настройки защиты TLS</string>
|
||||
<string name="tools_network">Сеть</string>
|
||||
<string name="traffic">%1$s↑ %2$s↓</string>
|
||||
<string name="traffic_sniffing">Включить анализ трафика</string>
|
||||
<string name="trojan_provider">Провайдер Trojan</string>
|
||||
<string name="tuic_congestion_controller">Контроллер перегрузки</string>
|
||||
<string name="tuic_disable_sni">Отключить SNI</string>
|
||||
<string name="tuic_reduce_rtt">Включить 0-RTT QUIC-соединение</string>
|
||||
<string name="tuic_udp_relay_mode">Режим UDP-ретранслятора</string>
|
||||
<string name="tun_implementation">Реализация TUN</string>
|
||||
<string name="udp_connections">%d UDP-соединений</string>
|
||||
<string name="unavailable">Недоступен</string>
|
||||
<string name="undo">Отменить</string>
|
||||
<string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить?</string>
|
||||
<string name="update_all_subscription">Обновить все подписки</string>
|
||||
<string name="update_current_subscription">Обновить подписку текущей группы</string>
|
||||
<string name="update_settings">Обновить настройки</string>
|
||||
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string>
|
||||
@@ -428,17 +466,17 @@
|
||||
<string name="v7_preference_on">ВКЛ.</string>
|
||||
<string name="version_x">Версия (%s)</string>
|
||||
<string name="vpn_connected">Подключено, нажмите для проверки подключения</string>
|
||||
<string name="vpn_error">%s</string>
|
||||
<string name="vpn_permission_denied">Отказано в разрешении на создание службы VPN</string>
|
||||
<string name="wake_reset_connections">Сбрасывать исходящие соединения, при выходе из спящего режима</string>
|
||||
<string name="wake_reset_connections">Сбросить исходящие соединения при выходе из спящего режима</string>
|
||||
<string name="warp_generate">Создать конфигурацию</string>
|
||||
<string name="warp_license">CloudFlare Warp - это бесплатный VPN-провайдер Wire Guard. Используя его, вы соглашаетесь с условиями использования.</string>
|
||||
<string name="warp_license">CloudFlare Warp - это бесплатный VPN-провайдер WireGuard. Используя его, вы соглашаетесь с условиями использования.</string>
|
||||
<string name="wireguard_local_address">Частный адрес</string>
|
||||
<string name="wireguard_psk">Пароль сервера</string>
|
||||
<string name="wireguard_public_key">Открытый ключ сервера</string>
|
||||
<string name="ws_browser_forwarding">Пересылка через браузер</string>
|
||||
<string name="ws_browser_forwarding_sum">Перенаправьте соответствующие веб-сокеты через браузер.</string>
|
||||
<string name="ws_host">Хост WebSocket</string>
|
||||
<string name="ws_max_early_data">Максимальный объём данных</string>
|
||||
<string name="ws_path">Путь к WebSocket</string>
|
||||
<string name="xtls_flow">Flow (подпротокол VLESS)</string>
|
||||
<string name="yes">Да</string>
|
||||
|
||||
@@ -1,130 +1,523 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="port_local_dns">Локальний порт DNS</string>
|
||||
<string name="dns_hosts">Переписування домену</string>
|
||||
<string name="fakedns_message">Може призвести до перезапуску інших програм для повторного підключення до мережі після зупинки проксі</string>
|
||||
<string name="enable_fakedns">Увімкніть FakeDNS</string>
|
||||
<string name="dns_routing_message">Вирішуйте домени в обхідних маршрутах за допомогою Direct DNS. Будьте в курсі можливих витоків DNS</string>
|
||||
<string name="enable_dns_routing">Увімкнути маршрутизацію DNS</string>
|
||||
<string name="direct_dns">Прямий DNS</string>
|
||||
<string name="remote_dns">Віддалений DNS</string>
|
||||
<string name="cag_dns">Налаштування DNS</string>
|
||||
<string name="connection_test_error_status_code">Код помилки: #%d</string>
|
||||
<string name="connection_test_fail">Інтернет недоступний</string>
|
||||
<string name="connection_test_error">Не вдалося: %s</string>
|
||||
<string name="connection_test_available_http">Успішно: рукостискання HTTP зайняло %dms</string>
|
||||
<string name="connection_test_available">Успіх: рукостискання HTTPS зайняло %dms</string>
|
||||
<string name="connection_test_testing">Тестування…</string>
|
||||
<string name="speed_detail">Проксі: %1$s↑ %2$s↓
|
||||
\nПрямий: %3$s↑ %4$s↓</string>
|
||||
<string name="allow_insecure_sum">Вимкнути перевірку сертифікатів. Якщо ввімкнено, ця конфігурація є такою ж безпечною, як і відкритий текст</string>
|
||||
<string name="allow_insecure">Дозволити незахищене</string>
|
||||
<string name="security_settings">Налаштування безпеки</string>
|
||||
<string name="show_direct_speed_sum">У сповіщенні також покажіть швидкість трафіку без проксі -сервера</string>
|
||||
<string name="show_direct_speed">Показати пряму швидкість</string>
|
||||
<string name="show_stop_sum">Якщо ви не хочете використовувати Quick Tile як перемикач</string>
|
||||
<string name="show_stop">Показати кнопку зупинки</string>
|
||||
<string name="cag_misc">Різні налаштування</string>
|
||||
<string name="speed_interval">Інтервал оновлення сповіщення про швидкість</string>
|
||||
<string name="ws_browser_forwarding_sum">Пересилайте відповідні WebSockets через браузер.</string>
|
||||
<string name="ws_browser_forwarding">Переадресація браузера</string>
|
||||
<string name="cag_ws">Налаштування WebSocket</string>
|
||||
<string name="require_http">Увімкнути вхідний протокол HTTP</string>
|
||||
<string name="general_settings">Налаштування програми</string>
|
||||
<string name="inbound_settings">Вхідні налаштування</string>
|
||||
<string name="allow_access_sum">Прив’язати вхідні сервери до 0.0.0.0</string>
|
||||
<string name="allow_access">Дозволити підключення з локальної мережі</string>
|
||||
<string name="cag_route">Налаштування маршруту</string>
|
||||
<string name="port_transproxy">Транспроксі -порт</string>
|
||||
<string name="port_http">Проксі -порт HTTP</string>
|
||||
<string name="port_proxy">Порт проксі -сервера SOCKS5</string>
|
||||
<string name="service_mode_proxy">Тільки проксі</string>
|
||||
<string name="service_mode">Режим обслуговування</string>
|
||||
<string name="group_duplicate">Дублікат:
|
||||
\n%s</string>
|
||||
<string name="group_deleted">Видалено:
|
||||
\n%s</string>
|
||||
<string name="group_changed">Оновлено:
|
||||
\n%s</string>
|
||||
<string name="group_added">Додано:
|
||||
\n%s</string>
|
||||
<string name="group_delete_confirm_prompt">Ви впевнені, що хочете видалити цю групу\?</string>
|
||||
<string name="group_diff">Різниця (%s)</string>
|
||||
<string name="group_show_diff">Різниця</string>
|
||||
<string name="group_updated">%s: Оновлено %d проксі</string>
|
||||
<string name="group_no_difference">%s: Різниці немає</string>
|
||||
<string name="group_status_proxies_subscription">%d проксі | Оновлено на %s</string>
|
||||
<string name="group_status_proxies">%d проксі</string>
|
||||
<string name="group_status_empty_subscription">Ще не оновлено</string>
|
||||
<string name="group_status_empty">Порожня група</string>
|
||||
<string name="group_edit_subscription">Редагувати підписку</string>
|
||||
<string name="group_edit">Редагувати групу</string>
|
||||
<string name="group_create_subscription">Створити підписку</string>
|
||||
<string name="group_create">Створити групу</string>
|
||||
<string name="group_name_required">Потрібна назва групи</string>
|
||||
<string name="group_subscription_link">Посилання на підписку</string>
|
||||
<string name="group_update">Оновлення</string>
|
||||
<string name="group_name">Назва групи</string>
|
||||
<string name="tile_title">Перемикач</string>
|
||||
<string name="quick_toggle">Переключити</string>
|
||||
<string name="group_default">Розгрупований</string>
|
||||
<string name="document">Документ</string>
|
||||
<string name="theme">Тема</string>
|
||||
<string name="menu_about">Про</string>
|
||||
<string name="menu_group">Група</string>
|
||||
<string name="menu_configuration">Конфігурація</string>
|
||||
<string name="logcat">Експорт інформації про налагодження</string>
|
||||
<string name="version_x">Версія (%s)</string>
|
||||
<string name="app_version">Версія</string>
|
||||
<string name="oss_licenses">Ліцензії з відкритим кодом</string>
|
||||
<string name="telegram">Канал оновлення Telegram</string>
|
||||
<string name="github">Вихідний код</string>
|
||||
<string name="project">Проєкт</string>
|
||||
<string name="app_name" translatable="false">NekoBox</string>
|
||||
<string name="app_name_long" translatable="false">NekoBox for Android</string>
|
||||
<string name="app_desc">Універсальний набір інструментів проксі для Android, написаний на Kotlin.</string>
|
||||
<string name="route_name">Назва маршруту</string>
|
||||
<string name="delete_route_prompt">Ви впевнені, що хочете видалити цей маршрут\?</string>
|
||||
<string name="route_add">Створити маршрут</string>
|
||||
<string name="menu_route">Маршрут</string>
|
||||
<string name="metered_summary">Система підказок щодо розгляду VPN як лічильника</string>
|
||||
<string name="metered">Підказка з дозуванням</string>
|
||||
<string name="only">Тільки</string>
|
||||
<string name="prefer">Краще</string>
|
||||
<string name="ipv6">Маршрут IPv6</string>
|
||||
<string name="edit_config">Редагувати конфігурацію</string>
|
||||
<string name="config_type">Тип конфігурації</string>
|
||||
<string name="extra_headers">Додаткові заголовки</string>
|
||||
<string name="encryption">Шифрування</string>
|
||||
<string name="early_data_header_name">Назва раннього заголовка даних</string>
|
||||
<string name="certificates">Сертифікати</string>
|
||||
<string name="alpn">Переговори про протокол шару додатків</string>
|
||||
<string name="sni">Індикація імені сервера</string>
|
||||
<string name="tls">Використовуйте TLS</string>
|
||||
<string name="grpc_service_name">ім\'я служби gRPC</string>
|
||||
<string name="http_path">Шлях HTTP</string>
|
||||
<string name="http_host">Хост HTTP</string>
|
||||
<string name="ws_path">Шлях WebSocket</string>
|
||||
<string name="ws_host">Хост WebSocket</string>
|
||||
<string name="header_type">Тип заголовка</string>
|
||||
<string name="network">Мережа</string>
|
||||
<string name="security">Шифрування транспортного рівня</string>
|
||||
<string name="alter_id">Змінити ідентифікатор</string>
|
||||
<string name="uuid">ідентифікатор користувача</string>
|
||||
<string name="protocol_param">Протокол Param</string>
|
||||
<string name="protocol">Протокол</string>
|
||||
<string name="enc_method">Метод шифрування</string>
|
||||
<string name="password">Пароль</string>
|
||||
<string name="key_opt">Ключ (необов’язково)</string>
|
||||
<string name="password_opt">Пароль (необов’язково)</string>
|
||||
<string name="username_opt">Ім\'я користувача (необов’язково)</string>
|
||||
<string name="username">Ім\'я користувача</string>
|
||||
<string name="server_port">Віддалений порт</string>
|
||||
<string name="server_address">Сервер</string>
|
||||
<string name="profile_name">Імя профілю</string>
|
||||
<string name="connection_test_url">URL -адреса перевірки з\'єднання</string>
|
||||
<string name="transproxy_mode">Режим Transproxy</string>
|
||||
<string name="project">Проєкт</string>
|
||||
<string name="github">Вихідний код</string>
|
||||
<string name="telegram">Канал оновлень в Telegram</string>
|
||||
<string name="oss_licenses">Ліцензії з відкритим кодом</string>
|
||||
<string name="app_version">Версія</string>
|
||||
<string name="version_x">Версія (%s)</string>
|
||||
<string name="logcat">Експорт інформації про налагодження</string>
|
||||
<string name="menu_configuration">Конфігурація</string>
|
||||
<string name="menu_group">Група</string>
|
||||
<string name="menu_about">Про додаток</string>
|
||||
<string name="theme">Тема</string>
|
||||
<string name="document">Документація</string>
|
||||
<string name="group_default">Без групи</string>
|
||||
<string name="quick_toggle">Перемикач</string>
|
||||
<string name="tile_title">Перемикач</string>
|
||||
<string name="menu_traffic">Трафік</string>
|
||||
<string name="menu_dashboard">Панель керування sing-box</string>
|
||||
<!-- externel -->
|
||||
<string name="action_copy">Копіювати</string>
|
||||
<string name="action_open">Відкрити</string>
|
||||
<!-- group -->
|
||||
<string name="group_name">Назва групи</string>
|
||||
<string name="group_update">Оновити</string>
|
||||
<string name="group_subscription_link">Посилання на підписку</string>
|
||||
<string name="group_name_required">Потрібна назва групи</string>
|
||||
<string name="group_create">Створити групу</string>
|
||||
<string name="group_create_subscription">Створити підписку</string>
|
||||
<string name="update_all_subscription">Оновити всі підписки</string>
|
||||
<string name="group_edit">Редагувати групу</string>
|
||||
<string name="group_edit_subscription">Редагувати підписку</string>
|
||||
<string name="group_status_empty">Порожня група</string>
|
||||
<string name="group_status_empty_subscription">Ще не оновлено</string>
|
||||
<string name="group_status_proxies">%d проксі</string>
|
||||
<string name="group_status_proxies_subscription">%d проксі | Оновлено %s</string>
|
||||
<string name="group_no_difference">%s: Немає різниці</string>
|
||||
<string name="group_updated">%s: Оновлено %d проксі</string>
|
||||
<string name="group_show_diff">Різниця</string>
|
||||
<string name="group_diff">Різниця (%s)</string>
|
||||
<string name="group_delete_confirm_prompt">Ви впевнені, що хочете видалити цю групу?</string>
|
||||
<string name="group_added">Додано: \n%s</string>
|
||||
<string name="group_changed">Оновлено: \n%s</string>
|
||||
<string name="group_deleted">Видалено: \n%s</string>
|
||||
<string name="group_duplicate">Дублікат: \n%s</string>
|
||||
<!-- misc -->
|
||||
<string name="service_mode">Режим роботи</string>
|
||||
<string name="service_mode_proxy">Тільки проксі</string>
|
||||
<string name="service_mode_vpn" translatable="false">VPN</string>
|
||||
<string name="port_proxy">Порт проксі-сервера SOCKS5</string>
|
||||
<string name="port_http">Проксі-порт HTTP</string>
|
||||
<string name="port_transproxy">Транспроксі-порт</string>
|
||||
<string name="cag_route">Налаштування маршруту</string>
|
||||
<string name="allow_access">Дозволити підключення з локальної мережі</string>
|
||||
<string name="allow_access_sum">Прив’язати вхідні сервери до 0.0.0.0</string>
|
||||
<string name="inbound_settings">Вхідні налаштування</string>
|
||||
<string name="general_settings">Налаштування програми</string>
|
||||
<string name="require_http">Увімкнути вхідний протокол HTTP</string>
|
||||
<string name="cag_ws">Налаштування WebSocket</string>
|
||||
<string name="ws_max_early_data" translatable="false">Max early data</string>
|
||||
<string name="ws_browser_forwarding">Переадресація браузера</string>
|
||||
<string name="ws_browser_forwarding_sum">Пересилайте відповідні WebSockets через браузер.</string>
|
||||
<string name="speed_interval">Інтервал оновлення сповіщення про швидкість</string>
|
||||
<string name="cag_misc">Різні налаштування</string>
|
||||
<string name="show_stop">Показати кнопку зупинки</string>
|
||||
<string name="show_stop_sum">Якщо ви не хочете використовувати Quick Tile як перемикач</string>
|
||||
<string name="show_direct_speed">Показати пряму швидкість</string>
|
||||
<string name="show_direct_speed_sum">У сповіщенні також покажіть швидкість трафіку без проксі-сервера</string>
|
||||
<string name="security_settings">Налаштування безпеки TLS</string>
|
||||
<string name="allow_insecure">Дозволити незахищене</string>
|
||||
<string name="allow_insecure_sum">Вимкнути перевірку сертифікатів. Якщо ввімкнено, ця конфігурація є такою ж безпечною, як і відкритий текст</string>
|
||||
<string name="traffic" translatable="false">%1$s↑ %2$s↓</string>
|
||||
<string name="speed_detail">Проксі: %1$s↑ %2$s↓\nПрямий: %3$s↑ %4$s↓</string>
|
||||
<string name="speed">%s/с</string>
|
||||
<string name="connection_test_testing">Тестування…</string>
|
||||
<string name="connection_test_available">Успіх: рукостискання HTTPS зайняло %dмс</string>
|
||||
<string name="connection_test_available_http">Успіх: рукостискання HTTP зайняло %dмс</string>
|
||||
<string name="connection_test_error">Не вдалося: %s</string>
|
||||
<string name="connection_test_fail">Інтернет недоступний</string>
|
||||
<string name="connection_test_error_status_code">Код помилки: #%d</string>
|
||||
<string name="cag_dns">Налаштування DNS</string>
|
||||
<string name="remote_dns">Віддалений DNS</string>
|
||||
<string name="direct_dns">Прямий DNS</string>
|
||||
<string name="enable_dns_routing">Увімкнути маршрутизацію DNS</string>
|
||||
<string name="dns_routing_message">Вирішуйте домени в обхідних маршрутах за допомогою Direct DNS. Будьте в курсі можливих витоків DNS</string>
|
||||
<string name="enable_fakedns">Увімкнути FakeDNS</string>
|
||||
<string name="fakedns_message">Може призвести до перезапуску інших програм для повторного підключення до мережі після зупинки проксі</string>
|
||||
<string name="dns_hosts">Переписування домену</string>
|
||||
<string name="port_local_dns">Локальний порт DNS</string>
|
||||
<string name="require_transproxy">Увімкнути вхідний сигнал Transproxy</string>
|
||||
<string name="obfs_param">Obfs Парам</string>
|
||||
<string name="transproxy_mode">Режим Transproxy</string>
|
||||
<string name="connection_test_url">URL-адреса перевірки з\'єднання</string>
|
||||
<!-- proxy category -->
|
||||
<string name="profile_name">Ім\'я профілю</string>
|
||||
<string name="server_address">Сервер</string>
|
||||
<string name="server_port">Віддалений порт</string>
|
||||
<string name="username">Ім\'я користувача</string>
|
||||
<string name="username_opt">Ім\'я користувача (необов’язково)</string>
|
||||
<string name="password_opt">Пароль (необов’язково)</string>
|
||||
<string name="key_opt">Ключ (необов’язково)</string>
|
||||
<string name="password">Пароль</string>
|
||||
<string name="enc_method">Метод шифрування</string>
|
||||
<string name="protocol">Протокол</string>
|
||||
<string name="protocol_param">Параметр протоколу</string>
|
||||
<string name="obfs">Obfs</string>
|
||||
<string name="speed">%s/s</string>
|
||||
<string name="menu_traffic">трафіку</string>
|
||||
</resources>
|
||||
<string name="obfs_param">Параметр Obfs</string>
|
||||
<string name="uuid">ідентифікатор користувача</string>
|
||||
<string name="alter_id">Змінити ідентифікатор</string>
|
||||
<string name="security">Шифрування транспортного рівня</string>
|
||||
<string name="network">Мережа</string>
|
||||
<string name="header_type">Тип заголовка</string>
|
||||
<string name="ws_host">Хост WebSocket</string>
|
||||
<string name="ws_path">Шлях WebSocket</string>
|
||||
<string name="http_host">Хост HTTP</string>
|
||||
<string name="http_path">Шлях HTTP</string>
|
||||
<string name="grpc_service_name">ім\'я служби gRPC</string>
|
||||
<string name="tls">Використовувати TLS</string>
|
||||
<string name="sni">Індикація імені сервера</string>
|
||||
<string name="alpn">Переговори про протокол шару додатків</string>
|
||||
<string name="certificates">Сертифікати</string>
|
||||
<string name="early_data_header_name">Назва раннього заголовка даних</string>
|
||||
<string name="encryption">Шифрування</string>
|
||||
<string name="extra_headers">Додаткові заголовки</string>
|
||||
<string name="config_type">Тип конфігурації</string>
|
||||
<string name="edit_config">Редагувати конфігурацію</string>
|
||||
<!-- feature category -->
|
||||
<string name="ipv6">Маршрут IPv6</string>
|
||||
<string name="prefer">Віддавати перевагу</string>
|
||||
<string name="only">Тільки</string>
|
||||
<string name="metered">Лімітне підключення</string>
|
||||
<string name="metered_summary">Повідомляти системі, що VPN-з\'єднання є лімітним</string>
|
||||
<string name="menu_route">Маршрут</string>
|
||||
<string name="route_add">Створити маршрут</string>
|
||||
<string name="delete_route_prompt">Ви впевнені, що хочете видалити цей маршрут?</string>
|
||||
<string name="route_name">Назва маршруту</string>
|
||||
<string name="route_proxy">Проксі</string>
|
||||
<string name="route_bypass">В обхід</string>
|
||||
<string name="route_block">Блокувати</string>
|
||||
<string name="route_profile">Вибрати профіль…</string>
|
||||
<string name="empty_route">Порожній маршрут</string>
|
||||
<string name="empty_route_notice">Встановіть правила перед збереженням</string>
|
||||
<string name="route_bypass_domain">Правило домену для %s</string>
|
||||
<string name="route_play_store">Правило Play Store для %s</string>
|
||||
<string name="route_bypass_ip">Правило IP для %s</string>
|
||||
<string name="route_reset">Скинути</string>
|
||||
<string name="route_manage_assets">Керування ресурсами маршрутів</string>
|
||||
<string name="route_assets">Ресурси</string>
|
||||
<string name="route_rules_provider">Постачальник ресурсів правил</string>
|
||||
<string name="route_rules_official">Офіційний</string>
|
||||
<string name="route_asset_status">Локальна версія: %s</string>
|
||||
<string name="route_asset_no_update">Немає оновлень</string>
|
||||
<string name="route_asset_updated">Оновлено</string>
|
||||
<string name="route_not_asset">Це не файл ресурсів: очікувався .db, але отримано %s</string>
|
||||
<string name="route_opt_bypass_lan">Обходити локальну мережу</string>
|
||||
<string name="route_opt_block_ads">Блокувати рекламу</string>
|
||||
<string name="route_opt_block_analysis">Блокувати аналітику</string>
|
||||
<string name="route_opt_block_quic">Блокувати QUIC</string>
|
||||
<string name="domain_strategy">Стратегія визначення доменів</string>
|
||||
<string name="traffic_sniffing">Увімкнути аналіз трафіку</string>
|
||||
<string name="enable_mux">Увімкнути мультиплексор</string>
|
||||
<string name="mux_sum">Mux призначений для зменшення затримки рукостискання TCP, а не для збільшення пропускної здатності з\'єднання. Використання Mux для перегляду відео, завантаження або тестування швидкості зазвичай є контрпродуктивним. Якщо сервер його не підтримує, ви не зможете отримати доступ до Інтернету.</string>
|
||||
<string name="mux_concurrency">Паралельні з\'єднання Mux</string>
|
||||
<string name="tcp_keep_alive_interval">Інтервал доставки пакетів TCP keep-alive</string>
|
||||
<string name="proxied_apps">Програми в режимі VPN</string>
|
||||
<string name="proxied_apps_summary">Налаштувати режим VPN для вибраних програм</string>
|
||||
<string name="on">Увімк</string>
|
||||
<string name="off">Вимк</string>
|
||||
<string name="search_apps">Пошук…</string>
|
||||
<string name="scanning">Сканування…</string>
|
||||
<string name="invert_selections">Інвертувати вибір</string>
|
||||
<string name="clear_selections">Очистити вибір</string>
|
||||
<string name="bypass_apps">В обхід</string>
|
||||
<string name="show_system_apps">Показувати системні програми</string>
|
||||
<string name="auto_connect">Автоматичне підключення</string>
|
||||
<string name="auto_connect_summary">Вмикати проксі під час запуску/оновлення програми, якщо він працював раніше</string>
|
||||
<string name="direct_boot_aware">Дозволити перемикання на екрані блокування</string>
|
||||
<string name="direct_boot_aware_summary">Інформація про ваш вибраний профіль буде менш захищеною</string>
|
||||
<!-- notification category -->
|
||||
<string name="service_vpn">Служба VPN</string>
|
||||
<string name="service_proxy">Служба проксі</string>
|
||||
<string name="forward_success">Проксі запущено.</string>
|
||||
<string name="invalid_server">Неправильне ім\'я сервера</string>
|
||||
<string name="service_failed">Не вдалося: </string>
|
||||
<string name="stop">Зупинити</string>
|
||||
<string name="stopping">Зупинка…</string>
|
||||
<string name="vpn_error">%s</string>
|
||||
<string name="vpn_permission_denied">Дозвіл на створення служби VPN відхилено</string>
|
||||
<string name="reboot_required">Не вдалося запустити службу VPN. Можливо, вам доведеться перезавантажити пристрій.</string>
|
||||
<!-- alert category -->
|
||||
<string name="profile_empty">Будь ласка, виберіть профіль</string>
|
||||
<string name="connect">Підключити</string>
|
||||
<string name="clipboard_empty">Буфер обміну порожній</string>
|
||||
<!-- menu category -->
|
||||
<string name="settings">Налаштування</string>
|
||||
<string name="edit">Редагувати</string>
|
||||
<string name="share">Поділитися</string>
|
||||
<string name="add_profile">Додати профіль</string>
|
||||
<string name="select_profile">Вибрати профіль</string>
|
||||
<string name="action_socks" translatable="false">SOCKS</string>
|
||||
<string name="action_http" translatable="false">HTTP</string>
|
||||
<string name="action_shadowsocks" translatable="false">Shadowsocks</string>
|
||||
<string name="action_shadowsocksr" translatable="false">ShadowsocksR</string>
|
||||
<string name="action_vmess" translatable="false">VMess</string>
|
||||
<string name="action_trojan" translatable="false">Trojan</string>
|
||||
<string name="action_trojan_go" translatable="false">Trojan Go</string>
|
||||
<string name="action_mieru" translatable="false">Mieru</string>
|
||||
<string name="action_naive" translatable="false">Naïve</string>
|
||||
<string name="action_anytls" translatable="false">AnyTLS</string>
|
||||
<string name="action_hysteria" translatable="false">Hysteria</string>
|
||||
<string name="action_ssh" translatable="false">SSH</string>
|
||||
<string name="action_wireguard" translatable="false">WireGuard</string>
|
||||
<string name="action_tuic" translatable="false">TUIC</string>
|
||||
<string name="proxy_chain">Ланцюжок проксі</string>
|
||||
<string name="custom_config">Власна конфігурація</string>
|
||||
<string name="balancer">Балансувальник</string>
|
||||
<string name="balancer_settings">Налаштування балансувальника</string>
|
||||
<string name="balancer_type">Тип</string>
|
||||
<string name="balancer_strategy">Стратегія</string>
|
||||
<string name="chain_settings">Налаштування ланцюжка</string>
|
||||
<string name="config_settings">Налаштування конфігурації</string>
|
||||
<string name="circular_reference">Циклічне посилання</string>
|
||||
<string name="circular_reference_sum">Маршрут не може містити самого себе.</string>
|
||||
<string name="clear_profiles">Очистити</string>
|
||||
<string name="action_create_group">Порожня група</string>
|
||||
<string name="action_from_link">З підписки</string>
|
||||
<string name="action_scan_china_apps">Сканувати китайські програми</string>
|
||||
<string name="action_export_file">Експортувати у файл</string>
|
||||
<string name="action_export_clipboard">Експортувати в буфер обміну</string>
|
||||
<string name="action_export">Експорт</string>
|
||||
<string name="action_import">Імпортувати з буфера обміну</string>
|
||||
<string name="action_import_file">Імпортувати з файлу</string>
|
||||
<string name="action_export_msg">Експортовано успішно!</string>
|
||||
<string name="action_export_err">Не вдалося експортувати.</string>
|
||||
<string name="action_import_msg">Імпортовано успішно!</string>
|
||||
<string name="action_import_err">Не вдалося імпортувати.</string>
|
||||
<string name="file_manager_missing">На вашому пристрої відсутній стандартний файловий менеджер Android, будь ласка, встановіть його, наприклад, Material Files.</string>
|
||||
<!-- share -->
|
||||
<!-- profile -->
|
||||
<string name="profile_config">Конфігурація профілю</string>
|
||||
<string name="delete">Видалити</string>
|
||||
<string name="delete_confirm_prompt">Ви впевнені, що хочете видалити цей профіль?</string>
|
||||
<string name="share_qr_nfc">QR-код</string>
|
||||
<string name="add_profile_methods_scan_qr_code">Сканувати QR-код</string>
|
||||
<string name="add_profile_methods_manual_settings">Ручні налаштування</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="one">Видалено</item>
|
||||
<item quantity="few">Видалено %d елементи</item>
|
||||
<item quantity="many">Видалено %d елементів</item>
|
||||
<item quantity="other">Видалено %d елемента</item>
|
||||
</plurals>
|
||||
<plurals name="added">
|
||||
<item quantity="one">Додано</item>
|
||||
<item quantity="few">Додано %d проксі</item>
|
||||
<item quantity="many">Додано %d проксі</item>
|
||||
<item quantity="other">Додано %d проксі</item>
|
||||
</plurals>
|
||||
<string name="undo">Скасувати</string>
|
||||
<string name="insecure">Незахищений</string>
|
||||
<string name="deprecated">Застарілий</string>
|
||||
<!-- tasker -->
|
||||
<!-- status -->
|
||||
<string name="connecting">Підключення…</string>
|
||||
<string name="vpn_connected">Підключено, торкніться, щоб перевірити з\'єднання</string>
|
||||
<string name="not_connected">Не підключено</string>
|
||||
<!-- subscriptions -->
|
||||
<string name="subscriptions">Підписки</string>
|
||||
<string name="cleartext_http_warning">HTTP-трафік у відкритому вигляді є незахищеним</string>
|
||||
<string name="error_title">Помилка</string>
|
||||
<string name="no_proxies_found">Проксі за посиланням не знайдено</string>
|
||||
<string name="no_proxies_found_in_subscription">У підписці не знайдено проксі</string>
|
||||
<string name="no_proxies_found_in_file">У файлі не знайдено проксі</string>
|
||||
<string name="no_proxies_found_in_clipboard">У буфері обміну не знайдено проксі</string>
|
||||
<string name="deduplication">Дедуплікація</string>
|
||||
<string name="donate">Пожертвувати</string>
|
||||
<string name="donate_info">Я люблю гроші</string>
|
||||
<string name="ignore_battery_optimizations">Ігнорувати оптимізацію батареї</string>
|
||||
<string name="ignore_battery_optimizations_sum">Зняти деякі обмеження</string>
|
||||
<!-- plugin -->
|
||||
<string name="plugin">Плагін</string>
|
||||
<string name="plugin_configure">Налаштувати…</string>
|
||||
<string name="plugin_disabled">Вимкнено</string>
|
||||
<string name="plugin_unknown">Невідомий плагін %s</string>
|
||||
<string name="plugin_untrusted">Попередження: цей плагін, здається, не з надійного джерела.</string>
|
||||
<string name="plugin_auto_connect_unlock_only">Цей плагін може не працювати з автоматичним підключенням</string>
|
||||
<string name="proxy_cat">Налаштування сервера</string>
|
||||
<string name="ss_cat">Налаштування Shadowsocks</string>
|
||||
<string name="unsaved_changes_prompt">Зміни не збережено. Ви хочете зберегти?</string>
|
||||
<string name="yes">Так</string>
|
||||
<string name="no">Ні</string>
|
||||
<string name="apply">Застосувати</string>
|
||||
<string name="need_reload">Перезавантажте службу проксі, щоб застосувати зміни</string>
|
||||
<string name="license">Ліцензія</string>
|
||||
<string name="route_warn">Переконайтеся, що ви прочитали документацію перед додаванням власних правил, інакше ви можете не підключитися до Інтернету.</string>
|
||||
<string name="lines">%d рядків</string>
|
||||
<string name="night_mode">Нічний режим</string>
|
||||
<string name="follow_system">Як у системі</string>
|
||||
<string name="enable">Увімкнути</string>
|
||||
<string name="disable">Вимкнути</string>
|
||||
<string name="auto">Авто</string>
|
||||
<string name="enable_log">Увімкнути журнал</string>
|
||||
<string name="enable_log_sum">Для налагодження</string>
|
||||
<string name="list">Список</string>
|
||||
<string name="random">Випадковий</string>
|
||||
<string name="leastPing" translatable="false">Ping</string>
|
||||
<string name="api_port">Порт API</string>
|
||||
<string name="probe_interval">Інтервал спостереження балансувальника</string>
|
||||
<string name="standard">Стандартний</string>
|
||||
<string name="v2rayn" translatable="false">V2RayN</string>
|
||||
<string name="available" translatable="false">%dмс</string>
|
||||
<string name="unavailable">Недоступний</string>
|
||||
<string name="always_show_address">Завжди показувати адресу</string>
|
||||
<string name="always_show_address_sum">Завжди відображати адресу сервера на картці конфігурації</string>
|
||||
<string name="clear_traffic_statistics">Очистити статистику трафіку</string>
|
||||
<string name="connection_test">Тест з\'єднання</string>
|
||||
<string name="connection_test_clear_results">Очистити результати тесту</string>
|
||||
<string name="connection_test_tcp_ping" translatable="false">TCPing</string>
|
||||
<string name="connection_test_tcp_ping_unavailable">TCPing недоступний</string>
|
||||
<string name="connection_test_icmp_ping" translatable="false">ICMPing</string>
|
||||
<string name="connection_test_icmp_ping_unavailable">ICMPing недоступний</string>
|
||||
<string name="connection_test_url_test" translatable="false">URL Test</string>
|
||||
<string name="connection_test_domain_not_found">Домен не знайдено</string>
|
||||
<string name="connection_test_refused">З\'єднання відхилено</string>
|
||||
<string name="connection_test_unreachable">Недоступний</string>
|
||||
<string name="connection_test_timeout">Час очікування минув</string>
|
||||
<string name="append_http_proxy">Додати HTTP-проксі до VPN</string>
|
||||
<string name="append_http_proxy_sum">HTTP-проксі буде використовуватися безпосередньо (браузером / деякими підтримуваними програмами), не проходячи через віртуальний мережевий пристрій (Android 10+)</string>
|
||||
<string name="protocol_settings">Налаштування протоколу</string>
|
||||
<string name="trojan_provider">Постачальник Trojan</string>
|
||||
<string name="group_basic">Основні</string>
|
||||
<string name="group_settings">Налаштування групи</string>
|
||||
<string name="subscription">Підписка</string>
|
||||
<string name="subscription_settings">Налаштування підписки</string>
|
||||
<string name="group_type">Тип групи</string>
|
||||
<string name="subscription_type">Тип підписки</string>
|
||||
<string name="delete_group_prompt">Ви впевнені, що хочете видалити цю групу?</string>
|
||||
<string name="force_resolve">Примусове визначення</string>
|
||||
<string name="force_resolve_sum">Визначати всі доменні імена в IP-адреси під час оновлення. Хост і SNI будуть автоматично додані, якщо це можливо</string>
|
||||
<string name="deduplication_sum">Видаляти дублікати конфігурацій під час оновлення</string>
|
||||
<string name="raw">Raw</string>
|
||||
<string name="update_settings">Налаштування оновлення</string>
|
||||
<string name="auto_update">Автоматичне оновлення</string>
|
||||
<string name="auto_update_delay">Затримка автооновлення (у хвилинах)</string>
|
||||
<string name="update_when_connected_only">Оновлювати лише при підключенні</string>
|
||||
<string name="update_when_connected_only_sum">Запобігати витоку IP-адреси</string>
|
||||
<string name="subscription_user_agent">UserAgent</string>
|
||||
<string name="confirm">Підтвердити</string>
|
||||
<string name="missing_plugin">Відсутній плагін</string>
|
||||
<string name="profile_requiring_plugin">Профіль %s вимагає встановлення плагіна %s, але його не знайдено.</string>
|
||||
<string name="action_learn_more">ДІЗНАТИСЯ БІЛЬШЕ</string>
|
||||
<string name="action_download">ЗАВАНТАЖИТИ</string>
|
||||
<string name="install_from_play_store">Встановити з Play Store</string>
|
||||
<string name="install_from_fdroid">Встановити з F-Droid</string>
|
||||
<string name="download">Завантажити</string>
|
||||
<string name="ooc_subscription_token" translatable="false">OOCv1 API Token</string>
|
||||
<string name="ooc_subscription_token_invalid">Неправильний токен OOCv1</string>
|
||||
<string name="update_subscription_warning">Проксі не підключено, ви впевнені, що хочете продовжити оновлення?</string>
|
||||
<string name="ooc_warning">Попередження</string>
|
||||
<string name="ooc_missing_protocol">Підписка вимагає підтримки протоколу %s, але його не знайдено. Непідтримувані профілі будуть проігноровані.</string>
|
||||
<string name="service_subscription">Служба оновлення підписок</string>
|
||||
<string name="subscription_update">Оновлення підписки</string>
|
||||
<string name="subscription_update_message">Оновлення %s …</string>
|
||||
<string name="group_filter">Фільтр</string>
|
||||
<string name="subscription_used">Використано %s</string>
|
||||
<string name="subscription_traffic">Використано %s / Залишилося %s</string>
|
||||
<string name="subscription_expire">Закінчується: %s</string>
|
||||
<string name="subscription_import">Імпортувати підписку</string>
|
||||
<string name="subscription_import_message">Підтвердьте, що ви хочете імпортувати підписку %s? Якщо ви робите це з ненадійного джерела, це може призвести до витоку вашої IP-адреси та даних про цю дію.</string>
|
||||
<string name="profile_import">Імпортувати профіль</string>
|
||||
<string name="profile_import_message">Підтвердьте, що ви хочете імпортувати профіль %s?</string>
|
||||
<string name="clear_profiles_message">Ви впевнені, що хочете очистити цю групу?</string>
|
||||
<string name="apps">Програми</string>
|
||||
<string name="select_apps">Вибрати програми</string>
|
||||
<string name="apps_message">%d програм</string>
|
||||
<string name="hysteria_obfs">Пароль обфускації</string>
|
||||
<string name="hysteria_auth_type">Тип автентифікації</string>
|
||||
<string name="hysteria_auth_payload">Дані автентифікації</string>
|
||||
<string name="hysteria_upload_mbps">Макс. швидкість вивантаження (у Мбіт/с)</string>
|
||||
<string name="hysteria_download_mbps">Макс. швидкість завантаження (у Мбіт/с)</string>
|
||||
<string name="experimental_settings">Експериментальні</string>
|
||||
<string name="hysteria_stream_receive_window">Вікно прийому потоку QUIC</string>
|
||||
<string name="hysteria_connection_receive_window">Вікно прийому з\'єднання QUIC</string>
|
||||
<string name="hysteria_disable_mtu_discovery">Вимкнути виявлення Path MTU</string>
|
||||
<string name="group_order">Порядок</string>
|
||||
<string name="group_order_origin">За замовчуванням</string>
|
||||
<string name="group_order_by_name">За назвою</string>
|
||||
<string name="group_order_by_delay">За затримкою</string>
|
||||
<string name="plugin_exists_but_on_shit_system">Профіль %s вимагає плагін %s, але ваш виробник обладнання (зазвичай гіганти-капіталісти зі спостереження та виробники шкідливого ПЗ) змінив вашу систему Android, зробивши плагін непридатним для використання.</string>
|
||||
<string name="shadowsocks_plugin_simple_obfs">Simple Obfs (плагін для Shadowsocks)</string>
|
||||
<string name="shadowsocks_plugin_v2ray">V2Ray (плагін для Shadowsocks)</string>
|
||||
<string name="traffic_uplink" translatable="false">%s | %s/с ↑</string>
|
||||
<string name="traffic_downlink" translatable="false">%s | %s/с ↓</string>
|
||||
<string name="traffic_uplink_total" translatable="false">Всього %s ↑</string>
|
||||
<string name="traffic_downlink_total" translatable="false">Всього %s ↓</string>
|
||||
<string name="tcp_connections">%d TCP-з\'єднань</string>
|
||||
<string name="udp_connections">%d UDP-з\'єднань</string>
|
||||
<string name="copy_label">Копіювати назву</string>
|
||||
<string name="copy_package_name">Копіювати назву пакета</string>
|
||||
<string name="open_app">Відкрити програму</string>
|
||||
<string name="open_settings">Відкрити налаштування</string>
|
||||
<string name="open_market">Відкрити в маркеті</string>
|
||||
<string name="create_rule">Створити правило</string>
|
||||
<string name="copy_success">Скопійовано успішно!</string>
|
||||
<string name="copy_failed">Не вдалося скопіювати.</string>
|
||||
<string name="app_no_launcher">Програма не має інтерфейсу.</string>
|
||||
<string name="route_for">Правило для %s</string>
|
||||
<string name="route_need_vpn">Правило маршрутизації %s залежить від VPN, щоб набути чинності, тому воно ігнорується.</string>
|
||||
<string name="profile_traffic_statistics">Статистика трафіку профілю</string>
|
||||
<string name="profile_traffic_statistics_summary">Якщо вимкнено, використаний трафік не буде враховуватися</string>
|
||||
<string name="no_statistics">Статистики ще немає</string>
|
||||
<string name="app_statistics_disabled">Статистика трафіку програм вимкнена</string>
|
||||
<string name="ssh_auth_type_none">Немає</string>
|
||||
<string name="ssh_public_key">Публічний ключ</string>
|
||||
<string name="ssh_private_key">Приватний ключ</string>
|
||||
<string name="ssh_private_key_passphrase">Парольна фраза приватного ключа</string>
|
||||
<string name="translate_platform">Платформа для перекладу</string>
|
||||
<string name="menu_tools">Інструменти</string>
|
||||
<string name="menu_log">Журнали</string>
|
||||
<string name="clear_logcat">Очистити Logcat</string>
|
||||
<string name="wireguard_local_address">Локальна адреса</string>
|
||||
<string name="wireguard_public_key">Публічний ключ піра</string>
|
||||
<string name="wireguard_psk">Pre-Shared Key піра</string>
|
||||
<string name="cloudflare_wrap" translatable="false">Cloudflare Warp</string>
|
||||
<string name="warp_license">CloudFlare Warp – це безкоштовний VPN-провайдер, що використовує WireGuard. Використовуючи його, ви погоджуєтеся з Умовами надання послуг.</string>
|
||||
<string name="warp_generate">Згенерувати конфігурацію</string>
|
||||
<string name="generating">Генерація…</string>
|
||||
<string name="tun_implementation">Реалізація TUN</string>
|
||||
<string name="destination_override">Перевизначити призначення</string>
|
||||
<string name="destination_override_summary">Використовувати перехоплений домен для перезапису адреси призначення, а не лише для маршрутизації</string>
|
||||
<string name="resolve_destination">Визначати призначення</string>
|
||||
<string name="resolve_destination_summary">Якщо адреса призначення є доменом, вона передається далі на основі стратегії IPv6 (конфліктує з FakeDNS)</string>
|
||||
<string name="pcap" translatable="false">Pcap</string>
|
||||
<string name="pcap_notice">Файли Pcap будуть збережені в %s</string>
|
||||
<string name="naive_insecure_concurrency">Небезпечна паралельність</string>
|
||||
<string name="naive_insecure_concurrency_summary">Використовуйте N паралельних тунельних з\'єднань для більшої стійкості в поганих мережевих умовах. Більша кількість з\'єднань полегшує виявлення тунелювання та робить його менш безпечним. Цей проєкт прагне до найсильнішого захисту від аналізу трафіку. Використання його небезпечним способом суперечить його меті. \n\nЯкщо ви все ж таки повинні це використовувати, спробуйте спочатку N=2, щоб побачити, чи це вирішить ваші проблеми. Наполегливо не рекомендується використовувати більше 4 з\'єднань.</string>
|
||||
<string name="stun_test">Виявлення поведінки NAT</string>
|
||||
<string name="stun_test_summary">Визначити поведінку відображення NAT клієнта та поведінку фільтрації NAT, визначену в RFC 3478, за допомогою STUN.</string>
|
||||
<string name="start">Почати</string>
|
||||
<string name="stun_attest_loading">Це може зайняти кілька хвилин…</string>
|
||||
<string name="nat_stun_server_hint">STUN-сервер</string>
|
||||
<string name="nat_result_hint">Результат перевірки NAT</string>
|
||||
<string name="tools_network">Мережа</string>
|
||||
<string name="mtu" translatable="false">MTU</string>
|
||||
<string name="backup">Резервне копіювання</string>
|
||||
<string name="backup_groups_and_configurations">Групи та конфігурації</string>
|
||||
<string name="backup_rules">Правила маршрутизації</string>
|
||||
<string name="backup_settings">Налаштування</string>
|
||||
<string name="backup_summary">Якщо налаштування маршрутизації не будуть збережені разом з конфігураціями, власні вихідні з\'єднання будуть втрачені.</string>
|
||||
<string name="backup_not_file">Не є файлом резервної копії: очікувався .json, але отримано %s</string>
|
||||
<string name="invalid_backup_file">Неправильний файл резервної копії</string>
|
||||
<string name="backup_import">Імпорт</string>
|
||||
<string name="backup_import_summary">Імпортування перезапише наявні дані.</string>
|
||||
<string name="backup_importing">Імпортування…</string>
|
||||
<string name="packet_encoding">Кодування пакетів</string>
|
||||
<string name="acquire_wake_lock">Захоплювати WakeLock</string>
|
||||
<string name="release_wake_lock">Відпускати WakeLock</string>
|
||||
<string name="acquire_wake_lock_summary">Не давати процесору заснути</string>
|
||||
<string name="action_switch">Перемкнути</string>
|
||||
<string name="tuic_udp_relay_mode">Режим ретрансляції UDP</string>
|
||||
<string name="tuic_congestion_controller">Контролер перевантаження</string>
|
||||
<string name="tuic_disable_sni">Вимкнути SNI</string>
|
||||
<string name="tuic_reduce_rtt">Увімкнути 0-RTT QUIC рукостискання</string>
|
||||
<string name="please_update">Ваша програма занадто стара (%s) і перестане працювати %s. Будь ласка, оновіть її!</string>
|
||||
<string name="please_update_force">Ваша програма занадто стара (%s) і перестала працювати %s. Будь ласка, оновіть її!</string>
|
||||
<string name="connection_test_delete_unavailable">Очистити недоступні</string>
|
||||
<string name="move">Перемістити</string>
|
||||
<string name="exe_prefer_provider">Пріоритетний постачальник плагіна</string>
|
||||
<string name="create_shortcut">Створити ярлик</string>
|
||||
<string name="app_tls_version">Мінімальна версія TLS для підписки</string>
|
||||
<string name="hop_interval">Інтервал зміни портів (секунди)</string>
|
||||
<string name="domain_strategy_for_remote">Стратегія доменів для віддаленого</string>
|
||||
<string name="domain_strategy_for_direct">Стратегія доменів для прямого</string>
|
||||
<string name="domain_strategy_for_server">Стратегія доменів для адреси сервера</string>
|
||||
<string name="show_bottom_bar">Показувати нижню панель, як у SagerNet</string>
|
||||
<string name="utls_fingerprint">Відбиток uTLS</string>
|
||||
<string name="custom_outbound_json">Власний JSON вихідного з\'єднання</string>
|
||||
<string name="custom_config_json">Власний JSON конфігурації</string>
|
||||
<string name="is_outbound_only">Встановлений JSON є лише вихідним з\'єднанням</string>
|
||||
<string name="save">Зберегти</string>
|
||||
<string name="set_panel_url">Встановити URL панелі</string>
|
||||
<string name="enable_clash_api">Увімкнути Clash API</string>
|
||||
<string name="log_level">Рівень журналу</string>
|
||||
<string name="enable_clash_api_summary">Надати Clash API та панель yacd за адресою 127.0.0.1:9090</string>
|
||||
<string name="xtls_flow">Flow (підпротокол VLESS)</string>
|
||||
<string name="ads">Реклама</string>
|
||||
<string name="bypass_lan_in_core">Обходити ЛВС в ядрі</string>
|
||||
<string name="need_restart">Перезапустіть програму, щоб застосувати зміни</string>
|
||||
<string name="use_selector">Використовувати селектор</string>
|
||||
<string name="front_proxy">Передній проксі</string>
|
||||
<string name="landing_proxy">Проксі-призначення</string>
|
||||
<string name="action_shadowtls" translatable="false">ShadowTLS</string>
|
||||
<string name="protocol_version">Версія протоколу</string>
|
||||
<string name="share_subscription">Поділитися підпискою</string>
|
||||
<string name="show_group_in_notification">Показувати назву групи у сповіщенні</string>
|
||||
<string name="reset_connections">Скинути з\'єднання</string>
|
||||
<string name="remove_duplicate">Видалити дублікати серверів</string>
|
||||
<string name="mtu_help">Довге натискання на налаштування, щоб встановити власний MTU.</string>
|
||||
<string name="log_level_help">Довге натискання на налаштування, щоб встановити розмір буфера.</string>
|
||||
<string name="tls_camouflage_settings">Налаштування маскування TLS</string>
|
||||
<string name="test_concurrency">Паралелізм тесту</string>
|
||||
<string name="mux_type">Протокол Mux</string>
|
||||
<string name="sniff_routing">Результат аналізу для маршрутизації</string>
|
||||
<string name="sniff_override">Результат аналізу для призначення</string>
|
||||
<string name="resolve_server">Визначати адресу сервера відповідно до політики IPv6</string>
|
||||
<string name="auto_select_proxy_apps">Автоматичний вибір програм для проксі</string>
|
||||
<string name="auto_select_proxy_apps_message">Автоматично вибрати програми для проксі, це очистить ваш поточний вибір.</string>
|
||||
<string name="enable_ech">Увімкнути ECH</string>
|
||||
<string name="enable_ech_sum">Увімкнути Encrypted Client Hello</string>
|
||||
<string name="ech_settings">Налаштування ECH</string>
|
||||
<string name="ech_config">Конфігурація ECH</string>
|
||||
<string name="http_upgrade_host">Хост HTTPUpgrade</string>
|
||||
<string name="http_upgrade_path">Шлях HTTPUpgrade</string>
|
||||
<string name="update_current_subscription">Оновити підписку поточної групи</string>
|
||||
<string name="group_not_subscription">Тип групи не є підпискою</string>
|
||||
<string name="allow_insecure_on_request_sum">Вимкнути перевірку сертифіката під час оновлення підписок</string>
|
||||
<string name="global_allow_insecure">Завжди дозволяти незахищене</string>
|
||||
<string name="mux_preference">Мультиплексування</string>
|
||||
<string name="padding">Заповнення (Padding)</string>
|
||||
<string name="network_change_reset_connections">Скидати вихідні з\'єднання при зміні мережі</string>
|
||||
<string name="wake_reset_connections">Скидати вихідні з\'єднання при виході пристрою зі сну</string>
|
||||
</resources>
|
||||
|
||||
@@ -486,4 +486,11 @@
|
||||
<string name="global_allow_insecure">总是跳过 TLS 证书验证</string>
|
||||
<string name="network_change_reset_connections">当网络发生变化时重置出站连接</string>
|
||||
<string name="wake_reset_connections">当设备从睡眠状态唤醒时重置出站连接</string>
|
||||
<string name="preview_version">预览版</string>
|
||||
<string name="preview_version_hint">本应用为预览版,可能存在诸多问题。若您不愿参与测试,请前往GitHub下载正式发布版本!</string>
|
||||
<string name="check_update_preview">检查预览版更新</string>
|
||||
<string name="check_update_release">检查正式版</string>
|
||||
<string name="update_dialog_title">发现新版本</string>
|
||||
<string name="update_dialog_message">当前版本:%1$s\n可升级版本:%2$s\n是否前往下载?</string>
|
||||
<string name="check_update_no">检查成功,但没有更新。</string>
|
||||
</resources>
|
||||
@@ -566,4 +566,11 @@
|
||||
<string name="padding">Padding</string>
|
||||
<string name="network_change_reset_connections">Reset outbound connections when network changes</string>
|
||||
<string name="wake_reset_connections">Reset outbound connections when device wake from sleep</string>
|
||||
<string name="preview_version">Preview version</string>
|
||||
<string name="preview_version_hint">This application is a preview version and may contain many problems. If you do not want to test it, please go to GitHub to download the Release version!</string>
|
||||
<string name="check_update_preview">Check for preview version updates</string>
|
||||
<string name="check_update_release">Check for release version updates</string>
|
||||
<string name="update_dialog_title">New version available</string>
|
||||
<string name="update_dialog_message">Current version: %1$s\nAvailable version: %2$s\nDo you want to download it?</string>
|
||||
<string name="check_update_no">Check successful, but no updates.</string>
|
||||
</resources>
|
||||
@@ -1,2 +1,2 @@
|
||||
export COMMIT_SING_BOX="01b72e129794acae89e1c7929d0ba5a63b0e67f8"
|
||||
export COMMIT_SING_BOX="cc3a8000fdc0c9ddf9aa1ab4d6aacdfec91d8e73"
|
||||
export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b"
|
||||
|
||||
@@ -14,33 +14,6 @@ private val Project.android get() = extensions.getByName<ApplicationExtension>("
|
||||
|
||||
private lateinit var metadata: Properties
|
||||
private lateinit var localProperties: Properties
|
||||
private lateinit var flavor: String
|
||||
|
||||
fun Project.requireFlavor(): String {
|
||||
if (::flavor.isInitialized) return flavor
|
||||
if (gradle.startParameter.taskNames.isNotEmpty()) {
|
||||
val taskName = gradle.startParameter.taskNames[0]
|
||||
when {
|
||||
taskName.contains("assemble") -> {
|
||||
flavor = taskName.substringAfter("assemble")
|
||||
return flavor
|
||||
}
|
||||
|
||||
taskName.contains("install") -> {
|
||||
flavor = taskName.substringAfter("install")
|
||||
return flavor
|
||||
}
|
||||
|
||||
taskName.contains("bundle") -> {
|
||||
flavor = taskName.substringAfter("bundle")
|
||||
return flavor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flavor = ""
|
||||
return flavor
|
||||
}
|
||||
|
||||
fun Project.requireMetadata(): Properties {
|
||||
if (!::metadata.isInitialized) {
|
||||
@@ -156,8 +129,6 @@ fun Project.setupAppCommon() {
|
||||
keyPassword = pwd
|
||||
}
|
||||
}
|
||||
} else if (requireFlavor().contains("(Oss|Expert|Play)Release".toRegex())) {
|
||||
exitProcess(0)
|
||||
}
|
||||
buildTypes {
|
||||
val key = signingConfigs.findByName("release")
|
||||
@@ -178,6 +149,7 @@ fun Project.setupApp() {
|
||||
applicationId = pkgName
|
||||
versionCode = verCode
|
||||
versionName = verName
|
||||
buildConfigField("String", "PRE_VERSION_NAME", "\"\"")
|
||||
}
|
||||
}
|
||||
setupAppCommon()
|
||||
@@ -209,6 +181,13 @@ fun Project.setupApp() {
|
||||
create("oss")
|
||||
create("fdroid")
|
||||
create("play")
|
||||
create("preview") {
|
||||
buildConfigField(
|
||||
"String",
|
||||
"PRE_VERSION_NAME",
|
||||
"\"${requireMetadata().getProperty("PRE_VERSION_NAME")}\""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
applicationVariants.all {
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
|
||||
"github.com/matsuridayo/libneko/protect_server"
|
||||
"github.com/matsuridayo/libneko/speedtest"
|
||||
"github.com/sagernet/sing-box/adapter"
|
||||
"github.com/sagernet/sing-box/boxapi"
|
||||
"github.com/sagernet/sing-box/experimental/libbox/platform"
|
||||
"github.com/sagernet/sing-box/protocol/group"
|
||||
@@ -83,7 +84,7 @@ func NewSingBoxInstance(config string) (b *BoxInstance, err error) {
|
||||
|
||||
// create box context
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
ctx = box.Context(ctx, nekoboxAndroidInboundRegistry(), nekoboxAndroidOutboundRegistry(), nekoboxAndroidEndpointRegistry())
|
||||
ctx = box.Context(ctx, nekoboxAndroidInboundRegistry(), nekoboxAndroidOutboundRegistry(), nekoboxAndroidEndpointRegistry(), nekoboxAndroidDNSTransportRegistry(), nekoboxAndroidServiceRegistry())
|
||||
ctx = service.ContextWithDefaultRegistry(ctx)
|
||||
service.MustRegister[platform.Interface](ctx, boxPlatformInterfaceInstance)
|
||||
|
||||
@@ -182,11 +183,17 @@ func (b *BoxInstance) SetAsMain() {
|
||||
}
|
||||
|
||||
func (b *BoxInstance) SetV2rayStats(outbounds string) {
|
||||
b.access.Lock()
|
||||
defer b.access.Unlock()
|
||||
if b.v2api != nil {
|
||||
log.Println("duplicate call of SetV2rayStats")
|
||||
return
|
||||
}
|
||||
b.v2api = boxapi.NewSbV2rayServer(option.V2RayStatsServiceOptions{
|
||||
Enabled: true,
|
||||
Outbounds: strings.Split(outbounds, "\n"),
|
||||
})
|
||||
b.Box.Router().SetNekoTracker(b.v2api.StatsService())
|
||||
b.Box.Router().AppendTracker(b.v2api.StatsService())
|
||||
}
|
||||
|
||||
func (b *BoxInstance) QueryStats(tag, direct string) int64 {
|
||||
@@ -205,11 +212,23 @@ func (b *BoxInstance) SelectOutbound(tag string) bool {
|
||||
|
||||
func UrlTest(i *BoxInstance, link string, timeout int32) (latency int32, err error) {
|
||||
defer device.DeferPanicToError("box.UrlTest", func(err_ error) { err = err_ })
|
||||
if i == nil {
|
||||
// test current
|
||||
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(mainInstance.Box), link, timeout, speedtest.UrlTestStandard_RTT)
|
||||
var connectionTracker adapter.ConnectionTracker
|
||||
// test i
|
||||
if i != nil {
|
||||
if i.v2api != nil {
|
||||
connectionTracker = i.v2api.StatsService()
|
||||
}
|
||||
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(i.Box, connectionTracker), link, timeout, speedtest.UrlTestStandard_RTT)
|
||||
}
|
||||
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(i.Box), link, timeout, speedtest.UrlTestStandard_RTT)
|
||||
// test direct
|
||||
if mainInstance == nil {
|
||||
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(nil, nil), link, timeout, speedtest.UrlTestStandard_RTT)
|
||||
}
|
||||
// test mainInstance
|
||||
if mainInstance.v2api != nil {
|
||||
connectionTracker = mainInstance.v2api.StatsService()
|
||||
}
|
||||
return speedtest.UrlTest(boxapi.CreateProxyHttpClient(mainInstance.Box, connectionTracker), link, timeout, speedtest.UrlTestStandard_RTT)
|
||||
}
|
||||
|
||||
var protectCloser io.Closer
|
||||
|
||||
@@ -4,10 +4,17 @@ import (
|
||||
"github.com/sagernet/sing-box/adapter/endpoint"
|
||||
"github.com/sagernet/sing-box/adapter/inbound"
|
||||
"github.com/sagernet/sing-box/adapter/outbound"
|
||||
"github.com/sagernet/sing-box/adapter/service"
|
||||
"github.com/sagernet/sing-box/dns"
|
||||
"github.com/sagernet/sing-box/dns/transport"
|
||||
"github.com/sagernet/sing-box/dns/transport/fakeip"
|
||||
"github.com/sagernet/sing-box/dns/transport/hosts"
|
||||
"github.com/sagernet/sing-box/dns/transport/local"
|
||||
"github.com/sagernet/sing-box/dns/transport/quic"
|
||||
"github.com/sagernet/sing-box/protocol/anytls"
|
||||
"github.com/sagernet/sing-box/protocol/block"
|
||||
"github.com/sagernet/sing-box/protocol/direct"
|
||||
"github.com/sagernet/sing-box/protocol/dns"
|
||||
protocolDns "github.com/sagernet/sing-box/protocol/dns"
|
||||
"github.com/sagernet/sing-box/protocol/group"
|
||||
"github.com/sagernet/sing-box/protocol/http"
|
||||
"github.com/sagernet/sing-box/protocol/hysteria"
|
||||
@@ -52,7 +59,7 @@ func nekoboxAndroidOutboundRegistry() *outbound.Registry {
|
||||
direct.RegisterOutbound(registry)
|
||||
|
||||
block.RegisterOutbound(registry)
|
||||
dns.RegisterOutbound(registry)
|
||||
protocolDns.RegisterOutbound(registry)
|
||||
|
||||
group.RegisterSelector(registry)
|
||||
group.RegisterURLTest(registry)
|
||||
@@ -68,8 +75,11 @@ func nekoboxAndroidOutboundRegistry() *outbound.Registry {
|
||||
vless.RegisterOutbound(registry)
|
||||
anytls.RegisterOutbound(registry)
|
||||
|
||||
registerQUICOutbounds(registry)
|
||||
registerWireGuardOutbound(registry)
|
||||
hysteria.RegisterOutbound(registry)
|
||||
tuic.RegisterOutbound(registry)
|
||||
hysteria2.RegisterOutbound(registry)
|
||||
|
||||
wireguard.RegisterOutbound(registry)
|
||||
|
||||
return registry
|
||||
}
|
||||
@@ -77,27 +87,30 @@ func nekoboxAndroidOutboundRegistry() *outbound.Registry {
|
||||
func nekoboxAndroidEndpointRegistry() *endpoint.Registry {
|
||||
registry := endpoint.NewRegistry()
|
||||
|
||||
registerWireGuardEndpoint(registry)
|
||||
wireguard.RegisterEndpoint(registry)
|
||||
|
||||
return registry
|
||||
}
|
||||
|
||||
func registerQUICInbounds(registry *inbound.Registry) {
|
||||
hysteria.RegisterInbound(registry)
|
||||
tuic.RegisterInbound(registry)
|
||||
hysteria2.RegisterInbound(registry)
|
||||
func nekoboxAndroidDNSTransportRegistry() *dns.TransportRegistry {
|
||||
registry := dns.NewTransportRegistry()
|
||||
|
||||
transport.RegisterTCP(registry)
|
||||
transport.RegisterUDP(registry)
|
||||
transport.RegisterTLS(registry)
|
||||
transport.RegisterHTTPS(registry)
|
||||
hosts.RegisterTransport(registry)
|
||||
local.RegisterTransport(registry)
|
||||
fakeip.RegisterTransport(registry)
|
||||
|
||||
quic.RegisterTransport(registry)
|
||||
quic.RegisterHTTP3Transport(registry)
|
||||
|
||||
return registry
|
||||
}
|
||||
|
||||
func registerQUICOutbounds(registry *outbound.Registry) {
|
||||
hysteria.RegisterOutbound(registry)
|
||||
tuic.RegisterOutbound(registry)
|
||||
hysteria2.RegisterOutbound(registry)
|
||||
}
|
||||
func nekoboxAndroidServiceRegistry() *service.Registry {
|
||||
registry := service.NewRegistry()
|
||||
|
||||
func registerWireGuardOutbound(registry *outbound.Registry) {
|
||||
wireguard.RegisterOutbound(registry)
|
||||
}
|
||||
|
||||
func registerWireGuardEndpoint(registry *endpoint.Registry) {
|
||||
wireguard.RegisterEndpoint(registry)
|
||||
return registry
|
||||
}
|
||||
|
||||
@@ -14,7 +14,8 @@ if [ -z "$GOPATH" ]; then
|
||||
GOPATH=$(go env GOPATH)
|
||||
fi
|
||||
|
||||
"$GOPATH"/bin/gomobile-matsuri bind -v -androidapi 21 -cache "$(realpath $BUILD)" -trimpath -ldflags='-s -w' -tags='with_conntrack,with_gvisor,with_quic,with_wireguard,with_utls,with_clash_api,with_ech' . || exit 1
|
||||
export GOBIND=gobind-matsuri
|
||||
"$GOPATH"/bin/gomobile-matsuri bind -v -androidapi 21 -cache "$(realpath $BUILD)" -trimpath -ldflags='-s -w' -tags='with_conntrack,with_gvisor,with_quic,with_wireguard,with_utls,with_clash_api' . || exit 1
|
||||
rm -r libcore-sources.jar
|
||||
|
||||
proj=../app/libs
|
||||
|
||||
@@ -6,86 +6,80 @@ toolchain go1.23.6
|
||||
|
||||
require (
|
||||
github.com/matsuridayo/libneko v1.0.0 // replaced
|
||||
github.com/miekg/dns v1.1.63
|
||||
github.com/oschwald/maxminddb-golang v1.12.0
|
||||
github.com/sagernet/sing v0.6.6-0.20250406121928-926a5a1e8bb7
|
||||
github.com/miekg/dns v1.1.67
|
||||
github.com/oschwald/maxminddb-golang v1.13.1
|
||||
github.com/sagernet/sing v0.7.6-0.20250825114712-2aeec120ce28
|
||||
github.com/sagernet/sing-box v1.0.0 // replaced
|
||||
github.com/sagernet/sing-dns v0.4.1
|
||||
github.com/sagernet/sing-tun v0.6.1
|
||||
github.com/sagernet/sing-tun v0.7.0-beta.1
|
||||
github.com/ulikunitz/xz v0.5.11
|
||||
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da
|
||||
golang.org/x/sys v0.30.0
|
||||
golang.org/x/sys v0.35.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/ajg/form v1.5.1 // indirect
|
||||
github.com/andybalholm/brotli v1.0.6 // indirect
|
||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
||||
github.com/anytls/sing-anytls v0.0.8 // indirect
|
||||
github.com/caddyserver/certmagic v0.20.0 // indirect
|
||||
github.com/cloudflare/circl v1.3.7 // indirect
|
||||
github.com/caddyserver/certmagic v0.23.0 // indirect
|
||||
github.com/caddyserver/zerossl v0.1.3 // indirect
|
||||
github.com/cretz/bine v0.2.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/go-chi/chi/v5 v5.2.1 // indirect
|
||||
github.com/go-chi/chi/v5 v5.2.2 // indirect
|
||||
github.com/go-chi/render v1.0.3 // indirect
|
||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/gobwas/httphead v0.1.0 // indirect
|
||||
github.com/gobwas/pool v0.2.1 // indirect
|
||||
github.com/gofrs/uuid/v5 v5.3.2 // indirect
|
||||
github.com/google/btree v1.1.3 // indirect
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a // indirect
|
||||
github.com/google/go-cmp v0.7.0 // indirect
|
||||
github.com/hashicorp/yamux v0.1.2 // indirect
|
||||
github.com/josharian/native v1.1.0 // indirect
|
||||
github.com/klauspost/compress v1.17.4 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
||||
github.com/libdns/alidns v1.0.3 // indirect
|
||||
github.com/libdns/cloudflare v0.1.1 // indirect
|
||||
github.com/libdns/libdns v0.2.2 // indirect
|
||||
github.com/klauspost/compress v1.17.11 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
|
||||
github.com/libdns/alidns v1.0.5-libdns.v1.beta1 // indirect
|
||||
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6 // indirect
|
||||
github.com/libdns/libdns v1.1.0 // indirect
|
||||
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
|
||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
||||
github.com/mdlayher/socket v0.4.1 // indirect
|
||||
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 // indirect
|
||||
github.com/mholt/acmez v1.2.0 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.9.7 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
|
||||
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect
|
||||
github.com/mdlayher/socket v0.5.1 // indirect
|
||||
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 // indirect
|
||||
github.com/metacubex/utls v1.8.0 // indirect
|
||||
github.com/mholt/acmez/v3 v3.1.2 // indirect
|
||||
github.com/quic-go/qpack v0.5.1 // indirect
|
||||
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect
|
||||
github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 // indirect
|
||||
github.com/sagernet/cors v1.2.1 // indirect
|
||||
github.com/sagernet/fswatch v0.1.1 // indirect
|
||||
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff // indirect
|
||||
github.com/sagernet/gvisor v0.0.0-20250325023245-7a9c0f5725fb // indirect
|
||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
||||
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
|
||||
github.com/sagernet/quic-go v0.49.0-beta.1 // indirect
|
||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 // indirect
|
||||
github.com/sagernet/sing-mux v0.3.1 // indirect
|
||||
github.com/sagernet/sing-quic v0.4.1 // indirect
|
||||
github.com/sagernet/sing-shadowsocks v0.2.7 // indirect
|
||||
github.com/sagernet/sing-shadowsocks2 v0.2.0 // indirect
|
||||
github.com/sagernet/sing-shadowtls v0.2.0 // indirect
|
||||
github.com/sagernet/sing-vmess v0.2.0 // indirect
|
||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
|
||||
github.com/sagernet/utls v1.6.7 // indirect
|
||||
github.com/sagernet/wireguard-go v0.0.1-beta.5 // indirect
|
||||
github.com/sagernet/quic-go v0.52.0-beta.1 // indirect
|
||||
github.com/sagernet/sing-mux v0.3.3 // indirect
|
||||
github.com/sagernet/sing-quic v0.5.0 // indirect
|
||||
github.com/sagernet/sing-shadowsocks v0.2.8 // indirect
|
||||
github.com/sagernet/sing-shadowsocks2 v0.2.1 // indirect
|
||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 // indirect
|
||||
github.com/sagernet/sing-vmess v0.2.7 // indirect
|
||||
github.com/sagernet/smux v1.5.34-mod.2 // indirect
|
||||
github.com/sagernet/wireguard-go v0.0.1-beta.7 // indirect
|
||||
github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854 // indirect
|
||||
github.com/vishvananda/netns v0.0.4 // indirect
|
||||
github.com/zeebo/blake3 v0.2.3 // indirect
|
||||
github.com/vishvananda/netns v0.0.5 // indirect
|
||||
github.com/zeebo/blake3 v0.2.4 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
go.uber.org/zap/exp v0.3.0 // indirect
|
||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
||||
golang.org/x/crypto v0.32.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/net v0.34.0 // indirect
|
||||
golang.org/x/sync v0.10.0 // indirect
|
||||
golang.org/x/text v0.21.0 // indirect
|
||||
golang.org/x/time v0.7.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
golang.org/x/crypto v0.41.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
|
||||
golang.org/x/mod v0.27.0 // indirect
|
||||
golang.org/x/net v0.43.0 // indirect
|
||||
golang.org/x/sync v0.16.0 // indirect
|
||||
golang.org/x/text v0.28.0 // indirect
|
||||
golang.org/x/time v0.9.0 // indirect
|
||||
golang.org/x/tools v0.36.0 // indirect
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect
|
||||
google.golang.org/grpc v1.63.2 // indirect
|
||||
google.golang.org/protobuf v1.33.0 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 // indirect
|
||||
google.golang.org/grpc v1.73.0 // indirect
|
||||
google.golang.org/protobuf v1.36.6 // indirect
|
||||
lukechampine.com/blake3 v1.3.0 // indirect
|
||||
)
|
||||
|
||||
|
||||
+124
-116
@@ -1,30 +1,31 @@
|
||||
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
||||
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
|
||||
github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
|
||||
github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||
github.com/anytls/sing-anytls v0.0.8 h1:1u/fnH1HoeeMV5mX7/eUOjLBvPdkd1UJRmXiRi6Vymc=
|
||||
github.com/anytls/sing-anytls v0.0.8/go.mod h1:7rjN6IukwysmdusYsrV51Fgu1uW6vsrdd6ctjnEAln8=
|
||||
github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc=
|
||||
github.com/caddyserver/certmagic v0.20.0/go.mod h1:N4sXgpICQUskEWpj7zVzvWD41p3NYacrNoZYiRM2jTg=
|
||||
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
|
||||
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
|
||||
github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
|
||||
github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
|
||||
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
|
||||
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
|
||||
github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo=
|
||||
github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||
github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8=
|
||||
github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
|
||||
github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
|
||||
github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
|
||||
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
|
||||
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
|
||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
||||
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
||||
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
|
||||
@@ -35,161 +36,168 @@ 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/pprof v0.0.0-20231101202521-4ca4178f5c7a h1:fEBsGL/sjAuJrgah5XqmmYsTLzJp/TO9Lhy39gkverk=
|
||||
github.com/google/pprof v0.0.0-20231101202521-4ca4178f5c7a/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
|
||||
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
|
||||
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
|
||||
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
|
||||
github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
|
||||
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/libdns/alidns v1.0.3 h1:LFHuGnbseq5+HCeGa1aW8awyX/4M2psB9962fdD2+yQ=
|
||||
github.com/libdns/alidns v1.0.3/go.mod h1:e18uAG6GanfRhcJj6/tps2rCMzQJaYVcGKT+ELjdjGE=
|
||||
github.com/libdns/cloudflare v0.1.1 h1:FVPfWwP8zZCqj268LZjmkDleXlHPlFU9KC4OJ3yn054=
|
||||
github.com/libdns/cloudflare v0.1.1/go.mod h1:9VK91idpOjg6v7/WbjkEW49bSCxj00ALesIFDhJ8PBU=
|
||||
github.com/libdns/libdns v0.2.0/go.mod h1:yQCXzk1lEZmmCPa857bnk4TsOiqYasqpyOEeSObbb40=
|
||||
github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s=
|
||||
github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
|
||||
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
||||
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
|
||||
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/libdns/alidns v1.0.5-libdns.v1.beta1 h1:txHK7UxDed3WFBDjrTZPuMn8X+WmhjBTTAMW5xdy5pQ=
|
||||
github.com/libdns/alidns v1.0.5-libdns.v1.beta1/go.mod h1:ystHmPwcGoWjPrGpensQSMY9VoCx4cpR2hXNlwk9H/g=
|
||||
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6 h1:3MGrVWs2COjMkQR17oUw1zMIPbm2YAzxDC3oGVZvQs8=
|
||||
github.com/libdns/cloudflare v0.2.2-0.20250708034226-c574dccb31a6/go.mod h1:w9uTmRCDlAoafAsTPnn2nJ0XHK/eaUMh86DUk8BWi60=
|
||||
github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
|
||||
github.com/libdns/libdns v1.1.0 h1:9ze/tWvt7Df6sbhOJRB8jT33GHEHpEQXdtkE3hPthbU=
|
||||
github.com/libdns/libdns v1.1.0/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
|
||||
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
|
||||
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
|
||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422 h1:zGeQt3UyNydIVrMRB97AA5WsYEau/TyCnRtTf1yUmJY=
|
||||
github.com/metacubex/tfo-go v0.0.0-20241231083714-66613d49c422/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||
github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30=
|
||||
github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE=
|
||||
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||
github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss=
|
||||
github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0=
|
||||
github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
|
||||
github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4=
|
||||
github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs=
|
||||
github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 h1:A1Cq6Ysb0GM0tpKMbdCXCIfBclan4oHk1Jb+Hrejirg=
|
||||
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o=
|
||||
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
|
||||
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
|
||||
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 h1:j1VRTiC9JLR4nUbSikx9OGdu/3AgFDqgcLj4GoqyQkc=
|
||||
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||
github.com/metacubex/utls v1.8.0 h1:mSYi6FMnmc5riARl5UZDmWVy710z+P5b7xuGW0lV9ac=
|
||||
github.com/metacubex/utls v1.8.0/go.mod h1:FdjYzVfCtgtna19hX0ER1Xsa5uJInwdQ4IcaaI98lEQ=
|
||||
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
|
||||
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
|
||||
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
|
||||
github.com/miekg/dns v1.1.67/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps=
|
||||
github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE=
|
||||
github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
|
||||
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
||||
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
||||
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a h1:+NkI2670SQpQWvkkD2QgdTuzQG263YZ+2emfpeyGqW0=
|
||||
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a/go.mod h1:63s7jpZqcDAIpj8oI/1v4Izok+npJOHACFCU6+huCkM=
|
||||
github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1 h1:YbmpqPQEMdlk9oFSKYWRqVuu9qzNiOayIonKmv1gCXY=
|
||||
github.com/sagernet/cloudflare-tls v0.0.0-20231208171750-a4483c1b7cd1/go.mod h1:J2yAxTFPDjrDPhuAi9aWFz2L3ox9it4qAluBBbN0H5k=
|
||||
github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ=
|
||||
github.com/sagernet/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI=
|
||||
github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs=
|
||||
github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o=
|
||||
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff h1:mlohw3360Wg1BNGook/UHnISXhUx4Gd/3tVLs5T0nSs=
|
||||
github.com/sagernet/gvisor v0.0.0-20241123041152-536d05261cff/go.mod h1:ehZwnT2UpmOWAHFL48XdBhnd4Qu4hN2O3Ji0us3ZHMw=
|
||||
github.com/sagernet/gvisor v0.0.0-20250325023245-7a9c0f5725fb h1:pprQtDqNgqXkRsXn+0E8ikKOemzmum8bODjSfDene38=
|
||||
github.com/sagernet/gvisor v0.0.0-20250325023245-7a9c0f5725fb/go.mod h1:QkkPEJLw59/tfxgapHta14UL5qMUah5NXhO0Kw2Kan4=
|
||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
|
||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
||||
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
||||
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
||||
github.com/sagernet/quic-go v0.49.0-beta.1 h1:3LdoCzVVfYRibZns1tYWSIoB65fpTmrwy+yfK8DQ8Jk=
|
||||
github.com/sagernet/quic-go v0.49.0-beta.1/go.mod h1:uesWD1Ihrldq1M3XtjuEvIUqi8WHNsRs71b3Lt1+p/U=
|
||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc=
|
||||
github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU=
|
||||
github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo=
|
||||
github.com/sagernet/sing v0.6.6-0.20250406121928-926a5a1e8bb7 h1:ZJauxLmH12Gzv3nucfjsSBQw9UA8t7Sxu8pYHBSP2TU=
|
||||
github.com/sagernet/sing v0.6.6-0.20250406121928-926a5a1e8bb7/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||
github.com/sagernet/quic-go v0.52.0-beta.1 h1:hWkojLg64zjV+MJOvJU/kOeWndm3tiEfBLx5foisszs=
|
||||
github.com/sagernet/quic-go v0.52.0-beta.1/go.mod h1:OV+V5kEBb8kJS7k29MzDu6oj9GyMc7HA07sE1tedxz4=
|
||||
github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||
github.com/sagernet/sing v0.7.6-0.20250825114712-2aeec120ce28 h1:C8Lnqd0Q+C15kwaMiDsfq5S45rhhaQMBG91TT+6oFVo=
|
||||
github.com/sagernet/sing v0.7.6-0.20250825114712-2aeec120ce28/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||
github.com/sagernet/sing-dns v0.4.1 h1:nozS7iqpxZ7aV73oHbkD/8haOvf3XXDCgT//8NdYirk=
|
||||
github.com/sagernet/sing-dns v0.4.1/go.mod h1:dweQs54ng2YGzoJfz+F9dGuDNdP5pJ3PLeggnK5VWc8=
|
||||
github.com/sagernet/sing-mux v0.3.1 h1:kvCc8HyGAskDHDQ0yQvoTi/7J4cZPB/VJMsAM3MmdQI=
|
||||
github.com/sagernet/sing-mux v0.3.1/go.mod h1:Mkdz8LnDstthz0HWuA/5foncnDIdcNN5KZ6AdJX+x78=
|
||||
github.com/sagernet/sing-quic v0.4.1 h1:pxlMa4efZu/M07RgGagNNDDyl6ZUwpmNUjRTpgHOWK4=
|
||||
github.com/sagernet/sing-quic v0.4.1/go.mod h1:tqPa0/Wqa19MkkSlKVZZX5sHxtiDR9BROcn4ufcbVdY=
|
||||
github.com/sagernet/sing-shadowsocks v0.2.7 h1:zaopR1tbHEw5Nk6FAkM05wCslV6ahVegEZaKMv9ipx8=
|
||||
github.com/sagernet/sing-shadowsocks v0.2.7/go.mod h1:0rIKJZBR65Qi0zwdKezt4s57y/Tl1ofkaq6NlkzVuyE=
|
||||
github.com/sagernet/sing-shadowsocks2 v0.2.0 h1:wpZNs6wKnR7mh1wV9OHwOyUr21VkS3wKFHi+8XwgADg=
|
||||
github.com/sagernet/sing-shadowsocks2 v0.2.0/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
||||
github.com/sagernet/sing-shadowtls v0.2.0 h1:cLKe4OAOFwuhmAIuPLj//CIL7Q9js+pIDardhJ+/osk=
|
||||
github.com/sagernet/sing-shadowtls v0.2.0/go.mod h1:agU+Fw5X+xnWVyRHyFthoZCX3MfWKCFPm4JUf+1oaxo=
|
||||
github.com/sagernet/sing-tun v0.6.1 h1:4l0+gnEKcGjlWfUVTD+W0BRApqIny/lU2ZliurE+VMo=
|
||||
github.com/sagernet/sing-tun v0.6.1/go.mod h1:fisFCbC4Vfb6HqQNcwPJi2CDK2bf0Xapyz3j3t4cnHE=
|
||||
github.com/sagernet/sing-vmess v0.2.0 h1:pCMGUXN2k7RpikQV65/rtXtDHzb190foTfF9IGTMZrI=
|
||||
github.com/sagernet/sing-vmess v0.2.0/go.mod h1:jDAZ0A0St1zVRkyvhAPRySOFfhC+4SQtO5VYyeFotgA=
|
||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
|
||||
github.com/sagernet/utls v1.6.7 h1:Ep3+aJ8FUGGta+II2IEVNUc3EDhaRCZINWkj/LloIA8=
|
||||
github.com/sagernet/utls v1.6.7/go.mod h1:Uua1TKO/FFuAhLr9rkaVnnrTmmiItzDjv1BUb2+ERwM=
|
||||
github.com/sagernet/wireguard-go v0.0.1-beta.5 h1:aBEsxJUMEONwOZqKPIkuAcv4zJV5p6XlzEN04CF0FXc=
|
||||
github.com/sagernet/wireguard-go v0.0.1-beta.5/go.mod h1:jGXij2Gn2wbrWuYNUmmNhf1dwcZtvyAvQoe8Xd8MbUo=
|
||||
github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw=
|
||||
github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
|
||||
github.com/sagernet/sing-quic v0.5.0 h1:jNLIyVk24lFPvu8A4x+ZNEnZdI+Tg1rp7eCJ6v0Csak=
|
||||
github.com/sagernet/sing-quic v0.5.0/go.mod h1:SAv/qdeDN+75msGG5U5ZIwG+3Ua50jVIKNrRSY8pkx0=
|
||||
github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE=
|
||||
github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI=
|
||||
github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnqqs2gQ2/Qioo=
|
||||
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
|
||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
|
||||
github.com/sagernet/sing-tun v0.7.0-beta.1 h1:mBIFXYAnGO5ey/HcCYanqnBx61E7yF8zTFGRZonGYmY=
|
||||
github.com/sagernet/sing-tun v0.7.0-beta.1/go.mod h1:AHJuRrLbNRJuivuFZ2VhXwDj4ViYp14szG5EkkKAqRQ=
|
||||
github.com/sagernet/sing-vmess v0.2.7 h1:2ee+9kO0xW5P4mfe6TYVWf9VtY8k1JhNysBqsiYj0sk=
|
||||
github.com/sagernet/sing-vmess v0.2.7/go.mod h1:5aYoOtYksAyS0NXDm0qKeTYW1yoE1bJVcv+XLcVoyJs=
|
||||
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
|
||||
github.com/sagernet/smux v1.5.34-mod.2/go.mod h1:0KW0+R+ycvA2INW4gbsd7BNyg+HEfLIAxa5N02/28Zc=
|
||||
github.com/sagernet/wireguard-go v0.0.1-beta.7 h1:ltgBwYHfr+9Wz1eG59NiWnHrYEkDKHG7otNZvu85DXI=
|
||||
github.com/sagernet/wireguard-go v0.0.1-beta.7/go.mod h1:jGXij2Gn2wbrWuYNUmmNhf1dwcZtvyAvQoe8Xd8MbUo=
|
||||
github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854 h1:6uUiZcDRnZSAegryaUGwPC/Fj13JSHwiTftrXhMmYOc=
|
||||
github.com/sagernet/ws v0.0.0-20231204124109-acfe8907c854/go.mod h1:LtfoSK3+NG57tvnVEHgcuBW9ujgE8enPSgzgwStwCAA=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
|
||||
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
|
||||
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
||||
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
|
||||
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||
github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg=
|
||||
github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ=
|
||||
github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
|
||||
github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
|
||||
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
|
||||
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
|
||||
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
|
||||
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
|
||||
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
|
||||
go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
|
||||
go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
|
||||
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
|
||||
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||
go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U=
|
||||
go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ=
|
||||
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.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
|
||||
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
|
||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
|
||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
|
||||
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
|
||||
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
|
||||
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
|
||||
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
|
||||
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da h1:gS9sVMAeHM+gVBmM9bTM6vUi/NHv58O3QzJ3vjjN84M=
|
||||
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da/go.mod h1:IEceR0jfVklLJXrbUe90rfdAFAYDW0SQwKl4qvO1GBQ=
|
||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
|
||||
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
|
||||
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
|
||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
|
||||
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
|
||||
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
|
||||
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
|
||||
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
|
||||
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
|
||||
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
|
||||
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
|
||||
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
|
||||
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
|
||||
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
|
||||
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
|
||||
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY=
|
||||
google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM=
|
||||
google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA=
|
||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
|
||||
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
|
||||
@@ -10,6 +10,7 @@ fi
|
||||
# Install gomobile
|
||||
if [ ! -f "$GOPATH/bin/gomobile-matsuri" ]; then
|
||||
git clone https://github.com/MatsuriDayo/gomobile.git
|
||||
git checkout origin/master2
|
||||
pushd gomobile/cmd
|
||||
pushd gomobile
|
||||
go install -v
|
||||
@@ -23,4 +24,4 @@ if [ ! -f "$GOPATH/bin/gomobile-matsuri" ]; then
|
||||
mv "$GOPATH/bin/gobind" "$GOPATH/bin/gobind-matsuri"
|
||||
fi
|
||||
|
||||
gomobile-matsuri init
|
||||
GOBIND=gobind-matsuri gomobile-matsuri init
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package libcore
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
|
||||
tun "github.com/sagernet/sing-tun"
|
||||
"github.com/sagernet/sing/common/control"
|
||||
"github.com/sagernet/sing/common/x/list"
|
||||
@@ -10,40 +8,38 @@ import (
|
||||
|
||||
// wtf
|
||||
|
||||
type interfaceMonitor struct {
|
||||
}
|
||||
type interfaceMonitorStub struct{}
|
||||
|
||||
func (i *interfaceMonitor) Start() error {
|
||||
func (s *interfaceMonitorStub) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) Close() error {
|
||||
func (s *interfaceMonitorStub) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) DefaultInterfaceName(destination netip.Addr) string {
|
||||
func (s *interfaceMonitorStub) DefaultInterface() *control.Interface {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *interfaceMonitorStub) OverrideAndroidVPN() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *interfaceMonitorStub) AndroidVPNEnabled() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *interfaceMonitorStub) RegisterCallback(callback tun.DefaultInterfaceUpdateCallback) *list.Element[tun.DefaultInterfaceUpdateCallback] {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *interfaceMonitorStub) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) {
|
||||
}
|
||||
|
||||
func (s *interfaceMonitorStub) RegisterMyInterface(interfaceName string) {
|
||||
}
|
||||
|
||||
func (s *interfaceMonitorStub) MyInterface() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) DefaultInterfaceIndex(destination netip.Addr) int {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) DefaultInterface() *control.Interface {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) OverrideAndroidVPN() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) AndroidVPNEnabled() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) RegisterCallback(callback tun.DefaultInterfaceUpdateCallback) *list.Element[tun.DefaultInterfaceUpdateCallback] {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *interfaceMonitor) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) {
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ func (w *boxPlatformInterfaceWrapper) UsePlatformDefaultInterfaceMonitor() bool
|
||||
}
|
||||
|
||||
func (w *boxPlatformInterfaceWrapper) CreateDefaultInterfaceMonitor(l logger.Logger) tun.DefaultInterfaceMonitor {
|
||||
return &interfaceMonitor{}
|
||||
return &interfaceMonitorStub{}
|
||||
}
|
||||
|
||||
func (w *boxPlatformInterfaceWrapper) UsePlatformInterfaceGetter() bool {
|
||||
@@ -104,6 +104,10 @@ func (w *boxPlatformInterfaceWrapper) SendNotification(notification *platform.No
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *boxPlatformInterfaceWrapper) SystemCertificates() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Android not using
|
||||
|
||||
func (w *boxPlatformInterfaceWrapper) UnderNetworkExtension() bool {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
PACKAGE_NAME=moe.nb4a
|
||||
VERSION_NAME=1.3.9
|
||||
PRE_VERSION_NAME=pre-1.4.0-20250902-1
|
||||
VERSION_CODE=43
|
||||
|
||||
@@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_ARCH_quickstart:=$(ARCH)
|
||||
|
||||
PKG_NAME:=quickstart
|
||||
PKG_VERSION:=0.11.3
|
||||
PKG_VERSION:=0.11.4
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/
|
||||
PKG_HASH:=fee17158398f7867eb20bf187fbfb2d12d46e44d2f9e882376173392a8979d14
|
||||
PKG_HASH:=4eb507924da586f974819755a9b1620808457da70563b0dbfb92c1460f28a8b3
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-passwall
|
||||
PKG_VERSION:=25.8.26
|
||||
PKG_VERSION:=25.9.3
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_CONFIG_DEPENDS:= \
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -510,6 +510,7 @@ bestvpnusa.com
|
||||
bet365.com
|
||||
betaclouds.net
|
||||
betfair.com
|
||||
betterhash.net
|
||||
betternet.co
|
||||
bettervpn.com
|
||||
bettween.com
|
||||
@@ -536,6 +537,7 @@ bild.de
|
||||
biliworld.com
|
||||
billypan.com
|
||||
binance.com
|
||||
binance.org
|
||||
binancezh.cc
|
||||
binux.me
|
||||
bird.so
|
||||
@@ -547,6 +549,7 @@ bitchute.com
|
||||
bitcointalk.org
|
||||
bitcoinworld.com
|
||||
bitfinex.com
|
||||
bitget.com
|
||||
bithumb.com
|
||||
bitmex.com
|
||||
bitshare.com
|
||||
@@ -1042,6 +1045,7 @@ clipconverter.cc
|
||||
clipfish.de
|
||||
cloud.dify.ai
|
||||
cloud.mail.ru
|
||||
cloudflare-dns.com
|
||||
cloudflare-ipfs.com
|
||||
cloudfunctions.net
|
||||
club1069.com
|
||||
@@ -1126,6 +1130,7 @@ costco.com
|
||||
cotweet.com
|
||||
counter.social
|
||||
coursehero.com
|
||||
covenantswatch.org.tw
|
||||
coze.com
|
||||
cpj.org
|
||||
cpu-monkey.com
|
||||
@@ -1264,6 +1269,7 @@ delicious.com
|
||||
demo.unlock-music.dev
|
||||
democrats.org
|
||||
demosisto.hk
|
||||
deno.dev
|
||||
depositphotos.com
|
||||
desc.se
|
||||
desipro.de
|
||||
@@ -1332,6 +1338,7 @@ dnvod.tv
|
||||
doc.new
|
||||
docker.com
|
||||
docker.io
|
||||
docs.deno.com
|
||||
docs.new
|
||||
doctorvoice.org
|
||||
documentingreality.com
|
||||
@@ -1671,6 +1678,7 @@ fdc64.org
|
||||
fdc89.jp
|
||||
feedburner.com
|
||||
feeder.co
|
||||
feedly.com
|
||||
feeds.fileforum.com
|
||||
feedx.net
|
||||
feelssh.com
|
||||
@@ -1841,6 +1849,8 @@ ftvnews.com.tw
|
||||
ftx.com
|
||||
fucd.com
|
||||
fuchsia.dev
|
||||
fuckccp.com
|
||||
fuckccp.xyz
|
||||
fuckgfw.org
|
||||
fulione.com
|
||||
fullerconsideration.com
|
||||
@@ -1852,6 +1862,7 @@ fuq.com
|
||||
furbo.org
|
||||
furhhdl.org
|
||||
furinkan.com
|
||||
furrybar.com
|
||||
futurechinaforum.org
|
||||
futuremessage.org
|
||||
fux.com
|
||||
@@ -2360,6 +2371,7 @@ hentaivideoworld.com
|
||||
heqinglian.net
|
||||
heritage.org
|
||||
herokuapp.com
|
||||
herominers.com
|
||||
hexieshe.com
|
||||
hexieshe.xyz
|
||||
hexxeh.net
|
||||
@@ -2656,6 +2668,7 @@ indiatoday.in
|
||||
indiemerch.com
|
||||
inews-api.tvb.com
|
||||
info-graf.fr
|
||||
infura.io
|
||||
inherit.live
|
||||
initiativesforchina.org
|
||||
inkbunny.net
|
||||
@@ -2729,9 +2742,11 @@ isupportuyghurs.org
|
||||
itaiwan.gov.tw
|
||||
italiatibet.org
|
||||
itasoftware.com
|
||||
itch.io
|
||||
itemdb.com
|
||||
itemfix.com
|
||||
ithelp.ithome.com.tw
|
||||
itiger.com
|
||||
itsaol.com
|
||||
itshidden.com
|
||||
itsky.it
|
||||
@@ -3080,6 +3095,8 @@ lsmwebcast.com
|
||||
lsxszzg.com
|
||||
ltn.com.tw
|
||||
luckydesigner.space
|
||||
luckymobile.ca
|
||||
ludepress.com
|
||||
luke54.com
|
||||
luke54.org
|
||||
lupm.org
|
||||
@@ -3152,6 +3169,7 @@ matters.news
|
||||
matters.town
|
||||
matthewdgreen.wordpress.com
|
||||
mattwilcox.net
|
||||
maven.neoforged.net
|
||||
maxing.jp
|
||||
mayimayi.com
|
||||
mcadforums.com
|
||||
@@ -3200,6 +3218,7 @@ mesotw.com
|
||||
messenger.com
|
||||
meta.com
|
||||
metafilter.com
|
||||
metamask.io
|
||||
metart.com
|
||||
metarthunter.com
|
||||
meteorshowersonline.com
|
||||
@@ -3286,6 +3305,7 @@ mofos.com
|
||||
mog.com
|
||||
mohu.club
|
||||
mohu.rocks
|
||||
moj.gov.tw
|
||||
mojim.com
|
||||
mol.gov.tw
|
||||
molihua.org
|
||||
@@ -3422,6 +3442,7 @@ nationalreview.com
|
||||
nationsonline.org
|
||||
nationwide.com
|
||||
naughtyamerica.com
|
||||
naver.com
|
||||
navyfamily.navy.mil
|
||||
navyreserve.navy.mil
|
||||
naweeklytimes.com
|
||||
@@ -3746,6 +3767,7 @@ palacemoon.com
|
||||
paljorpublications.com
|
||||
paltalk.com
|
||||
panamapapers.sueddeutsche.de
|
||||
pancakeswap.finance
|
||||
pandafan.pub
|
||||
pandapow.co
|
||||
pandapow.net
|
||||
@@ -3812,6 +3834,7 @@ periscope.tv
|
||||
perplexity.ai
|
||||
persecutionblog.com
|
||||
persiankitty.com
|
||||
pewresearch.org
|
||||
phapluan.org
|
||||
phayul.com
|
||||
philborges.com
|
||||
@@ -3939,6 +3962,7 @@ prism-break.org
|
||||
prisoneralert.com
|
||||
pritunl.com
|
||||
privacybox.de
|
||||
privacyguides.org
|
||||
private.com
|
||||
privateinternetaccess.com
|
||||
privatepaste.com
|
||||
@@ -4592,6 +4616,7 @@ suroot.com
|
||||
surrenderat20.net
|
||||
svsfx.com
|
||||
swagbucks.com
|
||||
swapspace.co
|
||||
swissinfo.ch
|
||||
swissvpn.net
|
||||
switch1.jp
|
||||
@@ -5120,6 +5145,7 @@ uderzo.it
|
||||
udn.com
|
||||
udn.com.tw
|
||||
udnbkk.com
|
||||
udomain.hk
|
||||
uforadio.com.tw
|
||||
ufreevpn.com
|
||||
ugo.com
|
||||
@@ -5160,6 +5186,7 @@ unseen.is
|
||||
unstable.icu
|
||||
unwire.hk
|
||||
uocn.org
|
||||
upbit.com
|
||||
updates.tdesktop.com
|
||||
upghsbc.com
|
||||
upholdjustice.org
|
||||
@@ -5366,6 +5393,7 @@ waffle1999.com
|
||||
wahas.com
|
||||
waikeung.org
|
||||
wainao.me
|
||||
walletconnect.com
|
||||
wallmama.com
|
||||
wallpapercasa.com
|
||||
wallproxy.com
|
||||
@@ -5577,7 +5605,6 @@ www.monlamit.org
|
||||
www.moztw.org
|
||||
www.msn.com
|
||||
www.nbc.com
|
||||
www.nodeloc.com
|
||||
www.owind.com
|
||||
www.oxid.it
|
||||
www.powerpointninja.com
|
||||
@@ -5590,12 +5617,15 @@ www.taiwanonline.cc
|
||||
www.thechinastory.org
|
||||
www.wan-press.org
|
||||
www.websnapr.com
|
||||
www.xicons.org
|
||||
www.zensur.freerk.com
|
||||
www1.american.edu
|
||||
www1.biz
|
||||
www2.ohchr.org
|
||||
www2.rocketbbs.com
|
||||
wwwhost.biz
|
||||
wxw.cat
|
||||
wxw.moe
|
||||
wzyboy.im
|
||||
x-art.com
|
||||
x-berry.com
|
||||
@@ -5694,6 +5724,7 @@ yam.com
|
||||
yam.org.tw
|
||||
yande.re
|
||||
yanghengjun.com
|
||||
yangzhi.org
|
||||
yasni.co.uk
|
||||
yasukuni.or.jp
|
||||
yayabay.com
|
||||
|
||||
+11
-11
@@ -7,7 +7,7 @@ toolchain go1.24.2
|
||||
require (
|
||||
github.com/adrg/xdg v0.5.3
|
||||
github.com/apernet/quic-go v0.48.2-0.20241104191913-cb103fcecfe7
|
||||
github.com/go-chi/chi/v5 v5.2.2
|
||||
github.com/go-chi/chi/v5 v5.2.3
|
||||
github.com/go-chi/render v1.0.3
|
||||
github.com/go-playground/validator/v10 v10.27.0
|
||||
github.com/golang-collections/go-datastructures v0.0.0-20150211160725-59788d5eb259
|
||||
@@ -27,7 +27,7 @@ require (
|
||||
github.com/quic-go/quic-go v0.54.0
|
||||
github.com/refraction-networking/utls v1.8.0
|
||||
github.com/seiflotfy/cuckoofilter v0.0.0-20220411075957-e3b120b3f5fb
|
||||
github.com/stretchr/testify v1.10.0
|
||||
github.com/stretchr/testify v1.11.1
|
||||
github.com/v2fly/BrowserBridge v0.0.0-20210430233438-0570fc1d7d08
|
||||
github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848
|
||||
github.com/v2fly/hysteria/core/v2 v2.0.0-20250113081444-b0a0747ac7ab
|
||||
@@ -37,12 +37,12 @@ require (
|
||||
github.com/xiaokangwang/VLite v0.0.0-20220418190619-cff95160a432
|
||||
go.starlark.net v0.0.0-20230612165344-9532f5667272
|
||||
go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35
|
||||
golang.org/x/crypto v0.40.0
|
||||
golang.org/x/net v0.42.0
|
||||
golang.org/x/crypto v0.41.0
|
||||
golang.org/x/net v0.43.0
|
||||
golang.org/x/sync v0.16.0
|
||||
golang.org/x/sys v0.34.0
|
||||
google.golang.org/grpc v1.74.2
|
||||
google.golang.org/protobuf v1.36.6
|
||||
golang.org/x/sys v0.35.0
|
||||
google.golang.org/grpc v1.75.0
|
||||
google.golang.org/protobuf v1.36.8
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1
|
||||
h12.io/socks v1.0.3
|
||||
@@ -87,10 +87,10 @@ require (
|
||||
github.com/xtaci/smux v1.5.24 // indirect
|
||||
go.uber.org/mock v0.5.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
|
||||
golang.org/x/mod v0.25.0 // indirect
|
||||
golang.org/x/text v0.27.0 // indirect
|
||||
golang.org/x/mod v0.26.0 // indirect
|
||||
golang.org/x/text v0.28.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
golang.org/x/tools v0.34.0 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect
|
||||
golang.org/x/tools v0.35.0 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
|
||||
nhooyr.io/websocket v1.8.6 // indirect
|
||||
)
|
||||
|
||||
+34
-32
@@ -114,8 +114,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
|
||||
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
|
||||
github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
|
||||
github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
|
||||
github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE=
|
||||
github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
|
||||
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
|
||||
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
@@ -503,8 +503,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
@@ -550,16 +550,16 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
|
||||
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
|
||||
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
|
||||
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
|
||||
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
|
||||
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
|
||||
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
|
||||
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
|
||||
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
|
||||
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
|
||||
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
|
||||
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
|
||||
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
|
||||
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
|
||||
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
|
||||
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
|
||||
go.starlark.net v0.0.0-20230612165344-9532f5667272 h1:2/wtqS591wZyD2OsClsVBKRPEvBsQt/Js+fsCiYhwu8=
|
||||
go.starlark.net v0.0.0-20230612165344-9532f5667272/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
@@ -590,8 +590,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
|
||||
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -620,8 +620,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
|
||||
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
|
||||
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
|
||||
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -653,8 +653,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
|
||||
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
|
||||
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
|
||||
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -717,8 +717,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
|
||||
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
@@ -738,8 +738,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
|
||||
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
|
||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -775,12 +775,14 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
|
||||
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
|
||||
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
|
||||
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
||||
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
||||
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||
@@ -805,8 +807,8 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx
|
||||
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
|
||||
@@ -821,8 +823,8 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
|
||||
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
|
||||
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
|
||||
google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
@@ -833,8 +835,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
|
||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
|
||||
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
||||
@@ -15,7 +15,6 @@ public enum EViewAction
|
||||
ShowHideWindow,
|
||||
ScanScreenTask,
|
||||
ScanImageTask,
|
||||
Shutdown,
|
||||
BrowseServer,
|
||||
ImportRulesFromFile,
|
||||
InitSettingFont,
|
||||
|
||||
@@ -13,6 +13,8 @@ public static class AppEvents
|
||||
|
||||
public static readonly Subject<Unit> AppExitRequested = new();
|
||||
|
||||
public static readonly Subject<bool> ShutdownRequested = new();
|
||||
|
||||
public static readonly Subject<Unit> AdjustMainLvColWidthRequested = new();
|
||||
|
||||
public static readonly Subject<ServerSpeedItem> DispatcherStatisticsRequested = new();
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
using System.Reactive;
|
||||
|
||||
namespace ServiceLib.Manager;
|
||||
|
||||
public sealed class AppManager
|
||||
@@ -34,7 +36,7 @@ public sealed class AppManager
|
||||
|
||||
#endregion Property
|
||||
|
||||
#region Init
|
||||
#region App
|
||||
|
||||
public bool InitApp()
|
||||
{
|
||||
@@ -87,7 +89,40 @@ public sealed class AppManager
|
||||
return true;
|
||||
}
|
||||
|
||||
#endregion Init
|
||||
public async Task AppExitAsync(bool needShutdown)
|
||||
{
|
||||
try
|
||||
{
|
||||
Logging.SaveLog("AppExitAsync Begin");
|
||||
|
||||
await SysProxyHandler.UpdateSysProxy(_config, true);
|
||||
AppEvents.AppExitRequested.OnNext(Unit.Default);
|
||||
await Task.Delay(50); //Wait for AppExitRequested to be processed
|
||||
|
||||
await ConfigHandler.SaveConfig(_config);
|
||||
await ProfileExManager.Instance.SaveTo();
|
||||
await StatisticsManager.Instance.SaveTo();
|
||||
await CoreManager.Instance.CoreStop();
|
||||
StatisticsManager.Instance.Close();
|
||||
|
||||
Logging.SaveLog("AppExitAsync End");
|
||||
}
|
||||
catch { }
|
||||
finally
|
||||
{
|
||||
if (needShutdown)
|
||||
{
|
||||
Shutdown(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Shutdown(bool byUser)
|
||||
{
|
||||
AppEvents.ShutdownRequested.OnNext(byUser);
|
||||
}
|
||||
|
||||
#endregion App
|
||||
|
||||
#region Config
|
||||
|
||||
|
||||
@@ -136,8 +136,7 @@ public class BackupAndRestoreViewModel : MyReactiveObject
|
||||
var result = await CreateZipFileFromDirectory(fileBackup);
|
||||
if (result)
|
||||
{
|
||||
var service = Locator.Current.GetService<MainWindowViewModel>();
|
||||
await service?.MyAppExitAsync(true);
|
||||
await AppManager.Instance.AppExitAsync(false);
|
||||
await SQLiteHelper.Instance.DisposeDbConnectionAsync();
|
||||
|
||||
var toPath = Utils.GetConfigPath();
|
||||
@@ -154,7 +153,7 @@ public class BackupAndRestoreViewModel : MyReactiveObject
|
||||
_ = ProcUtils.ProcessStart(upgradeFileName, Global.RebootAs, Utils.StartupPath());
|
||||
}
|
||||
}
|
||||
service?.Shutdown(true);
|
||||
AppManager.Instance.Shutdown(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -236,12 +236,19 @@ public class CheckUpdateViewModel : MyReactiveObject
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!Utils.UpgradeAppExists(out _))
|
||||
if (!Utils.UpgradeAppExists(out var upgradeFileName))
|
||||
{
|
||||
await UpdateView(_v2rayN, ResUI.UpgradeAppNotExistTip);
|
||||
NoticeManager.Instance.SendMessageAndEnqueue(ResUI.UpgradeAppNotExistTip);
|
||||
Logging.SaveLog("UpgradeApp does not exist");
|
||||
return;
|
||||
}
|
||||
Locator.Current.GetService<MainWindowViewModel>()?.UpgradeApp(fileName);
|
||||
|
||||
var id = ProcUtils.ProcessStart(upgradeFileName, fileName, Utils.StartupPath());
|
||||
if (id > 0)
|
||||
{
|
||||
await AppManager.Instance.AppExitAsync(true);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -282,59 +282,11 @@ public class MainWindowViewModel : MyReactiveObject
|
||||
AppEvents.DispatcherStatisticsRequested.OnNext(update);
|
||||
}
|
||||
|
||||
public async Task MyAppExitAsync(bool blWindowsShutDown)
|
||||
{
|
||||
try
|
||||
{
|
||||
Logging.SaveLog("MyAppExitAsync Begin");
|
||||
|
||||
await SysProxyHandler.UpdateSysProxy(_config, true);
|
||||
AppEvents.AppExitRequested.OnNext(Unit.Default);
|
||||
|
||||
await ConfigHandler.SaveConfig(_config);
|
||||
await ProfileExManager.Instance.SaveTo();
|
||||
await StatisticsManager.Instance.SaveTo();
|
||||
await CoreManager.Instance.CoreStop();
|
||||
StatisticsManager.Instance.Close();
|
||||
|
||||
Logging.SaveLog("MyAppExitAsync End");
|
||||
}
|
||||
catch { }
|
||||
finally
|
||||
{
|
||||
if (!blWindowsShutDown)
|
||||
{
|
||||
_updateView?.Invoke(EViewAction.Shutdown, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task UpgradeApp(string arg)
|
||||
{
|
||||
if (!Utils.UpgradeAppExists(out var upgradeFileName))
|
||||
{
|
||||
NoticeManager.Instance.SendMessageAndEnqueue(ResUI.UpgradeAppNotExistTip);
|
||||
Logging.SaveLog("UpgradeApp does not exist");
|
||||
return;
|
||||
}
|
||||
|
||||
var id = ProcUtils.ProcessStart(upgradeFileName, arg, Utils.StartupPath());
|
||||
if (id > 0)
|
||||
{
|
||||
await MyAppExitAsync(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowHideWindow(bool? blShow)
|
||||
{
|
||||
_updateView?.Invoke(EViewAction.ShowHideWindow, blShow);
|
||||
}
|
||||
|
||||
public void Shutdown(bool byUser)
|
||||
{
|
||||
_updateView?.Invoke(EViewAction.Shutdown, byUser);
|
||||
}
|
||||
|
||||
#endregion Actions
|
||||
|
||||
#region Servers && Groups
|
||||
@@ -517,7 +469,7 @@ public class MainWindowViewModel : MyReactiveObject
|
||||
public async Task RebootAsAdmin()
|
||||
{
|
||||
ProcUtils.RebootAsAdmin();
|
||||
await MyAppExitAsync(false);
|
||||
await AppManager.Instance.AppExitAsync(true);
|
||||
}
|
||||
|
||||
private async Task ClearServerStatistics()
|
||||
|
||||
@@ -74,11 +74,7 @@ public partial class App : Application
|
||||
|
||||
private async void MenuExit_Click(object? sender, EventArgs e)
|
||||
{
|
||||
var service = Locator.Current.GetService<MainWindowViewModel>();
|
||||
if (service != null)
|
||||
{
|
||||
await service.MyAppExitAsync(true);
|
||||
}
|
||||
service?.Shutdown(true);
|
||||
await AppManager.Instance.AppExitAsync(false);
|
||||
AppManager.Instance.Shutdown(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,6 +148,12 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
|
||||
.ObserveOn(RxApp.MainThreadScheduler)
|
||||
.Subscribe(_ => StorageUI())
|
||||
.DisposeWith(disposables);
|
||||
|
||||
AppEvents.ShutdownRequested
|
||||
.AsObservable()
|
||||
.ObserveOn(RxApp.MainThreadScheduler)
|
||||
.Subscribe(content => Shutdown(content))
|
||||
.DisposeWith(disposables);
|
||||
});
|
||||
|
||||
if (Utils.IsWindows())
|
||||
@@ -222,19 +228,6 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
|
||||
DispatcherPriority.Default);
|
||||
break;
|
||||
|
||||
case EViewAction.Shutdown:
|
||||
if (obj != null && _blCloseByUser == false)
|
||||
{
|
||||
_blCloseByUser = (bool)obj;
|
||||
}
|
||||
StorageUI();
|
||||
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||
{
|
||||
HotkeyManager.Instance.Dispose();
|
||||
desktop.Shutdown();
|
||||
}
|
||||
break;
|
||||
|
||||
case EViewAction.ScanScreenTask:
|
||||
await ScanScreenTaskAsync();
|
||||
break;
|
||||
@@ -289,10 +282,7 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
|
||||
break;
|
||||
|
||||
case WindowCloseReason.ApplicationShutdown or WindowCloseReason.OSShutdown:
|
||||
if (ViewModel != null)
|
||||
{
|
||||
await ViewModel.MyAppExitAsync(true);
|
||||
}
|
||||
await AppManager.Instance.AppExitAsync(false);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -387,9 +377,21 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
|
||||
|
||||
_blCloseByUser = true;
|
||||
StorageUI();
|
||||
if (ViewModel != null)
|
||||
|
||||
await AppManager.Instance.AppExitAsync(true);
|
||||
}
|
||||
|
||||
private void Shutdown(bool obj)
|
||||
{
|
||||
if (obj is bool b && _blCloseByUser == false)
|
||||
{
|
||||
await ViewModel.MyAppExitAsync(false);
|
||||
_blCloseByUser = b;
|
||||
}
|
||||
StorageUI();
|
||||
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||
{
|
||||
HotkeyManager.Instance.Dispose();
|
||||
desktop.Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -145,6 +145,12 @@ public partial class MainWindow
|
||||
.ObserveOn(RxApp.MainThreadScheduler)
|
||||
.Subscribe(_ => StorageUI())
|
||||
.DisposeWith(disposables);
|
||||
|
||||
AppEvents.ShutdownRequested
|
||||
.AsObservable()
|
||||
.ObserveOn(RxApp.MainThreadScheduler)
|
||||
.Subscribe(content => Shutdown(content))
|
||||
.DisposeWith(disposables);
|
||||
});
|
||||
|
||||
this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
|
||||
@@ -212,13 +218,6 @@ public partial class MainWindow
|
||||
}), DispatcherPriority.Normal);
|
||||
break;
|
||||
|
||||
case EViewAction.Shutdown:
|
||||
Application.Current?.Dispatcher.Invoke((() =>
|
||||
{
|
||||
Application.Current.Shutdown();
|
||||
}), DispatcherPriority.Normal);
|
||||
break;
|
||||
|
||||
case EViewAction.ScanScreenTask:
|
||||
await ScanScreenTaskAsync();
|
||||
break;
|
||||
@@ -266,7 +265,12 @@ public partial class MainWindow
|
||||
{
|
||||
Logging.SaveLog("Current_SessionEnding");
|
||||
StorageUI();
|
||||
await ViewModel?.MyAppExitAsync(true);
|
||||
await AppManager.Instance.AppExitAsync(false);
|
||||
}
|
||||
|
||||
private void Shutdown(bool obj)
|
||||
{
|
||||
Application.Current.Shutdown();
|
||||
}
|
||||
|
||||
private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
|
||||
|
||||
@@ -97,9 +97,7 @@ public partial class StatusBarView
|
||||
private async void menuExit_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
tbNotify.Dispose();
|
||||
var service = Locator.Current.GetService<MainWindowViewModel>();
|
||||
if (service != null)
|
||||
await service.MyAppExitAsync(false);
|
||||
await AppManager.Instance.AppExitAsync(true);
|
||||
}
|
||||
|
||||
private void txtRunningInfoDisplay_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
||||
|
||||
@@ -211,7 +211,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
||||
|
||||
responseDone := func() error {
|
||||
defer timer.SetTimeout(plcy.Timeouts.UplinkOnly)
|
||||
if destination.Network == net.Network_TCP && useSplice && proxy.IsRAWTransport(conn) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
|
||||
if destination.Network == net.Network_TCP && useSplice && proxy.IsRAWTransportWithoutSecurity(conn) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
|
||||
var writeConn net.Conn
|
||||
var inTimer *signal.ActivityTimer
|
||||
if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Conn != nil {
|
||||
|
||||
@@ -96,7 +96,7 @@ func (s *Server) ProcessWithFirstbyte(ctx context.Context, network net.Network,
|
||||
inbound.User = &protocol.MemoryUser{
|
||||
Level: s.config.UserLevel,
|
||||
}
|
||||
if !proxy.IsRAWTransport(conn) {
|
||||
if !proxy.IsRAWTransportWithoutSecurity(conn) {
|
||||
inbound.CanSpliceCopy = 3
|
||||
}
|
||||
var reader *bufio.Reader
|
||||
|
||||
@@ -337,7 +337,7 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
|
||||
w.directWriteCounter = writerCounter
|
||||
*switchToDirectCopy = false
|
||||
}
|
||||
if !mb.IsEmpty() && w.directWriteCounter != nil {
|
||||
if !mb.IsEmpty() && w.directWriteCounter != nil {
|
||||
w.directWriteCounter.Add(int64(mb.Len()))
|
||||
}
|
||||
|
||||
@@ -725,7 +725,7 @@ func readV(ctx context.Context, reader buf.Reader, writer buf.Writer, timer sign
|
||||
return nil
|
||||
}
|
||||
|
||||
func IsRAWTransport(conn stat.Connection) bool {
|
||||
func IsRAWTransportWithoutSecurity(conn stat.Connection) bool {
|
||||
iConn := conn
|
||||
if statConn, ok := iConn.(*stat.CounterConnection); ok {
|
||||
iConn = statConn.Connection
|
||||
|
||||
@@ -75,7 +75,7 @@ func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Con
|
||||
inbound.User = &protocol.MemoryUser{
|
||||
Level: s.config.UserLevel,
|
||||
}
|
||||
if !proxy.IsRAWTransport(conn) {
|
||||
if !proxy.IsRAWTransportWithoutSecurity(conn) {
|
||||
inbound.CanSpliceCopy = 3
|
||||
}
|
||||
|
||||
|
||||
@@ -506,8 +506,8 @@ func (h *Handler) Process(ctx context.Context, network net.Network, connection s
|
||||
var t reflect.Type
|
||||
var p uintptr
|
||||
if commonConn, ok := connection.(*encryption.CommonConn); ok {
|
||||
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransport(iConn) {
|
||||
inbound.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport can not use Linux Splice
|
||||
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransportWithoutSecurity(iConn) {
|
||||
inbound.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport / another securityConn should not be penetrated
|
||||
}
|
||||
t = reflect.TypeOf(commonConn).Elem()
|
||||
p = uintptr(unsafe.Pointer(commonConn))
|
||||
|
||||
@@ -166,8 +166,8 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
||||
var t reflect.Type
|
||||
var p uintptr
|
||||
if commonConn, ok := conn.(*encryption.CommonConn); ok {
|
||||
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransport(iConn) {
|
||||
ob.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport can not use Linux Splice
|
||||
if _, ok := commonConn.Conn.(*encryption.XorConn); ok || !proxy.IsRAWTransportWithoutSecurity(iConn) {
|
||||
ob.CanSpliceCopy = 3 // full-random xorConn / non-RAW transport / another securityConn should not be penetrated
|
||||
}
|
||||
t = reflect.TypeOf(commonConn).Elem()
|
||||
p = uintptr(unsafe.Pointer(commonConn))
|
||||
|
||||
Reference in New Issue
Block a user