diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 000000000..588716933
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2762 @@
+{
+ "name": "@meshtastic/web",
+ "version": "2.7.0-0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@meshtastic/web",
+ "version": "2.7.0-0",
+ "hasInstallScript": true,
+ "license": "GPL-3.0-only",
+ "dependencies": {
+ "@bufbuild/buf": "^1.61.0",
+ "@bufbuild/protobuf": "^2.9.0",
+ "@meshtastic/protobufs": "npm:@jsr/meshtastic__protobufs@^2.7.12-1",
+ "ste-simple-events": "^3.0.11",
+ "tslog": "^4.9.3"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "2.2.4",
+ "@types/node": "^24.3.1",
+ "tsdown": "^0.15.0",
+ "typescript": "^5.9.2",
+ "vitest": "^3.2.4"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@biomejs/biome": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.4.tgz",
+ "integrity": "sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==",
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "bin": {
+ "biome": "bin/biome"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/biome"
+ },
+ "optionalDependencies": {
+ "@biomejs/cli-darwin-arm64": "2.2.4",
+ "@biomejs/cli-darwin-x64": "2.2.4",
+ "@biomejs/cli-linux-arm64": "2.2.4",
+ "@biomejs/cli-linux-arm64-musl": "2.2.4",
+ "@biomejs/cli-linux-x64": "2.2.4",
+ "@biomejs/cli-linux-x64-musl": "2.2.4",
+ "@biomejs/cli-win32-arm64": "2.2.4",
+ "@biomejs/cli-win32-x64": "2.2.4"
+ }
+ },
+ "node_modules/@biomejs/cli-darwin-arm64": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.4.tgz",
+ "integrity": "sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-darwin-x64": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.4.tgz",
+ "integrity": "sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-arm64": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.4.tgz",
+ "integrity": "sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-arm64-musl": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.4.tgz",
+ "integrity": "sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-x64": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.4.tgz",
+ "integrity": "sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-linux-x64-musl": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.4.tgz",
+ "integrity": "sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-win32-arm64": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.4.tgz",
+ "integrity": "sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@biomejs/cli-win32-x64": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.4.tgz",
+ "integrity": "sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT OR Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ }
+ },
+ "node_modules/@bufbuild/buf": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.61.0.tgz",
+ "integrity": "sha512-9kKZK/GjhIDUj50pngmjtC6bGFl6U1rFDH2gZJATRfp2vNnQPsb6BqZ+2lea37bgHBYdAYttlve8wnXszXmftA==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "buf": "bin/buf",
+ "protoc-gen-buf-breaking": "bin/protoc-gen-buf-breaking",
+ "protoc-gen-buf-lint": "bin/protoc-gen-buf-lint"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@bufbuild/buf-darwin-arm64": "1.61.0",
+ "@bufbuild/buf-darwin-x64": "1.61.0",
+ "@bufbuild/buf-linux-aarch64": "1.61.0",
+ "@bufbuild/buf-linux-armv7": "1.61.0",
+ "@bufbuild/buf-linux-x64": "1.61.0",
+ "@bufbuild/buf-win32-arm64": "1.61.0",
+ "@bufbuild/buf-win32-x64": "1.61.0"
+ }
+ },
+ "node_modules/@bufbuild/buf-darwin-arm64": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.61.0.tgz",
+ "integrity": "sha512-8vUGNV65LNPp+HT3NuCT9i/mCUEyLrSFctJ2Dz8JqnUu8fVPm4f8lVBSCT0TYLoQ8o8xb/A7bwWu14aKfXxgCg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-darwin-x64": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.61.0.tgz",
+ "integrity": "sha512-dyJghwTYXT6e/Ec+2iPWijquTzyT+5vTItX4R7hM/soNQOs4eEo2z7EHLqvclHyi7+p7+8xye3z+BFM33ucM8A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-linux-aarch64": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.61.0.tgz",
+ "integrity": "sha512-9r5DRqwpq3WX0ltzt1p/Oe+8g679Fg4XJLaH/zmjqpwHVO+tNzYy7PHK4qWg83PCoANw6OVizl+iTmnE0vbklg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-linux-armv7": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-armv7/-/buf-linux-armv7-1.61.0.tgz",
+ "integrity": "sha512-P2cSlzu68omZ6kyijMcYezZJFS4XayfLA0ATm1HP0zUaV+xVoeMOGhKvMWUFAa9SGYUs4Drxi2fyK/c2ZFA8sw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-linux-x64": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.61.0.tgz",
+ "integrity": "sha512-USDSLB0vkrR6Sk/VDtECLdOKHfynenCjnAchr9bdqC137IVJT7TVT8JhBW0UWMmXDZYjwbDrBLITwWj8hwk6Uw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-win32-arm64": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.61.0.tgz",
+ "integrity": "sha512-36n90c0lzhDMXRKhht8XreUCha4OTY7yR6g+bnkAFUXSbCbR3BpqrenWvl5NBtfX2Y70dmvjKnGwVanSIrb1uA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-win32-x64": {
+ "version": "1.61.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.61.0.tgz",
+ "integrity": "sha512-uBIU7tQlCBPyoeJZH0NzL6y9Y4ikje4OlgHYGssbaPLsCKELSFDHQkHFabkwnVeXSUf9Intq+U3jtb+qOIlflw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/protobuf": {
+ "version": "2.10.2",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz",
+ "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==",
+ "license": "(Apache-2.0 AND BSD-3-Clause)"
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz",
+ "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz",
+ "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
+ "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
+ "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
+ "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
+ "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
+ "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
+ "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
+ "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
+ "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
+ "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
+ "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
+ "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
+ "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
+ "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
+ "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
+ "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
+ "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
+ "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
+ "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
+ "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@meshtastic/protobufs": {
+ "name": "@jsr/meshtastic__protobufs",
+ "version": "2.7.12-1",
+ "resolved": "https://npm.jsr.io/~/11/@jsr/meshtastic__protobufs/2.7.12-1.tgz",
+ "integrity": "sha512-B6m8ewPZX2Mi5phNmvJYwemLD4X8I9kDyQgRSlFFzUGhYkG1MX1rb1FRLUZh0t98qPrCBO4XH4CmYUPNywNWMg==",
+ "dependencies": {
+ "@bufbuild/protobuf": "^2.9.0"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz",
+ "integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1",
+ "@tybys/wasm-util": "^0.10.1"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.95.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.95.0.tgz",
+ "integrity": "sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@quansync/fs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz",
+ "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.45.tgz",
+ "integrity": "sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.45.tgz",
+ "integrity": "sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.45.tgz",
+ "integrity": "sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.45.tgz",
+ "integrity": "sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.45.tgz",
+ "integrity": "sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.45.tgz",
+ "integrity": "sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.45.tgz",
+ "integrity": "sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.45.tgz",
+ "integrity": "sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.45.tgz",
+ "integrity": "sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.45.tgz",
+ "integrity": "sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.45.tgz",
+ "integrity": "sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.0.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.45.tgz",
+ "integrity": "sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-ia32-msvc": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.45.tgz",
+ "integrity": "sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.45.tgz",
+ "integrity": "sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.45.tgz",
+ "integrity": "sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz",
+ "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz",
+ "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz",
+ "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz",
+ "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz",
+ "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz",
+ "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz",
+ "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz",
+ "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz",
+ "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz",
+ "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz",
+ "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz",
+ "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz",
+ "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz",
+ "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz",
+ "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz",
+ "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz",
+ "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz",
+ "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz",
+ "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz",
+ "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz",
+ "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz",
+ "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.10.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz",
+ "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz",
+ "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "3.2.4",
+ "@vitest/utils": "3.2.4",
+ "chai": "^5.2.0",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz",
+ "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.2.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz",
+ "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz",
+ "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.2.4",
+ "pathe": "^2.0.3",
+ "strip-literal": "^3.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz",
+ "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.4",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz",
+ "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^4.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz",
+ "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.4",
+ "loupe": "^3.1.4",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/ansis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+ "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ast-kit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz",
+ "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "pathe": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chai": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+ "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/diff": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz",
+ "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dts-resolver": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-2.1.3.tgz",
+ "integrity": "sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "oxc-resolver": ">=11.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-resolver": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/empathic": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
+ "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
+ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.2",
+ "@esbuild/android-arm": "0.27.2",
+ "@esbuild/android-arm64": "0.27.2",
+ "@esbuild/android-x64": "0.27.2",
+ "@esbuild/darwin-arm64": "0.27.2",
+ "@esbuild/darwin-x64": "0.27.2",
+ "@esbuild/freebsd-arm64": "0.27.2",
+ "@esbuild/freebsd-x64": "0.27.2",
+ "@esbuild/linux-arm": "0.27.2",
+ "@esbuild/linux-arm64": "0.27.2",
+ "@esbuild/linux-ia32": "0.27.2",
+ "@esbuild/linux-loong64": "0.27.2",
+ "@esbuild/linux-mips64el": "0.27.2",
+ "@esbuild/linux-ppc64": "0.27.2",
+ "@esbuild/linux-riscv64": "0.27.2",
+ "@esbuild/linux-s390x": "0.27.2",
+ "@esbuild/linux-x64": "0.27.2",
+ "@esbuild/netbsd-arm64": "0.27.2",
+ "@esbuild/netbsd-x64": "0.27.2",
+ "@esbuild/openbsd-arm64": "0.27.2",
+ "@esbuild/openbsd-x64": "0.27.2",
+ "@esbuild/openharmony-arm64": "0.27.2",
+ "@esbuild/sunos-x64": "0.27.2",
+ "@esbuild/win32-arm64": "0.27.2",
+ "@esbuild/win32-ia32": "0.27.2",
+ "@esbuild/win32-x64": "0.27.2"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
+ "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+ "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+ "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
+ "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-beta.45",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.45.tgz",
+ "integrity": "sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.95.0",
+ "@rolldown/pluginutils": "1.0.0-beta.45"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-beta.45",
+ "@rolldown/binding-darwin-arm64": "1.0.0-beta.45",
+ "@rolldown/binding-darwin-x64": "1.0.0-beta.45",
+ "@rolldown/binding-freebsd-x64": "1.0.0-beta.45",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.45",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.45",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.45",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.45",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-beta.45",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-beta.45",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-beta.45",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.45",
+ "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.45",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.45"
+ }
+ },
+ "node_modules/rolldown-plugin-dts": {
+ "version": "0.17.8",
+ "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.17.8.tgz",
+ "integrity": "sha512-76EEBlhF00yeY6M7VpMkWKI4r9WjuoMiOGey7j4D6zf3m0BR+ZrrY9hvSXdueJ3ljxSLq4DJBKFpX/X9+L7EKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/generator": "^7.28.5",
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "ast-kit": "^2.2.0",
+ "birpc": "^2.8.0",
+ "dts-resolver": "^2.1.3",
+ "get-tsconfig": "^4.13.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@ts-macro/tsc": "^0.3.6",
+ "@typescript/native-preview": ">=7.0.0-dev.20250601.1",
+ "rolldown": "^1.0.0-beta.44",
+ "typescript": "^5.0.0",
+ "vue-tsc": "~3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@ts-macro/tsc": {
+ "optional": true
+ },
+ "@typescript/native-preview": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.54.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz",
+ "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.54.0",
+ "@rollup/rollup-android-arm64": "4.54.0",
+ "@rollup/rollup-darwin-arm64": "4.54.0",
+ "@rollup/rollup-darwin-x64": "4.54.0",
+ "@rollup/rollup-freebsd-arm64": "4.54.0",
+ "@rollup/rollup-freebsd-x64": "4.54.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.54.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.54.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.54.0",
+ "@rollup/rollup-linux-arm64-musl": "4.54.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.54.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.54.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.54.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.54.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.54.0",
+ "@rollup/rollup-linux-x64-gnu": "4.54.0",
+ "@rollup/rollup-linux-x64-musl": "4.54.0",
+ "@rollup/rollup-openharmony-arm64": "4.54.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.54.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.54.0",
+ "@rollup/rollup-win32-x64-gnu": "4.54.0",
+ "@rollup/rollup-win32-x64-msvc": "4.54.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/std-env": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ste-core": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-3.0.11.tgz",
+ "integrity": "sha512-ivkRENMh0mdGoPlZ4xVcEaC8rXQfTEfvonRw5m8VDKV7kgcbZbaNd1TnKl08wXbcLdT7okSc63HNP8cVhy95zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.2.4"
+ }
+ },
+ "node_modules/ste-simple-events": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-3.0.11.tgz",
+ "integrity": "sha512-PDoQajqiTtJLNDWfJCihzACiTVZyFsXi6hNAVNelNJoNmqj+BaWuhJ/NHaAHxzfSRoMbL+hFgfPqFmxiHhAQSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ste-core": "^3.0.11"
+ },
+ "engines": {
+ "node": ">=4.2.4"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
+ "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinypool": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz",
+ "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/tsdown": {
+ "version": "0.15.12",
+ "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.15.12.tgz",
+ "integrity": "sha512-c8VLlQm8/lFrOAg5VMVeN4NAbejZyVQkzd+ErjuaQgJFI/9MhR9ivr0H/CM7UlOF1+ELlF6YaI7sU/4itgGQ8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansis": "^4.2.0",
+ "cac": "^6.7.14",
+ "chokidar": "^4.0.3",
+ "debug": "^4.4.3",
+ "diff": "^8.0.2",
+ "empathic": "^2.0.0",
+ "hookable": "^5.5.3",
+ "rolldown": "1.0.0-beta.45",
+ "rolldown-plugin-dts": "^0.17.2",
+ "semver": "^7.7.3",
+ "tinyexec": "^1.0.1",
+ "tinyglobby": "^0.2.15",
+ "tree-kill": "^1.2.2",
+ "unconfig": "^7.3.3"
+ },
+ "bin": {
+ "tsdown": "dist/run.mjs"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@arethetypeswrong/core": "^0.18.1",
+ "publint": "^0.3.0",
+ "typescript": "^5.0.0",
+ "unplugin-lightningcss": "^0.4.0",
+ "unplugin-unused": "^0.5.0",
+ "unrun": "^0.2.1"
+ },
+ "peerDependenciesMeta": {
+ "@arethetypeswrong/core": {
+ "optional": true
+ },
+ "publint": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "unplugin-lightningcss": {
+ "optional": true
+ },
+ "unplugin-unused": {
+ "optional": true
+ },
+ "unrun": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/tslog": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.10.2.tgz",
+ "integrity": "sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/fullstack-build/tslog?sponsor=1"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unconfig": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.4.2.tgz",
+ "integrity": "sha512-nrMlWRQ1xdTjSnSUqvYqJzbTBFugoqHobQj58B2bc8qxHKBBHMNNsWQFP3Cd3/JZK907voM2geYPWqD4VK3MPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "defu": "^6.1.4",
+ "jiti": "^2.6.1",
+ "quansync": "^1.0.0",
+ "unconfig-core": "7.4.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unconfig-core": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.4.2.tgz",
+ "integrity": "sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@quansync/fs": "^1.0.0",
+ "quansync": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz",
+ "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+ "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.4.1",
+ "es-module-lexer": "^1.7.0",
+ "pathe": "^2.0.3",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz",
+ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/expect": "3.2.4",
+ "@vitest/mocker": "3.2.4",
+ "@vitest/pretty-format": "^3.2.4",
+ "@vitest/runner": "3.2.4",
+ "@vitest/snapshot": "3.2.4",
+ "@vitest/spy": "3.2.4",
+ "@vitest/utils": "3.2.4",
+ "chai": "^5.2.0",
+ "debug": "^4.4.1",
+ "expect-type": "^1.2.1",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.2",
+ "std-env": "^3.9.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.14",
+ "tinypool": "^1.1.1",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+ "vite-node": "3.2.4",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.2.4",
+ "@vitest/ui": "3.2.4",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 6f0e13b17..62946c6db 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"test": "vitest"
},
"dependencies": {
+ "@bufbuild/buf": "^1.61.0",
"@bufbuild/protobuf": "^2.9.0",
"@meshtastic/protobufs": "npm:@jsr/meshtastic__protobufs@^2.7.12-1",
"ste-simple-events": "^3.0.11",
diff --git a/packages/web/public/i18n/locales/ru-RU/channels.json b/packages/web/public/i18n/locales/ru-RU/channels.json
index 73c8baac3..29e567ccd 100644
--- a/packages/web/public/i18n/locales/ru-RU/channels.json
+++ b/packages/web/public/i18n/locales/ru-RU/channels.json
@@ -2,70 +2,70 @@
"page": {
"sectionLabel": "Каналы",
"channelName": "Канал: {{channelName}}",
- "broadcastLabel": "Первичный",
- "channelIndex": "Кн {{index}}",
- "import": "Импортировать",
+ "broadcastLabel": "Основной",
+ "channelIndex": "Канал {{index}}",
+ "import": "Импорт",
"export": "Экспорт"
},
"validation": {
- "pskInvalid": "Введите правильный {{bits}} бит PSK."
+ "pskInvalid": "Пожалуйста, введите действительный {{bits}} битный PSK."
},
"settings": {
"label": "Настройки канала",
- "description": "Настройка шифрования, MQTT и пр"
+ "description": "Криптография, MQTT и прочие настройки"
},
"role": {
"label": "Роль",
- "description": "Телеметрия устройства отправляется через ГЛАВНЫЙ. Только один ГЛАВНЫЙ разрешен",
+ "description": "Телеметрия устройства отправляется через ОСНОВНОЙ. Разрешен только один ОСНОВНОЙ",
"options": {
- "primary": "ГЛАВНЫЙ",
- "disabled": "ЗАПРЕЩЕННЫЙ",
+ "primary": "ОСНОВНОЙ",
+ "disabled": "ОТКЛЮЧЕН",
"secondary": "ВТОРИЧНЫЙ"
}
},
"psk": {
- "label": "Pre-Shared Ключ",
- "description": "Поддерживаемая длина PSK: 256-бит, 128-бит, 8-бит, Пустое (0-бит)",
- "generate": "Сгенерировать"
+ "label": "Предварительно разделяемый ключ",
+ "description": "Поддерживаемые длины PSK: 256-бит, 128-бит, 8-бит, Пустой (0-бит)",
+ "generate": "Создать"
},
"name": {
"label": "Имя",
- "description": "ЗАПРЕЩЕННЫЙ"
+ "description": "Уникальное имя для канала <12 байт, оставьте пустым для значения по умолчанию"
},
"uplinkEnabled": {
- "label": "Выгрузка Разрешена",
- "description": "Отправлять сообщения из местного mesh в MQTT"
+ "label": "Восходящая связь включена",
+ "description": "Отправлять сообщения из локальной сети в MQTT"
},
"downlinkEnabled": {
- "label": "Загрузка Разрешена",
- "description": "Отправлять сообщения из MQTT в местный mesh"
+ "label": "Нисходящая связь включена",
+ "description": "Отправлять сообщения из MQTT в локальную сеть"
},
"positionPrecision": {
- "label": "Позиция",
- "description": "Точность позиции для отправки в канал. Можно запретить.",
+ "label": "Местоположение",
+ "description": "Точность местоположения для обмена с каналом. Может быть отключено.",
"options": {
- "none": "Не делиться позицией",
- "precise": "Точная позиция",
- "metric_km23": "Около 23 километров",
- "metric_km12": "Около 12 километров",
- "metric_km5_8": "Within 5.8 kilometers",
- "metric_km2_9": "Within 2.9 kilometers",
- "metric_km1_5": "Около 1,5 километров",
- "metric_m700": "Около 700 метров",
- "metric_m350": "Около 350 метров",
- "metric_m200": "Около 200 метров",
- "metric_m90": "Около 90 метров",
- "metric_m50": "Около 50 метров",
- "imperial_mi15": "Около 15 миль",
- "imperial_mi7_3": "Within 7.3 miles",
- "imperial_mi3_6": "Within 3.6 miles",
- "imperial_mi1_8": "Within 1.8 miles",
- "imperial_mi0_9": "Within 0.9 miles",
- "imperial_mi0_5": "Within 0.5 miles",
- "imperial_mi0_2": "Около 0,2 миль",
- "imperial_ft600": "Около 600 футов",
- "imperial_ft300": "Около 300 футов",
- "imperial_ft150": "Около 150 футов"
+ "none": "Не делиться местоположением",
+ "precise": "Точное местоположение",
+ "metric_km23": "В пределах 23 километров",
+ "metric_km12": "В пределах 12 километров",
+ "metric_km5_8": "В пределах 5.8 километров",
+ "metric_km2_9": "В пределах 2.9 километров",
+ "metric_km1_5": "В пределах 1.5 километров",
+ "metric_m700": "В пределах 700 метров",
+ "metric_m350": "В пределах 350 метров",
+ "metric_m200": "В пределах 200 метров",
+ "metric_m90": "В пределах 90 метров",
+ "metric_m50": "В пределах 50 метров",
+ "imperial_mi15": "В пределах 15 миль",
+ "imperial_mi7_3": "В пределах 7.3 миль",
+ "imperial_mi3_6": "В пределах 3.6 миль",
+ "imperial_mi1_8": "В пределах 1.8 миль",
+ "imperial_mi0_9": "В пределах 0.9 миль",
+ "imperial_mi0_5": "В пределах 0.5 миль",
+ "imperial_mi0_2": "В пределах 0.2 миль",
+ "imperial_ft600": "В пределах 600 футов",
+ "imperial_ft300": "В пределах 300 футов",
+ "imperial_ft150": "В пределах 150 футов"
}
}
}
diff --git a/packages/web/public/i18n/locales/ru-RU/commandPalette.json b/packages/web/public/i18n/locales/ru-RU/commandPalette.json
index 2f6f27be2..a5b3673bb 100644
--- a/packages/web/public/i18n/locales/ru-RU/commandPalette.json
+++ b/packages/web/public/i18n/locales/ru-RU/commandPalette.json
@@ -1,51 +1,51 @@
{
- "emptyState": "Результаты не найдены..",
+ "emptyState": "Результаты не найдены.",
"page": {
- "title": "Меню"
+ "title": "Меню команд"
},
"pinGroup": {
- "label": "Закрепить меню"
+ "label": "Закрепить группу команд"
},
"unpinGroup": {
- "label": "Открепить меню"
+ "label": "Открепить группу команд"
},
"goto": {
"label": "Перейти",
"command": {
"messages": "Сообщения",
"map": "Карта",
- "config": "Настройка",
+ "config": "Конфигурация",
"nodes": "Узлы"
}
},
"manage": {
"label": "Управление",
"command": {
- "switchNode": "Выбрать узел",
+ "switchNode": "Переключить узел",
"connectNewNode": "Подключить новый узел"
}
},
"contextual": {
- "label": "Контекст",
+ "label": "Контекстные",
"command": {
- "qrCode": "QR Код",
+ "qrCode": "QR код",
"qrGenerator": "Генератор",
- "qrImport": "Импортировать",
- "scheduleShutdown": "Расписание выключения",
+ "qrImport": "Импорт",
+ "scheduleShutdown": "Запланировать выключение",
"scheduleReboot": "Перезагрузить устройство",
- "resetNodeDb": "Стереть базу данных узлов",
+ "resetNodeDb": "Сбросить базу данных узлов",
"dfuMode": "Войти в режим DFU",
- "factoryResetDevice": "Сброс устройства к заводским установкам",
- "factoryResetConfig": "Factory Reset Config",
+ "factoryResetDevice": "Сброс устройства к заводским настройкам",
+ "factoryResetConfig": "Сброс конфигурации к заводским настройкам",
"disconnect": "Отключиться"
}
},
"debug": {
- "label": "Debug",
+ "label": "Отладка",
"command": {
"reconfigure": "Перенастроить",
- "clearAllStoredMessages": "Удалить все сохранённые сообщения",
- "clearAllStores": "Очистить всё локальное хранилище"
+ "clearAllStoredMessages": "Очистить все сохраненные сообщения",
+ "clearAllStores": "Очистить все локальное хранилище"
}
}
-}
+}
\ No newline at end of file
diff --git a/packages/web/public/i18n/locales/ru-RU/common.json b/packages/web/public/i18n/locales/ru-RU/common.json
index 6c8a25659..068e7e6a9 100644
--- a/packages/web/public/i18n/locales/ru-RU/common.json
+++ b/packages/web/public/i18n/locales/ru-RU/common.json
@@ -3,7 +3,7 @@
"apply": "Применить",
"addConnection": "Добавить подключение",
"saveConnection": "Сохранить подключение",
- "backupKey": "Бэкап ключа",
+ "backupKey": "Резервная копия ключа",
"cancel": "Отмена",
"connect": "Подключиться",
"clearMessages": "Очистить сообщения",
@@ -15,27 +15,27 @@
"disconnect": "Отключиться",
"export": "Экспорт",
"generate": "Создать",
- "regenerate": "Создать снова",
+ "regenerate": "Создать заново",
"import": "Импортировать",
"message": "Сообщение",
"now": "Сейчас",
- "ok": "Лады",
+ "ok": "ОК",
"print": "Печать",
"remove": "Удалить",
- "requestNewKeys": "Запрос нового ключа",
- "requestPosition": "Запрос позиции",
+ "requestNewKeys": "Запросить новые ключи",
+ "requestPosition": "Запросить позицию",
"reset": "Сброс",
"retry": "Повторить",
"save": "Сохранить",
"setDefault": "Установить по умолчанию",
- "unsetDefault": "Убрать умолчание",
+ "unsetDefault": "Убрать по умолчанию",
"scanQr": "Сканировать QR код",
"traceRoute": "Отследить маршрут",
"submit": "Отправить"
},
"app": {
"title": "Meshtastic",
- "fullTitle": "Веб клиент Meshtastic"
+ "fullTitle": "Веб-клиент Meshtastic"
},
"loading": "Загрузка...",
"unit": {
@@ -48,12 +48,12 @@
},
"hopsAway": {
"one": "{{count}} прыжок до",
- "plural": "{{count}} прыжков",
- "unknown": "? прыжков"
+ "plural": "{{count}} прыжков до",
+ "unknown": "Неизвестное количество прыжков"
},
"megahertz": "МГц",
"kilohertz": "кГц",
- "raw": "raw",
+ "raw": "сырые",
"meter": {
"one": "Метр",
"plural": "Метров",
@@ -92,74 +92,74 @@
"plural": "Месяцев"
},
"year": {
- "one": "Year",
- "plural": "Years"
+ "one": "Год",
+ "plural": "Лет"
},
- "snr": "Сигнал/шум",
+ "snr": "SNR",
"volt": {
- "one": "Volt",
- "plural": "Volts",
- "suffix": "V"
+ "one": "Вольт",
+ "plural": "Вольт",
+ "suffix": "В"
},
"record": {
- "one": "Records",
- "plural": "Records"
+ "one": "Запись",
+ "plural": "Записей"
},
"degree": {
- "one": "Degree",
- "plural": "Degrees",
+ "one": "Градус",
+ "plural": "Градусов",
"suffix": "°"
}
},
"security": {
- "0bit": "Empty",
- "8bit": "8 bit",
- "128bit": "128 bit",
- "256bit": "256 bit"
+ "0bit": "Пустой",
+ "8bit": "8 бит",
+ "128bit": "128 бит",
+ "256bit": "256 бит"
},
"unknown": {
"longName": "Неизвестно",
- "shortName": "UNK",
- "notAvailable": "N/A",
+ "shortName": "НЕИЗВ",
+ "notAvailable": "Н/Д",
"num": "??"
},
"nodeUnknownPrefix": "!",
- "unset": "UNSET",
+ "unset": "НЕ УСТАНОВЛЕНО",
"fallbackName": "Meshtastic {{last4}}",
- "node": "Node",
+ "node": "Узел",
"formValidation": {
- "unsavedChanges": "Unsaved changes",
+ "unsavedChanges": "Несохраненные изменения",
"tooBig": {
- "string": "Too long, expected less than or equal to {{maximum}} characters.",
- "number": "Too big, expected a number smaller than or equal to {{maximum}}.",
- "bytes": "Too big, expected less than or equal to {{params.maximum}} bytes."
+ "string": "Слишком длинно, ожидается не более {{maximum}} символов.",
+ "number": "Слишком большое значение, ожидается число не более {{maximum}}.",
+ "bytes": "Слишком большой размер, ожидается не более {{params.maximum}} байт."
},
"tooSmall": {
- "string": "Too short, expected more than or equal to {{minimum}} characters.",
- "number": "Too small, expected a number larger than or equal to {{minimum}}."
+ "string": "Слишком коротко, ожидается не менее {{minimum}} символов.",
+ "number": "Слишком маленькое значение, ожидается число не менее {{minimum}}."
},
"invalidFormat": {
- "ipv4": "Invalid format, expected an IPv4 address.",
- "key": "Invalid format, expected a Base64 encoded pre-shared key (PSK)."
+ "ipv4": "Неверный формат, ожидается IPv4 адрес.",
+ "key": "Неверный формат, ожидается предварительно разделяемый ключ (PSK) в кодировке Base64."
},
"invalidType": {
- "number": "Invalid type, expected a number."
+ "number": "Неверный тип, ожидается число."
},
"pskLength": {
- "0bit": "Key is required to be empty.",
- "8bit": "Key is required to be an 8 bit pre-shared key (PSK).",
- "128bit": "Key is required to be a 128 bit pre-shared key (PSK).",
- "256bit": "Key is required to be a 256 bit pre-shared key (PSK)."
+ "0bit": "Ключ должен быть пустым.",
+ "8bit": "Требуется 8-битный предварительно разделяемый ключ (PSK).",
+ "128bit": "Требуется 128-битный предварительно разделяемый ключ (PSK).",
+ "256bit": "Требуется 256-битный предварительно разделяемый ключ (PSK)."
},
"required": {
- "generic": "This field is required.",
- "managed": "At least one admin key is requred if the node is managed.",
- "key": "Key is required."
+ "generic": "Это поле обязательно для заполнения.",
+ "managed": "Требуется хотя бы один ключ администратора, если узел находится в управляемом режиме.",
+ "key": "Ключ обязателен."
},
"invalidOverrideFreq": {
- "number": "Invalid format, expected a value in the range 410-930 MHz or 0 (use default)."
+ "number": "Неверный формат, ожидается значение в диапазоне 410-930 МГц или 0 (использовать по умолчанию)."
}
},
- "yes": "Yes",
- "no": "No"
-}
+ "yes": "Да",
+ "no": "Нет"
+}
\ No newline at end of file
diff --git a/packages/web/public/i18n/locales/ru-RU/config.json b/packages/web/public/i18n/locales/ru-RU/config.json
index 5db23172e..17f2daaae 100644
--- a/packages/web/public/i18n/locales/ru-RU/config.json
+++ b/packages/web/public/i18n/locales/ru-RU/config.json
@@ -13,446 +13,458 @@
"tabSecurity": "Безопасность"
},
"sidebar": {
- "label": "Configuration"
+ "label": "Конфигурация"
},
"device": {
- "title": "Device Settings",
- "description": "Settings for the device",
+ "title": "Настройки устройства",
+ "description": "Настройки для устройства",
"buttonPin": {
- "description": "Button pin override",
- "label": "Button Pin"
+ "description": "Переопределение пина кнопки",
+ "label": "Пин кнопки"
},
"buzzerPin": {
- "description": "Buzzer pin override",
- "label": "Buzzer Pin"
+ "description": "Переопределение пина зуммера",
+ "label": "Пин зуммера"
},
"disableTripleClick": {
- "description": "Disable triple click",
- "label": "Disable Triple Click"
+ "description": "Отключить тройное нажатие",
+ "label": "Отключить тройное нажатие"
},
"doubleTapAsButtonPress": {
- "description": "Treat double tap as button press",
- "label": "Double Tap as Button Press"
+ "description": "Обрабатывать двойное касание как нажатие кнопки",
+ "label": "Двойное касание как нажатие кнопки"
},
"ledHeartbeatDisabled": {
- "description": "Disable default blinking LED",
- "label": "LED Heartbeat Disabled"
+ "description": "Отключить мигание светодиода по умолчанию",
+ "label": "Отключен пульс светодиода"
},
"nodeInfoBroadcastInterval": {
- "description": "How often to broadcast node info",
- "label": "Интервал вещания передачи информации об узле"
+ "description": "Как часто транслировать информацию об узле",
+ "label": "Интервал вещания информации об узле"
},
"posixTimezone": {
- "description": "The POSIX timezone string for the device",
+ "description": "Строка часового пояса POSIX для устройства",
"label": "Часовой пояс POSIX"
},
"rebroadcastMode": {
- "description": "How to handle rebroadcasting",
- "label": "Режим ретрансляции"
+ "description": "Как обрабатывать повторную трансляцию",
+ "label": "Режим повторной трансляции"
},
"role": {
- "description": "What role the device performs on the mesh",
+ "description": "Какую роль выполняет устройство в сети",
"label": "Роль"
}
},
"bluetooth": {
- "title": "Bluetooth Settings",
- "description": "Settings for the Bluetooth module",
- "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.",
+ "title": "Настройки Bluetooth",
+ "description": "Настройки для модуля Bluetooth",
+ "note": "Примечание: Некоторые устройства (ESP32) не могут использовать Bluetooth и WiFi одновременно.",
"enabled": {
- "description": "Enable or disable Bluetooth",
+ "description": "Включить или отключить Bluetooth",
"label": "Включено"
},
"pairingMode": {
- "description": "Pin selection behaviour.",
+ "description": "Поведение выбора пина.",
"label": "Режим сопряжения"
},
"pin": {
- "description": "Pin to use when pairing",
- "label": "Pin"
+ "description": "Пин для использования при сопряжении",
+ "label": "Пин"
}
},
"display": {
- "description": "Settings for the device display",
- "title": "Display Settings",
+ "description": "Настройки для дисплея устройства",
+ "title": "Настройки дисплея",
"headingBold": {
- "description": "Bolden the heading text",
- "label": "Выделять жирным заголовок"
+ "description": "Сделать заголовок жирным",
+ "label": "Жирный заголовок"
},
"carouselDelay": {
- "description": "How fast to cycle through windows",
- "label": "Carousel Delay"
+ "description": "Как быстро переключаться между окнами",
+ "label": "Задержка карусели"
},
"compassNorthTop": {
- "description": "Fix north to the top of compass",
- "label": "Compass North Top"
+ "description": "Закрепить север вверху компаса",
+ "label": "Север компаса сверху"
},
"displayMode": {
- "description": "Screen layout variant",
- "label": "Display Mode"
+ "description": "Вариант компоновки экрана",
+ "label": "Режим отображения"
},
"displayUnits": {
- "description": "Display metric or imperial units",
- "label": "Display Units"
+ "description": "Отображать метрические или имперские единицы",
+ "label": "Единицы отображения"
},
"flipScreen": {
- "description": "Flip display 180 degrees",
- "label": "Flip Screen"
+ "description": "Перевернуть дисплей на 180 градусов",
+ "label": "Перевернуть экран"
},
"gpsDisplayUnits": {
- "description": "Coordinate display format",
- "label": "GPS Display Units"
+ "description": "Формат отображения координат",
+ "label": "Единицы отображения GPS"
},
"oledType": {
- "description": "Type of OLED screen attached to the device",
- "label": "OLED Type"
+ "description": "Тип OLED экрана, подключенного к устройству",
+ "label": "Тип OLED"
},
"screenTimeout": {
- "description": "Turn off the display after this long",
- "label": "Screen Timeout"
+ "description": "Выключить дисплей через это время",
+ "label": "Таймаут экрана"
},
"twelveHourClock": {
- "description": "Use 12-hour clock format",
- "label": "12-Hour Clock"
+ "description": "Использовать 12-часовой формат времени",
+ "label": "12-часовой формат"
},
"wakeOnTapOrMotion": {
- "description": "Wake the device on tap or motion",
- "label": "Wake on Tap or Motion"
+ "description": "Пробуждать устройство при касании или движении",
+ "label": "Пробуждение при касании или движении"
}
},
"lora": {
- "title": "Mesh Settings",
- "description": "Settings for the LoRa mesh",
+ "title": "Настройки сети",
+ "description": "Настройки для сети LoRa",
"bandwidth": {
- "description": "Channel bandwidth in kHz",
- "label": "Ширина канала"
+ "description": "Пропускная способность канала в кГц",
+ "label": "Пропускная способность"
},
"boostedRxGain": {
- "description": "Boosted RX gain",
- "label": "Boosted RX Gain"
+ "description": "Усиленный прием RX",
+ "label": "Усиленный прием RX"
},
"codingRate": {
- "description": "The denominator of the coding rate",
- "label": "Частота кодирования"
+ "description": "Знаменатель коэффициента кодирования",
+ "label": "Коэффициент кодирования"
},
"frequencyOffset": {
- "description": "Frequency offset to correct for crystal calibration errors",
- "label": "Frequency Offset"
+ "description": "Смещение частоты для коррекции ошибок калибровки кристалла",
+ "label": "Смещение частоты"
},
"frequencySlot": {
- "description": "LoRa frequency channel number",
- "label": "Частота слота"
+ "description": "Номер частотного канала LoRa",
+ "label": "Частотный слот"
},
"hopLimit": {
- "description": "Maximum number of hops",
- "label": "Hop Limit"
+ "description": "Максимальное количество прыжков",
+ "label": "Лимит прыжков"
},
"ignoreMqtt": {
- "description": "Don't forward MQTT messages over the mesh",
+ "description": "Не пересылать MQTT сообщения по сети",
"label": "Игнорировать MQTT"
},
"modemPreset": {
- "description": "Modem preset to use",
- "label": "Режим работы модема"
+ "description": "Предустановка модема для использования",
+ "label": "Предустановка модема"
},
"okToMqtt": {
- "description": "When set to true, this configuration indicates that the user approves the packet to be uploaded to MQTT. If set to false, remote nodes are requested not to forward packets to MQTT",
- "label": "ОК в MQTT"
+ "description": "Когда установлено в true, эта конфигурация указывает, что пользователь одобряет загрузку пакета в MQTT. Если установлено в false, удаленные узлы запрашиваются не пересылать пакеты в MQTT",
+ "label": "Разрешено в MQTT"
},
"overrideDutyCycle": {
"description": "Переопределить рабочий цикл",
"label": "Переопределить рабочий цикл"
},
"overrideFrequency": {
- "description": "Override frequency",
- "label": "Override Frequency"
+ "description": "Переопределить частоту",
+ "label": "Переопределить частоту"
},
"region": {
- "description": "Sets the region for your node",
- "label": "Регион / Страна"
+ "description": "Устанавливает регион для вашего узла",
+ "label": "Регион"
},
"spreadingFactor": {
- "description": "Indicates the number of chirps per symbol",
- "label": "Spreading Factor"
+ "description": "Указывает количество чирпов на символ",
+ "label": "Коэффициент расширения"
},
"transmitEnabled": {
- "description": "Enable/Disable transmit (TX) from the LoRa radio",
+ "description": "Включить/Отключить передачу (TX) с радио LoRa",
"label": "Передача включена"
},
"transmitPower": {
- "description": "Max transmit power",
- "label": "Мощность передатчика"
+ "description": "Максимальная мощность передачи",
+ "label": "Мощность передачи"
},
"usePreset": {
- "description": "Use one of the predefined modem presets",
- "label": "Использовать шаблон"
+ "description": "Использовать одну из предопределенных предустановок модема",
+ "label": "Использовать предустановку"
},
"meshSettings": {
- "description": "Settings for the LoRa mesh",
- "label": "Mesh Settings"
+ "description": "Настройки для сети LoRa",
+ "label": "Настройки сети"
},
"waveformSettings": {
- "description": "Settings for the LoRa waveform",
- "label": "Waveform Settings"
+ "description": "Настройки для формы сигнала LoRa",
+ "label": "Настройки формы сигнала"
},
"radioSettings": {
- "label": "Radio Settings",
- "description": "Settings for the LoRa radio"
+ "label": "Настройки радио",
+ "description": "Настройки для радио LoRa"
}
},
"network": {
- "title": "WiFi Config",
- "description": "WiFi radio configuration",
- "note": "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.",
+ "title": "Конфигурация WiFi",
+ "description": "Конфигурация радио WiFi",
+ "note": "Примечание: Некоторые устройства (ESP32) не могут использовать Bluetooth и WiFi одновременно.",
"addressMode": {
- "description": "Address assignment selection",
- "label": "Address Mode"
+ "description": "Выбор назначения адреса",
+ "label": "Режим адреса"
},
"dns": {
- "description": "DNS Server",
+ "description": "DNS сервер",
"label": "DNS"
},
"ethernetEnabled": {
- "description": "Enable or disable the Ethernet port",
+ "description": "Включить или отключить порт Ethernet",
"label": "Включено"
},
"gateway": {
- "description": "Default Gateway",
+ "description": "Шлюз по умолчанию",
"label": "Шлюз"
},
"ip": {
- "description": "IP Address",
- "label": "IP-адрес"
+ "description": "IP адрес",
+ "label": "IP"
},
"psk": {
- "description": "Network password",
- "label": "Пароль"
+ "description": "Пароль сети",
+ "label": "PSK"
},
"ssid": {
- "description": "Network name",
- "label": "Название сети"
+ "description": "Имя сети",
+ "label": "SSID"
},
"subnet": {
- "description": "Subnet Mask",
+ "description": "Маска подсети",
"label": "Подсеть"
},
"wifiEnabled": {
- "description": "Enable or disable the WiFi radio",
+ "description": "Включить или отключить радио WiFi",
"label": "Включено"
},
"meshViaUdp": {
- "label": "Mesh via UDP"
+ "label": "Сеть через UDP"
},
"ntpServer": {
- "label": "NTP Server"
+ "label": "NTP сервер"
},
"rsyslogServer": {
- "label": "Rsyslog Server"
+ "label": "Rsyslog сервер"
},
"ethernetConfigSettings": {
- "description": "Ethernet port configuration",
- "label": "Ethernet Config"
+ "description": "Конфигурация порта Ethernet",
+ "label": "Конфигурация Ethernet"
},
"ipConfigSettings": {
- "description": "IP configuration",
- "label": "IP Config"
+ "description": "IP конфигурация",
+ "label": "Конфигурация IP"
},
"ntpConfigSettings": {
- "description": "NTP configuration",
- "label": "NTP Config"
+ "description": "NTP конфигурация",
+ "label": "Конфигурация NTP"
},
"rsyslogConfigSettings": {
- "description": "Rsyslog configuration",
- "label": "Rsyslog Config"
+ "description": "Rsyslog конфигурация",
+ "label": "Конфигурация Rsyslog"
},
"udpConfigSettings": {
- "description": "UDP over Mesh configuration",
- "label": "UDP Config"
+ "description": "Конфигурация UDP через сеть",
+ "label": "Конфигурация UDP"
}
},
"position": {
- "title": "Position Settings",
- "description": "Settings for the position module",
+ "title": "Настройки местоположения",
+ "description": "Настройки для модуля местоположения",
"broadcastInterval": {
- "description": "How often your position is sent out over the mesh",
- "label": "Период трансляции"
+ "description": "Как часто ваша позиция отправляется по сети",
+ "label": "Интервал вещания"
},
"enablePin": {
- "description": "GPS module enable pin override",
- "label": "Enable Pin"
+ "description": "Переопределение пина включения модуля GPS",
+ "label": "Пин включения"
},
"fixedPosition": {
- "description": "Don't report GPS position, but a manually-specified one",
- "label": "Фиксированное положение"
+ "description": "Не сообщать GPS позицию, а использовать вручную указанную",
+ "label": "Фиксированная позиция",
+ "latitude": {
+ "label": "Широта",
+ "description": "Десятичные градусы от -90 до 90 (например, 37.7749)"
+ },
+ "longitude": {
+ "label": "Долгота",
+ "description": "Десятичные градусы от -180 до 180 (например, -122.4194)"
+ },
+ "altitude": {
+ "label": "Высота",
+ "description": "Необязательно — введите высоту в {{unit}} над уровнем моря (например, 100). Оставьте пустым, если неизвестно, или добавьте дополнительную высоту для антенн/мачт."
+ }
},
"gpsMode": {
- "description": "Configure whether device GPS is Enabled, Disabled, or Not Present",
- "label": "GPS Mode"
+ "description": "Настроить, включен ли GPS устройства, отключен или отсутствует",
+ "label": "Режим GPS"
},
"gpsUpdateInterval": {
- "description": "How often a GPS fix should be acquired",
- "label": "GPS Update Interval"
+ "description": "Как часто должен получаться GPS фикс",
+ "label": "Интервал обновления GPS"
},
"positionFlags": {
- "description": "Optional fields to include when assembling position messages. The more fields are selected, the larger the message will be leading to longer airtime usage and a higher risk of packet loss.",
+ "description": "Необязательные поля для включения при сборке сообщений о позиции. Чем больше полей выбрано, тем больше будет сообщение, что приведет к более длительному использованию эфирного времени и более высокому риску потери пакетов.",
"label": "Флаги позиции"
},
"receivePin": {
- "description": "GPS module RX pin override",
- "label": "Receive Pin"
+ "description": "Переопределение пина RX модуля GPS",
+ "label": "Пин приема"
},
"smartPositionEnabled": {
- "description": "Only send position when there has been a meaningful change in location",
- "label": "Enable Smart Position"
+ "description": "Отправлять позицию только при значительном изменении местоположения",
+ "label": "Включить умную позицию"
},
"smartPositionMinDistance": {
- "description": "Minimum distance (in meters) that must be traveled before a position update is sent",
- "label": "Smart Position Minimum Distance"
+ "description": "Минимальное расстояние (в метрах), которое должно быть пройдено перед отправкой обновления позиции",
+ "label": "Минимальное расстояние умной позиции"
},
"smartPositionMinInterval": {
- "description": "Minimum interval (in seconds) that must pass before a position update is sent",
- "label": "Smart Position Minimum Interval"
+ "description": "Минимальный интервал (в секундах), который должен пройти перед отправкой обновления позиции",
+ "label": "Минимальный интервал умной позиции"
},
"transmitPin": {
- "description": "GPS module TX pin override",
- "label": "Transmit Pin"
+ "description": "Переопределение пина TX модуля GPS",
+ "label": "Пин передачи"
},
"intervalsSettings": {
- "description": "How often to send position updates",
- "label": "Intervals"
+ "description": "Как часто отправлять обновления позиции",
+ "label": "Интервалы"
},
"flags": {
- "placeholder": "Select position flags...",
+ "placeholder": "Выберите флаги позиции...",
"altitude": "Высота",
- "altitudeGeoidalSeparation": "Altitude Geoidal Separation",
- "altitudeMsl": "Altitude is Mean Sea Level",
- "dop": "Dilution of precision (DOP) PDOP used by default",
- "hdopVdop": "If DOP is set, use HDOP / VDOP values instead of PDOP",
- "numSatellites": "Number of satellites",
- "sequenceNumber": "Sequence number",
- "timestamp": "Отметка времени",
- "unset": "Не установлена",
- "vehicleHeading": "Vehicle heading",
- "vehicleSpeed": "Vehicle speed"
+ "altitudeGeoidalSeparation": "Разделение высоты геоида",
+ "altitudeMsl": "Высота над средним уровнем моря",
+ "dop": "Разбавление точности (DOP), по умолчанию используется PDOP",
+ "hdopVdop": "Если установлен DOP, использовать значения HDOP / VDOP вместо PDOP",
+ "numSatellites": "Количество спутников",
+ "sequenceNumber": "Номер последовательности",
+ "timestamp": "Временная метка",
+ "unset": "Не установлено",
+ "vehicleHeading": "Направление транспортного средства",
+ "vehicleSpeed": "Скорость транспортного средства"
}
},
"power": {
"adcMultiplierOverride": {
- "description": "Used for tweaking battery voltage reading",
- "label": "ADC Multiplier Override ratio"
+ "description": "Используется для настройки показаний напряжения батареи",
+ "label": "Коэффициент переопределения ADC"
},
"ina219Address": {
- "description": "Address of the INA219 battery monitor",
- "label": "INA219 Address"
+ "description": "Адрес монитора батареи INA219",
+ "label": "Адрес INA219"
},
"lightSleepDuration": {
- "description": "How long the device will be in light sleep for",
- "label": "Light Sleep Duration"
+ "description": "Как долго устройство будет в легком сне",
+ "label": "Длительность легкого сна"
},
"minimumWakeTime": {
- "description": "Minimum amount of time the device will stay awake for after receiving a packet",
- "label": "Minimum Wake Time"
+ "description": "Минимальное количество времени, которое устройство будет оставаться активным после получения пакета",
+ "label": "Минимальное время пробуждения"
},
"noConnectionBluetoothDisabled": {
- "description": "If the device does not receive a Bluetooth connection, the BLE radio will be disabled after this long",
- "label": "No Connection Bluetooth Disabled"
+ "description": "Если устройство не получает подключение Bluetooth, радио BLE будет отключено через это время",
+ "label": "Bluetooth отключен без подключения"
},
"powerSavingEnabled": {
- "description": "Select if powered from a low-current source (i.e. solar), to minimize power consumption as much as possible.",
+ "description": "Выберите, если питание от источника с низким током (например, солнечная батарея), чтобы минимизировать потребление энергии как можно больше.",
"label": "Включить режим энергосбережения"
},
"shutdownOnBatteryDelay": {
- "description": "Automatically shutdown node after this long when on battery, 0 for indefinite",
- "label": "Shutdown on battery delay"
+ "description": "Автоматически выключить узел через это время при работе от батареи, 0 для неограниченного времени",
+ "label": "Задержка выключения при работе от батареи"
},
"superDeepSleepDuration": {
- "description": "How long the device will be in super deep sleep for",
- "label": "Super Deep Sleep Duration"
+ "description": "Как долго устройство будет в глубоком сне",
+ "label": "Длительность глубокого сна"
},
"powerConfigSettings": {
- "description": "Settings for the power module",
- "label": "Настройка питания"
+ "description": "Настройки для модуля питания",
+ "label": "Конфигурация питания"
},
"sleepSettings": {
- "description": "Sleep settings for the power module",
- "label": "Sleep Settings"
+ "description": "Настройки сна для модуля питания",
+ "label": "Настройки сна"
}
},
"security": {
- "description": "Settings for the Security configuration",
- "title": "Security Settings",
- "button_backupKey": "Backup Key",
+ "description": "Настройки для конфигурации безопасности",
+ "title": "Настройки безопасности",
+ "button_backupKey": "Резервная копия ключа",
"adminChannelEnabled": {
- "description": "Allow incoming device control over the insecure legacy admin channel",
- "label": "Allow Legacy Admin"
+ "description": "Разрешить входящее управление устройством через небезопасный устаревший административный канал",
+ "label": "Разрешить устаревший административный доступ"
},
"enableDebugLogApi": {
- "description": "Output live debug logging over serial, view and export position-redacted device logs over Bluetooth",
- "label": "Enable Debug Log API"
+ "description": "Выводить отладочные логи в реальном времени через последовательный порт, просматривать и экспортировать логи устройства с удаленными позициями через Bluetooth",
+ "label": "Включить API отладочных логов"
},
"managed": {
- "description": "If enabled, device configuration options are only able to be changed remotely by a Remote Admin node via admin messages. Do not enable this option unless at least one suitable Remote Admin node has been setup, and the public key is stored in one of the fields above.",
- "label": "Managed"
+ "description": "Если включено, параметры конфигурации устройства могут быть изменены только удаленно узлом удаленного администратора через административные сообщения. Не включайте этот параметр, если не настроен хотя бы один подходящий узел удаленного администратора и публичный ключ не сохранен в одном из полей выше.",
+ "label": "Управляемый"
},
"privateKey": {
- "description": "Used to create a shared key with a remote device",
+ "description": "Используется для создания общего ключа с удаленным устройством",
"label": "Приватный ключ"
},
"publicKey": {
- "description": "Sent out to other nodes on the mesh to allow them to compute a shared secret key",
+ "description": "Отправляется другим узлам в сети, чтобы позволить им вычислить общий секретный ключ",
"label": "Публичный ключ"
},
"primaryAdminKey": {
- "description": "The primary public key authorized to send admin messages to this node",
- "label": "Primary Admin Key"
+ "description": "Основной публичный ключ, авторизованный для отправки административных сообщений на этот узел",
+ "label": "Основной ключ администратора"
},
"secondaryAdminKey": {
- "description": "The secondary public key authorized to send admin messages to this node",
- "label": "Secondary Admin Key"
+ "description": "Вторичный публичный ключ, авторизованный для отправки административных сообщений на этот узел",
+ "label": "Вторичный ключ администратора"
},
"serialOutputEnabled": {
- "description": "Serial Console over the Stream API",
- "label": "Serial Output Enabled"
+ "description": "Последовательная консоль через Stream API",
+ "label": "Последовательный вывод включен"
},
"tertiaryAdminKey": {
- "description": "The tertiary public key authorized to send admin messages to this node",
- "label": "Tertiary Admin Key"
+ "description": "Третичный публичный ключ, авторизованный для отправки административных сообщений на этот узел",
+ "label": "Третичный ключ администратора"
},
"adminSettings": {
- "description": "Settings for Admin",
- "label": "Admin Settings"
+ "description": "Настройки для администратора",
+ "label": "Настройки администратора"
},
"loggingSettings": {
- "description": "Settings for Logging",
- "label": "Logging Settings"
+ "description": "Настройки для логирования",
+ "label": "Настройки логирования"
}
},
"user": {
- "title": "User Settings",
- "description": "Configure your device name and identity settings",
+ "title": "Настройки пользователя",
+ "description": "Настройте имя устройства и параметры идентификации",
"longName": {
"label": "Полное имя",
- "description": "Your full display name (1-40 characters)",
+ "description": "Ваше полное отображаемое имя (1-40 символов)",
"validation": {
- "min": "Long name must be at least 1 character",
- "max": "Long name must be at most 40 characters"
+ "min": "Полное имя должно содержать не менее 1 символа",
+ "max": "Полное имя должно содержать не более 40 символов"
}
},
"shortName": {
"label": "Короткое имя",
- "description": "Your abbreviated name (2-4 characters)",
+ "description": "Ваше сокращенное имя (2-4 символа)",
"validation": {
- "min": "Short name must be at least 2 characters",
- "max": "Short name must be at most 4 characters"
+ "min": "Короткое имя должно содержать не менее 2 символов",
+ "max": "Короткое имя должно содержать не более 4 символов"
}
},
"isUnmessageable": {
- "label": "Не отправляемо",
- "description": "Used to identify unmonitored or infrastructure nodes so that messaging is not available to nodes that will never respond."
+ "label": "Недоступен для сообщений",
+ "description": "Используется для идентификации неконтролируемых или инфраструктурных узлов, чтобы обмен сообщениями был недоступен для узлов, которые никогда не ответят."
},
"isLicensed": {
"label": "Лицензированный радиолюбитель (HAM)",
- "description": "Enable if you are a licensed amateur radio operator, enabling this option disables encryption and is not compatible with the default Meshtastic network."
+ "description": "Включите, если вы лицензированный радиолюбитель, включение этого параметра отключает шифрование и несовместимо с сетью Meshtastic по умолчанию."
}
}
}
diff --git a/packages/web/public/i18n/locales/ru-RU/connections.json b/packages/web/public/i18n/locales/ru-RU/connections.json
index ed391076f..369dd33de 100644
--- a/packages/web/public/i18n/locales/ru-RU/connections.json
+++ b/packages/web/public/i18n/locales/ru-RU/connections.json
@@ -1,34 +1,34 @@
{
"page": {
- "title": "Connect to a Meshtastic device",
- "description": "Add a device connection via HTTP, Bluetooth, or Serial. Your saved connections will be saved in your browser."
+ "title": "Подключиться к устройству Meshtastic",
+ "description": "Добавьте подключение устройства через HTTP, Bluetooth или Serial. Ваши сохраненные подключения будут сохранены в вашем браузере."
},
"connectionType_ble": "BLE",
- "connectionType_serial": "COM-порт",
+ "connectionType_serial": "Serial",
"connectionType_network": "Сеть",
- "deleteConnection": "Delete connection",
- "areYouSure": "This will remove {{name}}. You canot undo this action.",
- "moreActions": "More actions",
+ "deleteConnection": "Удалить подключение",
+ "areYouSure": "Это удалит {{name}}. Вы не сможете отменить это действие.",
+ "moreActions": "Дополнительные действия",
"noConnections": {
- "title": "No connections yet.",
- "description": "Create your first connection. It will connect immediately and be saved for later."
+ "title": "Пока нет подключений.",
+ "description": "Создайте ваше первое подключение. Оно подключится сразу и будет сохранено для последующего использования."
},
- "lastConnectedAt": "Last connected: {{date}}",
- "neverConnected": "Never connected",
+ "lastConnectedAt": "Последнее подключение: {{date}}",
+ "neverConnected": "Никогда не подключалось",
"toasts": {
"connected": "Подключено",
- "nowConnected": "{{name}} is now connected",
- "nowDisconnected": "{{name}} are now disconnecte",
+ "nowConnected": "{{name}} теперь подключен",
+ "nowDisconnected": "{{name}} теперь отключен",
"disconnected": "Отключено",
- "failed": "Failed to connect",
- "checkConnetion": "Check your device or settings and try again",
- "defaultSet": "Default set",
- "defaultConnection": "Default connection is now {{nameisconnected}}",
- "deleted": "Deleted",
- "deletedByName": "{{name}} was removed",
- "pickConnectionAgain": "Could not connect. You may need to reselect the device/port.",
- "added": "Connection added",
- "savedByName": "{{name}} saved.",
- "savedCantConnect": "The connection was saved but could not connect."
+ "failed": "Не удалось подключиться",
+ "checkConnection": "Проверьте ваше устройство или настройки и попробуйте снова",
+ "defaultSet": "По умолчанию установлено",
+ "defaultConnection": "Подключение по умолчанию теперь {{nameisconnected}}",
+ "deleted": "Удалено",
+ "deletedByName": "{{name}} был удален",
+ "pickConnectionAgain": "Не удалось подключиться. Возможно, вам нужно повторно выбрать устройство/порт.",
+ "added": "Подключение добавлено",
+ "savedByName": "{{name}} сохранен.",
+ "savedCantConnect": "Подключение было сохранено, но не удалось подключиться."
}
-}
+}
\ No newline at end of file
diff --git a/packages/web/public/i18n/locales/ru-RU/dialog.json b/packages/web/public/i18n/locales/ru-RU/dialog.json
index 4ee529972..c9b092fa4 100644
--- a/packages/web/public/i18n/locales/ru-RU/dialog.json
+++ b/packages/web/public/i18n/locales/ru-RU/dialog.json
@@ -1,238 +1,238 @@
{
"deleteMessages": {
- "description": "This action will clear all message history. This cannot be undone. Are you sure you want to continue?",
- "title": "Clear All Messages"
+ "description": "Это действие очистит всю историю сообщений. Это нельзя отменить. Вы уверены, что хотите продолжить?",
+ "title": "Очистить все сообщения"
},
"import": {
- "description": "Import a Channel Set from a Meshtastic URL.
Valid Meshtasic URLs start with \"https://meshtastic.org/e/...\"",
+ "description": "Импортировать набор каналов из URL Meshtastic.
Действительные URL Meshtastic начинаются с \"https://meshtastic.org/e/...\"",
"error": {
- "invalidUrl": "Invalid Meshtastic URL"
+ "invalidUrl": "Неверный URL Meshtastic"
},
- "channelPrefix": "Channel ",
- "primary": "Primary ",
- "doNotImport": "No not import",
+ "channelPrefix": "Канал ",
+ "primary": "Основной ",
+ "doNotImport": "Не импортировать",
"channelName": "Имя",
"channelSlot": "Слот",
- "channelSetUrl": "Channel Set/QR Code URL",
- "useLoraConfig": "Import LoRa Config",
- "presetDescription": "The current LoRa Config will be replaced.",
- "title": "Import Channels"
+ "channelSetUrl": "URL набора каналов/QR кода",
+ "useLoraConfig": "Импортировать конфигурацию LoRa",
+ "presetDescription": "Текущая конфигурация LoRa будет заменена.",
+ "title": "Импорт каналов"
},
"locationResponse": {
- "title": "Location: {{identifier}}",
- "altitude": "Altitude: ",
- "coordinates": "Coordinates: ",
- "noCoordinates": "No Coordinates"
+ "title": "Местоположение: {{identifier}}",
+ "altitude": "Высота: ",
+ "coordinates": "Координаты: ",
+ "noCoordinates": "Нет координат"
},
"pkiRegenerateDialog": {
- "title": "Regenerate Pre-Shared Key?",
- "description": "Are you sure you want to regenerate the pre-shared key?",
- "regenerate": "Regenerate"
+ "title": "Пересоздать предварительно разделяемый ключ?",
+ "description": "Вы уверены, что хотите пересоздать предварительно разделяемый ключ?",
+ "regenerate": "Пересоздать"
},
"addConnection": {
- "title": "Add connection",
- "description": "Choose a connection type and fill in the details",
+ "title": "Добавить подключение",
+ "description": "Выберите тип подключения и заполните детали",
"validation": {
- "requiresWebBluetooth": "This connection type requires <0>Web Bluetooth0>. Please use a supported browser, like Chrome or Edge.",
- "requiresWebSerial": "This connection type requires <0>Web Serial0>. Please use a supported browser, like Chrome or Edge.",
- "requiresSecureContext": "This application requires a <0>secure context0>. Please connect using HTTPS or localhost.",
- "additionallyRequiresSecureContext": "Additionally, it requires a <0>secure context0>. Please connect using HTTPS or localhost."
+ "requiresWebBluetooth": "Этот тип подключения требует <0>Web Bluetooth0>. Пожалуйста, используйте поддерживаемый браузер, например Chrome или Edge.",
+ "requiresWebSerial": "Этот тип подключения требует <0>Web Serial0>. Пожалуйста, используйте поддерживаемый браузер, например Chrome или Edge.",
+ "requiresSecureContext": "Это приложение требует <0>безопасный контекст0>. Пожалуйста, подключитесь используя HTTPS или localhost.",
+ "additionallyRequiresSecureContext": "Кроме того, требуется <0>безопасный контекст0>. Пожалуйста, подключитесь используя HTTPS или localhost."
},
"bluetoothConnection": {
- "namePlaceholder": "My Bluetooth Node",
+ "namePlaceholder": "Мой Bluetooth узел",
"supported": {
- "title": "Web Bluetooth supported"
+ "title": "Web Bluetooth поддерживается"
},
"notSupported": {
- "title": "Web Bluetooth not supported",
- "description": "Your browser or device does not support Web Bluetooth"
+ "title": "Web Bluetooth не поддерживается",
+ "description": "Ваш браузер или устройство не поддерживает Web Bluetooth"
},
"short": "BT: {{deviceName}}",
- "long": "Bluetooth Device",
+ "long": "Bluetooth устройство",
"device": "Устройство",
- "selectDevice": "Select device",
- "selected": "Bluetooth device selected",
- "notSelected": "No device selected",
- "helperText": "Uses the Meshtastic Bluetooth service for discovery."
+ "selectDevice": "Выбрать устройство",
+ "selected": "Bluetooth устройство выбрано",
+ "notSelected": "Устройство не выбрано",
+ "helperText": "Использует службу Bluetooth Meshtastic для обнаружения."
},
"serialConnection": {
- "namePlaceholder": "My Serial Node",
- "helperText": "Selecting a port grants permission so the app can open it to connect.",
+ "namePlaceholder": "Мой Serial узел",
+ "helperText": "Выбор порта предоставляет разрешение, чтобы приложение могло открыть его для подключения.",
"supported": {
- "title": "Web Serial supported"
+ "title": "Web Serial поддерживается"
},
"notSupported": {
- "title": "Web Serial not supported",
- "description": "Your browser or device does not support Web Serial"
+ "title": "Web Serial не поддерживается",
+ "description": "Ваш браузер или устройство не поддерживает Web Serial"
},
"portSelected": {
- "title": "Serial port selected",
- "description": "Port permissions granted."
+ "title": "Последовательный порт выбран",
+ "description": "Разрешения на порт предоставлены."
},
- "port": "Port",
- "selectPort": "Select port",
+ "port": "Порт",
+ "selectPort": "Выбрать порт",
"deviceName": "USB {{vendorId}}:{{productId}}",
- "notSelected": "No port selected"
+ "notSelected": "Порт не выбран"
},
"httpConnection": {
- "namePlaceholder": "My HTTP Node",
- "inputPlaceholder": "192.168.1.10 or meshtastic.local",
- "heading": "URL or IP",
- "useHttps": "Use HTTTPS",
+ "namePlaceholder": "Мой HTTP узел",
+ "inputPlaceholder": "192.168.1.10 или meshtastic.local",
+ "heading": "URL или IP",
+ "useHttps": "Использовать HTTPS",
"invalidUrl": {
- "title": "Invalid URL",
- "description": "Please enter a valid HTTP or HTTPS URL."
+ "title": "Неверный URL",
+ "description": "Пожалуйста, введите действительный HTTP или HTTPS URL."
},
"connectionTest": {
- "description": "Test the connetion before saving to verify the device is reachable.",
+ "description": "Протестируйте подключение перед сохранением, чтобы убедиться, что устройство доступно.",
"button": {
- "loading": "Testing...",
- "label": "Test connection"
+ "loading": "Тестирование...",
+ "label": "Тест подключения"
},
- "reachable": "Reachable",
- "notReachable": "Not reachable",
+ "reachable": "Доступно",
+ "notReachable": "Недоступно",
"success": {
- "title": "Connection test successful",
- "description": "The device appears to be reachable."
+ "title": "Тест подключения успешен",
+ "description": "Устройство кажется доступным."
},
"failure": {
- "title": "Connection test failed",
- "description": "Could not reach the device. Check the URL and try again."
+ "title": "Тест подключения не удался",
+ "description": "Не удалось достичь устройства. Проверьте URL и попробуйте снова."
}
}
}
},
"nodeDetails": {
"message": "Сообщение",
- "requestPosition": "Request Position",
- "traceRoute": "Trace Route",
- "airTxUtilization": "Air TX utilization",
- "allRawMetrics": "All Raw Metrics:",
- "batteryLevel": "Battery level",
- "channelUtilization": "Channel utilization",
- "details": "Details:",
- "deviceMetrics": "Device Metrics:",
- "hardware": "Hardware: ",
- "lastHeard": "Last Heard: ",
- "nodeHexPrefix": "Node Hex: ",
- "nodeNumber": "Node Number: ",
- "position": "Position:",
- "role": "Role: ",
- "uptime": "Uptime: ",
+ "requestPosition": "Запросить позицию",
+ "traceRoute": "Отследить маршрут",
+ "airTxUtilization": "Использование эфирного времени TX",
+ "allRawMetrics": "Все сырые метрики:",
+ "batteryLevel": "Уровень батареи",
+ "channelUtilization": "Использование канала",
+ "details": "Детали:",
+ "deviceMetrics": "Метрики устройства:",
+ "hardware": "Оборудование: ",
+ "lastHeard": "Последний раз слышан: ",
+ "nodeHexPrefix": "ID пользователя: ",
+ "nodeNumber": "Номер узла: ",
+ "position": "Позиция:",
+ "role": "Роль: ",
+ "uptime": "Время работы: ",
"voltage": "Напряжение",
- "title": "Node Details for {{identifier}}",
- "ignoreNode": "Ignore node",
- "removeNode": "Remove node",
- "unignoreNode": "Unignore node",
- "security": "Security:",
- "publicKey": "Public Key: ",
- "messageable": "Messageable: ",
- "KeyManuallyVerifiedTrue": "Public Key has been manually verified",
- "KeyManuallyVerifiedFalse": "Public Key is not manually verified"
+ "title": "Детали узла для {{identifier}}",
+ "ignoreNode": "Игнорировать узел",
+ "removeNode": "Удалить узел",
+ "unignoreNode": "Перестать игнорировать узел",
+ "security": "Безопасность:",
+ "publicKey": "Публичный ключ: ",
+ "messageable": "Доступен для сообщений: ",
+ "KeyManuallyVerifiedTrue": "Публичный ключ был проверен вручную",
+ "KeyManuallyVerifiedFalse": "Публичный ключ не проверен вручную"
},
"pkiBackup": {
- "loseKeysWarning": "If you lose your keys, you will need to reset your device.",
- "secureBackup": "Its important to backup your public and private keys and store your backup securely!",
- "footer": "=== END OF KEYS ===",
- "header": "=== MESHTASTIC KEYS FOR {{longName}} ({{shortName}}) ===",
- "privateKey": "Private Key:",
- "publicKey": "Public Key:",
+ "loseKeysWarning": "Если вы потеряете свои ключи, вам потребуется сбросить устройство.",
+ "secureBackup": "Важно создать резервную копию ваших публичного и приватного ключей и хранить резервную копию в безопасности!",
+ "footer": "=== КОНЕЦ КЛЮЧЕЙ ===",
+ "header": "=== КЛЮЧИ MESHTASTIC ДЛЯ {{longName}} ({{shortName}}) ===",
+ "privateKey": "Приватный ключ:",
+ "publicKey": "Публичный ключ:",
"fileName": "meshtastic_keys_{{longName}}_{{shortName}}.txt",
- "title": "Backup Keys"
+ "title": "Резервная копия ключей"
},
"pkiBackupReminder": {
- "description": "We recommend backing up your key data regularly. Would you like to back up now?",
- "title": "Backup Reminder",
- "remindLaterPrefix": "Remind me in",
- "remindNever": "Never remind me",
- "backupNow": "Back up now"
+ "description": "Мы рекомендуем регулярно создавать резервные копии данных ключей. Хотите создать резервную копию сейчас?",
+ "title": "Напоминание о резервной копии",
+ "remindLaterPrefix": "Напомнить через",
+ "remindNever": "Никогда не напоминать",
+ "backupNow": "Создать резервную копию сейчас"
},
"pkiRegenerate": {
- "description": "Are you sure you want to regenerate key pair?",
- "title": "Regenerate Key Pair"
+ "description": "Вы уверены, что хотите пересоздать пару ключей?",
+ "title": "Пересоздать пару ключей"
},
"qr": {
- "addChannels": "Add Channels",
- "replaceChannels": "Replace Channels",
- "description": "The current LoRa configuration will also be shared.",
- "sharableUrl": "Sharable URL",
- "title": "Generate QR Code"
+ "addChannels": "Добавить каналы",
+ "replaceChannels": "Заменить каналы",
+ "description": "Текущая конфигурация LoRa также будет передана.",
+ "sharableUrl": "URL для обмена",
+ "title": "Создать QR код"
},
"reboot": {
- "title": "Reboot device",
- "description": "Reboot now or schedule a reboot of the connected node. Optionally, you can choose to reboot into OTA (Over-the-Air) mode.",
- "ota": "Reboot into OTA mode",
- "enterDelay": "Enter delay",
- "scheduled": "Reboot has been scheduled",
- "schedule": "Schedule reboot",
- "now": "Reboot now",
- "cancel": "Cancel scheduled reboot"
+ "title": "Перезагрузить устройство",
+ "description": "Перезагрузить сейчас или запланировать перезагрузку подключенного узла. Опционально, вы можете выбрать перезагрузку в режим OTA (Over-the-Air).",
+ "ota": "Перезагрузить в режим OTA",
+ "enterDelay": "Введите задержку",
+ "scheduled": "Перезагрузка запланирована",
+ "schedule": "Запланировать перезагрузку",
+ "now": "Перезагрузить сейчас",
+ "cancel": "Отменить запланированную перезагрузку"
},
"refreshKeys": {
"description": {
- "acceptNewKeys": "This will remove the node from device and request new keys.",
- "keyMismatchReasonSuffix": ". This is due to the remote node's current public key does not match the previously stored key for this node.",
- "unableToSendDmPrefix": "Your node is unable to send a direct message to node: "
+ "acceptNewKeys": "Это удалит узел из устройства и запросит новые ключи.",
+ "keyMismatchReasonSuffix": ". Это происходит из-за того, что текущий публичный ключ удаленного узла не соответствует ранее сохраненному ключу для этого узла.",
+ "unableToSendDmPrefix": "Ваш узел не может отправить прямое сообщение узлу: "
},
- "acceptNewKeys": "Accept New Keys",
- "title": "Keys Mismatch - {{identifier}}"
+ "acceptNewKeys": "Принять новые ключи",
+ "title": "Несоответствие ключей - {{identifier}}"
},
"removeNode": {
- "description": "Are you sure you want to remove this Node?",
- "title": "Remove Node?"
+ "description": "Вы уверены, что хотите удалить этот узел?",
+ "title": "Удалить узел?"
},
"shutdown": {
- "title": "Schedule Shutdown",
- "description": "Turn off the connected node after x minutes."
+ "title": "Запланировать выключение",
+ "description": "Выключить подключенный узел через x минут."
},
"traceRoute": {
- "routeToDestination": "Route to destination:",
- "routeBack": "Route back:"
+ "routeToDestination": "Маршрут к месту назначения:",
+ "routeBack": "Обратный маршрут:"
},
"tracerouteResponse": {
- "title": "Traceroute: {{identifier}}"
+ "title": "Трассировка: {{identifier}}"
},
"unsafeRoles": {
- "confirmUnderstanding": "Yes, I know what I'm doing",
- "conjunction": " and the blog post about ",
- "postamble": " and understand the implications of changing the role.",
- "preamble": "I have read the ",
- "choosingRightDeviceRole": "Choosing The Right Device Role",
- "deviceRoleDocumentation": "Device Role Documentation",
+ "confirmUnderstanding": "Да, я знаю, что делаю",
+ "conjunction": " и статью в блоге о ",
+ "postamble": " и понимаю последствия изменения роли.",
+ "preamble": "Я прочитал ",
+ "choosingRightDeviceRole": "Выбор правильной роли устройства",
+ "deviceRoleDocumentation": "Документация по ролям устройства",
"title": "Вы уверены?"
},
"managedMode": {
- "confirmUnderstanding": "Yes, I know what I'm doing",
+ "confirmUnderstanding": "Да, я знаю, что делаю",
"title": "Вы уверены?",
- "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration."
+ "description": "Включение управляемого режима блокирует клиентские приложения (включая веб-клиент) от записи конфигураций в радио. После включения конфигурации радио могут быть изменены только через сообщения удаленного администратора. Этот параметр не требуется для удаленного администрирования узлов."
},
"clientNotification": {
- "title": "Уведомления клиента",
- "TraceRoute can only be sent once every 30 seconds": "TraceRoute can only be sent once every 30 seconds",
- "Compromised keys were detected and regenerated.": "Compromised keys were detected and regenerated."
+ "title": "Уведомление клиента",
+ "TraceRoute can only be sent once every 30 seconds": "Трассировка может быть отправлена только раз в 30 секунд",
+ "Compromised keys were detected and regenerated.": "Обнаружены скомпрометированные ключи и они были пересозданы."
},
"resetNodeDb": {
- "title": "Reset Node Database",
- "description": "This will clear all nodes from the connected device's node database and clear all message history in the client. This cannot be undone. Are you sure you want to continue?",
- "confirm": "Reset Node Database",
- "failedTitle": "There was an error resetting the Node DB. Please try again."
+ "title": "Сбросить базу данных узлов",
+ "description": "Это очистит все узлы из базы данных узлов подключенного устройства и очистит всю историю сообщений в клиенте. Это нельзя отменить. Вы уверены, что хотите продолжить?",
+ "confirm": "Сбросить базу данных узлов",
+ "failedTitle": "Произошла ошибка при сбросе базы данных узлов. Пожалуйста, попробуйте снова."
},
"clearAllStores": {
- "title": "Clear All Local Storage",
- "description": "This will clear all locally stored data, including message history and node databases for all previously connected devices. This will require you to reconnect to your node once complete and cannot be undone. Are you sure you want to continue?",
- "confirm": "Clear all local storage",
- "failedTitle": "There was an error clearing local storage. Please try again."
+ "title": "Очистить все локальное хранилище",
+ "description": "Это очистит все локально сохраненные данные, включая историю сообщений и базы данных узлов для всех ранее подключенных устройств. Это потребует повторного подключения к вашему узлу после завершения и не может быть отменено. Вы уверены, что хотите продолжить?",
+ "confirm": "Очистить все локальное хранилище",
+ "failedTitle": "Произошла ошибка при очистке локального хранилища. Пожалуйста, попробуйте снова."
},
"factoryResetDevice": {
- "title": "Factory Reset Device",
- "description": "This will factory reset the connected device, erasing all configurations and data on the device as well as all nodes and messages saved in the client. This cannot be undone. Are you sure you want to continue?",
- "confirm": "Factory Reset Device",
- "failedTitle": "There was an error performing the factory reset. Please try again."
+ "title": "Сброс устройства к заводским настройкам",
+ "description": "Это выполнит сброс подключенного устройства к заводским настройкам, удалив все конфигурации и данные на устройстве, а также все узлы и сообщения, сохраненные в клиенте. Это нельзя отменить. Вы уверены, что хотите продолжить?",
+ "confirm": "Сброс устройства к заводским настройкам",
+ "failedTitle": "Произошла ошибка при выполнении сброса к заводским настройкам. Пожалуйста, попробуйте снова."
},
"factoryResetConfig": {
- "title": "Factory Reset Config",
- "description": "This will factory reset the configuration on the connected device, erasing all configurations on the device. This cannot be undone. Are you sure you want to continue?",
- "confirm": "Factory Reset Config",
- "failedTitle": "There was an error performing the factory reset. Please try again."
+ "title": "Сброс конфигурации к заводским настройкам",
+ "description": "Это выполнит сброс конфигурации подключенного устройства к заводским настройкам, удалив все конфигурации на устройстве. Это нельзя отменить. Вы уверены, что хотите продолжить?",
+ "confirm": "Сброс конфигурации к заводским настройкам",
+ "failedTitle": "Произошла ошибка при выполнении сброса к заводским настройкам. Пожалуйста, попробуйте снова."
}
-}
+}
\ No newline at end of file
diff --git a/packages/web/public/i18n/locales/ru-RU/map.json b/packages/web/public/i18n/locales/ru-RU/map.json
index fbd1597aa..2188b752f 100644
--- a/packages/web/public/i18n/locales/ru-RU/map.json
+++ b/packages/web/public/i18n/locales/ru-RU/map.json
@@ -1,38 +1,40 @@
{
"maplibre": {
- "GeolocateControl.FindMyLocation": "Find my location",
- "NavigationControl.ZoomIn": "Zoom in",
- "NavigationControl.ZoomOut": "Zoom out",
- "CooperativeGesturesHandler.WindowsHelpText": "Use Ctrl + scroll to zoom the map",
- "CooperativeGesturesHandler.MacHelpText": "Use ⌘ + scroll to zoom the map",
- "CooperativeGesturesHandler.MobileHelpText": "Use two fingers to move the map"
+ "GeolocateControl.FindMyLocation": "Найти мое местоположение",
+ "NavigationControl.ZoomIn": "Увеличить",
+ "NavigationControl.ZoomOut": "Уменьшить",
+ "CooperativeGesturesHandler.WindowsHelpText": "Используйте Ctrl + прокрутка для масштабирования карты",
+ "CooperativeGesturesHandler.MacHelpText": "Используйте ⌘ + прокрутка для масштабирования карты",
+ "CooperativeGesturesHandler.MobileHelpText": "Используйте два пальца для перемещения карты"
},
"layerTool": {
- "nodeMarkers": "Show nodes",
- "directNeighbors": "Show direct connections",
- "remoteNeighbors": "Show remote connections",
- "positionPrecision": "Show position precision",
- "traceroutes": "Show traceroutes",
- "waypoints": "Show waypoints"
+ "nodeMarkers": "Показать узлы",
+ "directNeighbors": "Показать прямые соединения",
+ "remoteNeighbors": "Показать удаленные соединения",
+ "positionPrecision": "Показать точность позиции",
+ "traceroutes": "Показать трассировки",
+ "waypoints": "Показать точки маршрута",
+ "heatmap": "Показать тепловую карту",
+ "density": "Плотность"
},
"mapMenu": {
- "locateAria": "Locate my node",
- "layersAria": "Change map style"
+ "locateAria": "Найти мой узел",
+ "layersAria": "Изменить стиль карты"
},
"waypointDetail": {
"edit": "Редактировать",
- "description": "Description:",
- "createdBy": "Edited by:",
- "createdDate": "Created:",
- "updated": "Updated:",
- "expires": "Expires:",
- "distance": "Distance:",
- "bearing": "Absolute bearing:",
- "lockedTo": "Locked by:",
- "latitude": "Latitude:",
- "longitude": "Longitude:"
+ "description": "Описание:",
+ "createdBy": "Создано:",
+ "createdDate": "Создано:",
+ "updated": "Обновлено:",
+ "expires": "Истекает:",
+ "distance": "Расстояние:",
+ "bearing": "Абсолютный азимут:",
+ "lockedTo": "Заблокировано:",
+ "latitude": "Широта:",
+ "longitude": "Долгота:"
},
"myNode": {
- "tooltip": "This device"
+ "tooltip": "Это устройство"
}
}
diff --git a/packages/web/public/i18n/locales/ru-RU/messages.json b/packages/web/public/i18n/locales/ru-RU/messages.json
index 378300fa1..72bb602dd 100644
--- a/packages/web/public/i18n/locales/ru-RU/messages.json
+++ b/packages/web/public/i18n/locales/ru-RU/messages.json
@@ -1,39 +1,39 @@
{
"page": {
- "title": "Messages: {{chatName}}",
- "placeholder": "Enter Message"
+ "title": "Сообщения: {{chatName}}",
+ "placeholder": "Введите сообщение"
},
"emptyState": {
- "title": "Select a Chat",
- "text": "No messages yet."
+ "title": "Выберите чат",
+ "text": "Пока нет сообщений."
},
"selectChatPrompt": {
- "text": "Select a channel or node to start messaging."
+ "text": "Выберите канал или узел, чтобы начать обмен сообщениями."
},
"sendMessage": {
- "placeholder": "Enter your message here...",
+ "placeholder": "Введите ваше сообщение здесь...",
"sendButton": "Отправить"
},
"actionsMenu": {
- "addReactionLabel": "Add Reaction",
+ "addReactionLabel": "Добавить реакцию",
"replyLabel": "Ответить"
},
"deliveryStatus": {
"delivered": {
- "label": "Message delivered",
- "displayText": "Message delivered"
+ "label": "Сообщение доставлено",
+ "displayText": "Доставлено"
},
"failed": {
- "label": "Message delivery failed",
- "displayText": "Delivery failed"
+ "label": "Ошибка доставки сообщения",
+ "displayText": "Ошибка доставки"
},
"unknown": {
- "label": "Message status unknown",
- "displayText": "Unknown state"
+ "label": "Статус сообщения неизвестен",
+ "displayText": "Неизвестное состояние"
},
"waiting": {
- "label": "Sending message",
- "displayText": "Waiting for delivery"
+ "label": "Отправка сообщения",
+ "displayText": "Ожидание доставки"
}
}
}
diff --git a/packages/web/public/i18n/locales/ru-RU/moduleConfig.json b/packages/web/public/i18n/locales/ru-RU/moduleConfig.json
index 59362373e..840eca1c4 100644
--- a/packages/web/public/i18n/locales/ru-RU/moduleConfig.json
+++ b/packages/web/public/i18n/locales/ru-RU/moduleConfig.json
@@ -1,448 +1,448 @@
{
"page": {
- "tabAmbientLighting": "Световое освещение",
- "tabAudio": "Звук",
- "tabCannedMessage": "Canned",
+ "tabAmbientLighting": "Окружающее освещение",
+ "tabAudio": "Аудио",
+ "tabCannedMessage": "Готовые сообщения",
"tabDetectionSensor": "Датчик обнаружения",
- "tabExternalNotification": "Ext Notif",
+ "tabExternalNotification": "Внешние уведомления",
"tabMqtt": "MQTT",
- "tabNeighborInfo": "Информация об окружности",
- "tabPaxcounter": "Счётчик прохожих",
- "tabRangeTest": "Проверка дальности",
- "tabSerial": "COM-порт",
- "tabStoreAndForward": "S&F",
+ "tabNeighborInfo": "Информация о соседях",
+ "tabPaxcounter": "Счетчик людей",
+ "tabRangeTest": "Тест дальности",
+ "tabSerial": "Последовательный порт",
+ "tabStoreAndForward": "Хранение и пересылка",
"tabTelemetry": "Телеметрия"
},
"ambientLighting": {
- "title": "Ambient Lighting Settings",
- "description": "Settings for the Ambient Lighting module",
+ "title": "Настройки окружающего освещения",
+ "description": "Настройки для модуля окружающего освещения",
"ledState": {
- "label": "LED State",
- "description": "Sets LED to on or off"
+ "label": "Состояние светодиода",
+ "description": "Установить светодиод включенным или выключенным"
},
"current": {
"label": "Ток",
- "description": "Sets the current for the LED output. Default is 10"
+ "description": "Устанавливает ток для выхода светодиода. По умолчанию 10"
},
"red": {
"label": "Красный",
- "description": "Sets the red LED level. Values are 0-255"
+ "description": "Устанавливает уровень красного светодиода. Значения от 0 до 255"
},
"green": {
"label": "Зеленый",
- "description": "Sets the green LED level. Values are 0-255"
+ "description": "Устанавливает уровень зеленого светодиода. Значения от 0 до 255"
},
"blue": {
"label": "Синий",
- "description": "Sets the blue LED level. Values are 0-255"
+ "description": "Устанавливает уровень синего светодиода. Значения от 0 до 255"
}
},
"audio": {
- "title": "Audio Settings",
- "description": "Settings for the Audio module",
+ "title": "Настройки аудио",
+ "description": "Настройки для модуля аудио",
"codec2Enabled": {
- "label": "Codec 2 Enabled",
- "description": "Enable Codec 2 audio encoding"
+ "label": "Codec 2 включен",
+ "description": "Включить кодирование аудио Codec 2"
},
"pttPin": {
- "label": "PTT Pin",
- "description": "GPIO pin to use for PTT"
+ "label": "Пин PTT",
+ "description": "GPIO пин для использования для PTT"
},
"bitrate": {
- "label": "Bitrate",
- "description": "Bitrate to use for audio encoding"
+ "label": "Битрейт",
+ "description": "Битрейт для использования при кодировании аудио"
},
"i2sWs": {
"label": "i2S WS",
- "description": "GPIO pin to use for i2S WS"
+ "description": "GPIO пин для использования для i2S WS"
},
"i2sSd": {
"label": "i2S SD",
- "description": "GPIO pin to use for i2S SD"
+ "description": "GPIO пин для использования для i2S SD"
},
"i2sDin": {
"label": "i2S DIN",
- "description": "GPIO pin to use for i2S DIN"
+ "description": "GPIO пин для использования для i2S DIN"
},
"i2sSck": {
"label": "i2S SCK",
- "description": "GPIO pin to use for i2S SCK"
+ "description": "GPIO пин для использования для i2S SCK"
}
},
"cannedMessage": {
- "title": "Canned Message Settings",
- "description": "Settings for the Canned Message module",
+ "title": "Настройки готовых сообщений",
+ "description": "Настройки для модуля готовых сообщений",
"moduleEnabled": {
- "label": "Module Enabled",
- "description": "Enable Canned Message"
+ "label": "Модуль включен",
+ "description": "Включить готовые сообщения"
},
"rotary1Enabled": {
- "label": "Rotary Encoder #1 Enabled",
- "description": "Enable the rotary encoder"
+ "label": "Энкодер #1 включен",
+ "description": "Включить поворотный энкодер"
},
"inputbrokerPinA": {
- "label": "Encoder Pin A",
- "description": "GPIO Pin Value (1-39) For encoder port A"
+ "label": "Пин энкодера A",
+ "description": "Значение GPIO пина (1-39) для порта A энкодера"
},
"inputbrokerPinB": {
- "label": "Encoder Pin B",
- "description": "GPIO Pin Value (1-39) For encoder port B"
+ "label": "Пин энкодера B",
+ "description": "Значение GPIO пина (1-39) для порта B энкодера"
},
"inputbrokerPinPress": {
- "label": "Encoder Pin Press",
- "description": "GPIO Pin Value (1-39) For encoder Press"
+ "label": "Пин нажатия энкодера",
+ "description": "Значение GPIO пина (1-39) для нажатия энкодера"
},
"inputbrokerEventCw": {
- "label": "Clockwise event",
- "description": "Select input event."
+ "label": "Событие по часовой стрелке",
+ "description": "Выберите событие ввода."
},
"inputbrokerEventCcw": {
- "label": "Counter Clockwise event",
- "description": "Select input event."
+ "label": "Событие против часовой стрелки",
+ "description": "Выберите событие ввода."
},
"inputbrokerEventPress": {
- "label": "Press event",
- "description": "Select input event"
+ "label": "Событие нажатия",
+ "description": "Выберите событие ввода"
},
"updown1Enabled": {
- "label": "Up Down enabled",
- "description": "Enable the up / down encoder"
+ "label": "Вверх/вниз включен",
+ "description": "Включить энкодер вверх/вниз"
},
"allowInputSource": {
- "label": "Allow Input Source",
- "description": "Select from: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'"
+ "label": "Разрешить источник ввода",
+ "description": "Выберите из: '_any', 'rotEnc1', 'upDownEnc1', 'cardkb'"
},
"sendBell": {
- "label": "Send Bell",
- "description": "Sends a bell character with each message"
+ "label": "Отправить звонок",
+ "description": "Отправляет символ звонка с каждым сообщением"
}
},
"detectionSensor": {
- "title": "Detection Sensor Settings",
- "description": "Settings for the Detection Sensor module",
+ "title": "Настройки датчика обнаружения",
+ "description": "Настройки для модуля датчика обнаружения",
"enabled": {
"label": "Включено",
- "description": "Enable or disable Detection Sensor Module"
+ "description": "Включить или отключить модуль датчика обнаружения"
},
"minimumBroadcastSecs": {
- "label": "Minimum Broadcast Seconds",
- "description": "The interval in seconds of how often we can send a message to the mesh when a state change is detected"
+ "label": "Минимальные секунды вещания",
+ "description": "Интервал в секундах, как часто мы можем отправлять сообщение в сеть при обнаружении изменения состояния"
},
"stateBroadcastSecs": {
- "label": "State Broadcast Seconds",
- "description": "The interval in seconds of how often we should send a message to the mesh with the current state regardless of changes"
+ "label": "Секунды вещания состояния",
+ "description": "Интервал в секундах, как часто мы должны отправлять сообщение в сеть с текущим состоянием независимо от изменений"
},
"sendBell": {
- "label": "Send Bell",
- "description": "Send ASCII bell with alert message"
+ "label": "Отправить звонок",
+ "description": "Отправить ASCII звонок с сообщением предупреждения"
},
"name": {
- "label": "Friendly Name",
- "description": "Used to format the message sent to mesh, max 20 Characters"
+ "label": "Понятное имя",
+ "description": "Используется для форматирования сообщения, отправляемого в сеть, максимум 20 символов"
},
"monitorPin": {
- "label": "Monitor Pin",
- "description": "The GPIO pin to monitor for state changes"
+ "label": "Пин мониторинга",
+ "description": "GPIO пин для мониторинга изменений состояния"
},
"detectionTriggerType": {
- "label": "Detection Triggered Type",
- "description": "The type of trigger event to be used"
+ "label": "Тип триггера обнаружения",
+ "description": "Тип события триггера для использования"
},
"usePullup": {
- "label": "Use Pullup",
- "description": "Whether or not use INPUT_PULLUP mode for GPIO pin"
+ "label": "Использовать подтяжку",
+ "description": "Использовать ли режим INPUT_PULLUP для GPIO пина"
}
},
"externalNotification": {
- "title": "External Notification Settings",
- "description": "Configure the external notification module",
+ "title": "Настройки внешних уведомлений",
+ "description": "Настроить модуль внешних уведомлений",
"enabled": {
- "label": "Module Enabled",
- "description": "Enable External Notification"
+ "label": "Модуль включен",
+ "description": "Включить внешние уведомления"
},
"outputMs": {
- "label": "Output MS",
- "description": "Output MS"
+ "label": "Выход МС",
+ "description": "Выход МС"
},
"output": {
- "label": "Output",
- "description": "Output"
+ "label": "Выход",
+ "description": "Выход"
},
"outputVibra": {
- "label": "Output Vibrate",
- "description": "Output Vibrate"
+ "label": "Выход вибрации",
+ "description": "Выход вибрации"
},
"outputBuzzer": {
- "label": "Output Buzzer",
- "description": "Output Buzzer"
+ "label": "Выход зуммера",
+ "description": "Выход зуммера"
},
"active": {
- "label": "Active",
- "description": "Active"
+ "label": "Активный",
+ "description": "Активный"
},
"alertMessage": {
- "label": "Alert Message",
- "description": "Alert Message"
+ "label": "Сообщение предупреждения",
+ "description": "Сообщение предупреждения"
},
"alertMessageVibra": {
- "label": "Alert Message Vibrate",
- "description": "Alert Message Vibrate"
+ "label": "Вибрация сообщения предупреждения",
+ "description": "Вибрация сообщения предупреждения"
},
"alertMessageBuzzer": {
- "label": "Alert Message Buzzer",
- "description": "Alert Message Buzzer"
+ "label": "Зуммер сообщения предупреждения",
+ "description": "Зуммер сообщения предупреждения"
},
"alertBell": {
- "label": "Alert Bell",
- "description": "Should an alert be triggered when receiving an incoming bell?"
+ "label": "Звонок предупреждения",
+ "description": "Должно ли срабатывать предупреждение при получении входящего звонка?"
},
"alertBellVibra": {
- "label": "Alert Bell Vibrate",
- "description": "Alert Bell Vibrate"
+ "label": "Вибрация звонка предупреждения",
+ "description": "Вибрация звонка предупреждения"
},
"alertBellBuzzer": {
- "label": "Alert Bell Buzzer",
- "description": "Alert Bell Buzzer"
+ "label": "Зуммер звонка предупреждения",
+ "description": "Зуммер звонка предупреждения"
},
"usePwm": {
- "label": "Use PWM",
- "description": "Use PWM"
+ "label": "Использовать PWM",
+ "description": "Использовать PWM"
},
"nagTimeout": {
- "label": "Nag Timeout",
- "description": "Nag Timeout"
+ "label": "Таймаут напоминания",
+ "description": "Таймаут напоминания"
},
"useI2sAsBuzzer": {
- "label": "Use I²S Pin as Buzzer",
- "description": "Designate I²S Pin as Buzzer Output"
+ "label": "Использовать пин I²S как зуммер",
+ "description": "Назначить пин I²S как выход зуммера"
}
},
"mqtt": {
- "title": "MQTT Settings",
- "description": "Settings for the MQTT module",
+ "title": "Настройки MQTT",
+ "description": "Настройки для модуля MQTT",
"enabled": {
"label": "Включено",
- "description": "Enable or disable MQTT"
+ "description": "Включить или отключить MQTT"
},
"address": {
- "label": "MQTT Server Address",
- "description": "MQTT server address to use for default/custom servers"
+ "label": "Адрес MQTT сервера",
+ "description": "Адрес MQTT сервера для использования для серверов по умолчанию/пользовательских"
},
"username": {
- "label": "MQTT Username",
- "description": "MQTT username to use for default/custom servers"
+ "label": "Имя пользователя MQTT",
+ "description": "Имя пользователя MQTT для использования для серверов по умолчанию/пользовательских"
},
"password": {
- "label": "MQTT Password",
- "description": "MQTT password to use for default/custom servers"
+ "label": "Пароль MQTT",
+ "description": "Пароль MQTT для использования для серверов по умолчанию/пользовательских"
},
"encryptionEnabled": {
- "label": "Encryption Enabled",
- "description": "Enable or disable MQTT encryption. Note: All messages are sent to the MQTT broker unencrypted if this option is not enabled, even when your uplink channels have encryption keys set. This includes position data."
+ "label": "Шифрование включено",
+ "description": "Включить или отключить шифрование MQTT. Примечание: Все сообщения отправляются на MQTT брокер без шифрования, если эта опция не включена, даже когда ваши каналы восходящей связи имеют установленные ключи шифрования. Это включает данные о позиции."
},
"jsonEnabled": {
- "label": "JSON Enabled",
- "description": "Whether to send/consume JSON packets on MQTT"
+ "label": "JSON включен",
+ "description": "Отправлять/получать ли JSON пакеты через MQTT"
},
"tlsEnabled": {
- "label": "TLS Enabled",
- "description": "Enable or disable TLS"
+ "label": "TLS включен",
+ "description": "Включить или отключить TLS"
},
"root": {
"label": "Корневая тема",
- "description": "MQTT root topic to use for default/custom servers"
+ "description": "Корневая тема MQTT для использования для серверов по умолчанию/пользовательских"
},
"proxyToClientEnabled": {
- "label": "MQTT Client Proxy Enabled",
- "description": "Utilizes the network connection to proxy MQTT messages to the client."
+ "label": "Прокси MQTT клиента включен",
+ "description": "Использует сетевое подключение для проксирования MQTT сообщений клиенту."
},
"mapReportingEnabled": {
- "label": "Map Reporting Enabled",
- "description": "Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name."
+ "label": "Отчеты карты включены",
+ "description": "Ваш узел будет периодически отправлять незашифрованный пакет отчета карты на настроенный MQTT сервер, это включает id, короткое и полное имя, приблизительное местоположение, модель оборудования, роль, версию прошивки, регион LoRa, предустановку модема и имя основного канала."
},
"mapReportSettings": {
"publishIntervalSecs": {
- "label": "Map Report Publish Interval (s)",
- "description": "Interval in seconds to publish map reports"
+ "label": "Интервал публикации отчета карты (с)",
+ "description": "Интервал в секундах для публикации отчетов карты"
},
"positionPrecision": {
- "label": "Approximate Location",
- "description": "Position shared will be accurate within this distance",
+ "label": "Приблизительное местоположение",
+ "description": "Позиция будет точной в пределах этого расстояния",
"options": {
- "metric_km23": "Within 23 km",
- "metric_km12": "Within 12 km",
- "metric_km5_8": "Within 5.8 km",
- "metric_km2_9": "Within 2.9 km",
- "metric_km1_5": "Within 1.5 km",
- "metric_m700": "Within 700 m",
- "metric_m350": "Within 350 m",
- "metric_m200": "Within 200 m",
- "metric_m90": "Within 90 m",
- "metric_m50": "Within 50 m",
- "imperial_mi15": "Within 15 miles",
- "imperial_mi7_3": "Within 7.3 miles",
- "imperial_mi3_6": "Within 3.6 miles",
- "imperial_mi1_8": "Within 1.8 miles",
- "imperial_mi0_9": "Within 0.9 miles",
- "imperial_mi0_5": "Within 0.5 miles",
- "imperial_mi0_2": "Within 0.2 miles",
- "imperial_ft600": "Within 600 feet",
- "imperial_ft300": "Within 300 feet",
- "imperial_ft150": "Within 150 feet"
+ "metric_km23": "В пределах 23 км",
+ "metric_km12": "В пределах 12 км",
+ "metric_km5_8": "В пределах 5.8 км",
+ "metric_km2_9": "В пределах 2.9 км",
+ "metric_km1_5": "В пределах 1.5 км",
+ "metric_m700": "В пределах 700 м",
+ "metric_m350": "В пределах 350 м",
+ "metric_m200": "В пределах 200 м",
+ "metric_m90": "В пределах 90 м",
+ "metric_m50": "В пределах 50 м",
+ "imperial_mi15": "В пределах 15 миль",
+ "imperial_mi7_3": "В пределах 7.3 миль",
+ "imperial_mi3_6": "В пределах 3.6 миль",
+ "imperial_mi1_8": "В пределах 1.8 миль",
+ "imperial_mi0_9": "В пределах 0.9 миль",
+ "imperial_mi0_5": "В пределах 0.5 миль",
+ "imperial_mi0_2": "В пределах 0.2 миль",
+ "imperial_ft600": "В пределах 600 футов",
+ "imperial_ft300": "В пределах 300 футов",
+ "imperial_ft150": "В пределах 150 футов"
}
}
}
},
"neighborInfo": {
- "title": "Neighbor Info Settings",
- "description": "Settings for the Neighbor Info module",
+ "title": "Настройки информации о соседях",
+ "description": "Настройки для модуля информации о соседях",
"enabled": {
"label": "Включено",
- "description": "Enable or disable Neighbor Info Module"
+ "description": "Включить или отключить модуль информации о соседях"
},
"updateInterval": {
"label": "Интервал обновления",
- "description": "Interval in seconds of how often we should try to send our Neighbor Info to the mesh"
+ "description": "Интервал в секундах, как часто мы должны пытаться отправлять нашу информацию о соседях в сеть"
}
},
"paxcounter": {
- "title": "Paxcounter Settings",
- "description": "Settings for the Paxcounter module",
+ "title": "Настройки счетчика людей",
+ "description": "Настройки для модуля счетчика людей",
"enabled": {
- "label": "Module Enabled",
- "description": "Enable Paxcounter"
+ "label": "Модуль включен",
+ "description": "Включить счетчик людей"
},
"paxcounterUpdateInterval": {
- "label": "Update Interval (seconds)",
- "description": "How long to wait between sending paxcounter packets"
+ "label": "Интервал обновления (секунды)",
+ "description": "Как долго ждать между отправкой пакетов счетчика людей"
},
"wifiThreshold": {
- "label": "WiFi RSSI Threshold",
- "description": "At what WiFi RSSI level should the counter increase. Defaults to -80."
+ "label": "Порог WiFi RSSI",
+ "description": "При каком уровне WiFi RSSI должен увеличиваться счетчик. По умолчанию -80."
},
"bleThreshold": {
- "label": "BLE RSSI Threshold",
- "description": "At what BLE RSSI level should the counter increase. Defaults to -80."
+ "label": "Порог BLE RSSI",
+ "description": "При каком уровне BLE RSSI должен увеличиваться счетчик. По умолчанию -80."
}
},
"rangeTest": {
- "title": "Range Test Settings",
- "description": "Settings for the Range Test module",
+ "title": "Настройки теста дальности",
+ "description": "Настройки для модуля теста дальности",
"enabled": {
- "label": "Module Enabled",
- "description": "Enable Range Test"
+ "label": "Модуль включен",
+ "description": "Включить тест дальности"
},
"sender": {
- "label": "Message Interval",
- "description": "How long to wait between sending test packets"
+ "label": "Интервал сообщений",
+ "description": "Как долго ждать между отправкой тестовых пакетов"
},
"save": {
- "label": "Save CSV to storage",
- "description": "ESP32 Only"
+ "label": "Сохранить CSV в хранилище",
+ "description": "Только ESP32"
}
},
"serial": {
- "title": "Serial Settings",
- "description": "Settings for the Serial module",
+ "title": "Настройки последовательного порта",
+ "description": "Настройки для модуля последовательного порта",
"enabled": {
- "label": "Module Enabled",
- "description": "Enable Serial output"
+ "label": "Модуль включен",
+ "description": "Включить вывод последовательного порта"
},
"echo": {
- "label": "Echo",
- "description": "Any packets you send will be echoed back to your device"
+ "label": "Эхо",
+ "description": "Любые пакеты, которые вы отправляете, будут возвращены обратно на ваше устройство"
},
"rxd": {
- "label": "Receive Pin",
- "description": "Set the GPIO pin to the RXD pin you have set up."
+ "label": "Пин приема",
+ "description": "Установить GPIO пин на пин RXD, который вы настроили."
},
"txd": {
- "label": "Transmit Pin",
- "description": "Set the GPIO pin to the TXD pin you have set up."
+ "label": "Пин передачи",
+ "description": "Установить GPIO пин на пин TXD, который вы настроили."
},
"baud": {
- "label": "Baud Rate",
- "description": "The serial baud rate"
+ "label": "Скорость передачи",
+ "description": "Скорость передачи последовательного порта"
},
"timeout": {
- "label": "Время ожидания истекло",
- "description": "Seconds to wait before we consider your packet as 'done'"
+ "label": "Таймаут",
+ "description": "Секунды ожидания, прежде чем мы считаем ваш пакет 'готовым'"
},
"mode": {
- "label": "Mode",
- "description": "Select Mode"
+ "label": "Режим",
+ "description": "Выбрать режим"
},
"overrideConsoleSerialPort": {
- "label": "Override Console Serial Port",
- "description": "If you have a serial port connected to the console, this will override it."
+ "label": "Переопределить последовательный порт консоли",
+ "description": "Если у вас есть последовательный порт, подключенный к консоли, это переопределит его."
}
},
"storeForward": {
- "title": "Store & Forward Settings",
- "description": "Settings for the Store & Forward module",
+ "title": "Настройки хранения и пересылки",
+ "description": "Настройки для модуля хранения и пересылки",
"enabled": {
- "label": "Module Enabled",
- "description": "Enable Store & Forward"
+ "label": "Модуль включен",
+ "description": "Включить хранение и пересылку"
},
"heartbeat": {
- "label": "Heartbeat Enabled",
- "description": "Enable Store & Forward heartbeat"
+ "label": "Пульс включен",
+ "description": "Включить пульс хранения и пересылки"
},
"records": {
"label": "Количество записей",
- "description": "Number of records to store"
+ "description": "Количество записей для хранения"
},
"historyReturnMax": {
- "label": "Макс возврат истории",
- "description": "Max number of records to return"
+ "label": "Максимум возврата истории",
+ "description": "Максимальное количество записей для возврата"
},
"historyReturnWindow": {
"label": "Окно возврата истории",
- "description": "Return records from this time window (minutes)"
+ "description": "Возвращать записи из этого временного окна (минуты)"
}
},
"telemetry": {
- "title": "Telemetry Settings",
- "description": "Settings for the Telemetry module",
+ "title": "Настройки телеметрии",
+ "description": "Настройки для модуля телеметрии",
"deviceUpdateInterval": {
- "label": "Device Metrics",
- "description": "Интервал обновления метрик устройства (в секундах)"
+ "label": "Метрики устройства",
+ "description": "Интервал обновления метрик устройства (секунды)"
},
"environmentUpdateInterval": {
- "label": "Интервал обновления метрик окружения (в секундах)",
+ "label": "Интервал обновления метрик окружения (секунды)",
"description": ""
},
"environmentMeasurementEnabled": {
- "label": "Module Enabled",
- "description": "Enable the Environment Telemetry"
+ "label": "Модуль включен",
+ "description": "Включить телеметрию окружения"
},
"environmentScreenEnabled": {
- "label": "Displayed on Screen",
- "description": "Show the Telemetry Module on the OLED"
+ "label": "Отображается на экране",
+ "description": "Показать модуль телеметрии на OLED"
},
"environmentDisplayFahrenheit": {
- "label": "Display Fahrenheit",
- "description": "Display temp in Fahrenheit"
+ "label": "Отображать по Фаренгейту",
+ "description": "Отображать температуру по Фаренгейту"
},
"airQualityEnabled": {
- "label": "Air Quality Enabled",
- "description": "Enable the Air Quality Telemetry"
+ "label": "Качество воздуха включено",
+ "description": "Включить телеметрию качества воздуха"
},
"airQualityInterval": {
- "label": "Air Quality Update Interval",
- "description": "How often to send Air Quality data over the mesh"
+ "label": "Интервал обновления качества воздуха",
+ "description": "Как часто отправлять данные о качестве воздуха по сети"
},
"powerMeasurementEnabled": {
- "label": "Power Measurement Enabled",
- "description": "Enable the Power Measurement Telemetry"
+ "label": "Измерение мощности включено",
+ "description": "Включить телеметрию измерения мощности"
},
"powerUpdateInterval": {
- "label": "Power Update Interval",
- "description": "How often to send Power data over the mesh"
+ "label": "Интервал обновления мощности",
+ "description": "Как часто отправлять данные о мощности по сети"
},
"powerScreenEnabled": {
- "label": "Power Screen Enabled",
- "description": "Enable the Power Telemetry Screen"
+ "label": "Экран мощности включен",
+ "description": "Включить экран телеметрии мощности"
}
}
}
diff --git a/packages/web/public/i18n/locales/ru-RU/nodes.json b/packages/web/public/i18n/locales/ru-RU/nodes.json
index ea231b707..a2e829765 100644
--- a/packages/web/public/i18n/locales/ru-RU/nodes.json
+++ b/packages/web/public/i18n/locales/ru-RU/nodes.json
@@ -1,59 +1,62 @@
{
"nodeDetail": {
"publicKeyEnabled": {
- "label": "Public Key Enabled"
+ "label": "Публичный ключ включен"
},
"noPublicKey": {
- "label": "No Public Key"
+ "label": "Нет публичного ключа"
},
"directMessage": {
- "label": "Direct Message {{shortName}}"
+ "label": "Прямое сообщение {{shortName}}"
},
"favorite": {
"label": "Избранное",
- "tooltip": "Add or remove this node from your favorites"
+ "tooltip": "Добавить или удалить этот узел из избранного"
},
"notFavorite": {
- "label": "Not a Favorite"
+ "label": "Не в избранном"
},
"error": {
- "label": "Ошибки",
- "text": "An error occurred while fetching node details. Please try again later."
+ "label": "Ошибка",
+ "text": "Произошла ошибка при получении деталей узла. Пожалуйста, попробуйте позже."
},
"status": {
- "heard": "Heard",
+ "heard": "Слышан",
"mqtt": "MQTT"
},
"elevation": {
- "label": "Elevation"
+ "label": "Высота"
},
"channelUtil": {
- "label": "Channel Util"
+ "label": "Исп. канала"
},
"airtimeUtil": {
- "label": "Airtime Util"
+ "label": "Исп. эфира"
}
},
"nodesTable": {
"headings": {
"longName": "Полное имя",
- "connection": "Соединения",
- "lastHeard": "Last Heard",
- "encryption": "Encryption",
- "model": "Model",
- "macAddress": "MAC Address"
+ "connection": "Подключение",
+ "lastHeard": "Последний раз слышан",
+ "encryption": "Шифрование",
+ "model": "Модель",
+ "macAddress": "MAC адрес"
},
"connectionStatus": {
"direct": "Прямой",
- "away": "away",
- "viaMqtt": ", via MQTT"
+ "away": "вдали",
+ "viaMqtt": ", через MQTT"
+ },
+ "lastHeardStatus": {
+ "never": "Никогда"
}
},
"actions": {
- "added": "Added",
- "removed": "Removed",
- "ignoreNode": "Ignore Node",
- "unignoreNode": "Unignore Node",
- "requestPosition": "Request Position"
+ "added": "Добавлен",
+ "removed": "Удален",
+ "ignoreNode": "Игнорировать узел",
+ "unignoreNode": "Перестать игнорировать узел",
+ "requestPosition": "Запросить позицию"
}
}
diff --git a/packages/web/public/i18n/locales/ru-RU/ui.json b/packages/web/public/i18n/locales/ru-RU/ui.json
index 492d459ec..9b336f166 100644
--- a/packages/web/public/i18n/locales/ru-RU/ui.json
+++ b/packages/web/public/i18n/locales/ru-RU/ui.json
@@ -1,111 +1,111 @@
{
"navigation": {
- "title": "Navigation",
+ "title": "Навигация",
"messages": "Сообщения",
"map": "Карта",
"settings": "Настройки",
"channels": "Каналы",
- "radioConfig": "Radio Config",
+ "radioConfig": "Настройки радио",
"deviceConfig": "Настройки устройства",
- "moduleConfig": "Module Config",
- "manageConnections": "Manage Connections",
+ "moduleConfig": "Настройки модулей",
+ "manageConnections": "Управление подключениями",
"nodes": "Узлы"
},
"app": {
"title": "Meshtastic",
- "logo": "Meshtastic Logo"
+ "logo": "Логотип Meshtastic"
},
"sidebar": {
"collapseToggle": {
"button": {
- "open": "Open sidebar",
- "close": "Close sidebar"
+ "open": "Открыть боковую панель",
+ "close": "Закрыть боковую панель"
}
},
"deviceInfo": {
- "volts": "{{voltage}} volts",
+ "volts": "{{voltage}} вольт",
"firmware": {
"title": "Прошивка",
"version": "v{{version}}",
- "buildDate": "Build date: {{date}}"
+ "buildDate": "Дата сборки: {{date}}"
}
}
},
"batteryStatus": {
- "charging": "{{level}}% charging",
- "pluggedIn": "Plugged in",
+ "charging": "{{level}}% зарядка",
+ "pluggedIn": "Подключено к сети",
"title": "Батарея"
},
"search": {
- "nodes": "Search nodes...",
- "channels": "Search channels...",
- "commandPalette": "Search commands..."
+ "nodes": "Поиск узлов...",
+ "channels": "Поиск каналов...",
+ "commandPalette": "Поиск команд..."
},
"toast": {
"positionRequestSent": {
- "title": "Position request sent."
+ "title": "Запрос позиции отправлен."
},
"requestingPosition": {
- "title": "Requesting position, please wait..."
+ "title": "Запрос позиции, пожалуйста, подождите..."
},
"sendingTraceroute": {
- "title": "Sending Traceroute, please wait..."
+ "title": "Отправка трассировки, пожалуйста, подождите..."
},
"tracerouteSent": {
- "title": "Traceroute sent."
+ "title": "Трассировка отправлена."
},
"savedChannel": {
- "title": "Saved Channel: {{channelName}}"
+ "title": "Сохранен канал: {{channelName}}"
},
"messages": {
"pkiEncryption": {
- "title": "Chat is using PKI encryption."
+ "title": "Чат использует PKI шифрование."
},
"pskEncryption": {
- "title": "Chat is using PSK encryption."
+ "title": "Чат использует PSK шифрование."
}
},
"configSaveError": {
- "title": "Error Saving Config",
- "description": "An error occurred while saving the configuration."
+ "title": "Ошибка сохранения конфигурации",
+ "description": "Произошла ошибка при сохранении конфигурации."
},
"validationError": {
- "title": "Config Errors Exist",
- "description": "Please fix the configuration errors before saving."
+ "title": "Обнаружены ошибки конфигурации",
+ "description": "Пожалуйста, исправьте ошибки конфигурации перед сохранением."
},
"saveSuccess": {
- "title": "Saving Config",
- "description": "The configuration change {{case}} has been saved."
+ "title": "Сохранение конфигурации",
+ "description": "Изменение конфигурации {{case}} было сохранено."
},
"saveAllSuccess": {
- "title": "Saved",
- "description": "All configuration changes have been saved."
+ "title": "Сохранено",
+ "description": "Все изменения конфигурации были сохранены."
},
"favoriteNode": {
- "title": "{{action}} {{nodeName}} {{direction}} favorites.",
+ "title": "{{action}} {{nodeName}} {{direction}} избранное.",
"action": {
- "added": "Added",
- "removed": "Removed",
- "to": "to",
- "from": "from"
+ "added": "Добавлен",
+ "removed": "Удален",
+ "to": "кому",
+ "from": "от"
}
},
"ignoreNode": {
- "title": "{{action}} {{nodeName}} {{direction}} ignore list",
+ "title": "{{action}} {{nodeName}} {{direction}} список игнорирования",
"action": {
- "added": "Added",
- "removed": "Removed",
- "to": "to",
- "from": "from"
+ "added": "Добавлен",
+ "removed": "Удален",
+ "to": "в",
+ "from": "из"
}
}
},
"notifications": {
"copied": {
- "label": "Copied!"
+ "label": "Скопировано!"
},
"copyToClipboard": {
- "label": "Copy to clipboard"
+ "label": "Копировать в буфер обмена"
},
"hidePassword": {
"label": "Скрыть пароль"
@@ -114,20 +114,20 @@
"label": "Показать пароль"
},
"deliveryStatus": {
- "delivered": "Delivered",
- "failed": "Delivery Failed",
- "waiting": "Waiting",
+ "delivered": "Доставлено",
+ "failed": "Ошибка доставки",
+ "waiting": "Ожидание",
"unknown": "Неизвестно"
}
},
"general": {
- "label": "General"
+ "label": "Общие"
},
"hardware": {
"label": "Оборудование"
},
"metrics": {
- "label": "Metrics"
+ "label": "Метрики"
},
"role": {
"label": "Роль"
@@ -139,92 +139,92 @@
"label": "Расширенные"
},
"clearInput": {
- "label": "Clear input"
+ "label": "Очистить ввод"
},
"resetFilters": {
- "label": "Reset Filters"
+ "label": "Сбросить фильтры"
},
"nodeName": {
- "label": "Node name/number",
+ "label": "Имя/номер узла",
"placeholder": "Meshtastic 1234"
},
"airtimeUtilization": {
- "label": "Airtime Utilization (%)",
- "short": "Airtime Util. (%)"
+ "label": "Использование эфирного времени (%)",
+ "short": "Исп. эфира (%)"
},
"batteryLevel": {
- "label": "Battery level (%)",
- "labelText": "Battery level (%): {{value}}"
+ "label": "Уровень батареи (%)",
+ "labelText": "Уровень батареи (%): {{value}}"
},
"batteryVoltage": {
- "label": "Battery voltage (V)",
+ "label": "Напряжение батареи (В)",
"title": "Напряжение"
},
"channelUtilization": {
- "label": "Channel Utilization (%)",
- "short": "Channel Util. (%)"
+ "label": "Использование канала (%)",
+ "short": "Исп. канала (%)"
},
"hops": {
"direct": "Прямой",
- "label": "Number of hops",
- "text": "Number of hops: {{value}}"
+ "label": "Количество прыжков",
+ "text": "Количество прыжков: {{value}}"
},
"lastHeard": {
"label": "Последний раз слышен",
- "labelText": "Last heard: {{value}}",
- "nowLabel": "Now"
+ "labelText": "Последний раз слышен: {{value}}",
+ "nowLabel": "Сейчас"
},
"snr": {
- "label": "SNR (db)"
+ "label": "SNR (дБ)"
},
"favorites": {
- "label": "Favorites"
+ "label": "Избранное"
},
"hide": {
- "label": "Hide"
+ "label": "Скрыть"
},
"showOnly": {
- "label": "Show Only"
+ "label": "Показать только"
},
"viaMqtt": {
- "label": "Connected via MQTT"
+ "label": "Подключено через MQTT"
},
"hopsUnknown": {
- "label": "Unknown number of hops"
+ "label": "Неизвестное количество прыжков"
},
"showUnheard": {
- "label": "Unknown last heard"
+ "label": "Неизвестно, когда слышан последний раз"
},
- "language": {
+ "languagePicker": {
"label": "Язык",
- "changeLanguage": "Change Language"
+ "changeLanguage": "Изменить язык"
},
"theme": {
"dark": "Темная",
"light": "Светлая",
- "system": "Automatic",
- "changeTheme": "Change Color Scheme"
+ "system": "Автоматически",
+ "changeTheme": "Изменить цветовую схему"
},
"errorPage": {
- "title": "This is a little embarrassing...",
- "description1": "We are really sorry but an error occurred in the web client that caused it to crash.
This is not supposed to happen, and we are working hard to fix it.",
- "description2": "The best way to prevent this from happening again to you or anyone else is to report the issue to us.",
- "reportInstructions": "Please include the following information in your report:",
+ "title": "Это немного неловко...",
+ "description1": "Нам очень жаль, но в веб-клиенте произошла ошибка, которая привела к сбою.
Этого не должно было произойти, и мы усердно работаем над исправлением.",
+ "description2": "Лучший способ предотвратить повторение этого для вас или кого-либо еще - сообщить нам о проблеме.",
+ "reportInstructions": "Пожалуйста, включите следующую информацию в ваш отчет:",
"reportSteps": {
- "step1": "What you were doing when the error occurred",
- "step2": "What you expected to happen",
- "step3": "What actually happened",
- "step4": "Any other relevant information"
- },
- "reportLink": "You can report the issue to our <0>GitHub0>",
- "connectionsLink": "Return to the <0>connections0>",
- "detailsSummary": "Error Details",
- "errorMessageLabel": "Error message:",
- "stackTraceLabel": "Stack trace:",
+ "step1": "Что вы делали, когда произошла ошибка",
+ "step2": "Что вы ожидали произойти",
+ "step3": "Что на самом деле произошло",
+ "step4": "Любая другая релевантная информация"
+ },
+ "reportLink": "Вы можете сообщить о проблеме на наш <0>GitHub0>",
+ "connectionsLink": "Вернуться к <0>подключениям0>",
+ "detailsSummary": "Детали ошибки",
+ "errorMessageLabel": "Сообщение об ошибке:",
+ "stackTraceLabel": "Трассировка стека:",
"fallbackError": "{{error}}"
},
"footer": {
- "text": "Powered by <0>▲ Vercel0> | Meshtastic® is a registered trademark of Meshtastic LLC. | <1>Legal Information1>",
- "commitSha": "Commit SHA: {{sha}}"
+ "text": "Работает на <0>▲ Vercel0> | Meshtastic® является зарегистрированным товарным знаком Meshtastic LLC. | <1>Юридическая информация1>",
+ "commitSha": "SHA коммита: {{sha}}"
}
-}
+}
\ No newline at end of file
diff --git a/packages/web/src/i18n-config.ts b/packages/web/src/i18n-config.ts
index 3c6f4637e..c5c2b604b 100644
--- a/packages/web/src/i18n-config.ts
+++ b/packages/web/src/i18n-config.ts
@@ -17,6 +17,7 @@ export const supportedLanguages: Lang[] = [
{ code: "de", name: "Deutsch", flag: "🇩🇪" },
{ code: "en", name: "English", flag: "🇺🇸" },
{ code: "fr", name: "Français", flag: "🇫🇷" },
+ { code: "ru", name: "Русский", flag: "🇷🇺" },
{ code: "sv", name: "Svenska", flag: "🇸🇪" },
];
@@ -45,6 +46,7 @@ i18next
fr: ["fr-FR", FALLBACK_LANGUAGE_CODE],
sv: ["sv-SE", FALLBACK_LANGUAGE_CODE],
de: ["de-DE", FALLBACK_LANGUAGE_CODE],
+ ru: ["ru-RU", FALLBACK_LANGUAGE_CODE],
},
fallbackNS: ["common", "ui", "dialog"],
debug: import.meta.env.MODE === "development",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 479805822..ce61378af 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
+ '@bufbuild/buf':
+ specifier: ^1.61.0
+ version: 1.61.0
'@bufbuild/protobuf':
specifier: ^2.9.0
version: 2.9.0
@@ -1095,6 +1098,53 @@ packages:
cpu: [x64]
os: [win32]
+ '@bufbuild/buf-darwin-arm64@1.61.0':
+ resolution: {integrity: sha512-8vUGNV65LNPp+HT3NuCT9i/mCUEyLrSFctJ2Dz8JqnUu8fVPm4f8lVBSCT0TYLoQ8o8xb/A7bwWu14aKfXxgCg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@bufbuild/buf-darwin-x64@1.61.0':
+ resolution: {integrity: sha512-dyJghwTYXT6e/Ec+2iPWijquTzyT+5vTItX4R7hM/soNQOs4eEo2z7EHLqvclHyi7+p7+8xye3z+BFM33ucM8A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@bufbuild/buf-linux-aarch64@1.61.0':
+ resolution: {integrity: sha512-9r5DRqwpq3WX0ltzt1p/Oe+8g679Fg4XJLaH/zmjqpwHVO+tNzYy7PHK4qWg83PCoANw6OVizl+iTmnE0vbklg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@bufbuild/buf-linux-armv7@1.61.0':
+ resolution: {integrity: sha512-P2cSlzu68omZ6kyijMcYezZJFS4XayfLA0ATm1HP0zUaV+xVoeMOGhKvMWUFAa9SGYUs4Drxi2fyK/c2ZFA8sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@bufbuild/buf-linux-x64@1.61.0':
+ resolution: {integrity: sha512-USDSLB0vkrR6Sk/VDtECLdOKHfynenCjnAchr9bdqC137IVJT7TVT8JhBW0UWMmXDZYjwbDrBLITwWj8hwk6Uw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@bufbuild/buf-win32-arm64@1.61.0':
+ resolution: {integrity: sha512-36n90c0lzhDMXRKhht8XreUCha4OTY7yR6g+bnkAFUXSbCbR3BpqrenWvl5NBtfX2Y70dmvjKnGwVanSIrb1uA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@bufbuild/buf-win32-x64@1.61.0':
+ resolution: {integrity: sha512-uBIU7tQlCBPyoeJZH0NzL6y9Y4ikje4OlgHYGssbaPLsCKELSFDHQkHFabkwnVeXSUf9Intq+U3jtb+qOIlflw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@bufbuild/buf@1.61.0':
+ resolution: {integrity: sha512-9kKZK/GjhIDUj50pngmjtC6bGFl6U1rFDH2gZJATRfp2vNnQPsb6BqZ+2lea37bgHBYdAYttlve8wnXszXmftA==}
+ engines: {node: '>=12'}
+ hasBin: true
+
'@bufbuild/protobuf@1.10.1':
resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==}
@@ -6823,6 +6873,37 @@ snapshots:
'@biomejs/cli-win32-x64@2.2.4':
optional: true
+ '@bufbuild/buf-darwin-arm64@1.61.0':
+ optional: true
+
+ '@bufbuild/buf-darwin-x64@1.61.0':
+ optional: true
+
+ '@bufbuild/buf-linux-aarch64@1.61.0':
+ optional: true
+
+ '@bufbuild/buf-linux-armv7@1.61.0':
+ optional: true
+
+ '@bufbuild/buf-linux-x64@1.61.0':
+ optional: true
+
+ '@bufbuild/buf-win32-arm64@1.61.0':
+ optional: true
+
+ '@bufbuild/buf-win32-x64@1.61.0':
+ optional: true
+
+ '@bufbuild/buf@1.61.0':
+ optionalDependencies:
+ '@bufbuild/buf-darwin-arm64': 1.61.0
+ '@bufbuild/buf-darwin-x64': 1.61.0
+ '@bufbuild/buf-linux-aarch64': 1.61.0
+ '@bufbuild/buf-linux-armv7': 1.61.0
+ '@bufbuild/buf-linux-x64': 1.61.0
+ '@bufbuild/buf-win32-arm64': 1.61.0
+ '@bufbuild/buf-win32-x64': 1.61.0
+
'@bufbuild/protobuf@1.10.1': {}
'@bufbuild/protobuf@2.9.0': {}