Update On Sat Apr 5 20:32:58 CEST 2025

This commit is contained in:
github-action[bot]
2025-04-05 20:32:58 +02:00
parent b11838ade6
commit 51605c1b3e
51 changed files with 1077 additions and 813 deletions
+1
View File
@@ -963,3 +963,4 @@ Update On Tue Apr 1 20:37:22 CEST 2025
Update On Wed Apr 2 20:37:16 CEST 2025
Update On Thu Apr 3 20:36:49 CEST 2025
Update On Fri Apr 4 20:36:13 CEST 2025
Update On Sat Apr 5 20:32:49 CEST 2025
+1 -1
View File
@@ -14,7 +14,7 @@ on:
- Alpha
tags:
- "v*"
pull_request_target:
pull_request:
branches:
- Alpha
concurrency:
@@ -11,7 +11,7 @@
"build": "tsc"
},
"dependencies": {
"@tanstack/react-query": "5.71.5",
"@tanstack/react-query": "5.71.10",
"@tauri-apps/api": "2.4.0",
"ahooks": "3.8.4",
"dayjs": "1.11.13",
@@ -16,9 +16,9 @@
"@emotion/styled": "11.14.0",
"@juggle/resize-observer": "3.4.0",
"@material/material-color-utilities": "0.3.0",
"@mui/icons-material": "6.4.9",
"@mui/icons-material": "6.4.10",
"@mui/lab": "6.0.0-dev.240424162023-9968b4889d",
"@mui/material": "6.4.9",
"@mui/material": "6.4.10",
"@nyanpasu/interface": "workspace:^",
"@nyanpasu/ui": "workspace:^",
"@tailwindcss/postcss": "4.0.17",
@@ -55,7 +55,7 @@
"@emotion/react": "11.14.0",
"@iconify/json": "2.2.323",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.71.5",
"@tanstack/react-query": "5.71.10",
"@tanstack/react-router": "1.114.34",
"@tanstack/router-devtools": "1.114.34",
"@tanstack/router-plugin": "1.114.34",
@@ -85,7 +85,7 @@
"unplugin-auto-import": "19.1.2",
"unplugin-icons": "22.1.0",
"validator": "13.15.0",
"vite": "6.2.3",
"vite": "6.2.5",
"vite-plugin-html": "3.2.2",
"vite-plugin-sass-dts": "1.3.31",
"vite-plugin-svgr": "4.3.0",
+3 -3
View File
@@ -17,9 +17,9 @@
},
"dependencies": {
"@material/material-color-utilities": "0.3.0",
"@mui/icons-material": "6.4.9",
"@mui/icons-material": "6.4.10",
"@mui/lab": "6.0.0-dev.240424162023-9968b4889d",
"@mui/material": "6.4.9",
"@mui/material": "6.4.10",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-scroll-area": "1.2.3",
"@tauri-apps/api": "2.4.0",
@@ -35,7 +35,7 @@
"react-i18next": "15.4.1",
"react-use": "17.6.0",
"tailwindcss": "4.0.17",
"vite": "6.2.3",
"vite": "6.2.5",
"vite-tsconfig-paths": "5.1.4"
},
"devDependencies": {
+2 -2
View File
@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.4",
"mihomo_alpha": "alpha-323973f",
"mihomo_alpha": "alpha-190047c",
"clash_rs": "v0.7.6",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.7.6-alpha+sha.5af4aa5"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-04-03T22:20:50.117Z"
"updated_at": "2025-04-04T22:20:45.107Z"
}
+140 -99
View File
@@ -175,8 +175,8 @@ importers:
frontend/interface:
dependencies:
'@tanstack/react-query':
specifier: 5.71.5
version: 5.71.5(react@19.1.0)
specifier: 5.71.10
version: 5.71.10(react@19.1.0)
'@tauri-apps/api':
specifier: 2.4.0
version: 2.4.0
@@ -227,14 +227,14 @@ importers:
specifier: 0.3.0
version: 0.3.0
'@mui/icons-material':
specifier: 6.4.9
version: 6.4.9(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
specifier: 6.4.10
version: 6.4.10(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/lab':
specifier: 6.0.0-dev.240424162023-9968b4889d
version: 6.0.0-dev.240424162023-9968b4889d(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
version: 6.0.0-dev.240424162023-9968b4889d(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material':
specifier: 6.4.9
version: 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
specifier: 6.4.10
version: 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@nyanpasu/interface':
specifier: workspace:^
version: link:../interface
@@ -279,13 +279,13 @@ importers:
version: 0.4.0
material-react-table:
specifier: 3.2.1
version: 3.2.1(461b1675e977ce7ddfccdb41b23a2b68)
version: 3.2.1(16cae48942a23fa283356967984e1dc9)
monaco-editor:
specifier: 0.52.2
version: 0.52.2
mui-color-input:
specifier: 5.0.1
version: 5.0.1(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
version: 5.0.1(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react:
specifier: 19.1.0
version: 19.1.0
@@ -300,7 +300,7 @@ importers:
version: 1.6.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react-hook-form-mui:
specifier: 7.5.1
version: 7.5.1(520e6035d6408ad75a0cc5e04e702c31)
version: 7.5.1(b72ea0bc365d989ec4315188915e6c3b)
react-i18next:
specifier: 15.4.1
version: 15.4.1(i18next@24.2.3(typescript@5.8.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -339,8 +339,8 @@ importers:
specifier: 4.7.0
version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/react-query':
specifier: 5.71.5
version: 5.71.5(react@19.1.0)
specifier: 5.71.10
version: 5.71.10(react@19.1.0)
'@tanstack/react-router':
specifier: 1.114.34
version: 1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -349,7 +349,7 @@ importers:
version: 1.114.34(@tanstack/react-router@1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.114.33)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)
'@tanstack/router-plugin':
specifier: 1.114.34
version: 1.114.34(@tanstack/react-router@1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 1.114.34(@tanstack/react-router@1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.2.2
version: 2.2.2
@@ -385,13 +385,13 @@ importers:
version: 13.12.3
'@vitejs/plugin-legacy':
specifier: 6.0.2
version: 6.0.2(terser@5.36.0)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 6.0.2(terser@5.36.0)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
'@vitejs/plugin-react':
specifier: 4.3.4
version: 4.3.4(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 4.3.4(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
'@vitejs/plugin-react-swc':
specifier: 3.8.1
version: 3.8.1(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 3.8.1(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
change-case:
specifier: 5.4.4
version: 5.4.4
@@ -429,20 +429,20 @@ importers:
specifier: 13.15.0
version: 13.15.0
vite:
specifier: 6.2.3
version: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
specifier: 6.2.5
version: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite-plugin-html:
specifier: 3.2.2
version: 3.2.2(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 3.2.2(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
vite-plugin-sass-dts:
specifier: 1.3.31
version: 1.3.31(postcss@8.5.3)(prettier@3.5.3)(sass-embedded@1.86.3)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 1.3.31(postcss@8.5.3)(prettier@3.5.3)(sass-embedded@1.86.3)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
vite-plugin-svgr:
specifier: 4.3.0
version: 4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
vite-tsconfig-paths:
specifier: 5.1.4
version: 5.1.4(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 5.1.4(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
zod:
specifier: 3.24.2
version: 3.24.2
@@ -453,14 +453,14 @@ importers:
specifier: 0.3.0
version: 0.3.0
'@mui/icons-material':
specifier: 6.4.9
version: 6.4.9(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
specifier: 6.4.10
version: 6.4.10(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/lab':
specifier: 6.0.0-dev.240424162023-9968b4889d
version: 6.0.0-dev.240424162023-9968b4889d(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
version: 6.0.0-dev.240424162023-9968b4889d(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material':
specifier: 6.4.9
version: 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
specifier: 6.4.10
version: 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@radix-ui/react-portal':
specifier: 1.1.4
version: 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.12))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -478,7 +478,7 @@ importers:
version: 19.0.12
'@vitejs/plugin-react':
specifier: 4.3.4
version: 4.3.4(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 4.3.4(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
ahooks:
specifier: 3.8.4
version: 3.8.4(react@19.1.0)
@@ -507,11 +507,11 @@ importers:
specifier: 4.0.17
version: 4.0.17
vite:
specifier: 6.2.3
version: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
specifier: 6.2.5
version: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite-tsconfig-paths:
specifier: 5.1.4
version: 5.1.4(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 5.1.4(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
devDependencies:
'@emotion/react':
specifier: 11.14.0
@@ -536,7 +536,7 @@ importers:
version: 5.1.0(typescript@5.8.2)
vite-plugin-dts:
specifier: 4.5.3
version: 4.5.3(@types/node@22.13.17)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
version: 4.5.3(@types/node@22.13.17)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))
scripts:
dependencies:
@@ -1774,14 +1774,14 @@ packages:
'@types/react':
optional: true
'@mui/core-downloads-tracker@6.4.9':
resolution: {integrity: sha512-3UvsvOjqZJcokHKSzA1lskj2XMM/G5GBgge6ykwmAij2pGGxydGxAXirQlLaeoMwTKDS6BcrLqPZyPVwzri20A==}
'@mui/core-downloads-tracker@6.4.10':
resolution: {integrity: sha512-cblGjlM6+xsptwyaALw8RbRIUoqmKxOqLxlk2LkTDhxqUuql1YSOKKLH3w+Yd2QLz28b7MR65sx1OjsRZUfOSQ==}
'@mui/icons-material@6.4.9':
resolution: {integrity: sha512-a8l63VIscBteJlh31R88aVgHelCcrhl3Rk0GnN8znTsGhcam9mFeo4Xlw+gLUYQP7mxVcVt3WP9XJkwXWZflnw==}
'@mui/icons-material@6.4.10':
resolution: {integrity: sha512-c2KdFl4KZ0QYC+JSDTMCNjcuOL2rVSdIx/beo7FwJDh2e9XqC1MoLCjw6L1Jo40zbArkgJyg3oFORbXcRfgZOA==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@mui/material': ^6.4.9
'@mui/material': ^6.4.10
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
@@ -1806,13 +1806,13 @@ packages:
'@types/react':
optional: true
'@mui/material@6.4.9':
resolution: {integrity: sha512-+5dExw9xUUFujIW889gB3qrfjeNo3YjYW7aWVZ6BlBIJnKpJ0jNcYZJpBUFoXt/FUV5Wy1V+/+XzR3Is2mXX2w==}
'@mui/material@6.4.10':
resolution: {integrity: sha512-L1B0+Vg9NFjo3NcfODH3bohl6fIkzjyDBHBHb3Al4QI7owaJrFm2sSDyfz++iatzICug6U6q5tHLQrCLO71xkg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
'@emotion/styled': ^11.3.0
'@mui/material-pigment-css': ^6.4.9
'@mui/material-pigment-css': ^6.4.10
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1846,6 +1846,16 @@ packages:
'@types/react':
optional: true
'@mui/private-theming@6.4.9':
resolution: {integrity: sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
optional: true
'@mui/styled-engine@5.16.6':
resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==}
engines: {node: '>=12.0.0'}
@@ -1901,8 +1911,8 @@ packages:
'@types/react':
optional: true
'@mui/system@6.4.8':
resolution: {integrity: sha512-gV7iBHoqlsIenU2BP0wq14BefRoZcASZ/4LeyuQglayBl+DfLX5rEd3EYR3J409V2EZpR0NOM1LATAGlNk2cyA==}
'@mui/system@6.4.10':
resolution: {integrity: sha512-RyBGQwP3tgo4JEibK+RwVu1a6nQ6y8urMCNsb2aiN/nvTxxumq6P26aoG4GTUf8L4O1sthC4lMXlP4r8ixDkMg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -1917,8 +1927,8 @@ packages:
'@types/react':
optional: true
'@mui/system@6.4.9':
resolution: {integrity: sha512-JOj7efXGtZn+NIzX8KDyMpO1QKc0DhilPBsxvci1xAvI1e5AtAtfzrEuV5ZvN+lz2BDuzngCWlllnqQ/cg40RQ==}
'@mui/system@6.4.8':
resolution: {integrity: sha512-gV7iBHoqlsIenU2BP0wq14BefRoZcASZ/4LeyuQglayBl+DfLX5rEd3EYR3J409V2EZpR0NOM1LATAGlNk2cyA==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@@ -1961,6 +1971,16 @@ packages:
'@types/react':
optional: true
'@mui/utils@6.4.9':
resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
optional: true
'@mui/x-date-pickers@7.9.0':
resolution: {integrity: sha512-GMDprioHlYmNle8Cbh6TxB4QThDGgqJxfH/R/p/5dNk+Tn5vB1gZSDMn3wVxItiEV6tDXbkyS5gPhSMVFDGvAA==}
engines: {node: '>=14.0.0'}
@@ -2782,11 +2802,11 @@ packages:
resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==}
engines: {node: '>=12'}
'@tanstack/query-core@5.71.5':
resolution: {integrity: sha512-XOQ5SyjCdwhxyLksGKWSL5poqyEXYPDnsrZAzJm2LgrMm4Yh6VOrfC+IFosXreDw9HNqC11YAMY3HlfHjNzuaA==}
'@tanstack/query-core@5.71.10':
resolution: {integrity: sha512-/fKEY8fO1nbszfrBatzmhJa1nEwIKn0c6Tv2A1ocSA5OiD2GukOIV8nnBbvJRgZb/VIoBy9/N4PVbABI8YQLow==}
'@tanstack/react-query@5.71.5':
resolution: {integrity: sha512-WpxZWy4fDASjY+iAaXB+aY+LC95PQ34W6EWVkjJ0hdzWWbczFnr9nHvHkVDpwdR18I1NO8igNGQJFrLrgyzI8Q==}
'@tanstack/react-query@5.71.10':
resolution: {integrity: sha512-mQYM/ObpL8YMDz8vCoUuHkbe8Yu7NnVRH8aBaBa/3zlufjp1f1VuWjeO3TcumNHfuVMDwEAGinsgwrB7OKADiQ==}
peerDependencies:
react: ^18 || ^19
@@ -8019,8 +8039,8 @@ packages:
vite:
optional: true
vite@6.2.3:
resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==}
vite@6.2.5:
resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -9668,21 +9688,21 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.12
'@mui/core-downloads-tracker@6.4.9': {}
'@mui/core-downloads-tracker@6.4.10': {}
'@mui/icons-material@6.4.9(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)':
'@mui/icons-material@6.4.10(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/material': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0
optionalDependencies:
'@types/react': 19.0.12
'@mui/lab@6.0.0-dev.240424162023-9968b4889d(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
'@mui/lab@6.0.0-dev.240424162023-9968b4889d(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/base': 5.0.0-beta.42(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/system': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/types': 7.2.24(@types/react@19.0.12)
'@mui/utils': 6.4.8(@types/react@19.0.12)(react@19.1.0)
@@ -9695,13 +9715,13 @@ snapshots:
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@types/react': 19.0.12
'@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
'@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/core-downloads-tracker': 6.4.9
'@mui/system': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/core-downloads-tracker': 6.4.10
'@mui/system': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/types': 7.2.24(@types/react@19.0.12)
'@mui/utils': 6.4.8(@types/react@19.0.12)(react@19.1.0)
'@mui/utils': 6.4.9(@types/react@19.0.12)(react@19.1.0)
'@popperjs/core': 2.11.8
'@types/react-transition-group': 4.4.12(@types/react@19.0.12)
clsx: 2.1.1
@@ -9734,6 +9754,15 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.12
'@mui/private-theming@6.4.9(@types/react@19.0.12)(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/utils': 6.4.9(@types/react@19.0.12)(react@19.1.0)
prop-types: 15.8.1
react: 19.1.0
optionalDependencies:
'@types/react': 19.0.12
'@mui/styled-engine@5.16.6(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
@@ -9787,13 +9816,13 @@ snapshots:
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@types/react': 19.0.12
'@mui/system@6.4.8(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)':
'@mui/system@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/private-theming': 6.4.8(@types/react@19.0.12)(react@19.1.0)
'@mui/styled-engine': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(react@19.1.0)
'@mui/private-theming': 6.4.9(@types/react@19.0.12)(react@19.1.0)
'@mui/styled-engine': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(react@19.1.0)
'@mui/types': 7.2.24(@types/react@19.0.12)
'@mui/utils': 6.4.8(@types/react@19.0.12)(react@19.1.0)
'@mui/utils': 6.4.9(@types/react@19.0.12)(react@19.1.0)
clsx: 2.1.1
csstype: 3.1.3
prop-types: 15.8.1
@@ -9803,11 +9832,11 @@ snapshots:
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@types/react': 19.0.12
'@mui/system@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)':
'@mui/system@6.4.8(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/private-theming': 6.4.8(@types/react@19.0.12)(react@19.1.0)
'@mui/styled-engine': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(react@19.1.0)
'@mui/styled-engine': 6.4.8(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(react@19.1.0)
'@mui/types': 7.2.24(@types/react@19.0.12)
'@mui/utils': 6.4.8(@types/react@19.0.12)(react@19.1.0)
clsx: 2.1.1
@@ -9847,11 +9876,23 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.12
'@mui/x-date-pickers@7.9.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
'@mui/utils@6.4.9(@types/react@19.0.12)(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/types': 7.2.24(@types/react@19.0.12)
'@types/prop-types': 15.7.14
clsx: 2.1.1
prop-types: 15.8.1
react: 19.1.0
react-is: 19.0.0
optionalDependencies:
'@types/react': 19.0.12
'@mui/x-date-pickers@7.9.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.26.10
'@mui/base': 5.0.0-beta.70(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/system': 5.16.7(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/utils': 5.16.6(@types/react@19.0.12)(react@19.1.0)
'@types/react-transition-group': 4.4.12(@types/react@19.0.12)
@@ -10606,11 +10647,11 @@ snapshots:
dependencies:
remove-accents: 0.5.0
'@tanstack/query-core@5.71.5': {}
'@tanstack/query-core@5.71.10': {}
'@tanstack/react-query@5.71.5(react@19.1.0)':
'@tanstack/react-query@5.71.10(react@19.1.0)':
dependencies:
'@tanstack/query-core': 5.71.5
'@tanstack/query-core': 5.71.10
react: 19.1.0
'@tanstack/react-router-devtools@1.114.34(@tanstack/react-router@1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.114.33)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)':
@@ -10694,7 +10735,7 @@ snapshots:
optionalDependencies:
'@tanstack/react-router': 1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/router-plugin@1.114.34(@tanstack/react-router@1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@tanstack/router-plugin@1.114.34(@tanstack/react-router@1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.9
'@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9)
@@ -10715,7 +10756,7 @@ snapshots:
zod: 3.24.2
optionalDependencies:
'@tanstack/react-router': 1.114.34(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
@@ -11224,7 +11265,7 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@vitejs/plugin-legacy@6.0.2(terser@5.36.0)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@vitejs/plugin-legacy@6.0.2(terser@5.36.0)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.9
'@babel/preset-env': 7.26.9(@babel/core@7.26.9)
@@ -11235,25 +11276,25 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.36.0
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react-swc@3.8.1(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@vitejs/plugin-react-swc@3.8.1(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@swc/core': 1.11.11
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- '@swc/helpers'
'@vitejs/plugin-react@4.3.4(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
'@vitejs/plugin-react@4.3.4(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
@@ -14134,13 +14175,13 @@ snapshots:
escape-string-regexp: 4.0.0
optional: true
material-react-table@3.2.1(461b1675e977ce7ddfccdb41b23a2b68):
material-react-table@3.2.1(16cae48942a23fa283356967984e1dc9):
dependencies:
'@emotion/react': 11.14.0(@types/react@19.0.12)(react@19.1.0)
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/icons-material': 6.4.9(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/material': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/icons-material': 6.4.10(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/material': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/match-sorter-utils': 8.19.4
'@tanstack/react-table': 8.20.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/react-virtual': 3.11.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -14491,12 +14532,12 @@ snapshots:
muggle-string@0.4.1: {}
mui-color-input@5.0.1(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
mui-color-input@5.0.1(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@ctrl/tinycolor': 4.1.0
'@emotion/react': 11.14.0(@types/react@19.0.12)(react@19.1.0)
'@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/material': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
optionalDependencies:
@@ -15065,14 +15106,14 @@ snapshots:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
react-hook-form-mui@7.5.1(520e6035d6408ad75a0cc5e04e702c31):
react-hook-form-mui@7.5.1(b72ea0bc365d989ec4315188915e6c3b):
dependencies:
'@mui/material': 6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/material': 6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-hook-form: 7.52.1(react@19.1.0)
optionalDependencies:
'@mui/icons-material': 6.4.9(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.9(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/icons-material': 6.4.10(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(react@19.1.0)
'@mui/x-date-pickers': 7.9.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@mui/material@6.4.10(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react@19.1.0))(@types/react@19.0.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@types/react@19.0.12)(dayjs@1.11.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react-hook-form@7.52.1(react@19.1.0):
dependencies:
@@ -16433,7 +16474,7 @@ snapshots:
- rollup
- supports-color
vite-plugin-dts@4.5.3(@types/node@22.13.17)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
vite-plugin-dts@4.5.3(@types/node@22.13.17)(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
dependencies:
'@microsoft/api-extractor': 7.51.0(@types/node@22.13.17)
'@rollup/pluginutils': 5.1.4(rollup@4.34.3)
@@ -16446,13 +16487,13 @@ snapshots:
magic-string: 0.30.17
typescript: 5.8.2
optionalDependencies:
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- '@types/node'
- rollup
- supports-color
vite-plugin-html@3.2.2(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
vite-plugin-html@3.2.2(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
dependencies:
'@rollup/pluginutils': 4.2.1
colorette: 2.0.20
@@ -16466,39 +16507,39 @@ snapshots:
html-minifier-terser: 6.1.0
node-html-parser: 5.4.2
pathe: 0.2.0
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite-plugin-sass-dts@1.3.31(postcss@8.5.3)(prettier@3.5.3)(sass-embedded@1.86.3)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
vite-plugin-sass-dts@1.3.31(postcss@8.5.3)(prettier@3.5.3)(sass-embedded@1.86.3)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
dependencies:
postcss: 8.5.3
postcss-js: 4.0.1(postcss@8.5.3)
prettier: 3.5.3
sass-embedded: 1.86.3
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite-plugin-svgr@4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
vite-plugin-svgr@4.3.0(rollup@4.34.3)(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.34.3)
'@svgr/core': 8.1.0(typescript@5.8.2)
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.2))
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)):
dependencies:
debug: 4.3.7
globrex: 0.1.2
tsconfck: 3.0.3(typescript@5.8.2)
optionalDependencies:
vite: 6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
vite: 6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0)
transitivePeerDependencies:
- supports-color
- typescript
vite@6.2.3(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0):
vite@6.2.5(@types/node@22.13.17)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.29.2)(sass-embedded@1.86.3)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.7.0):
dependencies:
esbuild: 0.25.0
postcss: 8.5.3
+2 -1
View File
@@ -3,7 +3,7 @@
#### 已知问题
- 仅在Ubuntu 22.04/24.04Fedora 41 **Gnome桌面环境** 做过简单测试,不保证其他其他Linux发行版可用,将在未来做进一步适配和调优
- MacOS 自定义图标与速率显示推荐图标尺寸为 256x256。其他尺寸(可能)会导致不正常图标和速率间隙
- MacOS 下 MacBook 外接显示器且盒盖关闭时速率图标闪烁
- MacOS 下 墙贴主要为浅色,Tray 图标深色时图标闪烁
- Linux 下 Clash Verge Rev 内存占用显著高于 Windows / MacOS
### 2.2.3-alpha 相对于 2.2.2
@@ -18,6 +18,7 @@
- 相同节点名称可能导致的页面渲染出错
- URL Schemes被截断的问题
- 首页流量统计卡更好的时间戳范围
- 静默启动无法触发自动轻量化计时器
#### 新增了:
- Mihomo(Meta)内核升级至 1.19.4
+1 -1
View File
@@ -103,7 +103,7 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult<bool> {
);
handle::Handle::notice_message(
"config_validate::file_not_found",
&format!("{}", file_path.display()),
format!("{}", file_path.display()),
);
return Ok(false);
}
+16 -16
View File
@@ -30,7 +30,7 @@ impl Hotkey {
let enable_global_hotkey = verge.latest().enable_global_hotkey.unwrap_or(true);
logging!(
info,
debug,
Type::Hotkey,
true,
"Initializing hotkeys with enable: {}",
@@ -44,7 +44,7 @@ impl Hotkey {
if let Some(hotkeys) = verge.latest().hotkeys.as_ref() {
logging!(
info,
debug,
Type::Hotkey,
true,
"Has {} hotkeys need to register",
@@ -59,7 +59,7 @@ impl Hotkey {
match (key, func) {
(Some(key), Some(func)) => {
logging!(
info,
debug,
Type::Hotkey,
true,
"Registering hotkey: {} -> {}",
@@ -78,7 +78,7 @@ impl Hotkey {
);
} else {
logging!(
info,
debug,
Type::Hotkey,
true,
"Successfully registered hotkey {} -> {}",
@@ -103,7 +103,7 @@ impl Hotkey {
}
self.current.lock().clone_from(hotkeys);
} else {
logging!(info, Type::Hotkey, true, "No hotkeys configured");
logging!(debug, Type::Hotkey, true, "No hotkeys configured");
}
Ok(())
@@ -121,7 +121,7 @@ impl Hotkey {
let manager = app_handle.global_shortcut();
logging!(
info,
debug,
Type::Hotkey,
true,
"Attempting to register hotkey: {} for function: {}",
@@ -131,7 +131,7 @@ impl Hotkey {
if manager.is_registered(hotkey) {
logging!(
info,
debug,
Type::Hotkey,
true,
"Hotkey {} was already registered, unregistering first",
@@ -143,14 +143,14 @@ impl Hotkey {
let f = match func.trim() {
"open_or_close_dashboard" => {
logging!(
info,
debug,
Type::Hotkey,
true,
"Registering open_or_close_dashboard function"
);
|| {
logging!(
info,
debug,
Type::Hotkey,
true,
"=== Hotkey Dashboard Window Operation Start ==="
@@ -159,7 +159,7 @@ impl Hotkey {
// 使用 spawn_blocking 来确保在正确的线程上执行
async_runtime::spawn_blocking(|| {
logging!(
info,
debug,
Type::Hotkey,
true,
"Toggle dashboard window visibility"
@@ -188,12 +188,12 @@ impl Hotkey {
true,
"Window does not exist, creating a new one"
);
resolve::create_window();
resolve::create_window(true);
}
});
logging!(
info,
debug,
Type::Hotkey,
true,
"=== Hotkey Dashboard Window Operation End ==="
@@ -220,18 +220,18 @@ impl Hotkey {
let _ = manager.on_shortcut(hotkey, move |app_handle, hotkey, event| {
if event.state == ShortcutState::Pressed {
logging!(info, Type::Hotkey, true, "Hotkey pressed: {:?}", hotkey);
logging!(debug, Type::Hotkey, true, "Hotkey pressed: {:?}", hotkey);
if hotkey.key == Code::KeyQ && is_quit {
if let Some(window) = app_handle.get_webview_window("main") {
if window.is_focused().unwrap_or(false) {
logging!(info, Type::Hotkey, true, "Executing quit function");
logging!(debug, Type::Hotkey, true, "Executing quit function");
f();
}
}
} else {
// 直接执行函数,不做任何状态检查
logging!(info, Type::Hotkey, true, "Executing function directly");
logging!(debug, Type::Hotkey, true, "Executing function directly");
// 获取全局热键状态
let is_enable_global_hotkey = Config::verge()
@@ -255,7 +255,7 @@ impl Hotkey {
});
logging!(
info,
debug,
Type::Hotkey,
true,
"Successfully registered hotkey {} for {}",
+56 -25
View File
@@ -1,4 +1,6 @@
use crate::{config::Config, core::CoreManager, feat};
use crate::{
config::Config, core::CoreManager, feat, logging, logging_error, utils::logging::Type,
};
use anyhow::{Context, Result};
use delay_timer::prelude::{DelayTimer, DelayTimerBuilder, TaskBuilder};
use once_cell::sync::OnceCell;
@@ -54,18 +56,18 @@ impl Timer {
)
.is_err()
{
log::debug!(target: "app", "Timer already initialized, skipping...");
logging!(debug, Type::Timer, "Timer already initialized, skipping...");
return Ok(());
}
log::info!(target: "app", "Initializing timer...");
logging!(info, Type::Timer, true, "Initializing timer...");
// Initialize timer tasks
if let Err(e) = self.refresh() {
// Reset initialization flag on error
self.initialized
.store(false, std::sync::atomic::Ordering::SeqCst);
log::error!(target: "app", "Failed to initialize timer: {}", e);
logging_error!(Type::Timer, false, "Failed to initialize timer: {}", e);
return Err(e);
}
@@ -98,15 +100,15 @@ impl Timer {
for uid in profiles_to_update {
if let Some(task) = timer_map.get(&uid) {
log::info!(target: "app", "Advancing task for uid: {}", uid);
logging!(info, Type::Timer, "Advancing task for uid: {}", uid);
if let Err(e) = delay_timer.advance_task(task.task_id) {
log::warn!(target: "app", "Failed to advance task {}: {}", uid, e);
logging!(warn, Type::Timer, "Failed to advance task {}: {}", uid, e);
}
}
}
}
log::info!(target: "app", "Timer initialization completed");
logging!(info, Type::Timer, "Timer initialization completed");
Ok(())
}
@@ -116,11 +118,16 @@ impl Timer {
let diff_map = self.gen_diff();
if diff_map.is_empty() {
log::debug!(target: "app", "No timer changes needed");
logging!(debug, Type::Timer, "No timer changes needed");
return Ok(());
}
log::info!(target: "app", "Refreshing {} timer tasks", diff_map.len());
logging!(
info,
Type::Timer,
"Refreshing {} timer tasks",
diff_map.len()
);
// Apply changes while holding locks
let mut timer_map = self.timer_map.write();
@@ -131,9 +138,16 @@ impl Timer {
DiffFlag::Del(tid) => {
timer_map.remove(&uid);
if let Err(e) = delay_timer.remove_task(tid) {
log::warn!(target: "app", "Failed to remove task {} for uid {}: {}", tid, uid, e);
logging!(
warn,
Type::Timer,
"Failed to remove task {} for uid {}: {}",
tid,
uid,
e
);
} else {
log::debug!(target: "app", "Removed task {} for uid {}", tid, uid);
logging!(debug, Type::Timer, "Removed task {} for uid {}", tid, uid);
}
}
DiffFlag::Add(tid, interval) => {
@@ -146,16 +160,23 @@ impl Timer {
timer_map.insert(uid.clone(), task);
if let Err(e) = self.add_task(&mut delay_timer, uid.clone(), tid, interval) {
log::error!(target: "app", "Failed to add task for uid {}: {}", uid, e);
logging_error!(Type::Timer, "Failed to add task for uid {}: {}", uid, e);
timer_map.remove(&uid); // Rollback on failure
} else {
log::debug!(target: "app", "Added task {} for uid {}", tid, uid);
logging!(debug, Type::Timer, "Added task {} for uid {}", tid, uid);
}
}
DiffFlag::Mod(tid, interval) => {
// Remove old task first
if let Err(e) = delay_timer.remove_task(tid) {
log::warn!(target: "app", "Failed to remove old task {} for uid {}: {}", tid, uid, e);
logging!(
warn,
Type::Timer,
"Failed to remove old task {} for uid {}: {}",
tid,
uid,
e
);
}
// Then add the new one
@@ -168,10 +189,10 @@ impl Timer {
timer_map.insert(uid.clone(), task);
if let Err(e) = self.add_task(&mut delay_timer, uid.clone(), tid, interval) {
log::error!(target: "app", "Failed to update task for uid {}: {}", uid, e);
logging_error!(Type::Timer, "Failed to update task for uid {}: {}", uid, e);
timer_map.remove(&uid); // Rollback on failure
} else {
log::debug!(target: "app", "Updated task {} for uid {}", tid, uid);
logging!(debug, Type::Timer, "Updated task {} for uid {}", tid, uid);
}
}
}
@@ -250,7 +271,14 @@ impl Timer {
tid: TaskID,
minutes: u64,
) -> Result<()> {
log::info!(target: "app", "Adding task: uid={}, id={}, interval={}min", uid, tid, minutes);
logging!(
info,
Type::Timer,
"Adding task: uid={}, id={}, interval={}min",
uid,
tid,
minutes
);
// Create a task with reasonable retries and backoff
let task = TaskBuilder::default()
@@ -275,7 +303,7 @@ impl Timer {
/// Async task with better error handling and logging
async fn async_task(uid: String) {
let task_start = std::time::Instant::now();
log::info!(target: "app", "Running timer task for profile: {}", uid);
logging!(info, Type::Timer, "Running timer task for profile: {}", uid);
// Update profile
let profile_result = feat::update_profile(uid.clone(), None).await;
@@ -286,23 +314,26 @@ impl Timer {
match CoreManager::global().update_config().await {
Ok(_) => {
let duration = task_start.elapsed().as_millis();
log::info!(
target: "app",
logging!(
info,
Type::Timer,
"Timer task completed successfully for uid: {} (took {}ms)",
uid, duration
uid,
duration
);
}
Err(e) => {
log::error!(
target: "app",
logging_error!(
Type::Timer,
"Failed to refresh config after profile update for uid {}: {}",
uid, e
uid,
e
);
}
}
}
Err(e) => {
log::error!(target: "app", "Failed to update profile uid {}: {}", uid, e);
logging_error!(Type::Timer, "Failed to update profile uid {}: {}", uid, e);
}
}
}
@@ -205,7 +205,7 @@ impl Tray {
match tray_event.as_str() {
"system_proxy" => feat::toggle_system_proxy(),
"tun_mode" => feat::toggle_tun_mode(None),
"main_window" => resolve::create_window(),
"main_window" => resolve::create_window(true),
_ => {}
}
}
@@ -309,13 +309,8 @@ impl Tray {
let rate = rate_guard.as_ref();
let rate_bytes = SpeedRate::add_speed_text(is_custom_icon, bytes, rate).unwrap();
let _ = tray.set_icon(Some(tauri::image::Image::from_bytes(&rate_bytes)?));
if !is_custom_icon {
let _ = tray.set_icon_as_template(!is_colorful);
} else {
let _ = tray.set_icon_as_template(false);
}
let _ = tray.set_icon_as_template(!is_custom_icon && !is_colorful);
}
Ok(())
}
@@ -680,7 +675,7 @@ fn on_menu_event(_: &AppHandle, event: MenuEvent) {
println!("change mode to: {}", mode);
feat::change_clash_mode(mode.into());
}
"open_window" => resolve::create_window(),
"open_window" => resolve::create_window(true),
"system_proxy" => feat::toggle_system_proxy(),
"tun_mode" => feat::toggle_tun_mode(None),
"copy_env" => feat::copy_clash_env(),
@@ -94,13 +94,6 @@ impl SpeedRate {
image::DynamicImage::new_rgba8(0, 0)
};
// 判断是否为彩色图标
let is_colorful = if let Some(bytes) = icon_bytes.clone() {
!crate::utils::help::is_monochrome_image_from_bytes(&bytes).unwrap_or(false)
} else {
false
};
let total_width = match (is_custom_icon, icon_bytes.is_some()) {
(true, true) => 510,
(true, false) => 740,
@@ -126,18 +119,28 @@ impl SpeedRate {
}
}
let is_colorful = if let Some(bytes) = icon_bytes.clone() {
!crate::utils::help::is_monochrome_image_from_bytes(&bytes).unwrap_or(false)
} else {
false
};
// 选择文本颜色
let (text_color, shadow_color) = if is_colorful {
// 彩色图标使用黑色文本和轻微白色阴影
(
Rgba([255u8, 255u8, 255u8, 255u8]),
Rgba([0u8, 0u8, 0u8, 160u8]),
Rgba([144u8, 144u8, 144u8, 255u8]),
// Rgba([255u8, 255u8, 255u8, 128u8]),
Rgba([0u8, 0u8, 0u8, 128u8]),
)
// (
// Rgba([160u8, 160u8, 160u8, 255u8]),
// // Rgba([255u8, 255u8, 255u8, 128u8]),
// Rgba([0u8, 0u8, 0u8, 255u8]),
// )
} else {
// 单色图标使用白色文本和轻微黑色阴影
(
Rgba([255u8, 255u8, 255u8, 255u8]),
Rgba([0u8, 0u8, 0u8, 120u8]),
Rgba([0u8, 0u8, 0u8, 128u8]),
)
};
// 减小字体大小以适应文本区域
+1 -36
View File
@@ -6,8 +6,6 @@ use crate::{
module::mihomo::MihomoManager,
utils::resolve,
};
use tauri::Manager;
use tauri_plugin_window_state::{AppHandleExt, StateFlags};
/// Open or close the dashboard window
#[allow(dead_code)]
@@ -47,43 +45,10 @@ pub fn open_or_close_dashboard() {
} else {
println!("No existing window found, creating new window");
log::info!(target: "app", "No existing window found, creating new window");
resolve::create_window();
resolve::create_window(true);
}
}
/// Setup window state monitor to save window position and size in real-time
pub fn setup_window_state_monitor(app_handle: &tauri::AppHandle) {
// 暂时移除实时监控-保存窗口位置和大小,这个特性可能会导致窗口异常大小和位置,需要进一步优化
//
// let window = app_handle.get_webview_window("main").unwrap();
// let app_handle_clone = app_handle.clone();
// // 监听窗口移动事件
// let app_handle_move = app_handle_clone.clone();
// window.on_window_event(move |event| {
// match event {
// // 窗口移动时保存状态
// tauri::WindowEvent::Moved(_) => {
// let _ = app_handle_move.save_window_state(StateFlags::all());
// }
// // 窗口调整大小时保存状态
// tauri::WindowEvent::Resized(_) => {
// let _ = app_handle_move.save_window_state(StateFlags::all());
// }
// // 其他可能改变窗口状态的事件
// tauri::WindowEvent::ScaleFactorChanged { .. } => {
// let _ = app_handle_move.save_window_state(StateFlags::all());
// }
// // 窗口关闭时保存
// tauri::WindowEvent::CloseRequested { .. } => {
// let _ = app_handle_move.save_window_state(StateFlags::all());
// }
// _ => {}
// }
// });
}
/// 优化的应用退出函数
pub fn quit(code: Option<i32>) {
log::debug!(target: "app", "启动退出流程");
@@ -13,6 +13,7 @@ use crate::{
const LIGHT_WEIGHT_TASK_UID: &str = "light_weight_task";
pub fn enable_auto_light_weight_mode() {
Timer::global().init().unwrap();
logging!(info, Type::Lightweight, true, "开启自动轻量模式");
setup_window_close_listener();
setup_webview_focus_listener();
@@ -39,10 +39,7 @@ impl PlatformSpecification {
// 使用默认值避免在同步上下文中执行异步操作
let running_mode = "NotRunning".to_string();
let is_admin = match system::is_admin() {
Ok(value) => value,
Err(_) => false,
};
let is_admin = system::is_admin().unwrap_or_default();
Self {
system_name,
+18 -13
View File
@@ -86,12 +86,17 @@ macro_rules! wrap_err {
#[macro_export]
macro_rules! logging {
// 带 println 的版本(支持格式化参数)
($level:ident, $type:expr, $print:expr, $($arg:tt)*) => {
($level:ident, $type:expr, true, $($arg:tt)*) => {
println!("{} {}", $type, format_args!($($arg)*));
log::$level!(target: "app", "{} {}", $type, format_args!($($arg)*));
};
// 带 println 的版本
// 带 println 的版本(使用 false 明确不打印)
($level:ident, $type:expr, false, $($arg:tt)*) => {
log::$level!(target: "app", "{} {}", $type, format_args!($($arg)*));
};
// 不带 print 参数的版本(默认不打印)
($level:ident, $type:expr, $($arg:tt)*) => {
log::$level!(target: "app", "{} {}", $type, format_args!($($arg)*));
};
@@ -99,7 +104,7 @@ macro_rules! logging {
#[macro_export]
macro_rules! logging_error {
// Version with println and Result expression
// 1. 处理 Result<T, E>,带打印控制
($type:expr, $print:expr, $expr:expr) => {
match $expr {
Ok(_) => {},
@@ -107,28 +112,28 @@ macro_rules! logging_error {
if $print {
println!("[{}] Error: {}", $type, err);
}
log::error!(target: "app", "{} {}", $type, err);
log::error!(target: "app", "[{}] {}", $type, err);
}
}
};
// Version without println and Result expression
// 2. 处理 Result<T, E>,默认不打印
($type:expr, $expr:expr) => {
if let Err(err) = $expr {
log::error!(target: "app", "{} {}", $type, err);
log::error!(target: "app", "[{}] {}", $type, err);
}
};
// Version with println and custom message
($type:expr, $print:expr, $($arg:tt)*) => {
// 3. 处理格式化字符串,带打印控制
($type:expr, $print:expr, $fmt:literal $(, $arg:expr)*) => {
if $print {
println!("[{}] {}", $type, format_args!($($arg)*));
println!("[{}] {}", $type, format_args!($fmt $(, $arg)*));
}
log::error!(target: "app", "{} {}", $type, format_args!($($arg)*));
log::error!(target: "app", "[{}] {}", $type, format_args!($fmt $(, $arg)*));
};
// Version without println and custom message
($type:expr, $($arg:tt)*) => {
log::error!(target: "app", "{} {}", $type, format_args!($($arg)*));
// 4. 处理格式化字符串,不带 bool 时,默认 `false`
($type:expr, $fmt:literal $(, $arg:expr)*) => {
logging_error!($type, false, $fmt $(, $arg)*);
};
}
+21 -49
View File
@@ -61,35 +61,6 @@ pub async fn resolve_setup(app: &mut App) {
logging!(trace, Type::Config, true, "Initial config");
logging_error!(Type::Config, true, Config::init_config().await);
// if service::check_service().await.is_err() {
// match service::install_service().await {
// Ok(_) => {
// log::info!(target:"app", "install service susccess.");
// #[cfg(not(target_os = "macos"))]
// std::thread::sleep(std::time::Duration::from_millis(1000));
// #[cfg(target_os = "macos")]
// {
// let mut service_runing = false;
// for _ in 0..40 {
// if service::check_service().await.is_ok() {
// service_runing = true;
// break;
// } else {
// log::warn!(target: "app", "service not runing, sleep 500ms and check again.");
// std::thread::sleep(std::time::Duration::from_millis(500));
// }
// }
// if !service_runing {
// log::warn!(target: "app", "service not running, will fallback to user mode");
// }
// }
// }
// Err(e) => {
// log::warn!(target: "app", "failed to install service: {e:?}, will fallback to user mode");
// }
// }
// }
logging!(trace, Type::Core, "Starting CoreManager");
logging_error!(Type::Core, true, CoreManager::global().init().await);
@@ -112,22 +83,21 @@ pub async fn resolve_setup(app: &mut App) {
sysopt::Sysopt::global().init_guard_sysproxy()
);
// 初始化热键
logging!(trace, Type::System, true, "Initial hotkeys");
logging_error!(Type::System, true, hotkey::Hotkey::global().init());
let is_silent_start = { Config::verge().data().enable_silent_start }.unwrap_or(false);
create_window(!is_silent_start);
let silent_start = { Config::verge().data().enable_silent_start };
if !silent_start.unwrap_or(false) {
create_window();
}
logging_error!(Type::Tray, true, tray::Tray::global().update_part());
logging_error!(Type::System, true, timer::Timer::global().init());
let enable_auto_light_weight_mode = { Config::verge().data().enable_auto_light_weight_mode };
if enable_auto_light_weight_mode.unwrap_or(false) {
lightweight::enable_auto_light_weight_mode();
}
logging_error!(Type::Tray, true, tray::Tray::global().update_part());
// 初始化热键
logging!(trace, Type::System, true, "Initial hotkeys");
logging_error!(Type::System, true, hotkey::Hotkey::global().init());
}
/// reset system proxy (异步版)
@@ -151,7 +121,7 @@ pub async fn resolve_reset_async() {
}
/// create main window
pub fn create_window() {
pub fn create_window(is_showup: bool) {
logging!(info, Type::Window, true, "Creating window");
let app_handle = handle::Handle::global().app_handle().unwrap();
@@ -226,17 +196,19 @@ pub fn create_window() {
match window {
Ok(window) => {
logging!(
info,
Type::Window,
true,
"Window created successfully, making window visible"
);
let _ = window.show();
let _ = window.set_focus();
logging!(info, Type::Window, true, "Window created successfully");
if is_showup {
println!("is showup");
let _ = window.show();
let _ = window.set_focus();
} else {
let _ = window.hide();
#[cfg(target_os = "macos")]
AppHandleManager::global().set_activation_policy_accessory();
}
// 设置窗口状态监控,实时保存窗口位置和大小
crate::feat::setup_window_state_monitor(&app_handle);
// crate::feat::setup_window_state_monitor(&app_handle);
// 标记前端UI已准备就绪,向前端发送启动完成事件
let app_handle_clone = app_handle.clone();
@@ -310,7 +282,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> {
Some(url) => {
log::info!(target:"app", "decoded subscription url: {}", url);
create_window();
create_window(false);
match PrfItem::from_url(url.as_ref(), name, None, None).await {
Ok(item) => {
let uid = item.uid.clone().unwrap();
@@ -49,7 +49,7 @@ pub fn embed_server() {
tauri::async_runtime::spawn(async move {
let visible = warp::path!("commands" / "visible").map(move || {
resolve::create_window();
resolve::create_window(false);
"ok"
});
@@ -16,12 +16,30 @@
ethernet0 = &gmac1;
mmc0 = &sdmmc;
mmc1 = &sdhci;
led-boot = &sys_led;
led-failsafe = &sys_led;
led-running = &sys_led;
led-upgrade = &sys_led;
};
chosen {
stdout-path = "serial2:1500000n8";
};
adc-key-maskrom {
compatible = "adc-keys";
io-channels = <&saradc 0>;
io-channel-names = "buttons";
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
button-maskrom {
label = "Maskrom";
linux,code = <KEY_VENDOR>;
press-threshold-microvolt = <1800>;
};
};
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
@@ -30,7 +48,7 @@
button-user {
debounce-interval = <50>;
gpios = <&gpio1 RK_PC0 GPIO_ACTIVE_LOW>;
label = "User Button";
label = "reset";
linux,code = <KEY_RESTART>;
};
};
@@ -40,9 +58,9 @@
sys_led: led-0 {
color = <LED_COLOR_ID_RED>;
function = LED_FUNCTION_HEARTBEAT;
function = LED_FUNCTION_POWER;
gpios = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat";
default-state = "on";
pinctrl-names = "default";
pinctrl-0 = <&sys_led_pin>;
};
+1 -1
View File
@@ -14,7 +14,7 @@ on:
- Alpha
tags:
- "v*"
pull_request_target:
pull_request:
branches:
- Alpha
concurrency:
+15 -10
View File
@@ -25,7 +25,7 @@ jobs:
path: |
src/third_party/llvm-build/Release+Asserts/
src/gn/
src/qemu-user-static*.deb
src/qemu-user*.deb
key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }}
- name: Cache PGO (Linux, OpenWrt)
uses: actions/cache@v4
@@ -45,8 +45,8 @@ jobs:
- run: ./get-clang.sh
- run: EXTRA_FLAGS='target_os="android"' ./get-clang.sh
- run: |
if [ ! -f qemu-user-static*.deb ]; then
wget https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qemu/qemu-user-static_8.0%2Bdfsg-4_amd64.deb
if [ ! -f qemu-user*.deb ]; then
wget https://snapshot.debian.org/archive/debian/20250405T083429Z/pool/main/q/qemu/qemu-user_9.2.2%2Bds-1%2Bb2_amd64.deb
fi
cache-toolchains-win:
runs-on: windows-2022
@@ -97,7 +97,7 @@ jobs:
strategy:
fail-fast: false
matrix:
arch: [x64, x86, arm64, arm, mipsel, mips64el, riscv64]
arch: [x64, x86, arm64, arm, mipsel, mips64el, riscv64, loong64]
env:
EXTRA_FLAGS: 'target_cpu="${{ matrix.arch }}"'
BUNDLE: naiveproxy-${{ github.event.release.tag_name }}-${{ github.job }}-${{ matrix.arch }}
@@ -109,7 +109,7 @@ jobs:
path: |
src/third_party/llvm-build/Release+Asserts/
src/gn/
src/qemu-user-static*.deb
src/qemu-user*.deb
key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }}
- name: Cache PGO (Linux, OpenWrt)
uses: actions/cache@v4
@@ -138,7 +138,7 @@ jobs:
sudo apt update
sudo apt install ninja-build pkg-config ccache bubblewrap
sudo apt remove -y qemu-user-binfmt
sudo dpkg -i qemu-user-static*.deb
sudo dpkg -i qemu-user*.deb
# libc6-i386 interferes with x86 build
sudo apt remove libc6-i386
- run: ./get-clang.sh
@@ -192,7 +192,7 @@ jobs:
path: |
src/third_party/llvm-build/Release+Asserts/
src/gn/
src/qemu-user-static*.deb
src/qemu-user*.deb
key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }}
- name: Cache AFDO (Android)
uses: actions/cache@v4
@@ -222,7 +222,7 @@ jobs:
sudo apt update
sudo apt install ninja-build pkg-config ccache bubblewrap
sudo apt remove -y qemu-user-binfmt
sudo dpkg -i qemu-user-static*.deb
sudo dpkg -i qemu-user*.deb
# libc6-i386 interferes with x86 build
sudo apt remove libc6-i386
- run: ./get-clang.sh
@@ -510,6 +510,11 @@ jobs:
target_cpu: riscv64
openwrt_release: '23.05.0'
openwrt_gcc_ver: '12.3.0'
- arch: loongarch64
openwrt: "target=loongarch64 subtarget=generic"
target_cpu: loong64
openwrt_release: '24.10.0'
openwrt_gcc_ver: '13.3.0'
env:
EXTRA_FLAGS: target_cpu="${{ matrix.target_cpu }}" target_os="openwrt" ${{ matrix.extra }} enable_shadow_metadata=false
OPENWRT_FLAGS: arch=${{ matrix.arch }} release=${{ matrix.openwrt_release || '18.06.0' }} gcc_ver=${{ matrix.openwrt_gcc_ver || '7.3.0' }} ${{ matrix.openwrt }}
@@ -522,7 +527,7 @@ jobs:
path: |
src/third_party/llvm-build/Release+Asserts/
src/gn/
src/qemu-user-static*.deb
src/qemu-user*.deb
key: toolchains-posix-${{ hashFiles('CHROMIUM_VERSION') }}-v${{ env.CACHE_EPOCH }}
- name: Cache PGO (Linux, OpenWrt)
uses: actions/cache@v4
@@ -547,7 +552,7 @@ jobs:
sudo apt update
sudo apt install ninja-build pkg-config ccache bubblewrap
sudo apt remove -y qemu-user-binfmt
sudo dpkg -i qemu-user-static*.deb
sudo dpkg -i qemu-user*.deb
# libc6-i386 interferes with x86 build
sudo apt remove libc6-i386
- run: ./get-clang.sh
@@ -1154,12 +1154,8 @@ void PartitionAllocSupport::ReconfigureAfterFeatureListInit(
UmaHistogramCounts100("Memory.PartitionAlloc.PartitionRoot.ExtrasSize",
int(extras_size));
#if !defined(__MUSL__)
// This call causes hanging in pthread_getattr_np() under qemu-user, see
// https://www.openwall.com/lists/musl/2017/06/15/9.
partition_alloc::internal::StackTopRegistry::Get().NotifyThreadCreated(
partition_alloc::internal::GetStackTop());
#endif
allocator_shim::internal::PartitionAllocMalloc::Allocator()
->EnableThreadCacheIfSupported();
@@ -368,7 +368,7 @@ declare_args() {
stack_scan_supported =
current_cpu == "x64" || current_cpu == "x86" || current_cpu == "arm" ||
current_cpu == "arm64" || current_cpu == "riscv64"
current_cpu == "arm64" || current_cpu == "riscv64" || current_cpu == "loong64"
# We want to provide assertions that guard against inconsistent build
# args, but there is no point in having them fire if we're not building
@@ -521,6 +521,9 @@ if (is_clang_or_gcc) {
} else if (current_cpu == "riscv64") {
assert(stack_scan_supported)
sources += [ "stack/asm/riscv64/push_registers_asm.cc" ]
} else if (current_cpu == "loong64") {
assert(stack_scan_supported)
sources += [ "stack/asm/loong64/push_registers_asm.cc" ]
} else {
# To support a trampoline for another arch, please refer to v8/src/heap/base.
assert(!stack_scan_supported)
@@ -0,0 +1,49 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Push all callee-saved registers to get them on the stack for conservative
// stack scanning.
//
// See asm/x64/push_registers_asm.cc for why the function is not generated
// using clang.
//
// Calling convention source:
// https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html
asm(".global PAPushAllRegistersAndIterateStack \n"
".type PAPushAllRegistersAndIterateStack, %function \n"
".hidden PAPushAllRegistersAndIterateStack \n"
"PAPushAllRegistersAndIterateStack: \n"
// Push all callee-saved registers and save return address.
" addi.d $sp, $sp, -96 \n"
// Save return address.
" st.d $ra, $sp, 88 \n"
// sp is callee-saved.
" st.d $sp, $sp, 80 \n"
// s0-s9(fp) are callee-saved.
" st.d $fp, $sp, 72 \n"
" st.d $s8, $sp, 64 \n"
" st.d $s7, $sp, 56 \n"
" st.d $s6, $sp, 48 \n"
" st.d $s5, $sp, 40 \n"
" st.d $s4, $sp, 32 \n"
" st.d $s3, $sp, 24 \n"
" st.d $s2, $sp, 16 \n"
" st.d $s1, $sp, 8 \n"
" st.d $s0, $sp, 0 \n"
// Maintain frame pointer(fp is s9).
" move $fp, $sp \n"
// Pass 1st parameter (a0) unchanged (Stack*).
// Pass 2nd parameter (a1) unchanged (StackVisitor*).
// Save 3rd parameter (a2; IterateStackCallback) to a3.
" move $a3, $a2 \n"
// Pass 3rd parameter as sp (stack pointer).
" move $a2, $sp \n"
// Call the callback.
" jirl $ra, $a3, 0 \n"
// Load return address.
" ld.d $ra, $sp, 88 \n"
// Restore frame pointer.
" ld.d $fp, $sp, 72 \n"
" addi.d $sp, $sp, 96 \n"
" jr $ra \n");
+1 -1
View File
@@ -55,7 +55,7 @@ namespace base {
// defined as a constant.
// These constants are borrowed from glibcs (arch)/bits/pthread_stack_min.h.
#if defined(ARCH_CPU_ARM64)
#if defined(ARCH_CPU_ARM64) || defined(ARCH_CPU_LOONGARCH64)
#define PTHREAD_STACK_MIN_CONST \
(__builtin_constant_p(PTHREAD_STACK_MIN) ? PTHREAD_STACK_MIN : 131072)
#else
+8 -5
View File
@@ -216,11 +216,14 @@ config("default_libs") {
# linking can have run-time side effects, nothing should be listed here.
libs = []
} else if (is_linux || is_chromeos) {
libs = [
"dl",
"pthread",
"rt",
]
# loong64 uses newer libc that subsumes libdl.so etc.
if (current_cpu != "loong64") {
libs = [
"dl",
"pthread",
"rt",
]
}
}
}
@@ -1530,7 +1530,7 @@ config("compiler_cpu_abi") {
}
cflags += [ "-mabi=lp64d" ]
} else if (current_cpu == "loong64") {
if (is_clang) {
if (is_clang && current_os != "openwrt") {
cflags += [ "--target=loongarch64-linux-gnu" ]
ldflags += [ "--target=loongarch64-linux-gnu" ]
}
@@ -61,6 +61,8 @@ config("compiler") {
arch = "mips64el"
} else if (current_cpu == "riscv64") {
arch = "riscv64"
} else if (current_cpu == "loong64") {
arch = "loongarch64"
} else {
assert(false, "Architecture not supported")
}
@@ -55,6 +55,7 @@ TRIPLES = {
"mips64el": "mips64el-linux-gnuabi64",
"ppc64el": "powerpc64le-linux-gnu",
"riscv64": "riscv64-linux-gnu",
"loong64": "loongarch64-linux-gnu",
}
REQUIRED_TOOLS = [
@@ -71,6 +72,8 @@ PACKAGES_EXT = "xz"
RELEASE_FILE = "Release"
RELEASE_FILE_GPG = "Release.gpg"
GCC_VERSION = 10
# List of development packages. Dependencies are automatically included.
DEBIAN_PACKAGES = [
"libc6-dev",
@@ -318,7 +321,7 @@ def hacks_and_patches(install_root: str, script_dir: str, arch: str) -> None:
"include",
TRIPLES[arch],
"c++",
"10",
f"{GCC_VERSION}",
"bits",
"c++config.h",
)
@@ -345,11 +348,17 @@ def hacks_and_patches(install_root: str, script_dir: str, arch: str) -> None:
for lib in ["libc.so.6", "libm.so.6", "libcrypt.so.1"]:
# RISCV64 is new and has no backward compatibility.
# Reversioning would remove necessary symbols and cause linking failures.
if arch == "riscv64":
if arch == "riscv64" or arch == "loong64":
continue
lib_path = os.path.join(install_root, "lib", TRIPLES[arch], lib)
reversion_glibc.reversion_glibc(lib_path)
if not os.path.exists(os.path.join(install_root, "lib")):
os.symlink(os.path.join("usr", "lib"), os.path.join(install_root, "lib"))
if (os.path.exists(os.path.join(install_root, "usr", "lib64")) and
not os.path.exists(os.path.join(install_root, "lib64"))):
os.symlink(os.path.join("usr", "lib64"), os.path.join(install_root, "lib64"))
def replace_in_file(file_path: str, search_pattern: str,
replace_pattern: str) -> None:
@@ -477,7 +486,7 @@ def removing_unnecessary_files(install_root, arch):
# Preserve these files.
gcc_triple = "i686-linux-gnu" if arch == "i386" else TRIPLES[arch]
ALLOWLIST = {
f"usr/lib/gcc/{gcc_triple}/10/libgcc.a",
f"usr/lib/gcc/{gcc_triple}/{GCC_VERSION}/libgcc.a",
f"usr/lib/{TRIPLES[arch]}/libc_nonshared.a",
}
@@ -702,12 +711,25 @@ def main():
sanity_check()
# RISCV64 only has support in debian-ports, no support in bookworm.
global ARCHIVE_URL, APT_SOURCES_LIST
if args.architecture == "riscv64":
global ARCHIVE_URL, APT_SOURCES_LIST
# This is the last snapshot that uses glibc 2.31, similar to bullseye
ARCHIVE_URL = "https://snapshot.debian.org/archive/debian-ports/20210906T080750Z/"
APT_SOURCES_LIST = [("sid", ["main"])]
if args.architecture == "loong64":
ARCHIVE_URL = "https://snapshot.debian.org/archive/debian-ports/20240531T134713Z/"
APT_SOURCES_LIST = [("sid", ["main"])]
global GCC_VERSION, DEBIAN_PACKAGES
GCC_VERSION = 13
DEBIAN_PACKAGES = [
"libc6-dev",
f"libgcc-{GCC_VERSION}-dev",
f"libstdc++-{GCC_VERSION}-dev",
"linux-libc-dev",
]
if args.command == "build":
build_sysroot(args.architecture)
elif args.command == "upload":
+30
View File
@@ -79,3 +79,33 @@ rm -rf $SDK_PATH
if [ -d "$sysroot/lib/gcc/arm-openwrt-linux-muslgnueabi" ]; then
mv "$sysroot/lib/gcc/arm-openwrt-linux-muslgnueabi" "$sysroot/lib/gcc/arm-openwrt-linux-musleabi"
fi
if [ "$arch" = "loongarch64" ]; then
if grep HWCAP_LOONGARCH_LSX "$sysroot/include/bits/hwcap.h"; then
echo "$sysroot/include/bits/hwcap.h" is already populated
exit 1
fi
# https://www.openwall.com/lists/musl/2025/04/03/3
cat >"$sysroot/include/bits/hwcap.h" <<EOF
/* The following must match the kernel's <asm/hwcap.h>. */
/* HWCAP flags */
#define HWCAP_LOONGARCH_CPUCFG (1 << 0)
#define HWCAP_LOONGARCH_LAM (1 << 1)
#define HWCAP_LOONGARCH_UAL (1 << 2)
#define HWCAP_LOONGARCH_FPU (1 << 3)
#define HWCAP_LOONGARCH_LSX (1 << 4)
#define HWCAP_LOONGARCH_LASX (1 << 5)
#define HWCAP_LOONGARCH_CRC32 (1 << 6)
#define HWCAP_LOONGARCH_COMPLEX (1 << 7)
#define HWCAP_LOONGARCH_CRYPTO (1 << 8)
#define HWCAP_LOONGARCH_LVZ (1 << 9)
#define HWCAP_LOONGARCH_LBT_X86 (1 << 10)
#define HWCAP_LOONGARCH_LBT_ARM (1 << 11)
#define HWCAP_LOONGARCH_LBT_MIPS (1 << 12)
#define HWCAP_LOONGARCH_PTW (1 << 13)
EOF
# https://www.openwall.com/lists/musl/2022/03/22/4
# But this breaks C++.
sed -i 's/extcontext\[\] /extcontext\[0\] /' "$sysroot/include/bits/signal.h"
fi
+1
View File
@@ -41,6 +41,7 @@ case "$target_os" in
mipsel) SYSROOT_ARCH=mipsel;;
mips64el) SYSROOT_ARCH=mips64el;;
riscv64) SYSROOT_ARCH=riscv64;;
loong64) SYSROOT_ARCH=loong64;;
esac
if [ "$SYSROOT_ARCH" ]; then
WITH_SYSROOT="out/sysroot-build/bullseye/bullseye_${SYSROOT_ARCH}_staging"
@@ -54,6 +54,8 @@
#define OPENSSL_32_BIT
#elif defined(__myriad2__)
#define OPENSSL_32_BIT
#elif defined(__loongarch__) && __SIZEOF_POINTER__ == 8
#define OPENSSL_64_BIT
#else
// The list above enumerates the platforms that BoringSSL supports. For these
// platforms we keep a reasonable bar of not breaking them: automated test
+6 -2
View File
@@ -78,6 +78,8 @@ def start_naive(naive_args, config_file):
with_qemu = 'mips64el'
elif argv.target_cpu == 'riscv64':
with_qemu = 'riscv64'
elif argv.target_cpu == 'loong64':
with_qemu = 'loong64'
if argv.rootfs:
if not with_qemu:
@@ -89,7 +91,7 @@ def start_naive(naive_args, config_file):
cmdline = ['bwrap', '--die-with-parent', '--bind', argv.rootfs, '/',
'--proc', '/proc', '--dev', '/dev', '--chdir', '/', '/naive']
else:
cmdline = [f'qemu-{with_qemu}-static',
cmdline = [f'qemu-{with_qemu}',
'-L', argv.rootfs, argv.naive]
else:
cmdline = [argv.naive]
@@ -104,7 +106,9 @@ def start_naive(naive_args, config_file):
print('terminate pid', proc.pid)
proc.terminate()
timeout = threading.Timer(10, terminate, args=(proc,))
# Some qemu-user tests take a while to start.
# See https://gitlab.com/qemu-project/qemu/-/issues/1729
timeout = threading.Timer(20, terminate, args=(proc,))
timeout.start()
while True:
if proc.poll() is not None:
@@ -476,7 +476,7 @@
<string name="please_update">نسخه (%s) برنامه شما بسیار قدیمی شده است و در %s متوقف می‌شود. لطفاً به نسخه جدیدتر به‌روزرسانی کنید</string>
<string name="please_update_force">برنامه شما خیلی قدیمی شده است (%s). و در %s کار نمی‌کند. باید نسخه جدید را دانلود کنید!</string>
<string name="connection_test_delete_unavailable">Clear unavailable</string>
<string name="connection_test_delete_unavailable">پاک‌کردن غیرقابل‌دسترس‌ها</string>
<string name="neko_plugin">افزونه پیشرفته</string>
<string name="neko_plugin_summary">افزونه‌های پیشرفته می‌توانند پروتکل‌هایی را ارائه دهند که به صورت پیش‌فرض در این برنامه پشتیبانی نشده‌اند.\n\n هر کسی می‌تواند افزونه‌های پیشرفته بنویسد که می‌توانند NekoBox را کنترل کنند. لطفا از منابع معتبر دانلود و نصب کنید.</string>
<string name="neko_plugin_internal_error">مشکل داخلی %s</string>
@@ -534,4 +534,6 @@
<string name="group_not_subscription">نوع این گروه اشتراکی نیست</string>
<string name="allow_insecure_on_request_sum">غیرفعال کردن بررسی گواهی‌ها هنگام به‌روزرسانی اشتراک‌ها</string>
<string name="global_allow_insecure">به اتصال محافظت‌نشده همیشه اجازه داده شود.</string>
<string name="network_change_reset_connections">بازنشانی اتصال خروجی، هنگام تغییر شبکه</string>
<string name="wake_reset_connections">بازنشانی اتصال خروجی، هنگام روشن‌شدن صفحه موبایل</string>
</resources>
@@ -1,409 +1,449 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="header_type">Тип заголовка</string>
<string name="network">Сеть</string>
<string name="security">Шифрование транспортного уровня</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">Имя пользователя</string>
<string name="traffic">%1$s↑ %2$s↓</string>
<string name="transproxy_mode">Транспрокси-режим</string>
<string name="require_transproxy">Включить входящий прокси-сервер</string>
<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 заняло %d мс</string>
<string name="connection_test_available">Успех: рукопожатие HTTPS заняло %d мс</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">Перенаправьте соответствующие веб-сокеты через браузер.</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_http">Порт прокси HTTP</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="server_port">Удаленный порт</string>
<string name="server_address">Сервер</string>
<string name="profile_name">Имя профиля</string>
<string name="connection_test_url">URL-адрес проверки подключения</string>
<string name="port_transproxy">Транспрокси-порт</string>
<string name="port_proxy">Порт прокси SOCKS5</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_desc">Универсальный набор инструментов прокси для Android, написанный на Kotlin.</string>
<plurals name="added">
<item quantity="one">Добавлен</item>
<item quantity="few">Добавлено %d прокси</item>
<item quantity="many">Добавлено %d прокси</item>
<item quantity="other">Добавлено %d прокси</item>
</plurals>
<plurals name="removed">
<item quantity="one">Удалено</item>
<item quantity="few">%d элемента удалены</item>
<item quantity="many">%d элементов удалено</item>
<item quantity="other">%d элементов удалено</item>
</plurals>
<string name="apps_message">%d приложений</string>
<string name="select_apps">Выберите приложения</string>
<string name="apps">Приложения</string>
<string name="clear_profiles_message">Вы уверены, что хотите очистить эту группу\?</string>
<string name="profile_import_message">Подтвердите, что хотите импортировать профиль %s\?</string>
<string name="profile_import">Импортировать профиль</string>
<string name="subscription_import_message">Подтвердите, что хотите импортировать подписку %s\? Если вы импортируете из ненадежного источника, это может привести к утечке вашего IP-адреса и такого поведения.</string>
<string name="subscription_import">Импортировать подписку</string>
<string name="subscription_traffic">%s Использовано / %s Осталось</string>
<string name="subscription_used">%s Использовано</string>
<string name="group_filter">Фильтр</string>
<string name="subscription_update_message">Обновление %s …</string>
<string name="subscription_update">Обновление подписки</string>
<string name="service_subscription">Служба обновления подписки</string>
<string name="ooc_missing_protocol">Подписка требует поддержки протокола %s, но ее нельзя найти. Неподдерживаемые профили игнорируются.</string>
<string name="ooc_warning">Предупреждение</string>
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление\?</string>
<string name="ooc_subscription_token_invalid">Недействительный токен OOCv1</string>
<string name="download">Скачать</string>
<string name="install_from_fdroid">Установить с F-Droid</string>
<string name="install_from_play_store">Установить из Play Store</string>
<string name="action_download">СКАЧАТЬ</string>
<string name="action_learn_more">УЗНАТЬ БОЛЬШЕ</string>
<string name="profile_requiring_plugin">Профиль %s требует установки подключаемого модуля %s, но он не найден.</string>
<string name="missing_plugin">Отсутствующий плагин</string>
<string name="confirm">Подтвердить</string>
<string name="subscription_user_agent">UserAgent</string>
<string name="update_when_connected_only_sum">Предотвратить утечку IP-адреса</string>
<string name="update_when_connected_only">Обновлять только при подключении</string>
<string name="auto_update_delay">Задержка автоматического обновления (в минутах)</string>
<string name="auto_update">Автоматическое обновление</string>
<string name="update_settings">Обновить настройки</string>
<string name="force_resolve_sum">При обновлении преобразовать все доменные имена в IP-адреса. Хост и SNI будут добавлены автоматически, если это возможно</string>
<string name="raw">Обычный</string>
<string name="deduplication_sum">Удалить повторяющиеся конфигурации при обновлении</string>
<string name="force_resolve">Принудительно разрешать доменные имена</string>
<string name="delete_group_prompt">Вы уверены, что хотите удалить эту группу\?</string>
<string name="subscription_type">Тип подписки</string>
<string name="group_type">Тип группы</string>
<string name="subscription_settings">Настройки подписки</string>
<string name="subscription">Подписка</string>
<string name="group_settings">Настройки группы</string>
<string name="group_basic">Базовый</string>
<string name="trojan_provider">Провайдер Trojan</string>
<string name="protocol_settings">Настройки протокола</string>
<string name="append_http_proxy_sum">HTTP-прокси будет использоваться напрямую из (браузера / некоторых поддерживаемых приложений), без использования виртуального сетевого интерфейса (Android 10+)</string>
<string name="append_http_proxy">Добавить HTTP-прокси к VPN</string>
<string name="connection_test_timeout">Тайм-аут</string>
<string name="connection_test_unreachable">Недоступен</string>
<string name="connection_test_refused">В соединении отказано</string>
<string name="connection_test_domain_not_found">Домен не найден</string>
<string name="connection_test_icmp_ping_unavailable">ICMPing недоступен</string>
<string name="connection_test_tcp_ping_unavailable">TCPing недоступен</string>
<string name="connection_test_clear_results">Очистить результаты теста</string>
<string name="connection_test">Тест подключения</string>
<string name="clear_traffic_statistics">Очистить статистику трафика</string>
<string name="always_show_address_sum">Всегда отображать адрес сервера на карте конфигурации</string>
<string name="always_show_address">Всегда показывать адрес</string>
<string name="unavailable">Недоступен</string>
<string name="standard">Стандарт</string>
<string name="probe_interval">Интервал наблюдения балансировщика</string>
<string name="api_port">Порт API</string>
<string name="random">Случайный</string>
<string name="list">Список</string>
<string name="enable_log_sum">В целях отладки</string>
<string name="enable_log">Включить журнал</string>
<string name="auto">Авто</string>
<string name="disable">Отключить</string>
<string name="enable">Включить</string>
<string name="follow_system">Использовать системную тему</string>
<string name="night_mode">Ночной режим</string>
<string name="lines">%d строк</string>
<string name="route_warn">Перед добавлением собственных правил убедитесь, что вы прочитали документацию, иначе подключение к Интернету может не удасться.</string>
<string name="license">Лицензия</string>
<string name="need_reload">Перезагрузите прокси-сервис, чтобы применить изменения</string>
<string name="apply">Применить</string>
<string name="no">Нет</string>
<string name="yes">Да</string>
<string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить\?</string>
<string name="ss_cat">Настройки Shadowsocks</string>
<string name="proxy_cat">Настройки сервера</string>
<string name="plugin_auto_connect_unlock_only">Этот плагин может не работать с автоподключением</string>
<string name="plugin_untrusted">Предупреждение: похоже, что этот плагин не из известного надежного источника.</string>
<string name="plugin_unknown">Неизвестный плагин %s</string>
<string name="plugin_disabled">Отключено</string>
<string name="plugin_configure">Настроить…</string>
<string name="plugin">Плагин</string>
<string name="ignore_battery_optimizations_sum">Снять некоторые ограничения</string>
<string name="ignore_battery_optimizations">Игнорировать оптимизации батареи</string>
<string name="donate_info">Я люблю деньги</string>
<string name="donate">Пожертвовать</string>
<string name="deduplication">Дедупликация</string>
<string name="no_proxies_found_in_clipboard">В буфере обмена не найдено ни одного прокси</string>
<string name="no_proxies_found_in_file">В файле не найдено прокси-серверов</string>
<string name="no_proxies_found_in_subscription">В подписке не найдено прокси-серверов</string>
<string name="no_proxies_found">В ссылке не найдено прокси-серверов</string>
<string name="error_title">Ошибка</string>
<string name="cleartext_http_warning">Передача HTTP-трафика в виде открытого текста небезопасна</string>
<string name="subscriptions">Подписки</string>
<string name="not_connected">Не подключен</string>
<string name="vpn_connected">Подключено, нажмите, чтобы проверить подключение</string>
<string name="connecting">Подключение…</string>
<string name="deprecated">Устарело</string>
<string name="insecure">Ненадежный</string>
<string name="undo">Отменить</string>
<string name="add_profile_methods_manual_settings">Ручные настройки</string>
<string name="add_profile_methods_scan_qr_code">Отсканировать QR-код</string>
<string name="share_qr_nfc">QR-код</string>
<string name="delete_confirm_prompt">Вы уверены, что хотите удалить этот профиль\?</string>
<string name="delete">Удалить</string>
<string name="profile_config">Конфигурация профиля</string>
<string name="file_manager_missing">На вашем устройстве отсутствует стандартный селектор файлов Android, установите его, например Material Files.</string>
<string name="action_import_err">Не удалось импортировать.</string>
<string name="action_import_msg">Успешно импортировано!</string>
<string name="action_export_err">Не удалось экспортировать.</string>
<string name="action_export_msg">Успешно экспортировано!</string>
<string name="action_import_file">Импортировать из файла</string>
<string name="action_import">Импорт из буфера обмена</string>
<string name="action_export">Экспортировать</string>
<string name="action_export_clipboard">Экспорт в буфер обмена</string>
<string name="action_export_file">Экспорт в файл</string>
<string name="action_scan_china_apps">Сканировать китайские приложения</string>
<string name="action_from_link">По подписке</string>
<string name="action_create_group">Пустая группа</string>
<string name="clear_profiles">Очистить</string>
<string name="circular_reference_sum">Маршрут не может содержать сам себя.</string>
<string name="circular_reference">Циклическая ссылка</string>
<string name="config_settings">Настройки конфигурации</string>
<string name="chain_settings">Настройки цепочки</string>
<string name="balancer_strategy">Стратегия</string>
<string name="balancer_type">Тип</string>
<string name="balancer_settings">Настройки балансировщика</string>
<string name="balancer">Балансер</string>
<string name="custom_config">Пользовательская конфигурация</string>
<string name="proxy_chain">Прокси-цепочка</string>
<string name="select_profile">Выбрать профиль</string>
<string name="add_profile">Добавить профиль</string>
<string name="share">Поделиться</string>
<string name="edit">Редактировать</string>
<string name="settings">Настройки</string>
<string name="clipboard_empty">Буфер обмена пуст</string>
<string name="connect">Подключиться</string>
<string name="profile_empty">Пожалуйста, выберите профиль</string>
<string name="reboot_required">Не удалось запустить службу VPN. Возможно, вам потребуется перезагрузить устройство.</string>
<string name="vpn_permission_denied">Отказано в разрешении на создание службы VPN</string>
<string name="vpn_error">%s</string>
<string name="stopping">Выключение…</string>
<string name="stop">Остановить</string>
<string name="service_failed">Не удалось:</string>
<string name="invalid_server">Неверное имя сервера</string>
<string name="forward_success">Прокси запустился.</string>
<string name="service_proxy">Прокси-сервис</string>
<string name="service_vpn">VPN-сервис</string>
<string name="direct_boot_aware_summary">Выбранная вами информация профиля будет менее защищена</string>
<string name="direct_boot_aware">Разрешить переключение на экране блокировки</string>
<string name="auto_connect_summary">Включить прокси при запуске/обновлении приложения, если он был запущен до этого</string>
<string name="auto_connect">Автоматическое подключение</string>
<string name="show_system_apps">Показать системные приложения</string>
<string name="bypass_apps">Обход</string>
<string name="clear_selections">Очистить выбор</string>
<string name="invert_selections">Инвертировать выбор</string>
<string name="scanning">Сканирование…</string>
<string name="search_apps">Поиск…</string>
<string name="off">Выключенный</string>
<string name="on">Включено</string>
<string name="proxied_apps_summary">Настроить режим VPN для выбранных приложений</string>
<string name="proxied_apps">Режим VPN для приложений</string>
<string name="tcp_keep_alive_interval">Интервал доставки пакетов TCP keep-alive</string>
<string name="mux_concurrency">Число одновременных подключений Mux</string>
<string name="enable_mux">Включить мультиплексор</string>
<string name="traffic_sniffing">Включить анализ трафика</string>
<string name="domain_strategy">Стратегия разрешения доменов</string>
<string name="route_opt_block_ads">Блокировать рекламу</string>
<string name="route_opt_bypass_lan">Обход LAN</string>
<string name="route_not_asset">Не файл ресурса: ожидался .db, а не %s</string>
<string name="route_asset_updated">Обновлено</string>
<string name="route_asset_no_update">Обновлений нет</string>
<string name="route_asset_status">Локальная версия: %s</string>
<string name="route_rules_official">Официальный</string>
<string name="route_rules_provider">Поставщик ресурсов правил</string>
<string name="route_assets">Ресурсы</string>
<string name="route_manage_assets">Управление ресурсами маршрутов</string>
<string name="route_reset">Сброс</string>
<string name="route_bypass_ip">Правило IP для %s</string>
<string name="route_bypass_domain">Правило домена для %s</string>
<string name="empty_route_notice">Установите какие-либо правила перед сохранением</string>
<string name="empty_route">Пустой маршрут</string>
<string name="route_profile">Выбрать профиль…</string>
<string name="route_block">Блокировать</string>
<string name="route_bypass">Обход</string>
<string name="route_proxy">Прокси</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">Server Name Indication (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="alter_id">Изменить ID</string>
<string name="uuid">Логин пользователя</string>
<string name="obfs_param">Параметры Obfs</string>
<string name="obfs">Obfs</string>
<string name="protocol_param">Параметры протокола</string>
<string name="username_opt">Имя пользователя (необязательно)</string>
<string name="speed">%s/с</string>
<string name="hysteria_download_mbps">Максимальная скорость загрузки (в Мбит / с)</string>
<string name="hysteria_upload_mbps">Максимальная скорость загрузки (в Мбит / с)</string>
<string name="hysteria_auth_payload">Полезные данные аутентификации</string>
<string name="hysteria_auth_type">Тип аутентификации</string>
<string name="hysteria_obfs">Обфускация пароля</string>
<string name="experimental_settings">Экспериментальный</string>
<string name="route_need_vpn">Правило маршрутизации `%s` зависит от VPN, поэтому игнорируется.</string>
<string name="route_for">Правило для %s</string>
<string name="app_no_launcher">У приложения нет интерфейса.</string>
<string name="copy_failed">Не удалось скопировать.</string>
<string name="copy_success">Копировано успешно!</string>
<string name="create_rule">Создать правило</string>
<string name="open_market">Показать в маркете</string>
<string name="open_settings">Открыть настройки</string>
<string name="open_app">Открыть приложение</string>
<string name="copy_package_name">Копировать имя пакета</string>
<string name="copy_label">Копировать имя</string>
<string name="udp_connections">%d UDP-соединений</string>
<string name="tcp_connections">%d TCP-соединений</string>
<string name="shadowsocks_plugin_v2ray">V2Ray (плагин Shadowsocks для Android)</string>
<string name="shadowsocks_plugin_simple_obfs">Simple Obfs (плагин Shadowsocks для Android)</string>
<string name="plugin_exists_but_on_shit_system">Профиль %s требует плагин %s, но поставщик вашего проприетарного оборудования (обычно это большие компании, занимающиеся слежкой и производители вредоносного ПО) изменил ваш Android, сделав плагин непригодным для использования.</string>
<string name="group_order_by_delay">По задержке</string>
<string name="group_order_by_name">По имени</string>
<string name="group_order_origin">По происхождению</string>
<string name="group_order">Сортировка</string>
<string name="hysteria_disable_mtu_discovery">Отключить обнаружение MTU пути</string>
<string name="hysteria_connection_receive_window">Окно получения соединения QUIC</string>
<string name="hysteria_stream_receive_window">Окно приема потока QUIC</string>
<string name="menu_traffic">Трафик</string>
<string name="no_statistics">Статистики пока нет</string>
<string name="clear_logcat">Очистить Logcat</string>
<string name="menu_log">Логи</string>
<string name="menu_tools">Инструменты</string>
<string name="translate_platform">Платформа локализации</string>
<string name="ssh_private_key_passphrase">Парольная фраза закрытого ключа</string>
<string name="ssh_private_key">Закрытый ключ</string>
<string name="ssh_public_key">Открытый ключ</string>
<string name="ssh_auth_type_none">Без аутентификации</string>
<string name="profile_traffic_statistics">Статистика трафика профиля</string>
<string name="profile_traffic_statistics_summary">Когда отключено, использованный трафик не будет отображаться</string>
<string name="app_statistics_disabled">Статистика трафика приложений отключена в настройках</string>
<string name="warp_generate">Создать конфигурацию</string>
<string name="generating">Создание…</string>
<string name="tun_implementation">Реализация TUN</string>
<string name="wireguard_local_address">Частный адрес</string>
<string name="destination_override">Переопределять адрес назначения</string>
<string name="resolve_destination_summary">Если адрес назначения является доменом, то он передается в соответствии со стратегией IPv6.</string>
<string name="destination_override_summary">Использовать перехваченный домен для переопределения адреса назначения, а не только для маршрутизации</string>
<string name="pcap_notice">Pcap файлы будут сохранены в %s</string>
<string name="route_play_store">Правило Play Store для %s</string>
<string name="route_opt_block_analysis">Блокировать аналитику</string>
<string name="wireguard_public_key">Открытый ключ сервера</string>
<string name="wireguard_psk">Пароль сервера</string>
<string name="naive_insecure_concurrency">Небезопасный параллелизм</string>
<string name="naive_insecure_concurrency_summary">Использовать N параллельных соединений для повышения отказоустойчивости в условиях ненадёжной сети. Большее число соединений увеличивает риск обнаружения туннелей и снижает безопасность. Этот проект стремится к максимальной защите от анализа трафика, следовательно, использование его небезопасным образом противоречит данной цели.
\n
\nЕсли придётся использовать данную функцию, попробуйте N=2, чтобы проверить, решит ли это проблему. Настоятельно не рекомендуется использовать более 4 соединений.</string>
<string name="resolve_destination">Резолвить адрес назначения</string>
<string name="start">Старт</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="warp_license">[CloudFlare Warp](https://blog.cloudflare.com/1111-warp-better-vpn/) - это бесплатный провайдер WireGuard VPN. Используя его, вы соглашаетесь с [условиями использования](https://www.cloudflare.com/application/terms/).</string>
<string name="tools_network">Сеть</string>
<string name="backup">Бэкап</string>
<string name="backup_rules">Правила маршрутизации</string>
<string name="backup_settings">Настройки</string>
<string name="backup_not_file">Не файл резервной копии: ожидался .json, а не %s</string>
<string name="invalid_backup_file">Недействительный файл резервной копии</string>
<string name="backup_import_summary">При импорте существующие данные будут перезаписаны.</string>
<string name="backup_importing">Импортирование…</string>
<string name="backup_import">Импортировать</string>
<string name="backup_groups_and_configurations">Группы и конфигурации</string>
<string name="backup_summary">Если правила маршрутизации резервируются без конфигураций, то пользовательские исходящие соединения будут потеряны.</string>
<string name="packet_encoding">Кодирование пакетов</string>
</resources>
<string name="acquire_wake_lock">Использовать WakeLock</string>
<string name="acquire_wake_lock_summary">Сохранять CPU включенным</string>
<string name="action_download">СКАЧАТЬ</string>
<string name="action_export">Экспортировать</string>
<string name="action_export_clipboard">Экспорт в буфер обмена</string>
<string name="action_export_err">Не удалось экспортировать.</string>
<string name="action_export_file">Экспорт в файл</string>
<string name="action_export_msg">Успешно экспортировано!</string>
<string name="action_import">Импорт из буфера обмена</string>
<string name="action_import_err">Не удалось импортировать.</string>
<string name="action_import_file">Импортировать из файла</string>
<string name="action_import_msg">Успешно импортировано!</string>
<string name="action_learn_more">УЗНАТЬ БОЛЬШЕ</string>
<string name="action_switch">Переключить</string>
<string name="add_profile">Добавить профиль</string>
<string name="add_profile_methods_manual_settings">Ручные настройки</string>
<string name="add_profile_methods_scan_qr_code">Отсканировать QR-код</string>
<string name="ads">Реклама</string>
<string name="allow_access">Разрешить подключения из локальной сети</string>
<string name="allow_access_sum">Привязать входящие серверы к 0.0.0.0</string>
<string name="allow_insecure">Разрешить небезопасное подключение</string>
<string name="allow_insecure_on_request_sum">Отключить проверку сертификатов при обновлении подписок</string>
<string name="allow_insecure_sum">Отключить проверку сертификата. При включении эта функция настолько же безопасна как передача пароля в открытом виде</string>
<string name="alpn">Согласование протокола уровня приложений</string>
<string name="alter_id">Изменить ID</string>
<string name="always_show_address">Всегда показывать адрес</string>
<string name="always_show_address_sum">Всегда отображать адрес сервера на карте конфигурации</string>
<string name="app_desc">Универсальный набор инструментов прокси для Android, написанный на Kotlin.</string>
<string name="app_tls_version">Минимальная версия TLS протокола</string>
<string name="app_version">Версия</string>
<string name="append_http_proxy">Добавить HTTP-прокси к VPN</string>
<string name="append_http_proxy_sum">HTTP-прокси будет использоваться напрямую из (браузера / некоторых поддерживаемых приложений), без использования виртуального сетевого интерфейса (Android 10+)</string>
<string name="apply">Применить</string>
<string name="apps">Приложения</string>
<string name="apps_message">%d приложений</string>
<string name="auto">Авто</string>
<string name="auto_connect">Автоматическое подключение</string>
<string name="auto_connect_summary">Включить прокси при запуске/обновлении приложения, если он был запущен до этого</string>
<string name="auto_update">Автоматическое обновление</string>
<string name="auto_update_delay">Задержка автоматического обновления (в минутах)</string>
<string name="backup">Бэкап</string>
<string name="backup_groups_and_configurations">Группы и конфигурации</string>
<string name="backup_import">Импортировать</string>
<string name="backup_import_summary">При импорте существующие данные будут перезаписаны.</string>
<string name="backup_importing">Импортирование…</string>
<string name="backup_not_file">Не файл резервной копии: ожидался .json, а не %s</string>
<string name="backup_rules">Правила маршрутизации</string>
<string name="backup_settings">Настройки</string>
<string name="backup_summary">Если правила маршрутизации резервируются без конфигураций, то пользовательские исходящие соединения будут потеряны.</string>
<string name="bottomsheet_action_collapse">Свернуть нижний экран</string>
<string name="bottomsheet_action_expand">Развернуть нижний экран</string>
<string name="bottomsheet_action_expand_halfway">Развернуть наполовину</string>
<string name="bottomsheet_drag_handle_clicked">Двойное нажатие на маркер перемещения</string>
<string name="bottomsheet_drag_handle_content_description">Маркер перемещения</string>
<string name="bypass_apps">Обход</string>
<string name="bypass_lan_in_core">Обход LAN в ядре</string>
<string name="cag_dns">Настройки DNS</string>
<string name="cag_misc">Прочие настройки</string>
<string name="cag_route">Настройки маршрута</string>
<string name="cag_ws">Настройки WebSocket</string>
<string name="certificates">Сертификаты</string>
<string name="chain_settings">Настройки цепочки</string>
<string name="character_counter_content_description">Введено символов: %1$d из %2$d</string>
<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_profiles">Очистить</string>
<string name="clear_profiles_message">Вы уверены, что хотите очистить эту группу?</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>
<string name="clipboard_empty">Буфер обмена пуст</string>
<string name="config_settings">Настройки конфигурации</string>
<string name="config_type">Тип конфигурации</string>
<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_clear_results">Очистить результаты теста</string>
<string name="connection_test_delete_unavailable">Удалить недоступные</string>
<string name="connection_test_domain_not_found">Домен не найден</string>
<string name="connection_test_error">Ошибка: %s</string>
<string name="connection_test_icmp_ping_unavailable">ICMPing недоступен</string>
<string name="connection_test_refused">В соединении отказано</string>
<string name="connection_test_tcp_ping">TCP Пинг</string>
<string name="connection_test_tcp_ping_unavailable">TCPing недоступен</string>
<string name="connection_test_testing">Тестирование…</string>
<string name="connection_test_timeout">Тайм-аут</string>
<string name="connection_test_unreachable">Недоступен</string>
<string name="connection_test_url">URL-адрес проверки подключения</string>
<string name="connection_test_url_test">URL Тест</string>
<string name="copy">Копировать</string>
<string name="copy_toast_msg">Ссылка скопирована в буфер обмена.</string>
<string name="create_shortcut">Создать ярлык</string>
<string name="custom_config">Пользовательская конфигурация</string>
<string name="custom_config_json">Пользовательская конфигурация JSON</string>
<string name="custom_outbound_json">Пользовательский исходящий JSON</string>
<string name="deduplication">Дедупликация</string>
<string name="deduplication_sum">Удалить повторяющиеся конфигурации при обновлении</string>
<string name="delete">Удалить</string>
<string name="delete_confirm_prompt">Вы уверены, что хотите удалить этот профиль?</string>
<string name="delete_group_prompt">Вы уверены, что хотите удалить эту группу?</string>
<string name="delete_route_prompt">Вы уверены, что хотите удалить этот маршрут?</string>
<string name="direct_boot_aware">Разрешить переключение на экране блокировки</string>
<string name="direct_boot_aware_summary">Выбранная вами информация профиля будет менее защищена</string>
<string name="direct_dns">Прямой DNS</string>
<string name="disable">Отключить</string>
<string name="dns_hosts">Перезапись домена</string>
<string name="dns_routing_message">Разрешить домены в обходных маршрутах с помощью Direct DNS. Помните о потенциальных утечках DNS</string>
<string name="document">Документы</string>
<string name="domain_strategy">Правило разрешения доменов</string>
<string name="domain_strategy_for_direct">Правило домена для Прямого</string>
<string name="domain_strategy_for_remote">Правило домена для Удаленного</string>
<string name="domain_strategy_for_server">Правило домена для Адреса сервера</string>
<string name="donate">Пожертвовать</string>
<string name="donate_info">Я люблю деньги</string>
<string name="download">Скачать</string>
<string name="early_data_header_name">Имя заголовка ранних данных</string>
<string name="ech_config">Конфигурация ECH</string>
<string name="edit">Редактировать</string>
<string name="edit_config">Изменить конфигурацию</string>
<string name="empty_route">Пустой маршрут</string>
<string name="empty_route_notice">Установите какие-либо правила перед сохранением</string>
<string name="enable">Включить</string>
<string name="enable_clash_api">Включить Clash API</string>
<string name="enable_clash_api_summary">Предоставлять панель управления Clash API и YACD по адресу 127.0.0.1:9090</string>
<string name="enable_dns_routing">Включить маршрутизацию DNS</string>
<string name="enable_ech">Включить ECH</string>
<string name="enable_ech_sum">Включить зашифрованный клиент Hello</string>
<string name="enable_fakedns">Включить FakeDNS</string>
<string name="enable_log">Включить журнал</string>
<string name="enable_log_sum">В целях отладки</string>
<string name="enable_mux">Включить мультиплексор</string>
<string name="enc_method">Метод шифрования</string>
<string name="encryption">Шифрование</string>
<string name="error_icon_content_description">Ошибка</string>
<string name="error_title">Ошибка</string>
<string name="expand_button_title">Дополнительно</string>
<string name="exposed_dropdown_menu_content_description">Показать раскрывающееся меню</string>
<string name="extra_headers">Дополнительные заголовки</string>
<string name="fakedns_message">Может вызвать необходимость перезапуска других приложений для повторного подключения к сети после остановки прокси</string>
<string name="file_manager_missing">На вашем устройстве отсутствует стандартный селектор файлов Android, установите его, например Material Files.</string>
<string name="follow_system">Использовать системную тему</string>
<string name="force_resolve">Принудительно разрешать доменные имена</string>
<string name="force_resolve_sum">При обновлении преобразовать все доменные имена в IP-адреса. Хост и SNI будут добавлены автоматически, если это возможно</string>
<string name="forward_success">Прокси запустился.</string>
<string name="front_proxy">Прямой прокси</string>
<string name="general_settings">Настройки приложения</string>
<string name="generating">Создание…</string>
<string name="github">Исходный код</string>
<string name="global_allow_insecure">Всегда разрешать небезопасные</string>
<string name="group_added">"\"Создано:
%s\""</string>
<string name="group_basic">Базовый</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_diff">различия (%s)</string>
<string name="group_duplicate">"\"Дубликат:
%s\""</string>
<string name="group_edit">Редактировать группу</string>
<string name="group_edit_subscription">Редактировать подписку</string>
<string name="group_filter">Фильтр</string>
<string name="group_name">Имя группы</string>
<string name="group_name_required">Требуется название группы</string>
<string name="group_no_difference">%s: Не отличаются</string>
<string name="group_not_subscription">Тип группы не является подпиской</string>
<string name="group_order">Сортировка</string>
<string name="group_order_by_delay">По задержке</string>
<string name="group_order_by_name">По имени</string>
<string name="group_order_origin">По источнику</string>
<string name="group_settings">Настройки группы</string>
<string name="group_show_diff">Сравнить группы</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" formatted="false">%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="grpc_service_name">Имя службы gRPC</string>
<string name="header_type">Тип заголовка</string>
<string name="http_host">HTTP-хост</string>
<string name="http_path">HTTP-путь</string>
<string name="hysteria_auth_payload">Полезные данные аутентификации</string>
<string name="hysteria_auth_type">Тип аутентификации</string>
<string name="hysteria_connection_receive_window">Окно получения соединения QUIC</string>
<string name="hysteria_disable_mtu_discovery">Отключить обнаружение MTU пути</string>
<string name="hysteria_download_mbps">Максимальная скорость загрузки (в Мбит / с)</string>
<string name="hysteria_obfs">Обфускация пароля</string>
<string name="hysteria_stream_receive_window">Окно приема потока QUIC</string>
<string name="hysteria_upload_mbps">Максимальная скорость загрузки (в Мбит / с)</string>
<string name="icon_content_description">Значок диалогового окна</string>
<string name="ignore_battery_optimizations">Игнорировать оптимизации батареи</string>
<string name="ignore_battery_optimizations_sum">Снять некоторые ограничения</string>
<string name="inbound_settings">Входящие настройки</string>
<string name="insecure">Ненадежный</string>
<string name="install_from_fdroid">Установить с F-Droid</string>
<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="ipv6">Маршрут IPv6</string>
<string name="item_view_role_description">Вкладка</string>
<string name="key_opt">Ключ (необязательно)</string>
<string name="landing_proxy">Обратный прокси</string>
<string name="license">Лицензия</string>
<string name="lines">%d строк</string>
<string name="log_level">Тип журнала</string>
<string name="log_level_help">Удерживайте для настройки размера буфера.</string>
<string name="logcat">Экспорт отладочной информации</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_group">Группы</string>
<string name="menu_log">Журналы</string>
<string name="menu_route">Маршруты</string>
<string name="menu_tools">Инструменты</string>
<string name="menu_traffic">Трафик</string>
<string name="metered">Подсказка о соединении с лимитным тарифным планом</string>
<string name="metered_summary">Подсказывать системе, что VPN следует рассматривать как сеть с лимитным тарифным планом</string>
<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_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_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="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 параллельных соединений для повышения отказоустойчивости в условиях ненадёжной сети. Большее число соединений увеличивает риск обнаружения туннелей и снижает безопасность. Этот проект стремится к максимальной защите от анализа трафика, следовательно, использование его небезопасным образом противоречит данной цели.
Если придётся использовать данную функцию, попробуйте N=2, чтобы проверить, решит ли это проблему. Настоятельно не рекомендуется использовать более 4 соединений.\""</string>
<string name="need_reload">Перезагрузите прокси-сервис, чтобы применить изменения</string>
<string name="need_restart">Перезапустите приложение для применения изменений</string>
<string name="neko_plugin">Дополнительный плагин</string>
<string name="neko_plugin_summary">"\"Дополнительные плагины могут предоставлять протоколы, которые изначально не поддерживаются.
Любой может написать дополнительные плагины, которые могут управлять Nekobox. Загружайте и устанавливайте их из надежных источников.\""</string>
<string name="network">Сеть</string>
<string name="network_change_reset_connections">Сбрасывать исходящие соединения при изменении сети</string>
<string name="night_mode">Ночной режим</string>
<string name="no">Нет</string>
<string name="no_proxies_found">В ссылке не найдено прокси-серверов</string>
<string name="no_proxies_found_in_clipboard">В буфере обмена не найдено ни одного прокси</string>
<string name="no_proxies_found_in_file">В файле не найдено прокси-серверов</string>
<string name="no_proxies_found_in_subscription">В подписке не найдено прокси-серверов</string>
<string name="no_statistics">Статистики пока нет</string>
<string name="not_connected">Не подключен</string>
<string name="not_set">Не указано</string>
<string name="obfs">Obfs</string>
<string name="obfs_param">Параметры Obfs</string>
<string name="off">Выключенный</string>
<string name="on">Включено</string>
<string name="only">Исключительно</string>
<string name="ooc_warning">Предупреждение</string>
<string name="oss_licenses">Лицензии с открытым исходным кодом</string>
<string name="packet_encoding">Кодирование пакетов</string>
<string name="padding">Отступ</string>
<string name="password">Пароль</string>
<string name="password_opt">Пароль (необязательно)</string>
<string name="password_toggle_content_description">Показать пароль</string>
<string name="plugin">Плагин</string>
<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_unknown">Неизвестный плагин %s</string>
<string name="plugin_untrusted">Предупреждение: похоже, что этот плагин не из известного надежного источника.</string>
<string name="port_http">Порт прокси HTTP</string>
<string name="port_local_dns">Локальный порт DNS</string>
<string name="port_proxy">Порт прокси SOCKS5</string>
<string name="port_transproxy">Транспрокси-порт</string>
<string name="prefer">Предпочитать</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_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="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="remote_dns">Удаленный DNS</string>
<string name="remove_duplicate">Удалить дубликаты серверов</string>
<string name="reset_connections">Сбросить соединения</string>
<string name="resolve_destination">Определить адрес назначения</string>
<string name="resolve_destination_summary">Если адрес назначения является доменом, то он передается в соответствии с правилом IPv6.</string>
<string name="route_add">Создать маршрут</string>
<string name="route_asset_no_update">Обновлений нет</string>
<string name="route_asset_status">Локальная версия: %s</string>
<string name="route_asset_updated">Обновлено</string>
<string name="route_assets">Ресурсы</string>
<string name="route_block">Блокировать</string>
<string name="route_bypass">Обход</string>
<string name="route_bypass_domain">Правило домена для %s</string>
<string name="route_bypass_ip">Правило IP для %s</string>
<string name="route_for">Правило для %s</string>
<string name="route_manage_assets">Управление ресурсами маршрутов</string>
<string name="route_name">Название маршрута</string>
<string name="route_need_vpn">Правило маршрутизации `%s` зависит от VPN, поэтому игнорируется.</string>
<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_bypass_lan">Обход LAN</string>
<string name="route_play_store">Правило Play Store для %s</string>
<string name="route_profile">Выбрать профиль…</string>
<string name="route_proxy">Прокси</string>
<string name="route_reset">Сброс</string>
<string name="route_rules_official">Официальный</string>
<string name="route_rules_provider">Поставщик ресурсов правил</string>
<string name="route_warn">Перед добавлением собственных правил убедитесь, что вы прочитали документацию, иначе подключение к Интернету может не удасться.</string>
<string name="scanning">Сканирование…</string>
<string name="search_apps">Поиск…</string>
<string name="search_menu_title">Поиск</string>
<string name="security">Шифрование транспортного уровня</string>
<string name="security_settings">Настройки безопасности</string>
<string name="select_apps">Выберите приложения</string>
<string name="select_profile">Выбрать профиль</string>
<string name="server_address">Сервер</string>
<string name="server_port">Удаленный порт</string>
<string name="service_failed">Не удалось:</string>
<string name="service_mode">Сервисный режим</string>
<string name="service_mode_proxy">Только прокси</string>
<string name="service_proxy">Прокси-сервис</string>
<string name="service_subscription">Служба обновления подписки</string>
<string name="service_vpn">VPN-сервис</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="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="sniff_routing">Перехватывать результат для Маршрутизации</string>
<string name="speed">%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>
<string name="ssh_private_key">Закрытый ключ</string>
<string name="ssh_private_key_passphrase">Парольная фраза закрытого ключа</string>
<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="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_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_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="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="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_current_subscription">Обновить подписку текущей группы</string>
<string name="update_settings">Обновить настройки</string>
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string>
<string name="update_when_connected_only">Обновлять только при подключении</string>
<string name="update_when_connected_only_sum">Предотвратить утечку IP-адреса</string>
<string name="use_selector">Использовать селектор</string>
<string name="username">Имя пользователя</string>
<string name="username_opt">Имя пользователя (необязательно)</string>
<string name="utls_fingerprint">Отпечаток uTLS</string>
<string name="uuid">Логин пользователя</string>
<string name="v7_preference_off">ВЫКЛ.</string>
<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="warp_generate">Создать конфигурацию</string>
<string name="warp_license">CloudFlare Warp - это бесплатный VPN-провайдер Wire Guard. Используя его, вы соглашаетесь с условиями использования.</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_path">Путь к WebSocket</string>
<string name="xtls_flow">Flow (подпротокол VLESS)</string>
<string name="yes">Да</string>
</resources>
+3 -3
View File
@@ -9,9 +9,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://gn.googlesource.com/gn.git
PKG_SOURCE_DATE:=2024-12-17
PKG_SOURCE_VERSION:=c97a86a72105f3328a540f5a5ab17d11989ab7dd
PKG_MIRROR_HASH:=2884591821bac9779d01402e6e7a1c7966889cdd52d3163826ebdcb365ec6101
PKG_SOURCE_DATE:=2025-03-24
PKG_SOURCE_VERSION:=6e8e0d6d4a151ab2ed9b4a35366e630c55888444
PKG_MIRROR_HASH:=8f7fba8f572aa7d324a3bef672a3b36fc2fbc6db19f3202332979d405eff43e4
PKG_LICENSE:=BSD 3-Clause
PKG_LICENSE_FILES:=LICENSE
+2 -2
View File
@@ -3,7 +3,7 @@
#ifndef OUT_LAST_COMMIT_POSITION_H_
#define OUT_LAST_COMMIT_POSITION_H_
#define LAST_COMMIT_POSITION_NUM 2207
#define LAST_COMMIT_POSITION "2207 (c97a86a72105)"
#define LAST_COMMIT_POSITION_NUM 2224
#define LAST_COMMIT_POSITION "2224 (6e8e0d6d4a15)"
#endif // OUT_LAST_COMMIT_POSITION_H_
@@ -6,7 +6,6 @@ uci batch <<EOF
"init": "bypass"
}
EEOF
/etc/init.d/ucitrack reload
}
delete ucitrack.@bypass[-1]
add ucitrack bypass
+22 -22
View File
@@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=naiveproxy
PKG_VERSION:=134.0.6998.39-1
PKG_VERSION:=135.0.7049.38-1
PKG_RELEASE:=1
# intel 80386 & riscv64 & cortex-a76
@@ -20,47 +20,47 @@ else ifeq ($(ARCH_PREBUILT),riscv64_riscv64)
endif
ifeq ($(ARCH_PACKAGES),aarch64_cortex-a53)
PKG_HASH:=0e616a8dade5207435e0f7a2d5c39e86850079d2c992a3877d1483b1367db97e
PKG_HASH:=7711d714d9cec37eac9048a59fc0d1fa7c7bc0a637018c9b2e419c43368e3c53
else ifeq ($(ARCH_PACKAGES),aarch64_cortex-a72)
PKG_HASH:=c98c1867f58d24757d2fab09ee28bf921d9805f0d836bb11d25c4acf8306abec
PKG_HASH:=44253ecd8cb7c62ffd948901a1191ca2c1b65430ec19253322c5935551e13b7c
else ifeq ($(ARCH_PACKAGES),aarch64_generic)
PKG_HASH:=9c9d62f1a66b7616e42833ef79ad64aa38c1ac036710ea8bc2a7a133784b7be4
PKG_HASH:=7ba36313b0485d0bbb7d95debcd90a8add2d6ae40e756c702542fc64dc1e9c12
else ifeq ($(ARCH_PACKAGES),arm_arm1176jzf-s_vfp)
PKG_HASH:=2442a34a532e7bfbc0926fd1fbabc94a19779a4ea6edcc50bfe8c2281d524b8d
PKG_HASH:=15e33c0368cf8adca8dade760e1d65307f93ea3a7f9e83aa6fe8ab6410578c0e
else ifeq ($(ARCH_PACKAGES),arm_arm926ej-s)
PKG_HASH:=4efd0b2bdff46657436dda8016f65a06feb1db1275b3b9023e1b5d4bcd95f776
PKG_HASH:=c7cca2201b9a582fb674984cf9521c237fa9ff8f5e8fbe6323d4be34b684c85e
else ifeq ($(ARCH_PACKAGES),arm_cortex-a15_neon-vfpv4)
PKG_HASH:=7b423e5def6b067bcf72c987714a34ed0eaf785cb5dd6d372a9a15e573ac3074
PKG_HASH:=474e3227c6bb0271e4d9e9a11f02bbf3a96171abbfad710b764a4cbf01276c39
else ifeq ($(ARCH_PACKAGES),arm_cortex-a5_vfpv4)
PKG_HASH:=30d429df58bd50d6a527500e1e279e5ae31440383afec5756b0373c68b971dcb
PKG_HASH:=d8267795f9221e3c9ef1194f67b5c132e61236135ba9f5130666782e6cb3b00e
else ifeq ($(ARCH_PACKAGES),arm_cortex-a7)
PKG_HASH:=7b4f3b658058569f7cbfb18a6179c317c6bad9947885d46212a32ba526bb519a
PKG_HASH:=519d116bea3d19ef3f9da782d2066c09cb4b9fcc1494f9bc2450f65e5d5895b7
else ifeq ($(ARCH_PACKAGES),arm_cortex-a7_neon-vfpv4)
PKG_HASH:=bf85b73a85a198f73b5d0bd5f538a04be9d126d54b35d56ef1fbf366a758b168
PKG_HASH:=e2d8748b13867f9c0f9007b4570bdf2466d4717ed5fe112cdd5c5745dd9cda88
else ifeq ($(ARCH_PACKAGES),arm_cortex-a7_vfpv4)
PKG_HASH:=26481b7801cf55b46b0e0363de4f4520bf4e839586652ed820a3a21413cc3351
PKG_HASH:=ee74875fa83dac7b79ea2945ee3320bd1b5c974b38e528217e8db514dfd4f015
else ifeq ($(ARCH_PACKAGES),arm_cortex-a8_vfpv3)
PKG_HASH:=535c30dedf4a95b9d3e79e4b6c36e8ee256c6f439ebbdaa673163b32eef63f0e
PKG_HASH:=415aa150b519949cd89b0c8c22ba10681de2bfcd78894830e270c83412f247a7
else ifeq ($(ARCH_PACKAGES),arm_cortex-a9)
PKG_HASH:=afa8050347a759b1030939339a7e3e46bab4a8ba42d00b5db3dc7d9bddf5b996
PKG_HASH:=62c9b107c4cef346de3d7f81fc39e37356b7635b7c86c2e5628a7c79d852f6e7
else ifeq ($(ARCH_PACKAGES),arm_cortex-a9_neon)
PKG_HASH:=52bd52c123e3b0c23eda946056bcdca805977ac81d97dba3bd8f07ecb04e2add
PKG_HASH:=8e7b251f880f7249138c93b623c82037ea03a4e91cfad0a127d2f0860363ade6
else ifeq ($(ARCH_PACKAGES),arm_cortex-a9_vfpv3-d16)
PKG_HASH:=d04f22d4c2d33982d638d0a0ec0db07a1fec021ce3100e820c862f7f9788d74b
PKG_HASH:=83a8f4333c8a0ce14348d461a6f1b2e55078a2afb5cfa937b5141dd58f700c1c
else ifeq ($(ARCH_PACKAGES),arm_mpcore)
PKG_HASH:=a3cb60d42ae13253983728767cd41b7ded11bb699ea4239fafeb03e93477c0fc
PKG_HASH:=c9d88844b79d77ba387275f707896df6f0ddb109eed15461f169b4193f55f5ae
else ifeq ($(ARCH_PACKAGES),arm_xscale)
PKG_HASH:=6a9e7a2679812af394cbfc41b5403b5025c8acc15a56c46dc288becd0f940222
PKG_HASH:=d27f2d18fd5ce59c78af7f879d300e0700de05672cfb6265d252a4a7197a4df1
else ifeq ($(ARCH_PACKAGES),mipsel_24kc)
PKG_HASH:=64f6f77e87cb8c06d880b3d4ecafc9baab117452e70dddcdb8c69aae41b6a6ca
PKG_HASH:=054b2e9989ae30fbfc2ca4f69e1df686433a604d0c55827e6eb478b902d02cd1
else ifeq ($(ARCH_PACKAGES),mipsel_mips32)
PKG_HASH:=9be977a06b701dfadae4f6c5e56fde7adbda0f7cc8b11921fae01b5ef2315cc7
PKG_HASH:=c6e7015b2e900e94244e66118b2b3c7c9f5ff5e0257311625497e7dc133a1071
else ifeq ($(ARCH_PACKAGES),riscv64)
PKG_HASH:=91969c969010f7bb1bde3871b7004a37257a8bc7dcf1d3d2a393b38213e236ff
PKG_HASH:=7a9a49046672eced503fb9adf8fcb0e158ffd01e8856123e04a1400c57be81b0
else ifeq ($(ARCH_PACKAGES),x86)
PKG_HASH:=b07fc6775a51b6ff66763210c3c08a60a3e17faa9ed92f5bc0fef8e93266c876
PKG_HASH:=ddf4599057756bb77e560454eb7b62591077af731f06baff4491f07a7bf59c57
else ifeq ($(ARCH_PACKAGES),x86_64)
PKG_HASH:=49e051113d6bf1a9376f26e40ade0672e38b75bc978cabc7622e3a2d0c424d3a
PKG_HASH:=41b982201463ebca5aac999efc80484d6261ddcd5763a69e078c1e41fb427ef6
else
PKG_HASH:=dummy
endif
+4 -4
View File
@@ -12,22 +12,22 @@ PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
include $(INCLUDE_DIR)/package.mk
GEOIP_VER:=202503281421
GEOIP_VER:=202504050136
GEOIP_FILE:=geoip.dat.$(GEOIP_VER)
define Download/geoip
URL:=https://github.com/v2fly/geoip/releases/download/$(GEOIP_VER)/
URL_FILE:=geoip.dat
FILE:=$(GEOIP_FILE)
HASH:=83337c712b04d8c16351cf5a5394eae5cb9cfa257fb4773485945dce65dcea76
HASH:=735786c00694313090c5d525516463836167422b132ce293873443613b496e92
endef
GEOSITE_VER:=20250401022534
GEOSITE_VER:=20250405160157
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=6c69c83e0d9ee39cb0674515ce1668a411b9824a1c6314291d77bc83cd0c6d56
HASH:=bf18a50193c260b5913af089394e49ca92967a1bb416d1e8e651667985e018bc
endef
GEOSITE_IRAN_VER:=202503310039
+2 -2
View File
@@ -135,7 +135,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: ^1.23
go-version: ^1.24
- name: Get project dependencies
run: go mod download
@@ -215,7 +215,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: ^1.23
go-version: ^1.24
- uses: actions/download-artifact@v4
with:
+4 -4
View File
@@ -1,8 +1,8 @@
module github.com/v2fly/v2ray-core/v5
go 1.22
go 1.23
toolchain go1.22.7
toolchain go1.24.2
require (
github.com/adrg/xdg v0.5.3
@@ -13,7 +13,7 @@ require (
github.com/golang-collections/go-datastructures v0.0.0-20150211160725-59788d5eb259
github.com/golang/mock v1.6.0
github.com/golang/protobuf v1.5.4
github.com/google/go-cmp v0.6.0
github.com/google/go-cmp v0.7.0
github.com/google/gopacket v1.1.19
github.com/gorilla/websocket v1.5.3
github.com/improbable-eng/grpc-web v0.15.0
@@ -46,7 +46,7 @@ require (
gopkg.in/yaml.v3 v3.0.1
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1
h12.io/socks v1.0.3
lukechampine.com/blake3 v1.3.0
lukechampine.com/blake3 v1.4.0
)
require (
+4 -4
View File
@@ -199,8 +199,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
@@ -873,8 +873,8 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w=
lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0=
nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k=
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+66 -23
View File
@@ -21,10 +21,12 @@ type Config struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Server is the DNS server address. If specified, this address overrides the
// original one.
Server *net.Endpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
UserLevel uint32 `protobuf:"varint,2,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
Server *net.Endpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
UserLevel uint32 `protobuf:"varint,2,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"`
OverrideResponseTtl bool `protobuf:"varint,4,opt,name=override_response_ttl,json=overrideResponseTtl,proto3" json:"override_response_ttl,omitempty"`
ResponseTtl uint32 `protobuf:"varint,3,opt,name=response_ttl,json=responseTtl,proto3" json:"response_ttl,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Config) Reset() {
@@ -71,10 +73,26 @@ func (x *Config) GetUserLevel() uint32 {
return 0
}
func (x *Config) GetOverrideResponseTtl() bool {
if x != nil {
return x.OverrideResponseTtl
}
return false
}
func (x *Config) GetResponseTtl() uint32 {
if x != nil {
return x.ResponseTtl
}
return 0
}
type SimplifiedConfig struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
state protoimpl.MessageState `protogen:"open.v1"`
OverrideResponseTtl bool `protobuf:"varint,4,opt,name=override_response_ttl,json=overrideResponseTtl,proto3" json:"override_response_ttl,omitempty"`
ResponseTtl uint32 `protobuf:"varint,3,opt,name=response_ttl,json=responseTtl,proto3" json:"response_ttl,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *SimplifiedConfig) Reset() {
@@ -107,6 +125,20 @@ func (*SimplifiedConfig) Descriptor() ([]byte, []int) {
return file_proxy_dns_config_proto_rawDescGZIP(), []int{1}
}
func (x *SimplifiedConfig) GetOverrideResponseTtl() bool {
if x != nil {
return x.OverrideResponseTtl
}
return false
}
func (x *SimplifiedConfig) GetResponseTtl() uint32 {
if x != nil {
return x.ResponseTtl
}
return 0
}
var File_proxy_dns_config_proto protoreflect.FileDescriptor
var file_proxy_dns_config_proto_rawDesc = string([]byte{
@@ -116,22 +148,33 @@ var file_proxy_dns_config_proto_rawDesc = string([]byte{
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x73, 0x74, 0x69,
0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x63, 0x6f,
0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x65, 0x78, 0x74, 0x2f, 0x65, 0x78,
0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60,
0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76,
0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74,
0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65,
0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18,
0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c,
0x22, 0x27, 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x6f,
0x6e, 0x66, 0x69, 0x67, 0x3a, 0x13, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62,
0x6f, 0x75, 0x6e, 0x64, 0x12, 0x03, 0x64, 0x6e, 0x73, 0x42, 0x5d, 0x0a, 0x18, 0x63, 0x6f, 0x6d,
0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78,
0x79, 0x2e, 0x64, 0x6e, 0x73, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x66, 0x6c, 0x79, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2d,
0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6e,
0x73, 0xaa, 0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50,
0x72, 0x6f, 0x78, 0x79, 0x2e, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb7,
0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x65, 0x72,
0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61,
0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65,
0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76,
0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65,
0x6c, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x72, 0x65,
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
0x52, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x54, 0x74, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x74, 0x6c, 0x22, 0x7e, 0x0a, 0x10, 0x53, 0x69, 0x6d, 0x70,
0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x15,
0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6f, 0x76, 0x65,
0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x74, 0x6c,
0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x74, 0x6c,
0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
0x54, 0x74, 0x6c, 0x3a, 0x13, 0x82, 0xb5, 0x18, 0x0f, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f,
0x75, 0x6e, 0x64, 0x12, 0x03, 0x64, 0x6e, 0x73, 0x42, 0x5d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e,
0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79,
0x2e, 0x64, 0x6e, 0x73, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x66, 0x6c, 0x79, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2d, 0x63,
0x6f, 0x72, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6e, 0x73,
0xaa, 0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72,
0x6f, 0x78, 0x79, 0x2e, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
})
var (
+6
View File
@@ -14,9 +14,15 @@ message Config {
// original one.
v2ray.core.common.net.Endpoint server = 1;
uint32 user_level = 2;
bool override_response_ttl = 4;
uint32 response_ttl = 3;
}
message SimplifiedConfig {
option (v2ray.core.common.protoext.message_opt).type = "outbound";
option (v2ray.core.common.protoext.message_opt).short_name = "dns";
bool override_response_ttl = 4;
uint32 response_ttl = 3;
}
+9
View File
@@ -38,6 +38,8 @@ func init() {
simplifiedServer := config.(*SimplifiedConfig)
_ = simplifiedServer
fullConfig := &Config{}
fullConfig.OverrideResponseTtl = simplifiedServer.OverrideResponseTtl
fullConfig.ResponseTtl = simplifiedServer.ResponseTtl
return common.CreateObject(ctx, fullConfig)
}))
}
@@ -53,6 +55,8 @@ type Handler struct {
ownLinkVerifier ownLinkVerifier
server net.Destination
timeout time.Duration
config *Config
}
func (h *Handler) Init(config *Config, dnsClient dns.Client, policyManager policy.Manager) error {
@@ -82,6 +86,8 @@ func (h *Handler) Init(config *Config, dnsClient dns.Client, policyManager polic
if config.Server != nil {
h.server = config.Server.AsDestination()
}
h.config = config
return nil
}
@@ -239,6 +245,9 @@ func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string,
var err error
var ttl uint32 = 600
if h.config.OverrideResponseTtl {
ttl = h.config.ResponseTtl
}
switch qType {
case dnsmessage.TypeA:
@@ -164,7 +164,7 @@ func (d dialerWithEarlyData) Dial(earlyData []byte) (*websocket.Conn, error) {
}
if n != int64(len(earlyData)) {
if errWrite := conn.WriteMessage(websocket.BinaryMessage, earlyData[n:]); errWrite != nil {
return nil, newError("failed to dial to (", d.uriBase, ") with early data as write of remainder early data failed: ").Base(err)
return nil, newError("failed to dial to (", d.uriBase, ") with early data as write of remainder early data failed: ").Base(errWrite)
}
}
return conn, nil
@@ -209,7 +209,7 @@ func (d dialerWithEarlyDataRelayed) Dial(earlyData []byte) (io.ReadWriteCloser,
}
if n != int64(len(earlyData)) {
if _, errWrite := conn.Write(earlyData[n:]); errWrite != nil {
return nil, newError("failed to dial to (", d.uriBase, ") with early data as write of remainder early data failed: ").Base(err)
return nil, newError("failed to dial to (", d.uriBase, ") with early data as write of remainder early data failed: ").Base(errWrite)
}
}
return conn, nil
+9 -8
View File
@@ -5,7 +5,9 @@ from ..utils import (
int_or_none,
try_get,
unified_strdate,
url_or_none,
)
from ..utils.traversal import traverse_obj
class CrowdBunkerIE(InfoExtractor):
@@ -44,16 +46,15 @@ class CrowdBunkerIE(InfoExtractor):
'url': sub_url,
})
mpd_url = try_get(video_json, lambda x: x['dashManifest']['url'])
if mpd_url:
fmts, subs = self._extract_mpd_formats_and_subtitles(mpd_url, video_id)
if mpd_url := traverse_obj(video_json, ('dashManifest', 'url', {url_or_none})):
fmts, subs = self._extract_mpd_formats_and_subtitles(mpd_url, video_id, mpd_id='dash', fatal=False)
formats.extend(fmts)
subtitles = self._merge_subtitles(subtitles, subs)
m3u8_url = try_get(video_json, lambda x: x['hlsManifest']['url'])
if m3u8_url:
fmts, subs = self._extract_m3u8_formats_and_subtitles(mpd_url, video_id)
self._merge_subtitles(subs, target=subtitles)
if m3u8_url := traverse_obj(video_json, ('hlsManifest', 'url', {url_or_none})):
fmts, subs = self._extract_m3u8_formats_and_subtitles(m3u8_url, video_id, m3u8_id='hls', fatal=False)
formats.extend(fmts)
subtitles = self._merge_subtitles(subtitles, subs)
self._merge_subtitles(subs, target=subtitles)
thumbnails = [{
'url': image['url'],
+39 -22
View File
@@ -7,7 +7,6 @@ from ..utils import (
ExtractorError,
UnsupportedError,
clean_html,
determine_ext,
extract_attributes,
format_field,
get_element_by_class,
@@ -36,7 +35,7 @@ class RumbleEmbedIE(InfoExtractor):
'upload_date': '20191020',
'channel_url': 'https://rumble.com/c/WMAR',
'channel': 'WMAR',
'thumbnail': 'https://sp.rmbl.ws/s8/1/5/M/z/1/5Mz1a.qR4e-small-WMAR-2-News-Latest-Headline.jpg',
'thumbnail': r're:https://.+\.jpg',
'duration': 234,
'uploader': 'WMAR',
'live_status': 'not_live',
@@ -52,7 +51,7 @@ class RumbleEmbedIE(InfoExtractor):
'upload_date': '20220217',
'channel_url': 'https://rumble.com/c/CyberTechNews',
'channel': 'CTNews',
'thumbnail': 'https://sp.rmbl.ws/s8/6/7/i/9/h/7i9hd.OvCc.jpg',
'thumbnail': r're:https://.+\.jpg',
'duration': 901,
'uploader': 'CTNews',
'live_status': 'not_live',
@@ -114,6 +113,22 @@ class RumbleEmbedIE(InfoExtractor):
'live_status': 'was_live',
},
'params': {'skip_download': True},
}, {
'url': 'https://rumble.com/embed/v6pezdb',
'info_dict': {
'id': 'v6pezdb',
'ext': 'mp4',
'title': '"Es war einmal ein Mädchen" Ein filmisches Zeitzeugnis aus Leningrad 1944',
'uploader': 'RT DE',
'channel': 'RT DE',
'channel_url': 'https://rumble.com/c/RTDE',
'duration': 309,
'thumbnail': 'https://1a-1791.com/video/fww1/dc/s8/1/n/z/2/y/nz2yy.qR4e-small-Es-war-einmal-ein-Mdchen-Ei.jpg',
'timestamp': 1743703500,
'upload_date': '20250403',
'live_status': 'not_live',
},
'params': {'skip_download': True},
}, {
'url': 'https://rumble.com/embed/ufe9n.v5pv5f',
'only_matching': True,
@@ -168,40 +183,42 @@ class RumbleEmbedIE(InfoExtractor):
live_status = None
formats = []
for ext, ext_info in (video.get('ua') or {}).items():
if isinstance(ext_info, dict):
for height, video_info in ext_info.items():
for format_type, format_info in (video.get('ua') or {}).items():
if isinstance(format_info, dict):
for height, video_info in format_info.items():
if not traverse_obj(video_info, ('meta', 'h', {int_or_none})):
video_info.setdefault('meta', {})['h'] = height
ext_info = ext_info.values()
format_info = format_info.values()
for video_info in ext_info:
for video_info in format_info:
meta = video_info.get('meta') or {}
if not video_info.get('url'):
continue
if ext == 'hls':
# With default query params returns m3u8 variants which are duplicates, without returns tar files
if format_type == 'tar':
continue
if format_type == 'hls':
if meta.get('live') is True and video.get('live') == 1:
live_status = 'post_live'
formats.extend(self._extract_m3u8_formats(
video_info['url'], video_id,
ext='mp4', m3u8_id='hls', fatal=False, live=live_status == 'is_live'))
continue
timeline = ext == 'timeline'
if timeline:
ext = determine_ext(video_info['url'])
is_timeline = format_type == 'timeline'
is_audio = format_type == 'audio'
formats.append({
'ext': ext,
'acodec': 'none' if timeline else None,
'acodec': 'none' if is_timeline else None,
'vcodec': 'none' if is_audio else None,
'url': video_info['url'],
'format_id': join_nonempty(ext, format_field(meta, 'h', '%sp')),
'format_note': 'Timeline' if timeline else None,
'fps': None if timeline else video.get('fps'),
'format_id': join_nonempty(format_type, format_field(meta, 'h', '%sp')),
'format_note': 'Timeline' if is_timeline else None,
'fps': None if is_timeline or is_audio else video.get('fps'),
**traverse_obj(meta, {
'tbr': 'bitrate',
'filesize': 'size',
'width': 'w',
'height': 'h',
}, expected_type=lambda x: int(x) or None),
'tbr': ('bitrate', {int_or_none}),
'filesize': ('size', {int_or_none}),
'width': ('w', {int_or_none}),
'height': ('h', {int_or_none}),
}),
})
subtitles = {