From db08542b397767bcaaa60b6abea29a1f88e69e4f Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 14:25:29 -0500 Subject: [PATCH 01/15] refactor: switch to deno --- .github/workflows/ci.yml | 12 +- .github/workflows/nightly.yml | 14 +- .github/workflows/pr.yml | 14 +- .github/workflows/release.yml | 14 +- .gitignore | 3 +- .npmrc | 1 - .vscode/settings.json | 9 +- README.md | 71 +- biome.json | 27 - deno.lock | 6729 +++++++++++++++++++++++++++++++++ package.json | 36 +- tsconfig.json | 24 +- vite.config.ts | 2 +- 13 files changed, 6842 insertions(+), 114 deletions(-) delete mode 100644 .npmrc delete mode 100644 biome.json create mode 100644 deno.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7baa07ab..fa399d7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,14 +16,16 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup bun - uses: oven-sh/setup-bun@v2 + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x - name: Install Dependencies - run: bun install + run: deno install - name: Run tests - run: bun run test:run + run: deno task test - name: Build Package - run: bun run build + run: deno task build diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ed2995e4..b631af55 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -15,20 +15,22 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup bun - uses: oven-sh/setup-bun@v2 + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x - name: Install Dependencies - run: bun install + run: deno install - name: Run tests - run: bun run test:run + run: deno task test - name: Build Package - run: bun run build + run: deno task build - name: Package Output - run: bun run package + run: deno task package - name: Archive compressed build uses: actions/upload-artifact@v4 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 72cf5eb6..4e1ae33a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -9,20 +9,22 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup bun - uses: oven-sh/setup-bun@v2 + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x - name: Install Dependencies - run: bun install + run: deno install - name: Run tests - run: bun run test:run + run: deno task test - name: Build Package - run: bun run build + run: deno task build - name: Compress build - run: bun run package + run: deno task package - name: Archive compressed build uses: actions/upload-artifact@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0a777932..580dc7c2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,20 +15,22 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup bun - uses: oven-sh/setup-bun@v2 + - name: Setup Deno + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x - name: Install Dependencies - run: bun install + run: deno install - name: Run tests - run: bun run test:run + run: deno task test - name: Build Package - run: bun run build + run: deno task build - name: Package Output - run: bun run package + run: deno task package - name: Archive compressed build uses: actions/upload-artifact@v4 diff --git a/.gitignore b/.gitignore index c744fc28..1701a18f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ dist node_modules stats.html .vercel -dev-dist \ No newline at end of file +.vite/deps +dev-dist diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 41583e36..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -@jsr:registry=https://npm.jsr.io diff --git a/.vscode/settings.json b/.vscode/settings.json index f9d98cd9..9045fc0f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,6 @@ { - "editor.defaultFormatter": "biomejs.biome", - "editor.codeActionsOnSave": { - "quickfix.biome": "explicit" - }, - "editor.formatOnSave": true + "deno.enable": true, + "deno.suggest.imports.autoDiscover": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "denoland.vscode-deno" } diff --git a/README.md b/README.md index a42debb3..52a70bad 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,8 @@ ## Overview -Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted or served from a node +Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted +or served from a node **[Hosted version](https://client.meshtastic.org)** @@ -19,7 +20,8 @@ Official [Meshtastic](https://meshtastic.org) web interface, that can be hosted ## Progress Web App Support (PWA) -Meshtastic Web Client now includes Progressive Web App (PWA) functionality, allowing users to: +Meshtastic Web Client now includes Progressive Web App (PWA) functionality, +allowing users to: - Install the app on desktop and mobile devices - Access the interface offline @@ -35,8 +37,10 @@ PWA functionality works with both the hosted version and self-hosted instances. ## Self-host -The client can be self hosted using the precompiled container images with an OCI compatible runtime such as [Docker](https://www.docker.com/) or [Podman](https://podman.io/). -The base image used is [Nginx 1.27](https://hub.docker.com/_/nginx) +The client can be self hosted using the precompiled container images with an OCI +compatible runtime such as [Docker](https://www.docker.com/) or +[Podman](https://podman.io/). The base image used is +[Nginx 1.27](https://hub.docker.com/_/nginx) ```bash # With Docker @@ -46,9 +50,11 @@ docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshta podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web ``` -## Nightly releases +## Nightly releases -Our nightly releases provide the latest development builds with cutting-edge features and fixes. These builds are automatically generated from the latest main branch every night and are available for testing and early adoption. +Our nightly releases provide the latest development builds with cutting-edge +features and fixes. These builds are automatically generated from the latest +main branch every night and are available for testing and early adoption. ```bash # With Docker @@ -57,38 +63,55 @@ docker run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshta podman run -d -p 8080:8080 --restart always --name Meshtastic-Web ghcr.io/meshtastic/web:nightly ``` -> [!WARNING] -> - Nightly builds represent the latest development state and may contain breaking changes -> - These builds undergo automated testing but may be less stable than tagged release versions -> - Not recommended for production environments unless you are actively testing new features +> [!WARNING] +> +> - Nightly builds represent the latest development state and may contain +> breaking changes +> - These builds undergo automated testing but may be less stable than tagged +> release versions +> - Not recommended for production environments unless you are actively testing +> new features > - No guarantee of backward compatibility between nightly builds ### Version Information + Each nightly build is tagged with: - The nightly tag for the latest build - A specific SHA for build reproducibility ### Feedback -If you encounter any issues with nightly builds, please report them in our [issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps improve the stability of future releases + +If you encounter any issues with nightly builds, please report them in our +[issues tracker](https://github.com/meshtastic/web/issues). Your feedback helps +improve the stability of future releases ## Development & Building -You'll need to download the package manager used with this repo. You can install it by visiting [Bun.sh](https://bun.sh/) and following the installation instructions. -### Debugging +You'll need to download the package manager used with this repo. You can install +it by visiting [deno.com](https://deno.com/) and following the installation +instructions listed on the home page. + +### Debugging #### Debugging with React Scan -Meshtastic Web Client has included the library [React Scan](https://github.com/aidenybai/react-scan) to help you identify and resolve render performance issues during development. -React's comparison-by-reference approach to props makes it easy to inadvertently cause unnecessary re-renders, especially with: +Meshtastic Web Client has included the library +[React Scan](https://github.com/aidenybai/react-scan) to help you identify and +resolve render performance issues during development. + +React's comparison-by-reference approach to props makes it easy to inadvertently +cause unnecessary re-renders, especially with: - Inline function callbacks (`onClick={() => handleClick()}`) - Object literals (`style={{ color: "purple" }}`) - Array literals (`items={[1, 2, 3]}`) -These are recreated on every render, causing child components to re-render even when nothing has actually changed. +These are recreated on every render, causing child components to re-render even +when nothing has actually changed. -Unlike React DevTools, React Scan specifically focuses on performance optimization by: +Unlike React DevTools, React Scan specifically focuses on performance +optimization by: - Clearly distinguishing between necessary and unnecessary renders - Providing render counts for components @@ -96,10 +119,11 @@ Unlike React DevTools, React Scan specifically focuses on performance optimizati - Offering a dedicated performance debugging experience #### Usage + When experiencing slow renders, run: ```bash -bun run dev:scan +deno task dev:scan ``` This will allow you to discover the following about your components and pages: @@ -109,20 +133,21 @@ This will allow you to discover the following about your components and pages: - Expensive hook operations - Props that change reference on every render -Use these insights to apply targeted optimizations like `React.memo()`, `useCallback()`, or `useMemo()` where they'll have the most impact. +Use these insights to apply targeted optimizations like `React.memo()`, +`useCallback()`, or `useMemo()` where they'll have the most impact. ### Building and Packaging Build the project: ```bash -bun run build +deno task build ``` GZip the output: ```bash -bun run package +deno task package ``` ### Development @@ -130,11 +155,11 @@ bun run package Install the dependencies. ```bash -bun i +deno i ``` Start the development server: ```bash -bun run dev +deno task dev ``` diff --git a/biome.json b/biome.json deleted file mode 100644 index 6d2c7f6c..00000000 --- a/biome.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", - "organizeImports": { - "enabled": true - }, - "files": { - "ignoreUnknown": true, - "ignore": ["vercel.json"] - }, - "vcs": { - "enabled": true, - "clientKind": "git", - "useIgnoreFile": true, - "defaultBranch": "master" - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2 - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true - } - } -} diff --git a/deno.lock b/deno.lock new file mode 100644 index 00000000..31626c83 --- /dev/null +++ b/deno.lock @@ -0,0 +1,6729 @@ +{ + "version": "4", + "specifiers": { + "npm:@bufbuild/protobuf@^2.2.3": "2.2.3", + "npm:@noble/curves@^1.8.1": "1.8.1", + "npm:@radix-ui/react-accordion@^1.2.3": "1.2.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-checkbox@^1.1.4": "1.1.4_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-dialog@^1.1.6": "1.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-dropdown-menu@^2.1.6": "2.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-label@^2.1.2": "2.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-menubar@^1.1.6": "1.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-popover@^1.1.6": "1.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-scroll-area@^1.2.3": "1.2.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-select@^2.1.6": "2.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-separator@^1.1.2": "1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-switch@^1.1.3": "1.1.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-tabs@^1.1.3": "1.1.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-toast@^1.2.6": "1.2.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@radix-ui/react-tooltip@^1.1.8": "1.1.8_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@tailwindcss/postcss@^4.0.9": "4.0.9", + "npm:@testing-library/react@^16.2.0": "16.2.0_@testing-library+dom@10.4.0_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:@turf/turf@^7.2.0": "7.2.0", + "npm:@types/chrome@^0.0.307": "0.0.307", + "npm:@types/js-cookie@^3.0.6": "3.0.6", + "npm:@types/node@*": "22.12.0", + "npm:@types/node@^22.13.7": "22.13.8", + "npm:@types/react-dom@^19.0.4": "19.0.4_@types+react@19.0.10", + "npm:@types/react@^19.0.10": "19.0.10", + "npm:@types/serviceworker@^0.0.123": "0.0.123", + "npm:@types/w3c-web-serial@^1.0.8": "1.0.8", + "npm:@types/web-bluetooth@^0.0.21": "0.0.21", + "npm:@vitejs/plugin-react@^4.3.4": "4.3.4_vite@6.2.0__@types+node@22.13.8_@babel+core@7.26.9_@types+node@22.13.8", + "npm:autoprefixer@^10.4.20": "10.4.20_postcss@8.5.3", + "npm:base64-js@^1.5.1": "1.5.1", + "npm:class-validator@~0.14.1": "0.14.1", + "npm:class-variance-authority@~0.7.1": "0.7.1", + "npm:clsx@^2.1.1": "2.1.1", + "npm:cmdk@^1.0.4": "1.0.4_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10", + "npm:crypto-random-string@5": "5.0.0", + "npm:gzipper@^8.2.0": "8.2.0", + "npm:happy-dom@^17.1.8": "17.1.8", + "npm:immer@^10.1.1": "10.1.1", + "npm:js-cookie@^3.0.5": "3.0.5", + "npm:lucide-react@0.477": "0.477.0_react@19.0.0", + "npm:maplibre-gl@5.1.1": "5.1.1", + "npm:postcss@^8.5.3": "8.5.3", + "npm:react-dom@19": "19.0.0_react@19.0.0", + "npm:react-hook-form@^7.54.2": "7.54.2_react@19.0.0", + "npm:react-map-gl@8.0.1": "8.0.1_maplibre-gl@5.1.1_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:react-qrcode-logo@3": "3.0.0_react@19.0.0_react-dom@19.0.0__react@19.0.0", + "npm:react-scan@~0.2.8": "0.2.8_react@19.0.0_react-dom@19.0.0__react@19.0.0_preact@10.26.4", + "npm:react@19": "19.0.0", + "npm:rfc4648@^1.5.4": "1.5.4", + "npm:tailwind-merge@^3.0.2": "3.0.2", + "npm:tailwindcss-animate@^1.0.7": "1.0.7_tailwindcss@4.0.9", + "npm:tailwindcss@^4.0.9": "4.0.9", + "npm:tar@^7.4.3": "7.4.3", + "npm:typescript@^5.8.2": "5.8.2", + "npm:vite-plugin-node-polyfills@0.23": "0.23.0_vite@6.2.0__@types+node@22.13.8_@types+node@22.13.8", + "npm:vite-plugin-pwa@~0.21.1": "0.21.1_vite@6.2.0__@types+node@22.13.8_workbox-build@7.3.0__ajv@8.17.1__@babel+core@7.26.9__rollup@2.79.2_workbox-window@7.3.0_@types+node@22.13.8", + "npm:vite@*": "6.2.0_@types+node@22.13.8", + "npm:vite@^6.2.0": "6.2.0_@types+node@22.13.8", + "npm:vitest@^3.0.7": "3.0.7_@types+node@22.13.8_happy-dom@17.1.8_vite@6.2.0__@types+node@22.13.8", + "npm:zustand@5.0.3": "5.0.3_@types+react@19.0.10_immer@10.1.1_react@19.0.0" + }, + "npm": { + "@alloc/quick-lru@5.2.0": { + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@ampproject/remapping@2.3.0": { + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@apideck/better-ajv-errors@0.3.6_ajv@8.17.1": { + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": [ + "ajv", + "json-schema", + "jsonpointer", + "leven" + ] + }, + "@babel/code-frame@7.26.2": { + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": [ + "@babel/helper-validator-identifier", + "js-tokens", + "picocolors" + ] + }, + "@babel/compat-data@7.26.8": { + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==" + }, + "@babel/core@7.26.9": { + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "dependencies": [ + "@ampproject/remapping", + "@babel/code-frame", + "@babel/generator", + "@babel/helper-compilation-targets", + "@babel/helper-module-transforms", + "@babel/helpers", + "@babel/parser", + "@babel/template", + "@babel/traverse", + "@babel/types", + "convert-source-map", + "debug", + "gensync", + "json5", + "semver" + ] + }, + "@babel/generator@7.26.9": { + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping", + "jsesc@3.1.0" + ] + }, + "@babel/helper-annotate-as-pure@7.25.9": { + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-compilation-targets@7.26.5": { + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dependencies": [ + "@babel/compat-data", + "@babel/helper-validator-option", + "browserslist", + "lru-cache@5.1.1", + "semver" + ] + }, + "@babel/helper-create-class-features-plugin@7.26.9_@babel+core@7.26.9": { + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-member-expression-to-functions", + "@babel/helper-optimise-call-expression", + "@babel/helper-replace-supers", + "@babel/helper-skip-transparent-expression-wrappers", + "@babel/traverse", + "semver" + ] + }, + "@babel/helper-create-regexp-features-plugin@7.26.3_@babel+core@7.26.9": { + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "regexpu-core", + "semver" + ] + }, + "@babel/helper-define-polyfill-provider@0.6.3_@babel+core@7.26.9": { + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "debug", + "lodash.debounce", + "resolve" + ] + }, + "@babel/helper-member-expression-to-functions@7.25.9": { + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-imports@7.25.9": { + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-transforms@7.26.0_@babel+core@7.26.9": { + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/helper-optimise-call-expression@7.25.9": { + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-plugin-utils@7.26.5": { + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==" + }, + "@babel/helper-remap-async-to-generator@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-wrap-function", + "@babel/traverse" + ] + }, + "@babel/helper-replace-supers@7.26.5_@babel+core@7.26.9": { + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dependencies": [ + "@babel/core", + "@babel/helper-member-expression-to-functions", + "@babel/helper-optimise-call-expression", + "@babel/traverse" + ] + }, + "@babel/helper-skip-transparent-expression-wrappers@7.25.9": { + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-string-parser@7.25.9": { + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + }, + "@babel/helper-validator-identifier@7.25.9": { + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + }, + "@babel/helper-validator-option@7.25.9": { + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==" + }, + "@babel/helper-wrap-function@7.25.9": { + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dependencies": [ + "@babel/template", + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helpers@7.26.9": { + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "dependencies": [ + "@babel/template", + "@babel/types" + ] + }, + "@babel/parser@7.26.9": { + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers", + "@babel/plugin-transform-optional-chaining" + ] + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2_@babel+core@7.26.9": { + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dependencies": [ + "@babel/core" + ] + }, + "@babel/plugin-syntax-import-assertions@7.26.0_@babel+core@7.26.9": { + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-import-attributes@7.26.0_@babel+core@7.26.9": { + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-syntax-unicode-sets-regex@7.18.6_@babel+core@7.26.9": { + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-arrow-functions@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-async-generator-functions@7.26.8_@babel+core@7.26.9": { + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-remap-async-to-generator", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-async-to-generator@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-plugin-utils", + "@babel/helper-remap-async-to-generator" + ] + }, + "@babel/plugin-transform-block-scoped-functions@7.26.5_@babel+core@7.26.9": { + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-block-scoping@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-class-properties@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-class-static-block@7.26.0_@babel+core@7.26.9": { + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-classes@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers", + "@babel/traverse", + "globals" + ] + }, + "@babel/plugin-transform-computed-properties@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/template" + ] + }, + "@babel/plugin-transform-destructuring@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-dotall-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-duplicate-keys@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-dynamic-import@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-exponentiation-operator@7.26.3_@babel+core@7.26.9": { + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-export-namespace-from@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-for-of@7.26.9_@babel+core@7.26.9": { + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-function-name@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-json-strings@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-literals@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-logical-assignment-operators@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-member-expression-literals@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-amd@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-commonjs@7.26.3_@babel+core@7.26.9": { + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-modules-systemjs@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/plugin-transform-modules-umd@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-transforms", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-named-capturing-groups-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-new-target@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-nullish-coalescing-operator@7.26.6_@babel+core@7.26.9": { + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-numeric-separator@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-object-rest-spread@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dependencies": [ + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/plugin-transform-parameters" + ] + }, + "@babel/plugin-transform-object-super@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers" + ] + }, + "@babel/plugin-transform-optional-catch-binding@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-optional-chaining@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-parameters@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-private-methods@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-private-property-in-object@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-create-class-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-property-literals@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-jsx-self@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-jsx-source@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-regenerator@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "regenerator-transform" + ] + }, + "@babel/plugin-transform-regexp-modifiers@7.26.0_@babel+core@7.26.9": { + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-reserved-words@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-shorthand-properties@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-spread@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-skip-transparent-expression-wrappers" + ] + }, + "@babel/plugin-transform-sticky-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-template-literals@7.26.8_@babel+core@7.26.9": { + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-typeof-symbol@7.26.7_@babel+core@7.26.9": { + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-escapes@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-property-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-unicode-sets-regex@7.25.9_@babel+core@7.26.9": { + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-create-regexp-features-plugin", + "@babel/helper-plugin-utils" + ] + }, + "@babel/preset-env@7.26.9_@babel+core@7.26.9": { + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dependencies": [ + "@babel/compat-data", + "@babel/core", + "@babel/helper-compilation-targets", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key", + "@babel/plugin-bugfix-safari-class-field-initializer-scope", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly", + "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-syntax-import-assertions", + "@babel/plugin-syntax-import-attributes", + "@babel/plugin-syntax-unicode-sets-regex", + "@babel/plugin-transform-arrow-functions", + "@babel/plugin-transform-async-generator-functions", + "@babel/plugin-transform-async-to-generator", + "@babel/plugin-transform-block-scoped-functions", + "@babel/plugin-transform-block-scoping", + "@babel/plugin-transform-class-properties", + "@babel/plugin-transform-class-static-block", + "@babel/plugin-transform-classes", + "@babel/plugin-transform-computed-properties", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-dotall-regex", + "@babel/plugin-transform-duplicate-keys", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex", + "@babel/plugin-transform-dynamic-import", + "@babel/plugin-transform-exponentiation-operator", + "@babel/plugin-transform-export-namespace-from", + "@babel/plugin-transform-for-of", + "@babel/plugin-transform-function-name", + "@babel/plugin-transform-json-strings", + "@babel/plugin-transform-literals", + "@babel/plugin-transform-logical-assignment-operators", + "@babel/plugin-transform-member-expression-literals", + "@babel/plugin-transform-modules-amd", + "@babel/plugin-transform-modules-commonjs", + "@babel/plugin-transform-modules-systemjs", + "@babel/plugin-transform-modules-umd", + "@babel/plugin-transform-named-capturing-groups-regex", + "@babel/plugin-transform-new-target", + "@babel/plugin-transform-nullish-coalescing-operator", + "@babel/plugin-transform-numeric-separator", + "@babel/plugin-transform-object-rest-spread", + "@babel/plugin-transform-object-super", + "@babel/plugin-transform-optional-catch-binding", + "@babel/plugin-transform-optional-chaining", + "@babel/plugin-transform-parameters", + "@babel/plugin-transform-private-methods", + "@babel/plugin-transform-private-property-in-object", + "@babel/plugin-transform-property-literals", + "@babel/plugin-transform-regenerator", + "@babel/plugin-transform-regexp-modifiers", + "@babel/plugin-transform-reserved-words", + "@babel/plugin-transform-shorthand-properties", + "@babel/plugin-transform-spread", + "@babel/plugin-transform-sticky-regex", + "@babel/plugin-transform-template-literals", + "@babel/plugin-transform-typeof-symbol", + "@babel/plugin-transform-unicode-escapes", + "@babel/plugin-transform-unicode-property-regex", + "@babel/plugin-transform-unicode-regex", + "@babel/plugin-transform-unicode-sets-regex", + "@babel/preset-modules", + "babel-plugin-polyfill-corejs2", + "babel-plugin-polyfill-corejs3", + "babel-plugin-polyfill-regenerator", + "core-js-compat", + "semver" + ] + }, + "@babel/preset-modules@0.1.6-no-external-plugins_@babel+core@7.26.9": { + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/types", + "esutils" + ] + }, + "@babel/runtime@7.26.9": { + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", + "dependencies": [ + "regenerator-runtime" + ] + }, + "@babel/template@7.26.9": { + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dependencies": [ + "@babel/code-frame", + "@babel/parser", + "@babel/types" + ] + }, + "@babel/traverse@7.26.9": { + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/parser", + "@babel/template", + "@babel/types", + "debug", + "globals" + ] + }, + "@babel/types@7.26.9": { + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "dependencies": [ + "@babel/helper-string-parser", + "@babel/helper-validator-identifier" + ] + }, + "@bufbuild/protobuf@2.2.3": { + "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==" + }, + "@clack/core@0.3.5": { + "integrity": "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==", + "dependencies": [ + "picocolors", + "sisteransi" + ] + }, + "@clack/prompts@0.8.2": { + "integrity": "sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==", + "dependencies": [ + "@clack/core", + "picocolors", + "sisteransi" + ] + }, + "@esbuild/aix-ppc64@0.24.2": { + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==" + }, + "@esbuild/aix-ppc64@0.25.0": { + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==" + }, + "@esbuild/android-arm64@0.24.2": { + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==" + }, + "@esbuild/android-arm64@0.25.0": { + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==" + }, + "@esbuild/android-arm@0.24.2": { + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==" + }, + "@esbuild/android-arm@0.25.0": { + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==" + }, + "@esbuild/android-x64@0.24.2": { + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==" + }, + "@esbuild/android-x64@0.25.0": { + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==" + }, + "@esbuild/darwin-arm64@0.24.2": { + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==" + }, + "@esbuild/darwin-arm64@0.25.0": { + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==" + }, + "@esbuild/darwin-x64@0.24.2": { + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==" + }, + "@esbuild/darwin-x64@0.25.0": { + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==" + }, + "@esbuild/freebsd-arm64@0.24.2": { + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==" + }, + "@esbuild/freebsd-arm64@0.25.0": { + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==" + }, + "@esbuild/freebsd-x64@0.24.2": { + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==" + }, + "@esbuild/freebsd-x64@0.25.0": { + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==" + }, + "@esbuild/linux-arm64@0.24.2": { + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==" + }, + "@esbuild/linux-arm64@0.25.0": { + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==" + }, + "@esbuild/linux-arm@0.24.2": { + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==" + }, + "@esbuild/linux-arm@0.25.0": { + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==" + }, + "@esbuild/linux-ia32@0.24.2": { + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==" + }, + "@esbuild/linux-ia32@0.25.0": { + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==" + }, + "@esbuild/linux-loong64@0.24.2": { + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==" + }, + "@esbuild/linux-loong64@0.25.0": { + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==" + }, + "@esbuild/linux-mips64el@0.24.2": { + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==" + }, + "@esbuild/linux-mips64el@0.25.0": { + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==" + }, + "@esbuild/linux-ppc64@0.24.2": { + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==" + }, + "@esbuild/linux-ppc64@0.25.0": { + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==" + }, + "@esbuild/linux-riscv64@0.24.2": { + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==" + }, + "@esbuild/linux-riscv64@0.25.0": { + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==" + }, + "@esbuild/linux-s390x@0.24.2": { + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==" + }, + "@esbuild/linux-s390x@0.25.0": { + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==" + }, + "@esbuild/linux-x64@0.24.2": { + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==" + }, + "@esbuild/linux-x64@0.25.0": { + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==" + }, + "@esbuild/netbsd-arm64@0.24.2": { + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==" + }, + "@esbuild/netbsd-arm64@0.25.0": { + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==" + }, + "@esbuild/netbsd-x64@0.24.2": { + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==" + }, + "@esbuild/netbsd-x64@0.25.0": { + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==" + }, + "@esbuild/openbsd-arm64@0.24.2": { + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==" + }, + "@esbuild/openbsd-arm64@0.25.0": { + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==" + }, + "@esbuild/openbsd-x64@0.24.2": { + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==" + }, + "@esbuild/openbsd-x64@0.25.0": { + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==" + }, + "@esbuild/sunos-x64@0.24.2": { + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==" + }, + "@esbuild/sunos-x64@0.25.0": { + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==" + }, + "@esbuild/win32-arm64@0.24.2": { + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==" + }, + "@esbuild/win32-arm64@0.25.0": { + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==" + }, + "@esbuild/win32-ia32@0.24.2": { + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==" + }, + "@esbuild/win32-ia32@0.25.0": { + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==" + }, + "@esbuild/win32-x64@0.24.2": { + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==" + }, + "@esbuild/win32-x64@0.25.0": { + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==" + }, + "@floating-ui/core@1.6.9": { + "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "dependencies": [ + "@floating-ui/utils" + ] + }, + "@floating-ui/dom@1.6.13": { + "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "dependencies": [ + "@floating-ui/core", + "@floating-ui/utils" + ] + }, + "@floating-ui/react-dom@2.1.2_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": [ + "@floating-ui/dom", + "react", + "react-dom" + ] + }, + "@floating-ui/utils@0.2.9": { + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" + }, + "@gfx/zopfli@1.0.15": { + "integrity": "sha512-7mBgpi7UD82fsff5ThQKet0uBTl4BYerQuc+/qA1ELTwWEiIedRTcD3JgiUu9wwZ2kytW8JOb165rSdAt8PfcQ==", + "dependencies": [ + "base64-js" + ] + }, + "@isaacs/cliui@8.0.2": { + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": [ + "string-width@5.1.2", + "string-width-cjs@npm:string-width@4.2.3", + "strip-ansi@7.1.0", + "strip-ansi-cjs@npm:strip-ansi@6.0.1", + "wrap-ansi@8.1.0", + "wrap-ansi-cjs@npm:wrap-ansi@7.0.0" + ] + }, + "@isaacs/fs-minipass@4.0.1": { + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": [ + "minipass" + ] + }, + "@jridgewell/gen-mapping@0.3.8": { + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dependencies": [ + "@jridgewell/set-array", + "@jridgewell/sourcemap-codec", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/resolve-uri@3.1.2": { + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array@1.2.1": { + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/source-map@0.3.6": { + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/sourcemap-codec@1.5.0": { + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@jridgewell/trace-mapping@0.3.25": { + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": [ + "@jridgewell/resolve-uri", + "@jridgewell/sourcemap-codec" + ] + }, + "@mapbox/geojson-rewind@0.5.2": { + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "dependencies": [ + "get-stream", + "minimist" + ] + }, + "@mapbox/jsonlint-lines-primitives@2.0.2": { + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/point-geometry@0.1.0": { + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/tiny-sdf@2.0.6": { + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + }, + "@mapbox/unitbezier@0.0.1": { + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==" + }, + "@mapbox/vector-tile@1.3.1": { + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "dependencies": [ + "@mapbox/point-geometry" + ] + }, + "@mapbox/whoots-js@3.1.0": { + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@maplibre/maplibre-gl-style-spec@19.3.3": { + "integrity": "sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==", + "dependencies": [ + "@mapbox/jsonlint-lines-primitives", + "@mapbox/unitbezier", + "json-stringify-pretty-compact@3.0.0", + "minimist", + "rw", + "sort-object" + ] + }, + "@maplibre/maplibre-gl-style-spec@23.1.0": { + "integrity": "sha512-R6/ihEuC5KRexmKIYkWqUv84Gm+/QwsOUgHyt1yy2XqCdGdLvlBWVWIIeTZWN4NGdwmY6xDzdSGU2R9oBLNg2w==", + "dependencies": [ + "@mapbox/jsonlint-lines-primitives", + "@mapbox/unitbezier", + "json-stringify-pretty-compact@4.0.0", + "minimist", + "quickselect@3.0.0", + "rw", + "tinyqueue@3.0.0" + ] + }, + "@noble/curves@1.8.1": { + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "dependencies": [ + "@noble/hashes" + ] + }, + "@noble/hashes@1.7.1": { + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==" + }, + "@pivanov/utils@0.0.1_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-JQ/pXeG9/Yq3UuwH2Xp4F6bSAIDGzbxT0Vrg/82tMi3Yp+Ps9AYzjSDE+zfvBRqc7J11V6MMonUrWj4+2dYgrg==", + "dependencies": [ + "react", + "react-dom" + ] + }, + "@pkgjs/parseargs@0.11.0": { + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" + }, + "@preact/signals-core@1.8.0": { + "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==" + }, + "@preact/signals@1.3.2_preact@10.26.4": { + "integrity": "sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==", + "dependencies": [ + "@preact/signals-core", + "preact" + ] + }, + "@radix-ui/number@1.1.0": { + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "@radix-ui/primitive@1.1.1": { + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==" + }, + "@radix-ui/react-accordion@1.2.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-collapsible", + "@radix-ui/react-collection", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-id", + "@radix-ui/react-primitive", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-arrow@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==", + "dependencies": [ + "@radix-ui/react-primitive", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-checkbox@1.1.4_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-use-controllable-state", + "@radix-ui/react-use-previous", + "@radix-ui/react-use-size", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-collapsible@1.1.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-id", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-use-controllable-state", + "@radix-ui/react-use-layout-effect", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-collection@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==", + "dependencies": [ + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-primitive", + "@radix-ui/react-slot", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-compose-refs@1.1.1_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-context@1.1.1_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-dialog@1.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-dismissable-layer", + "@radix-ui/react-focus-guards", + "@radix-ui/react-focus-scope", + "@radix-ui/react-id", + "@radix-ui/react-portal", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-slot", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "aria-hidden", + "react", + "react-dom", + "react-remove-scroll" + ] + }, + "@radix-ui/react-direction@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-dismissable-layer@1.1.5_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-primitive", + "@radix-ui/react-use-callback-ref", + "@radix-ui/react-use-escape-keydown", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-dropdown-menu@2.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-id", + "@radix-ui/react-menu", + "@radix-ui/react-primitive", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-focus-guards@1.1.1_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-focus-scope@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==", + "dependencies": [ + "@radix-ui/react-compose-refs", + "@radix-ui/react-primitive", + "@radix-ui/react-use-callback-ref", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-id@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": [ + "@radix-ui/react-use-layout-effect", + "@types/react", + "react" + ] + }, + "@radix-ui/react-label@2.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==", + "dependencies": [ + "@radix-ui/react-primitive", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-menu@2.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-collection", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-dismissable-layer", + "@radix-ui/react-focus-guards", + "@radix-ui/react-focus-scope", + "@radix-ui/react-id", + "@radix-ui/react-popper", + "@radix-ui/react-portal", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-roving-focus", + "@radix-ui/react-slot", + "@radix-ui/react-use-callback-ref", + "@types/react", + "@types/react-dom", + "aria-hidden", + "react", + "react-dom", + "react-remove-scroll" + ] + }, + "@radix-ui/react-menubar@1.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-FHq7+3DlXwh/7FOM4i0G4bC4vPjiq89VEEvNF4VMLchGnaUuUbE5uKXMUCjdKaOghEEMeiKa5XCa2Pk4kteWmg==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-collection", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-id", + "@radix-ui/react-menu", + "@radix-ui/react-primitive", + "@radix-ui/react-roving-focus", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-popover@1.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-dismissable-layer", + "@radix-ui/react-focus-guards", + "@radix-ui/react-focus-scope", + "@radix-ui/react-id", + "@radix-ui/react-popper", + "@radix-ui/react-portal", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-slot", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "aria-hidden", + "react", + "react-dom", + "react-remove-scroll" + ] + }, + "@radix-ui/react-popper@1.2.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==", + "dependencies": [ + "@floating-ui/react-dom", + "@radix-ui/react-arrow", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-primitive", + "@radix-ui/react-use-callback-ref", + "@radix-ui/react-use-layout-effect", + "@radix-ui/react-use-rect", + "@radix-ui/react-use-size", + "@radix-ui/rect", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-portal@1.1.4_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==", + "dependencies": [ + "@radix-ui/react-primitive", + "@radix-ui/react-use-layout-effect", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-presence@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "dependencies": [ + "@radix-ui/react-compose-refs", + "@radix-ui/react-use-layout-effect", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-primitive@2.0.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "dependencies": [ + "@radix-ui/react-slot", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-roving-focus@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-collection", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-id", + "@radix-ui/react-primitive", + "@radix-ui/react-use-callback-ref", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-scroll-area@1.2.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==", + "dependencies": [ + "@radix-ui/number", + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-use-callback-ref", + "@radix-ui/react-use-layout-effect", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-select@2.1.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==", + "dependencies": [ + "@radix-ui/number", + "@radix-ui/primitive", + "@radix-ui/react-collection", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-dismissable-layer", + "@radix-ui/react-focus-guards", + "@radix-ui/react-focus-scope", + "@radix-ui/react-id", + "@radix-ui/react-popper", + "@radix-ui/react-portal", + "@radix-ui/react-primitive", + "@radix-ui/react-slot", + "@radix-ui/react-use-callback-ref", + "@radix-ui/react-use-controllable-state", + "@radix-ui/react-use-layout-effect", + "@radix-ui/react-use-previous", + "@radix-ui/react-visually-hidden", + "@types/react", + "@types/react-dom", + "aria-hidden", + "react", + "react-dom", + "react-remove-scroll" + ] + }, + "@radix-ui/react-separator@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==", + "dependencies": [ + "@radix-ui/react-primitive", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-slot@1.1.2_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "dependencies": [ + "@radix-ui/react-compose-refs", + "@types/react", + "react" + ] + }, + "@radix-ui/react-switch@1.1.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-primitive", + "@radix-ui/react-use-controllable-state", + "@radix-ui/react-use-previous", + "@radix-ui/react-use-size", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-tabs@1.1.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-context", + "@radix-ui/react-direction", + "@radix-ui/react-id", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-roving-focus", + "@radix-ui/react-use-controllable-state", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-toast@1.2.6_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-collection", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-dismissable-layer", + "@radix-ui/react-portal", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-use-callback-ref", + "@radix-ui/react-use-controllable-state", + "@radix-ui/react-use-layout-effect", + "@radix-ui/react-visually-hidden", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-tooltip@1.1.8_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==", + "dependencies": [ + "@radix-ui/primitive", + "@radix-ui/react-compose-refs", + "@radix-ui/react-context", + "@radix-ui/react-dismissable-layer", + "@radix-ui/react-id", + "@radix-ui/react-popper", + "@radix-ui/react-portal", + "@radix-ui/react-presence", + "@radix-ui/react-primitive", + "@radix-ui/react-slot", + "@radix-ui/react-use-controllable-state", + "@radix-ui/react-visually-hidden", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/react-use-callback-ref@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-use-controllable-state@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": [ + "@radix-ui/react-use-callback-ref", + "@types/react", + "react" + ] + }, + "@radix-ui/react-use-escape-keydown@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": [ + "@radix-ui/react-use-callback-ref", + "@types/react", + "react" + ] + }, + "@radix-ui/react-use-layout-effect@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-use-previous@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "dependencies": [ + "@types/react", + "react" + ] + }, + "@radix-ui/react-use-rect@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": [ + "@radix-ui/rect", + "@types/react", + "react" + ] + }, + "@radix-ui/react-use-size@1.1.0_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": [ + "@radix-ui/react-use-layout-effect", + "@types/react", + "react" + ] + }, + "@radix-ui/react-visually-hidden@1.1.2_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==", + "dependencies": [ + "@radix-ui/react-primitive", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@radix-ui/rect@1.1.0": { + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "@rollup/plugin-babel@5.3.1_@babel+core@7.26.9_rollup@2.79.2": { + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@rollup/pluginutils@3.1.0_rollup@2.79.2", + "rollup@2.79.2" + ] + }, + "@rollup/plugin-inject@5.0.5": { + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dependencies": [ + "@rollup/pluginutils@5.1.4_rollup@2.79.2", + "estree-walker@2.0.2", + "magic-string@0.30.17" + ] + }, + "@rollup/plugin-node-resolve@15.3.1_rollup@2.79.2": { + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dependencies": [ + "@rollup/pluginutils@5.1.4_rollup@2.79.2", + "@types/resolve", + "deepmerge", + "is-module", + "resolve", + "rollup@2.79.2" + ] + }, + "@rollup/plugin-replace@2.4.2_rollup@2.79.2": { + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": [ + "@rollup/pluginutils@3.1.0_rollup@2.79.2", + "magic-string@0.25.9", + "rollup@2.79.2" + ] + }, + "@rollup/plugin-terser@0.4.4_rollup@2.79.2": { + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dependencies": [ + "rollup@2.79.2", + "serialize-javascript", + "smob", + "terser" + ] + }, + "@rollup/pluginutils@3.1.0_rollup@2.79.2": { + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": [ + "@types/estree@0.0.39", + "estree-walker@1.0.1", + "picomatch@2.3.1", + "rollup@2.79.2" + ] + }, + "@rollup/pluginutils@5.1.4_rollup@2.79.2": { + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dependencies": [ + "@types/estree@1.0.6", + "estree-walker@2.0.2", + "picomatch@4.0.2", + "rollup@2.79.2" + ] + }, + "@rollup/rollup-android-arm-eabi@4.34.9": { + "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==" + }, + "@rollup/rollup-android-arm64@4.34.9": { + "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==" + }, + "@rollup/rollup-darwin-arm64@4.34.9": { + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==" + }, + "@rollup/rollup-darwin-x64@4.34.9": { + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==" + }, + "@rollup/rollup-freebsd-arm64@4.34.9": { + "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==" + }, + "@rollup/rollup-freebsd-x64@4.34.9": { + "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==" + }, + "@rollup/rollup-linux-arm-gnueabihf@4.34.9": { + "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==" + }, + "@rollup/rollup-linux-arm-musleabihf@4.34.9": { + "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==" + }, + "@rollup/rollup-linux-arm64-gnu@4.34.9": { + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==" + }, + "@rollup/rollup-linux-arm64-musl@4.34.9": { + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==" + }, + "@rollup/rollup-linux-loongarch64-gnu@4.34.9": { + "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==" + }, + "@rollup/rollup-linux-powerpc64le-gnu@4.34.9": { + "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==" + }, + "@rollup/rollup-linux-riscv64-gnu@4.34.9": { + "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==" + }, + "@rollup/rollup-linux-s390x-gnu@4.34.9": { + "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==" + }, + "@rollup/rollup-linux-x64-gnu@4.34.9": { + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==" + }, + "@rollup/rollup-linux-x64-musl@4.34.9": { + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==" + }, + "@rollup/rollup-win32-arm64-msvc@4.34.9": { + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==" + }, + "@rollup/rollup-win32-ia32-msvc@4.34.9": { + "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==" + }, + "@rollup/rollup-win32-x64-msvc@4.34.9": { + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==" + }, + "@surma/rollup-plugin-off-main-thread@2.2.3": { + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": [ + "ejs", + "json5", + "magic-string@0.25.9", + "string.prototype.matchall" + ] + }, + "@tailwindcss/node@4.0.9": { + "integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", + "dependencies": [ + "enhanced-resolve", + "jiti", + "tailwindcss" + ] + }, + "@tailwindcss/oxide-android-arm64@4.0.9": { + "integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==" + }, + "@tailwindcss/oxide-darwin-arm64@4.0.9": { + "integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==" + }, + "@tailwindcss/oxide-darwin-x64@4.0.9": { + "integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==" + }, + "@tailwindcss/oxide-freebsd-x64@4.0.9": { + "integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==" + }, + "@tailwindcss/oxide-linux-arm-gnueabihf@4.0.9": { + "integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==" + }, + "@tailwindcss/oxide-linux-arm64-gnu@4.0.9": { + "integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==" + }, + "@tailwindcss/oxide-linux-arm64-musl@4.0.9": { + "integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==" + }, + "@tailwindcss/oxide-linux-x64-gnu@4.0.9": { + "integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==" + }, + "@tailwindcss/oxide-linux-x64-musl@4.0.9": { + "integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==" + }, + "@tailwindcss/oxide-win32-arm64-msvc@4.0.9": { + "integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==" + }, + "@tailwindcss/oxide-win32-x64-msvc@4.0.9": { + "integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==" + }, + "@tailwindcss/oxide@4.0.9": { + "integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==", + "dependencies": [ + "@tailwindcss/oxide-android-arm64", + "@tailwindcss/oxide-darwin-arm64", + "@tailwindcss/oxide-darwin-x64", + "@tailwindcss/oxide-freebsd-x64", + "@tailwindcss/oxide-linux-arm-gnueabihf", + "@tailwindcss/oxide-linux-arm64-gnu", + "@tailwindcss/oxide-linux-arm64-musl", + "@tailwindcss/oxide-linux-x64-gnu", + "@tailwindcss/oxide-linux-x64-musl", + "@tailwindcss/oxide-win32-arm64-msvc", + "@tailwindcss/oxide-win32-x64-msvc" + ] + }, + "@tailwindcss/postcss@4.0.9": { + "integrity": "sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==", + "dependencies": [ + "@alloc/quick-lru", + "@tailwindcss/node", + "@tailwindcss/oxide", + "lightningcss", + "postcss", + "tailwindcss" + ] + }, + "@testing-library/dom@10.4.0": { + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dependencies": [ + "@babel/code-frame", + "@babel/runtime", + "@types/aria-query", + "aria-query", + "chalk", + "dom-accessibility-api", + "lz-string", + "pretty-format" + ] + }, + "@testing-library/react@16.2.0_@testing-library+dom@10.4.0_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", + "dependencies": [ + "@babel/runtime", + "@testing-library/dom", + "@types/react", + "@types/react-dom", + "react", + "react-dom" + ] + }, + "@turf/along@7.2.0": { + "integrity": "sha512-Cf+d2LozABdb0TJoIcJwFKB+qisJY4nMUW9z6PAuZ9UCH7AR//hy2Z06vwYCKFZKP4a7DRPkOMBadQABCyoYuw==", + "dependencies": [ + "@turf/bearing", + "@turf/destination", + "@turf/distance", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/angle@7.2.0": { + "integrity": "sha512-b28rs1NO8Dt/MXadFhnpqH7GnEWRsl+xF5JeFtg9+eM/+l/zGrdliPYMZtAj12xn33w22J1X4TRprAI0rruvVQ==", + "dependencies": [ + "@turf/bearing", + "@turf/helpers", + "@turf/invariant", + "@turf/rhumb-bearing", + "@types/geojson", + "tslib" + ] + }, + "@turf/area@7.2.0": { + "integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/bbox-clip@7.2.0": { + "integrity": "sha512-q6RXTpqeUQAYLAieUL1n3J6ukRGsNVDOqcYtfzaJbPW+0VsAf+1cI16sN700t0sekbeU1DH/RRVAHhpf8+36wA==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/bbox-polygon@7.2.0": { + "integrity": "sha512-Aj4G1GAAy26fmOqMjUk0Z+Lcax5VQ9g1xYDbHLQWXvfTsaueBT+RzdH6XPnZ/seEEnZkio2IxE8V5af/osupgA==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/bbox@7.2.0": { + "integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/bearing@7.2.0": { + "integrity": "sha512-Jm0Xt3GgHjRrWvBtAGvgfnADLm+4exud2pRlmCYx8zfiKuNXQFkrcTZcOiJOgTfG20Agq28iSh15uta47jSIbg==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/bezier-spline@7.2.0": { + "integrity": "sha512-7BPkc3ufYB9KLvcaTpTsnpXzh9DZoENxCS0Ms9XUwuRXw45TpevwUpOsa3atO76iKQ5puHntqFO4zs8IUxBaaA==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-clockwise@7.2.0": { + "integrity": "sha512-0fJeFSARxy6ealGBM4Gmgpa1o8msQF87p2Dx5V6uSqzT8VPDegX1NSWl4b7QgXczYa9qv7IAABttdWP0K7Q7eQ==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-concave@7.2.0": { + "integrity": "sha512-v3dTN04dfO6VqctQj1a+pjDHb6+/Ev90oAR2QjJuAntY4ubhhr7vKeJdk/w+tWNSMKULnYwfe65Du3EOu3/TeA==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-contains@7.2.0": { + "integrity": "sha512-dgRQm4uVO5XuLee4PLVH7CFQZKdefUBMIXTPITm2oRIDmPLJKHDOFKQTNkGJ73mDKKBR2lmt6eVH3br6OYrEYg==", + "dependencies": [ + "@turf/bbox", + "@turf/boolean-point-in-polygon", + "@turf/boolean-point-on-line", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-crosses@7.2.0": { + "integrity": "sha512-9GyM4UUWFKQOoNhHVSfJBf5XbPy8Fxfz9djjJNAnm/IOl8NmFUSwFPAjKlpiMcr6yuaAoc9R/1KokS9/eLqPvA==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/helpers", + "@turf/invariant", + "@turf/line-intersect", + "@turf/polygon-to-line", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-disjoint@7.2.0": { + "integrity": "sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/helpers", + "@turf/line-intersect", + "@turf/meta", + "@turf/polygon-to-line", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-equal@7.2.0": { + "integrity": "sha512-TmjKYLsxXqEmdDtFq3QgX4aSogiISp3/doeEtDOs3NNSR8susOtBEZkmvwO6DLW+g/rgoQJIBR6iVoWiRqkBxw==", + "dependencies": [ + "@turf/clean-coords", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "geojson-equality-ts", + "tslib" + ] + }, + "@turf/boolean-intersects@7.2.0": { + "integrity": "sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow==", + "dependencies": [ + "@turf/boolean-disjoint", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-overlap@7.2.0": { + "integrity": "sha512-ieM5qIE4anO+gUHIOvEN7CjyowF+kQ6v20/oNYJCp63TVS6eGMkwgd+I4uMzBXfVW66nVHIXjODdUelU+Xyctw==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@turf/line-intersect", + "@turf/line-overlap", + "@turf/meta", + "@types/geojson", + "geojson-equality-ts", + "tslib" + ] + }, + "@turf/boolean-parallel@7.2.0": { + "integrity": "sha512-iOtuzzff8nmwv05ROkSvyeGLMrfdGkIi+3hyQ+DH4IVyV37vQbqR5oOJ0Nt3Qq1Tjrq9fvF8G3OMdAv3W2kY9w==", + "dependencies": [ + "@turf/clean-coords", + "@turf/helpers", + "@turf/line-segment", + "@turf/rhumb-bearing", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-point-in-polygon@7.2.0": { + "integrity": "sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "point-in-polygon-hao", + "tslib" + ] + }, + "@turf/boolean-point-on-line@7.2.0": { + "integrity": "sha512-H/bXX8+2VYeSyH8JWrOsu8OGmeA9KVZfM7M6U5/fSqGsRHXo9MyYJ94k39A9kcKSwI0aWiMXVD2UFmiWy8423Q==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-touches@7.2.0": { + "integrity": "sha512-8qb1CO+cwFATGRGFgTRjzL9aibfsbI91pdiRl7KIEkVdeN/H9k8FDrUA1neY7Yq48IaciuwqjbbojQ16FD9b0w==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/boolean-point-on-line", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/boolean-valid@7.2.0": { + "integrity": "sha512-xb7gdHN8VV6ivPJh6rPpgxmAEGReiRxqY+QZoEZVGpW2dXcmU1BdY6FA6G/cwvggXAXxJBREoANtEDgp/0ySbA==", + "dependencies": [ + "@turf/bbox", + "@turf/boolean-crosses", + "@turf/boolean-disjoint", + "@turf/boolean-overlap", + "@turf/boolean-point-in-polygon", + "@turf/boolean-point-on-line", + "@turf/helpers", + "@turf/invariant", + "@turf/line-intersect", + "@types/geojson", + "geojson-polygon-self-intersections", + "tslib" + ] + }, + "@turf/boolean-within@7.2.0": { + "integrity": "sha512-zB3AiF59zQZ27Dp1iyhp9mVAKOFHat8RDH45TZhLY8EaqdEPdmLGvwMFCKfLryQcUDQvmzP8xWbtUR82QM5C4g==", + "dependencies": [ + "@turf/bbox", + "@turf/boolean-point-in-polygon", + "@turf/boolean-point-on-line", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/buffer@7.2.0": { + "integrity": "sha512-QH1FTr5Mk4z1kpQNztMD8XBOZfpOXPOtlsxaSAj2kDIf5+LquA6HtJjZrjUngnGtzG5+XwcfyRL4ImvLnFjm5Q==", + "dependencies": [ + "@turf/bbox", + "@turf/center", + "@turf/helpers", + "@turf/jsts", + "@turf/meta", + "@turf/projection", + "@types/geojson", + "d3-geo" + ] + }, + "@turf/center-mean@7.2.0": { + "integrity": "sha512-NaW6IowAooTJ35O198Jw3U4diZ6UZCCeJY+4E+WMLpks3FCxMDSHEfO2QjyOXQMGWZnVxVelqI5x9DdniDbQ+A==", + "dependencies": [ + "@turf/bbox", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/center-median@7.2.0": { + "integrity": "sha512-/CgVyHNG4zAoZpvkl7qBCe4w7giWNVtLyTU5PoIfg1vWM4VpYw+N7kcBBH46bbzvVBn0vhmZr586r543EwdC/A==", + "dependencies": [ + "@turf/center-mean", + "@turf/centroid", + "@turf/distance", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/center-of-mass@7.2.0": { + "integrity": "sha512-ij3pmG61WQPHGTQvOziPOdIgwTMegkYTwIc71Gl7xn4C0vWH6KLDSshCphds9xdWSXt2GbHpUs3tr4XGntHkEQ==", + "dependencies": [ + "@turf/centroid", + "@turf/convex", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/center@7.2.0": { + "integrity": "sha512-UTNp9abQ2kuyRg5gCIGDNwwEQeF3NbpYsd1Q0KW9lwWuzbLVNn0sOwbxjpNF4J2HtMOs5YVOcqNvYyuoa2XrXw==", + "dependencies": [ + "@turf/bbox", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/centroid@7.2.0": { + "integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/circle@7.2.0": { + "integrity": "sha512-1AbqBYtXhstrHmnW6jhLwsv7TtmT0mW58Hvl1uZXEDM1NCVXIR50yDipIeQPjrCuJ/Zdg/91gU8+4GuDCAxBGA==", + "dependencies": [ + "@turf/destination", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/clean-coords@7.2.0": { + "integrity": "sha512-+5+J1+D7wW7O/RDXn46IfCHuX1gIV1pIAQNSA7lcDbr3HQITZj334C4mOGZLEcGbsiXtlHWZiBtm785Vg8i+QQ==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/clone@7.2.0": { + "integrity": "sha512-JlGUT+/5qoU5jqZmf6NMFIoLDY3O7jKd53Up+zbpJ2vzUp6QdwdNzwrsCeONhynWM13F0MVtPXH4AtdkrgFk4g==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/clusters-dbscan@7.2.0": { + "integrity": "sha512-VWVUuDreev56g3/BMlnq/81yzczqaz+NVTypN5CigGgP67e+u/CnijphiuhKjtjDd/MzGjXgEWBJc26Y6LYKAw==", + "dependencies": [ + "@turf/clone", + "@turf/distance", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "rbush@3.0.1", + "tslib" + ] + }, + "@turf/clusters-kmeans@7.2.0": { + "integrity": "sha512-BxQdK8jc8Mwm9yoClCYkktm4W004uiQGqb/i/6Y7a8xqgJITWDgTu/cy//wOxAWPk4xfe6MThjnqkszWW8JdyQ==", + "dependencies": [ + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "skmeans", + "tslib" + ] + }, + "@turf/clusters@7.2.0": { + "integrity": "sha512-sKOrIKHHtXAuTKNm2USnEct+6/MrgyzMW42deZ2YG2RRKWGaaxHMFU2Yw71Yk4DqStOqTIBQpIOdrRuSOwbuQw==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/collect@7.2.0": { + "integrity": "sha512-zRVGDlYS8Bx/Zz4vnEUyRg4dmqHhkDbW/nIUIJh657YqaMj1SFi4Iv2i9NbcurlUBDJFkpuOhCvvEvAdskJ8UA==", + "dependencies": [ + "@turf/bbox", + "@turf/boolean-point-in-polygon", + "@turf/helpers", + "@types/geojson", + "rbush@3.0.1", + "tslib" + ] + }, + "@turf/combine@7.2.0": { + "integrity": "sha512-VEjm3IvnbMt3IgeRIhCDhhQDbLqCU1/5uN1+j1u6fyA095pCizPThGp4f/COSzC3t1s/iiV+fHuDsB6DihHffQ==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/concave@7.2.0": { + "integrity": "sha512-cpaDDlumK762kdadexw5ZAB6g/h2pJdihZ+e65lbQVe3WukJHAANnIEeKsdFCuIyNKrwTz2gWu5ws+OpjP48Yw==", + "dependencies": [ + "@turf/clone", + "@turf/distance", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/tin", + "@types/geojson", + "topojson-client", + "topojson-server", + "tslib" + ] + }, + "@turf/convex@7.2.0": { + "integrity": "sha512-HsgHm+zHRE8yPCE/jBUtWFyaaBmpXcSlyHd5/xsMhSZRImFzRzBibaONWQo7xbKZMISC3Nc6BtUjDi/jEVbqyA==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "concaveman", + "tslib" + ] + }, + "@turf/destination@7.2.0": { + "integrity": "sha512-8DUxtOO0Fvrh1xclIUj3d9C5WS20D21F5E+j+X9Q+ju6fcM4huOqTg5ckV1DN2Pg8caABEc5HEZJnGch/5YnYQ==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/difference@7.2.0": { + "integrity": "sha512-NHKD1v3s8RX+9lOpvHJg6xRuJOKiY3qxHhz5/FmE0VgGqnCkE7OObqWZ5SsXG+Ckh0aafs5qKhmDdDV/gGi6JA==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "polyclip-ts", + "tslib" + ] + }, + "@turf/dissolve@7.2.0": { + "integrity": "sha512-gPG5TE3mAYuZqBut8tPYCKwi4hhx5Cq0ALoQMB9X0hrVtFIKrihrsj98XQM/5pL/UIpAxQfwisQvy6XaOFaoPA==", + "dependencies": [ + "@turf/flatten", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "polyclip-ts", + "tslib" + ] + }, + "@turf/distance-weight@7.2.0": { + "integrity": "sha512-NeoyV0fXDH+7nIoNtLjAoH9XL0AS1pmTIyDxEE6LryoDTsqjnuR0YQxIkLCCWDqECoqaOmmBqpeWONjX5BwWCg==", + "dependencies": [ + "@turf/centroid", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/distance@7.2.0": { + "integrity": "sha512-HBjjXIgEcD/wJYjv7/6OZj5yoky2oUvTtVeIAqO3lL80XRvoYmVg6vkOIu6NswkerwLDDNT9kl7+BFLJoHbh6Q==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/ellipse@7.2.0": { + "integrity": "sha512-/Y75S5hE2+xjnTw4dXpQ5r/Y2HPM4xrwkPRCCQRpuuboKdEvm42azYmh7isPnMnBTVcmGb9UmGKj0HHAbiwt1g==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@turf/rhumb-destination", + "@turf/transform-rotate", + "@types/geojson", + "tslib" + ] + }, + "@turf/envelope@7.2.0": { + "integrity": "sha512-xOMtDeNKHwUuDfzQeoSNmdabsP0/IgVDeyzitDe/8j9wTeW+MrKzVbGz7627PT3h6gsO+2nUv5asfKtUbmTyHA==", + "dependencies": [ + "@turf/bbox", + "@turf/bbox-polygon", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/explode@7.2.0": { + "integrity": "sha512-jyMXg93J1OI7/65SsLE1k9dfQD3JbcPNMi4/O3QR2Qb3BAs2039oFaSjtW+YqhMqVC4V3ZeKebMcJ8h9sK1n+A==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/flatten@7.2.0": { + "integrity": "sha512-q38Qsqr4l7mxp780zSdn0gp/WLBX+sa+gV6qIbDQ1HKCrrPK8QQJmNx7gk1xxEXVot6tq/WyAPysCQdX+kLmMA==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/flip@7.2.0": { + "integrity": "sha512-X0TQ0U/UYh4tyXdLO5itP1sO2HOvfrZC0fYSWmTfLDM14jEPkEK8PblofznfBygL+pIFtOS2is8FuVcp5XxYpQ==", + "dependencies": [ + "@turf/clone", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/geojson-rbush@7.2.0": { + "integrity": "sha512-ST8fLv+EwxVkDgsmhHggM0sPk2SfOHTZJkdgMXVFT7gB9o4lF8qk4y4lwvCCGIfFQAp2yv/PN5EaGMEKutk6xw==", + "dependencies": [ + "@turf/bbox", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "rbush@3.0.1" + ] + }, + "@turf/great-circle@7.2.0": { + "integrity": "sha512-n30OiADyOKHhor0aXNgYfXQYXO3UtsOKmhQsY1D89/Oh1nCIXG/1ZPlLL9ZoaRXXBTUBjh99a+K8029NQbGDhw==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson" + ] + }, + "@turf/helpers@7.2.0": { + "integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==", + "dependencies": [ + "@types/geojson", + "tslib" + ] + }, + "@turf/hex-grid@7.2.0": { + "integrity": "sha512-Yo2yUGxrTCQfmcVsSjDt0G3Veg8YD26WRd7etVPD9eirNNgXrIyZkbYA7zVV/qLeRWVmYIKRXg1USWl7ORQOGA==", + "dependencies": [ + "@turf/distance", + "@turf/helpers", + "@turf/intersect", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/interpolate@7.2.0": { + "integrity": "sha512-Ifgjm1SEo6XujuSAU6lpRMvoJ1SYTreil1Rf5WsaXj16BQJCedht/4FtWCTNhSWTwEz2motQ1WNrjTCuPG94xA==", + "dependencies": [ + "@turf/bbox", + "@turf/centroid", + "@turf/clone", + "@turf/distance", + "@turf/helpers", + "@turf/hex-grid", + "@turf/invariant", + "@turf/meta", + "@turf/point-grid", + "@turf/square-grid", + "@turf/triangle-grid", + "@types/geojson" + ] + }, + "@turf/intersect@7.2.0": { + "integrity": "sha512-81GMzKS9pKqLPa61qSlFxLFeAC8XbwyCQ9Qv4z6o5skWk1qmMUbEHeMqaGUTEzk+q2XyhZ0sju1FV4iLevQ/aw==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "polyclip-ts", + "tslib" + ] + }, + "@turf/invariant@7.2.0": { + "integrity": "sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/isobands@7.2.0": { + "integrity": "sha512-lYoHeRieFzpBp29Jh19QcDIb0E+dzo/K5uwZuNga4wxr6heNU0AfkD4ByAHYIXHtvmp4m/JpSKq/2N6h/zvBkg==", + "dependencies": [ + "@turf/area", + "@turf/bbox", + "@turf/boolean-point-in-polygon", + "@turf/explode", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "marchingsquares", + "tslib" + ] + }, + "@turf/isolines@7.2.0": { + "integrity": "sha512-4ZXKxvA/JKkxAXixXhN3UVza5FABsdYgOWXyYm3L5ryTPJVOYTVSSd9A+CAVlv9dZc3YdlsqMqLTXNOOre/kwg==", + "dependencies": [ + "@turf/bbox", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "marchingsquares", + "tslib" + ] + }, + "@turf/jsts@2.7.2": { + "integrity": "sha512-zAezGlwWHPyU0zxwcX2wQY3RkRpwuoBmhhNE9HY9kWhFDkCxZ3aWK5URKwa/SWKJbj9aztO+8vtdiBA28KVJFg==", + "dependencies": [ + "jsts" + ] + }, + "@turf/kinks@7.2.0": { + "integrity": "sha512-BtxDxGewJR0Q5WR9HKBSxZhirFX+GEH1rD7/EvgDsHS8e1Y5/vNQQUmXdURjdPa4StzaUBsWRU5T3A356gLbPA==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/length@7.2.0": { + "integrity": "sha512-LBmYN+iCgVtWNLsckVnpQIJENqIIPO63mogazMp23lrDGfWXu07zZQ9ZinJVO5xYurXNhc/QI2xxoqt2Xw90Ig==", + "dependencies": [ + "@turf/distance", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/line-arc@7.2.0": { + "integrity": "sha512-kfWzA5oYrTpslTg5fN50G04zSypiYQzjZv3FLjbZkk6kta5fo4JkERKjTeA8x4XNojb+pfmjMBB0yIh2w2dDRw==", + "dependencies": [ + "@turf/circle", + "@turf/destination", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/line-chunk@7.2.0": { + "integrity": "sha512-1ODyL5gETtWSL85MPI0lgp/78vl95M39gpeBxePXyDIqx8geDP9kXfAzctuKdxBoR4JmOVM3NT7Fz7h+IEkC+g==", + "dependencies": [ + "@turf/helpers", + "@turf/length", + "@turf/line-slice-along", + "@turf/meta", + "@types/geojson" + ] + }, + "@turf/line-intersect@7.2.0": { + "integrity": "sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "sweepline-intersections", + "tslib" + ] + }, + "@turf/line-offset@7.2.0": { + "integrity": "sha512-1+OkYueDCbnEWzbfBh3taVr+3SyM2bal5jfnSEuDiLA6jnlScgr8tn3INo+zwrUkPFZPPAejL1swVyO5TjUahw==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson" + ] + }, + "@turf/line-overlap@7.2.0": { + "integrity": "sha512-NNn7/jg53+N10q2Kyt66bEDqN3101iW/1zA5FW7J6UbKApDFkByh+18YZq1of71kS6oUYplP86WkDp16LFpqqw==", + "dependencies": [ + "@turf/boolean-point-on-line", + "@turf/geojson-rbush", + "@turf/helpers", + "@turf/invariant", + "@turf/line-segment", + "@turf/meta", + "@turf/nearest-point-on-line", + "@types/geojson", + "fast-deep-equal", + "tslib" + ] + }, + "@turf/line-segment@7.2.0": { + "integrity": "sha512-E162rmTF9XjVN4rINJCd15AdQGCBlNqeWN3V0YI1vOUpZFNT2ii4SqEMCcH2d+5EheHLL8BWVwZoOsvHZbvaWA==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/line-slice-along@7.2.0": { + "integrity": "sha512-4/gPgP0j5Rp+1prbhXqn7kIH/uZTmSgiubUnn67F8nb9zE+MhbRglhSlRYEZxAVkB7VrGwjyolCwvrROhjHp2A==", + "dependencies": [ + "@turf/bearing", + "@turf/destination", + "@turf/distance", + "@turf/helpers", + "@types/geojson" + ] + }, + "@turf/line-slice@7.2.0": { + "integrity": "sha512-bHotzZIaU1GPV3RMwttYpDrmcvb3X2i1g/WUttPZWtKrEo2VVAkoYdeZ2aFwtogERYS4quFdJ/TDzAtquBC8WQ==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@turf/nearest-point-on-line", + "@types/geojson" + ] + }, + "@turf/line-split@7.2.0": { + "integrity": "sha512-yJTZR+c8CwoKqdW/aIs+iLbuFwAa3Yan+EOADFQuXXIUGps3bJUXx/38rmowNoZbHyP1np1+OtrotyHu5uBsfQ==", + "dependencies": [ + "@turf/bbox", + "@turf/geojson-rbush", + "@turf/helpers", + "@turf/invariant", + "@turf/line-intersect", + "@turf/line-segment", + "@turf/meta", + "@turf/nearest-point-on-line", + "@turf/square", + "@turf/truncate", + "@types/geojson" + ] + }, + "@turf/line-to-polygon@7.2.0": { + "integrity": "sha512-iKpJqc7EYc5NvlD4KaqrKKO6mXR7YWO/YwtW60E2FnsF/blnsy9OfAOcilYHgH3S/V/TT0VedC7DW7Kgjy2EIA==", + "dependencies": [ + "@turf/bbox", + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/mask@7.2.0": { + "integrity": "sha512-ulJ6dQqXC0wrjIoqFViXuMUdIPX5Q6GPViZ3kGfeVijvlLM7kTFBsZiPQwALSr5nTQg4Ppf3FD0Jmg8IErPrgA==", + "dependencies": [ + "@turf/clone", + "@turf/helpers", + "@types/geojson", + "polyclip-ts", + "tslib" + ] + }, + "@turf/meta@7.2.0": { + "integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==", + "dependencies": [ + "@turf/helpers", + "@types/geojson" + ] + }, + "@turf/midpoint@7.2.0": { + "integrity": "sha512-AMn5S9aSrbXdE+Q4Rj+T5nLdpfpn+mfzqIaEKkYI021HC0vb22HyhQHsQbSeX+AWcS4CjD1hFsYVcgKI+5qCfw==", + "dependencies": [ + "@turf/bearing", + "@turf/destination", + "@turf/distance", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/moran-index@7.2.0": { + "integrity": "sha512-Aexh1EmXVPJhApr9grrd120vbalIthcIsQ3OAN2Tqwf+eExHXArJEJqGBo9IZiQbIpFJeftt/OvUvlI8BeO1bA==", + "dependencies": [ + "@turf/distance-weight", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/nearest-neighbor-analysis@7.2.0": { + "integrity": "sha512-LmP/crXb7gilgsL0wL9hsygqc537W/a1W5r9XBKJT4SKdqjoXX5APJatJfd3nwXbRIqwDH0cDA9/YyFjBPlKnA==", + "dependencies": [ + "@turf/area", + "@turf/bbox", + "@turf/bbox-polygon", + "@turf/centroid", + "@turf/distance", + "@turf/helpers", + "@turf/meta", + "@turf/nearest-point", + "@types/geojson", + "tslib" + ] + }, + "@turf/nearest-point-on-line@7.2.0": { + "integrity": "sha512-UOhAeoDPVewBQV+PWg1YTMQcYpJsIqfW5+EuZ5vJl60XwUa0+kqB/eVfSLNXmHENjKKIlEt9Oy9HIDF4VeWmXA==", + "dependencies": [ + "@turf/distance", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/nearest-point-to-line@7.2.0": { + "integrity": "sha512-EorU7Qj30A7nAjh++KF/eTPDlzwuuV4neBz7tmSTB21HKuXZAR0upJsx6M2X1CSyGEgNsbFB0ivNKIvymRTKBw==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/point-to-line-distance", + "@types/geojson", + "tslib" + ] + }, + "@turf/nearest-point@7.2.0": { + "integrity": "sha512-0wmsqXZ8CGw4QKeZmS+NdjYTqCMC+HXZvM3XAQIU6k6laNLqjad2oS4nDrtcRs/nWDvcj1CR+Io7OiQ6sbpn5Q==", + "dependencies": [ + "@turf/clone", + "@turf/distance", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/planepoint@7.2.0": { + "integrity": "sha512-8Vno01tvi5gThUEKBQ46CmlEKDAwVpkl7stOPFvJYlA1oywjAL4PsmgwjXgleZuFtXQUPBNgv5a42Pf438XP4g==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/point-grid@7.2.0": { + "integrity": "sha512-ai7lwBV2FREPW3XiUNohT4opC1hd6+F56qZe20xYhCTkTD9diWjXHiNudQPSmVAUjgMzQGasblQQqvOdL+bJ3Q==", + "dependencies": [ + "@turf/boolean-within", + "@turf/distance", + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/point-on-feature@7.2.0": { + "integrity": "sha512-ksoYoLO9WtJ/qI8VI9ltF+2ZjLWrAjZNsCsu8F7nyGeCh4I8opjf4qVLytFG44XA2qI5yc6iXDpyv0sshvP82Q==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/center", + "@turf/explode", + "@turf/helpers", + "@turf/nearest-point", + "@types/geojson", + "tslib" + ] + }, + "@turf/point-to-line-distance@7.2.0": { + "integrity": "sha512-fB9Rdnb5w5+t76Gho2dYDkGe20eRrFk8CXi4v1+l1PC8YyLXO+x+l3TrtT8HzL/dVaZeepO6WUIsIw3ditTOPg==", + "dependencies": [ + "@turf/bearing", + "@turf/distance", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/nearest-point-on-line", + "@turf/projection", + "@turf/rhumb-bearing", + "@turf/rhumb-distance", + "@types/geojson", + "tslib" + ] + }, + "@turf/point-to-polygon-distance@7.2.0": { + "integrity": "sha512-w+WYuINgTiFjoZemQwOaQSje/8Kq+uqJOynvx7+gleQPHyWQ3VtTodtV4LwzVzXz8Sf7Mngx1Jcp2SNai5CJYA==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/point-to-line-distance", + "@turf/polygon-to-line", + "@types/geojson", + "tslib" + ] + }, + "@turf/points-within-polygon@7.2.0": { + "integrity": "sha512-jRKp8/mWNMzA+hKlQhxci97H5nOio9tp14R2SzpvkOt+cswxl+NqTEi1hDd2XetA7tjU0TSoNjEgVY8FfA0S6w==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/polygon-smooth@7.2.0": { + "integrity": "sha512-KCp9wF2IEynvGXVhySR8oQ2razKP0zwg99K+fuClP21pSKCFjAPaihPEYq6e8uI/1J7ibjL5++6EMl+LrUTrLg==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/polygon-tangents@7.2.0": { + "integrity": "sha512-AHUUPmOjiQDrtP/ODXukHBlUG0C/9I1je7zz50OTfl2ZDOdEqFJQC3RyNELwq07grTXZvg5TS5wYx/Y7nsm47g==", + "dependencies": [ + "@turf/bbox", + "@turf/boolean-within", + "@turf/explode", + "@turf/helpers", + "@turf/invariant", + "@turf/nearest-point", + "@types/geojson", + "tslib" + ] + }, + "@turf/polygon-to-line@7.2.0": { + "integrity": "sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/polygonize@7.2.0": { + "integrity": "sha512-U9v+lBhUPDv+nsg/VcScdiqCB59afO6CHDGrwIl2+5i6Ve+/KQKjpTV/R+NqoC1iMXAEq3brY6HY8Ukp/pUWng==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/envelope", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/projection@7.2.0": { + "integrity": "sha512-/qke5vJScv8Mu7a+fU3RSChBRijE6EVuFHU3RYihMuYm04Vw8dBMIs0enEpoq0ke/IjSbleIrGQNZIMRX9EwZQ==", + "dependencies": [ + "@turf/clone", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/quadrat-analysis@7.2.0": { + "integrity": "sha512-fDQh3+ldYNxUqS6QYlvJ7GZLlCeDZR6tD3ikdYtOsSemwW1n/4gm2xcgWJqy3Y0uszBwxc13IGGY7NGEjHA+0w==", + "dependencies": [ + "@turf/area", + "@turf/bbox", + "@turf/bbox-polygon", + "@turf/centroid", + "@turf/helpers", + "@turf/invariant", + "@turf/point-grid", + "@turf/random", + "@turf/square-grid", + "@types/geojson", + "tslib" + ] + }, + "@turf/random@7.2.0": { + "integrity": "sha512-fNXs5mOeXsrirliw84S8UCNkpm4RMNbefPNsuCTfZEXhcr1MuHMzq4JWKb4FweMdN1Yx2l/xcytkO0s71cJ50w==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/rectangle-grid@7.2.0": { + "integrity": "sha512-f0o5ifvy0Ml/nHDJzMNcuSk4h11aa3BfvQNnYQhLpuTQu03j/ICZNlzKTLxwjcUqvxADUifty7Z9CX5W6zky4A==", + "dependencies": [ + "@turf/boolean-intersects", + "@turf/distance", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/rewind@7.2.0": { + "integrity": "sha512-SZpRAZiZsE22+HVz6pEID+ST25vOdpAMGk5NO1JeqzhpMALIkIGnkG+xnun2CfYHz7wv8/Z0ADiAvei9rkcQYA==", + "dependencies": [ + "@turf/boolean-clockwise", + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/rhumb-bearing@7.2.0": { + "integrity": "sha512-jbdexlrR8X2ZauUciHx3tRwG+BXoMXke4B8p8/IgDlAfIrVdzAxSQN89FMzIKnjJ/kdLjo9bFGvb92bu31Etug==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/rhumb-destination@7.2.0": { + "integrity": "sha512-U9OLgLAHlH4Wfx3fBZf3jvnkDjdTcfRan5eI7VPV1+fQWkOteATpzkiRjCvSYK575GljVwWBjkKca8LziGWitQ==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/rhumb-distance@7.2.0": { + "integrity": "sha512-NsijTPON1yOc9tirRPEQQuJ5aQi7pREsqchQquaYKbHNWsexZjcDi4wnw2kM3Si4XjmgynT+2f7aXH7FHarHzw==", + "dependencies": [ + "@turf/helpers", + "@turf/invariant", + "@types/geojson", + "tslib" + ] + }, + "@turf/sample@7.2.0": { + "integrity": "sha512-f+ZbcbQJ9glQ/F26re8LadxO0ORafy298EJZe6XtbctRTJrNus6UNAsl8+GYXFqMnXM22tbTAznnJX3ZiWNorA==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/sector@7.2.0": { + "integrity": "sha512-zL06MjbbMG4DdpiNz+Q9Ax8jsCekt3R76uxeWShulAGkyDB5smdBOUDoRwxn05UX7l4kKv4Ucq2imQXhxKFd1w==", + "dependencies": [ + "@turf/circle", + "@turf/helpers", + "@turf/invariant", + "@turf/line-arc", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/shortest-path@7.2.0": { + "integrity": "sha512-6fpx8feZ2jMSaeRaFdqFShGWkNb+veUOeyLFSHA/aRD9n/e9F2pWZoRbQWKbKTpcKFJ2FnDEqCZnh/GrcAsqWA==", + "dependencies": [ + "@turf/bbox", + "@turf/bbox-polygon", + "@turf/boolean-point-in-polygon", + "@turf/clean-coords", + "@turf/distance", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/transform-scale", + "@types/geojson", + "tslib" + ] + }, + "@turf/simplify@7.2.0": { + "integrity": "sha512-9YHIfSc8BXQfi5IvEMbCeQYqNch0UawIGwbboJaoV8rodhtk6kKV2wrpXdGqk/6Thg6/RWvChJFKVVTjVrULyQ==", + "dependencies": [ + "@turf/clean-coords", + "@turf/clone", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/square-grid@7.2.0": { + "integrity": "sha512-EmzGXa90hz+tiCOs9wX+Lak6pH0Vghb7QuX6KZej+pmWi3Yz7vdvQLmy/wuN048+wSkD5c8WUo/kTeNDe7GnmA==", + "dependencies": [ + "@turf/helpers", + "@turf/rectangle-grid", + "@types/geojson", + "tslib" + ] + }, + "@turf/square@7.2.0": { + "integrity": "sha512-9pMoAGFvqzCDOlO9IRSSBCGXKbl8EwMx6xRRBMKdZgpS0mZgfm9xiptMmx/t1m4qqHIlb/N+3MUF7iMBx6upcA==", + "dependencies": [ + "@turf/distance", + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/standard-deviational-ellipse@7.2.0": { + "integrity": "sha512-+uC0pR2nRjm90JvMXe/2xOCZsYV2II1ZZ2zmWcBWv6bcFXBspcxk2QfCC3k0bj6jDapELzoQgnn3cG5lbdQV2w==", + "dependencies": [ + "@turf/center-mean", + "@turf/ellipse", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/points-within-polygon", + "@types/geojson", + "tslib" + ] + }, + "@turf/tag@7.2.0": { + "integrity": "sha512-TAFvsbp5TCBqXue8ui+CtcLsPZ6NPC88L8Ad6Hb/R6VAi21qe0U42WJHQYXzWmtThoTNwxi+oKSeFbRDsr0FIA==", + "dependencies": [ + "@turf/boolean-point-in-polygon", + "@turf/clone", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/tesselate@7.2.0": { + "integrity": "sha512-zHGcG85aOJJu1seCm+CYTJ3UempX4Xtyt669vFG6Hbr/Hc7ii6STQ2ysFr7lJwFtU9uyYhphVrrgwIqwglvI/Q==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "earcut@2.2.4", + "tslib" + ] + }, + "@turf/tin@7.2.0": { + "integrity": "sha512-y24Vt3oeE6ZXvyLJamP0Ke02rPlDGE9gF7OFADnR0mT+2uectb0UTIBC3kKzON80TEAlA3GXpKFkCW5Fo/O/Kg==", + "dependencies": [ + "@turf/helpers", + "@types/geojson", + "tslib" + ] + }, + "@turf/transform-rotate@7.2.0": { + "integrity": "sha512-EMCj0Zqy3cF9d3mGRqDlYnX2ZBXe3LgT+piDR0EuF5c5sjuKErcFcaBIsn/lg1gp4xCNZFinkZ3dsFfgGHf6fw==", + "dependencies": [ + "@turf/centroid", + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/rhumb-bearing", + "@turf/rhumb-destination", + "@turf/rhumb-distance", + "@types/geojson", + "tslib" + ] + }, + "@turf/transform-scale@7.2.0": { + "integrity": "sha512-HYB+pw938eeI8s1/zSWFy6hq+t38fuUaBb0jJsZB1K9zQ1WjEYpPvKF/0//80zNPlyxLv3cOkeBucso3hzI07A==", + "dependencies": [ + "@turf/bbox", + "@turf/center", + "@turf/centroid", + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/rhumb-bearing", + "@turf/rhumb-destination", + "@turf/rhumb-distance", + "@types/geojson", + "tslib" + ] + }, + "@turf/transform-translate@7.2.0": { + "integrity": "sha512-zAglR8MKCqkzDTjGMIQgbg/f+Q3XcKVzr9cELw5l9CrS1a0VTSDtBZLDm0kWx0ankwtam7ZmI2jXyuQWT8Gbug==", + "dependencies": [ + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@turf/meta", + "@turf/rhumb-destination", + "@types/geojson", + "tslib" + ] + }, + "@turf/triangle-grid@7.2.0": { + "integrity": "sha512-4gcAqWKh9hg6PC5nNSb9VWyLgl821cwf9yR9yEzQhEFfwYL/pZONBWCO1cwVF23vSYMSMm+/TwqxH4emxaArfw==", + "dependencies": [ + "@turf/distance", + "@turf/helpers", + "@turf/intersect", + "@types/geojson", + "tslib" + ] + }, + "@turf/truncate@7.2.0": { + "integrity": "sha512-jyFzxYbPugK4XjV5V/k6Xr3taBjjvo210IbPHJXw0Zh7Y6sF+hGxeRVtSuZ9VP/6oRyqAOHKUrze+OOkPqBgUg==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "tslib" + ] + }, + "@turf/turf@7.2.0": { + "integrity": "sha512-G1kKBu4hYgoNoRJgnpJohNuS7bLnoWHZ2G/4wUMym5xOSiYah6carzdTEsMoTsauyi7ilByWHx5UHwbjjCVcBw==", + "dependencies": [ + "@turf/along", + "@turf/angle", + "@turf/area", + "@turf/bbox", + "@turf/bbox-clip", + "@turf/bbox-polygon", + "@turf/bearing", + "@turf/bezier-spline", + "@turf/boolean-clockwise", + "@turf/boolean-concave", + "@turf/boolean-contains", + "@turf/boolean-crosses", + "@turf/boolean-disjoint", + "@turf/boolean-equal", + "@turf/boolean-intersects", + "@turf/boolean-overlap", + "@turf/boolean-parallel", + "@turf/boolean-point-in-polygon", + "@turf/boolean-point-on-line", + "@turf/boolean-touches", + "@turf/boolean-valid", + "@turf/boolean-within", + "@turf/buffer", + "@turf/center", + "@turf/center-mean", + "@turf/center-median", + "@turf/center-of-mass", + "@turf/centroid", + "@turf/circle", + "@turf/clean-coords", + "@turf/clone", + "@turf/clusters", + "@turf/clusters-dbscan", + "@turf/clusters-kmeans", + "@turf/collect", + "@turf/combine", + "@turf/concave", + "@turf/convex", + "@turf/destination", + "@turf/difference", + "@turf/dissolve", + "@turf/distance", + "@turf/distance-weight", + "@turf/ellipse", + "@turf/envelope", + "@turf/explode", + "@turf/flatten", + "@turf/flip", + "@turf/geojson-rbush", + "@turf/great-circle", + "@turf/helpers", + "@turf/hex-grid", + "@turf/interpolate", + "@turf/intersect", + "@turf/invariant", + "@turf/isobands", + "@turf/isolines", + "@turf/kinks", + "@turf/length", + "@turf/line-arc", + "@turf/line-chunk", + "@turf/line-intersect", + "@turf/line-offset", + "@turf/line-overlap", + "@turf/line-segment", + "@turf/line-slice", + "@turf/line-slice-along", + "@turf/line-split", + "@turf/line-to-polygon", + "@turf/mask", + "@turf/meta", + "@turf/midpoint", + "@turf/moran-index", + "@turf/nearest-neighbor-analysis", + "@turf/nearest-point", + "@turf/nearest-point-on-line", + "@turf/nearest-point-to-line", + "@turf/planepoint", + "@turf/point-grid", + "@turf/point-on-feature", + "@turf/point-to-line-distance", + "@turf/point-to-polygon-distance", + "@turf/points-within-polygon", + "@turf/polygon-smooth", + "@turf/polygon-tangents", + "@turf/polygon-to-line", + "@turf/polygonize", + "@turf/projection", + "@turf/quadrat-analysis", + "@turf/random", + "@turf/rectangle-grid", + "@turf/rewind", + "@turf/rhumb-bearing", + "@turf/rhumb-destination", + "@turf/rhumb-distance", + "@turf/sample", + "@turf/sector", + "@turf/shortest-path", + "@turf/simplify", + "@turf/square", + "@turf/square-grid", + "@turf/standard-deviational-ellipse", + "@turf/tag", + "@turf/tesselate", + "@turf/tin", + "@turf/transform-rotate", + "@turf/transform-scale", + "@turf/transform-translate", + "@turf/triangle-grid", + "@turf/truncate", + "@turf/union", + "@turf/unkink-polygon", + "@turf/voronoi", + "@types/geojson", + "tslib" + ] + }, + "@turf/union@7.2.0": { + "integrity": "sha512-Xex/cfKSmH0RZRWSJl4RLlhSmEALVewywiEXcu0aIxNbuZGTcpNoI0h4oLFrE/fUd0iBGFg/EGLXRL3zTfpg6g==", + "dependencies": [ + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "polyclip-ts", + "tslib" + ] + }, + "@turf/unkink-polygon@7.2.0": { + "integrity": "sha512-dFPfzlIgkEr15z6oXVxTSWshWi51HeITGVFtl1GAKGMtiXJx1uMqnfRsvljqEjaQu/4AzG1QAp3b+EkSklQSiQ==", + "dependencies": [ + "@turf/area", + "@turf/boolean-point-in-polygon", + "@turf/helpers", + "@turf/meta", + "@types/geojson", + "rbush@3.0.1", + "tslib" + ] + }, + "@turf/voronoi@7.2.0": { + "integrity": "sha512-3K6N0LtJsWTXxPb/5N2qD9e8f4q8+tjTbGV3lE3v8x06iCnNlnuJnqM5NZNPpvgvCatecBkhClO3/3RndE61Fw==", + "dependencies": [ + "@turf/clone", + "@turf/helpers", + "@turf/invariant", + "@types/d3-voronoi", + "@types/geojson", + "d3-voronoi", + "tslib" + ] + }, + "@types/aria-query@5.0.4": { + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + }, + "@types/babel__core@7.20.5": { + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "@types/babel__generator", + "@types/babel__template", + "@types/babel__traverse" + ] + }, + "@types/babel__generator@7.6.8": { + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": [ + "@babel/types" + ] + }, + "@types/babel__template@7.4.4": { + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": [ + "@babel/parser", + "@babel/types" + ] + }, + "@types/babel__traverse@7.20.6": { + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dependencies": [ + "@babel/types" + ] + }, + "@types/chrome@0.0.307": { + "integrity": "sha512-IHqsTT+JT6vlFTcRWaih7saaEYhFCT13KRgRIRFKjXYOG3g0ummwXAGKtaxK9Zzz6yYsYvbEut91exTX0F/xSg==", + "dependencies": [ + "@types/filesystem", + "@types/har-format" + ] + }, + "@types/d3-voronoi@1.1.12": { + "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==" + }, + "@types/estree@0.0.39": { + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "@types/estree@1.0.6": { + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "@types/filesystem@0.0.36": { + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", + "dependencies": [ + "@types/filewriter" + ] + }, + "@types/filewriter@0.0.33": { + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==" + }, + "@types/geojson-vt@3.2.5": { + "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "dependencies": [ + "@types/geojson" + ] + }, + "@types/geojson@7946.0.16": { + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" + }, + "@types/har-format@1.2.16": { + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==" + }, + "@types/js-cookie@3.0.6": { + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==" + }, + "@types/mapbox__point-geometry@0.1.4": { + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" + }, + "@types/mapbox__vector-tile@1.3.4": { + "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "dependencies": [ + "@types/geojson", + "@types/mapbox__point-geometry", + "@types/pbf" + ] + }, + "@types/node@20.17.22": { + "integrity": "sha512-9RV2zST+0s3EhfrMZIhrz2bhuhBwxgkbHEwP2gtGWPjBzVQjifMzJ9exw7aDZhR1wbpj8zBrfp3bo8oJcGiUUw==", + "dependencies": [ + "undici-types@6.19.8" + ] + }, + "@types/node@22.12.0": { + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "dependencies": [ + "undici-types@6.20.0" + ] + }, + "@types/node@22.13.8": { + "integrity": "sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==", + "dependencies": [ + "undici-types@6.20.0" + ] + }, + "@types/pbf@3.0.5": { + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" + }, + "@types/react-dom@19.0.4_@types+react@19.0.10": { + "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", + "dependencies": [ + "@types/react" + ] + }, + "@types/react@19.0.10": { + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "dependencies": [ + "csstype" + ] + }, + "@types/resolve@1.20.2": { + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, + "@types/serviceworker@0.0.123": { + "integrity": "sha512-c6ynzmpJwqKTkMHDLonE+EStBqTHJqiR+1RsDd40K3YjglABm/C6mZO7xn25g5WldsgxfGHGaKa3IXRnig9c0A==" + }, + "@types/supercluster@7.1.3": { + "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "dependencies": [ + "@types/geojson" + ] + }, + "@types/trusted-types@2.0.7": { + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "@types/validator@13.12.2": { + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + }, + "@types/w3c-web-serial@1.0.8": { + "integrity": "sha512-QQOT+bxQJhRGXoZDZGLs3ksLud1dMNnMiSQtBA0w8KXvLpXX4oM4TZb6J0GgJ8UbCaHo5s9/4VQT8uXy9JER2A==" + }, + "@types/web-bluetooth@0.0.21": { + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==" + }, + "@vis.gl/react-mapbox@8.0.1_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-s/OokvgK1T43Ev2/4hj21C0DKrf79nIigBCdYPtAkEX88qGLRQ5t5zCRqg5Zl+44xXfVxcVpX2/vWUKd9oYGKQ==", + "dependencies": [ + "react", + "react-dom" + ] + }, + "@vis.gl/react-maplibre@8.0.1_maplibre-gl@5.1.1_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-IFguo7DKIDZ9U9uRI4thZRfc5aTHEH4lWlIjedBeCpLeMm7wdrqtU2JshyEQt8dDO85kkEE7CbrtjMx5MplaoA==", + "dependencies": [ + "@maplibre/maplibre-gl-style-spec@19.3.3", + "maplibre-gl", + "react", + "react-dom" + ] + }, + "@vitejs/plugin-react@4.3.4_vite@6.2.0__@types+node@22.13.8_@babel+core@7.26.9_@types+node@22.13.8": { + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dependencies": [ + "@babel/core", + "@babel/plugin-transform-react-jsx-self", + "@babel/plugin-transform-react-jsx-source", + "@types/babel__core", + "react-refresh", + "vite" + ] + }, + "@vitest/expect@3.0.7": { + "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==", + "dependencies": [ + "@vitest/spy", + "@vitest/utils", + "chai", + "tinyrainbow" + ] + }, + "@vitest/mocker@3.0.7_vite@6.2.0__@types+node@22.13.8_@types+node@22.13.8": { + "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==", + "dependencies": [ + "@vitest/spy", + "estree-walker@3.0.3", + "magic-string@0.30.17", + "vite" + ] + }, + "@vitest/pretty-format@3.0.7": { + "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==", + "dependencies": [ + "tinyrainbow" + ] + }, + "@vitest/runner@3.0.7": { + "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==", + "dependencies": [ + "@vitest/utils", + "pathe" + ] + }, + "@vitest/snapshot@3.0.7": { + "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==", + "dependencies": [ + "@vitest/pretty-format", + "magic-string@0.30.17", + "pathe" + ] + }, + "@vitest/spy@3.0.7": { + "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==", + "dependencies": [ + "tinyspy" + ] + }, + "@vitest/utils@3.0.7": { + "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==", + "dependencies": [ + "@vitest/pretty-format", + "loupe", + "tinyrainbow" + ] + }, + "acorn@8.14.0": { + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" + }, + "ajv@8.17.1": { + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": [ + "fast-deep-equal", + "fast-uri", + "json-schema-traverse", + "require-from-string" + ] + }, + "ansi-regex@5.0.1": { + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-regex@6.1.0": { + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" + }, + "ansi-styles@4.3.0": { + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": [ + "color-convert" + ] + }, + "ansi-styles@5.2.0": { + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "ansi-styles@6.2.1": { + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "aria-hidden@1.2.4": { + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": [ + "tslib" + ] + }, + "aria-query@5.3.0": { + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": [ + "dequal" + ] + }, + "arr-union@3.1.0": { + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + }, + "array-buffer-byte-length@1.0.2": { + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dependencies": [ + "call-bound", + "is-array-buffer" + ] + }, + "arraybuffer.prototype.slice@1.0.4": { + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dependencies": [ + "array-buffer-byte-length", + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "get-intrinsic", + "is-array-buffer" + ] + }, + "asn1.js@4.10.1": { + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dependencies": [ + "bn.js@4.12.1", + "inherits", + "minimalistic-assert" + ] + }, + "assert@2.1.0": { + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": [ + "call-bind", + "is-nan", + "object-is", + "object.assign", + "util" + ] + }, + "assertion-error@2.0.1": { + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" + }, + "assign-symbols@1.0.0": { + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + }, + "async-function@1.0.0": { + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==" + }, + "async@3.2.6": { + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "at-least-node@1.0.0": { + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "autoprefixer@10.4.20_postcss@8.5.3": { + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dependencies": [ + "browserslist", + "caniuse-lite", + "fraction.js", + "normalize-range", + "picocolors", + "postcss", + "postcss-value-parser" + ] + }, + "available-typed-arrays@1.0.7": { + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": [ + "possible-typed-array-names" + ] + }, + "babel-plugin-polyfill-corejs2@0.4.12_@babel+core@7.26.9": { + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", + "dependencies": [ + "@babel/compat-data", + "@babel/core", + "@babel/helper-define-polyfill-provider", + "semver" + ] + }, + "babel-plugin-polyfill-corejs3@0.11.1_@babel+core@7.26.9": { + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dependencies": [ + "@babel/core", + "@babel/helper-define-polyfill-provider", + "core-js-compat" + ] + }, + "babel-plugin-polyfill-regenerator@0.6.3_@babel+core@7.26.9": { + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", + "dependencies": [ + "@babel/core", + "@babel/helper-define-polyfill-provider" + ] + }, + "balanced-match@1.0.2": { + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js@1.5.1": { + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bignumber.js@9.1.2": { + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, + "bippy@0.2.7": { + "integrity": "sha512-LTCos3SmOJHrag0qF91tLUZMMw6wA+i15ESRBp71pvfNlTMYcxYoJHJ/pvFhd+29Wm5vfgVxBHV7kP5OKUUipg==" + }, + "bn.js@4.12.1": { + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "bn.js@5.2.1": { + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "brace-expansion@1.1.11": { + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": [ + "balanced-match", + "concat-map" + ] + }, + "brace-expansion@2.0.1": { + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": [ + "balanced-match" + ] + }, + "brorand@1.1.0": { + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "browser-resolve@2.0.0": { + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dependencies": [ + "resolve" + ] + }, + "browserify-aes@1.2.0": { + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": [ + "buffer-xor", + "cipher-base", + "create-hash", + "evp_bytestokey", + "inherits", + "safe-buffer@5.2.1" + ] + }, + "browserify-cipher@1.0.1": { + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": [ + "browserify-aes", + "browserify-des", + "evp_bytestokey" + ] + }, + "browserify-des@1.0.2": { + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": [ + "cipher-base", + "des.js", + "inherits", + "safe-buffer@5.2.1" + ] + }, + "browserify-rsa@4.1.1": { + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dependencies": [ + "bn.js@5.2.1", + "randombytes", + "safe-buffer@5.2.1" + ] + }, + "browserify-sign@4.2.3": { + "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "dependencies": [ + "bn.js@5.2.1", + "browserify-rsa", + "create-hash", + "create-hmac", + "elliptic", + "hash-base", + "inherits", + "parse-asn1", + "readable-stream@2.3.8", + "safe-buffer@5.2.1" + ] + }, + "browserify-zlib@0.2.0": { + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": [ + "pako" + ] + }, + "browserslist@4.24.4": { + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dependencies": [ + "caniuse-lite", + "electron-to-chromium", + "node-releases", + "update-browserslist-db" + ] + }, + "buffer-from@1.1.2": { + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor@1.0.3": { + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "buffer@5.7.1": { + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": [ + "base64-js", + "ieee754" + ] + }, + "builtin-status-codes@3.0.0": { + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "bytewise-core@1.2.3": { + "integrity": "sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==", + "dependencies": [ + "typewise-core" + ] + }, + "bytewise@1.1.0": { + "integrity": "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==", + "dependencies": [ + "bytewise-core", + "typewise" + ] + }, + "cac@6.7.14": { + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + }, + "call-bind-apply-helpers@1.0.2": { + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": [ + "es-errors", + "function-bind" + ] + }, + "call-bind@1.0.8": { + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "get-intrinsic", + "set-function-length" + ] + }, + "call-bound@1.0.3": { + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": [ + "call-bind-apply-helpers", + "get-intrinsic" + ] + }, + "caniuse-lite@1.0.30001701": { + "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==" + }, + "chai@5.2.0": { + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dependencies": [ + "assertion-error", + "check-error", + "deep-eql", + "loupe", + "pathval" + ] + }, + "chalk@4.1.2": { + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": [ + "ansi-styles@4.3.0", + "supports-color" + ] + }, + "check-error@2.1.1": { + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==" + }, + "chownr@3.0.0": { + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + }, + "cipher-base@1.0.6": { + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dependencies": [ + "inherits", + "safe-buffer@5.2.1" + ] + }, + "class-validator@0.14.1": { + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "dependencies": [ + "@types/validator", + "libphonenumber-js", + "validator" + ] + }, + "class-variance-authority@0.7.1": { + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dependencies": [ + "clsx" + ] + }, + "clsx@2.1.1": { + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "cmdk@1.0.4_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10": { + "integrity": "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==", + "dependencies": [ + "@radix-ui/react-dialog", + "@radix-ui/react-id", + "@radix-ui/react-primitive", + "react", + "react-dom", + "use-sync-external-store" + ] + }, + "color-convert@2.0.1": { + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": [ + "color-name" + ] + }, + "color-name@1.1.4": { + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "commander@12.1.0": { + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==" + }, + "commander@2.20.3": { + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "common-tags@1.8.2": { + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "concat-map@0.0.1": { + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concaveman@1.2.1": { + "integrity": "sha512-PwZYKaM/ckQSa8peP5JpVr7IMJ4Nn/MHIaWUjP4be+KoZ7Botgs8seAZGpmaOM+UZXawcdYRao/px9ycrCihHw==", + "dependencies": [ + "point-in-polygon", + "rbush@3.0.1", + "robust-predicates@2.0.4", + "tinyqueue@2.0.3" + ] + }, + "console-browserify@1.2.0": { + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify@1.0.0": { + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "convert-source-map@2.0.0": { + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "core-js-compat@3.41.0": { + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dependencies": [ + "browserslist" + ] + }, + "core-util-is@1.0.3": { + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "create-ecdh@4.0.4": { + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": [ + "bn.js@4.12.1", + "elliptic" + ] + }, + "create-hash@1.2.0": { + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": [ + "cipher-base", + "inherits", + "md5.js", + "ripemd160", + "sha.js" + ] + }, + "create-hmac@1.1.7": { + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": [ + "cipher-base", + "create-hash", + "inherits", + "ripemd160", + "safe-buffer@5.2.1", + "sha.js" + ] + }, + "create-require@1.1.1": { + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "cross-spawn@7.0.6": { + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": [ + "path-key", + "shebang-command", + "which@2.0.2" + ] + }, + "crypto-browserify@3.12.1": { + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dependencies": [ + "browserify-cipher", + "browserify-sign", + "create-ecdh", + "create-hash", + "create-hmac", + "diffie-hellman", + "hash-base", + "inherits", + "pbkdf2", + "public-encrypt", + "randombytes", + "randomfill" + ] + }, + "crypto-random-string@2.0.0": { + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "crypto-random-string@5.0.0": { + "integrity": "sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==", + "dependencies": [ + "type-fest@2.19.0" + ] + }, + "csstype@3.1.3": { + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "d3-array@1.2.4": { + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-geo@1.7.1": { + "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", + "dependencies": [ + "d3-array" + ] + }, + "d3-voronoi@1.1.2": { + "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" + }, + "data-view-buffer@1.0.2": { + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-length@1.0.2": { + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "data-view-byte-offset@1.0.1": { + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dependencies": [ + "call-bound", + "es-errors", + "is-data-view" + ] + }, + "debug@4.4.0": { + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": [ + "ms" + ] + }, + "deep-eql@5.0.2": { + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==" + }, + "deepmerge@4.3.1": { + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "define-data-property@1.1.4": { + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": [ + "es-define-property", + "es-errors", + "gopd" + ] + }, + "define-properties@1.2.1": { + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": [ + "define-data-property", + "has-property-descriptors", + "object-keys" + ] + }, + "dequal@2.0.3": { + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, + "des.js@1.1.0": { + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": [ + "inherits", + "minimalistic-assert" + ] + }, + "detect-libc@1.0.3": { + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, + "detect-node-es@1.1.0": { + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "diffie-hellman@5.0.3": { + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": [ + "bn.js@4.12.1", + "miller-rabin", + "randombytes" + ] + }, + "dom-accessibility-api@0.5.16": { + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "domain-browser@4.22.0": { + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==" + }, + "dunder-proto@1.0.1": { + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": [ + "call-bind-apply-helpers", + "es-errors", + "gopd" + ] + }, + "duplex-maker@1.0.0": { + "integrity": "sha512-KoHuzggxg7f+vvjqOHfXxaQYI1POzBm+ah0eec7YDssZmbt6QFBI8d1nl5GQwAgR2f+VQCPvyvZtmWWqWuFtlA==" + }, + "duplexify@3.7.1": { + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": [ + "end-of-stream", + "inherits", + "readable-stream@2.3.8", + "stream-shift" + ] + }, + "earcut@2.2.4": { + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + }, + "earcut@3.0.1": { + "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==" + }, + "eastasianwidth@0.2.0": { + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ejs@3.1.10": { + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": [ + "jake" + ] + }, + "electron-to-chromium@1.5.109": { + "integrity": "sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==" + }, + "elliptic@6.6.1": { + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "dependencies": [ + "bn.js@4.12.1", + "brorand", + "hash.js", + "hmac-drbg", + "inherits", + "minimalistic-assert", + "minimalistic-crypto-utils" + ] + }, + "emoji-regex@8.0.0": { + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emoji-regex@9.2.2": { + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "end-of-stream@1.4.4": { + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": [ + "once" + ] + }, + "enhanced-resolve@5.18.1": { + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dependencies": [ + "graceful-fs", + "tapable" + ] + }, + "es-abstract@1.23.9": { + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dependencies": [ + "array-buffer-byte-length", + "arraybuffer.prototype.slice", + "available-typed-arrays", + "call-bind", + "call-bound", + "data-view-buffer", + "data-view-byte-length", + "data-view-byte-offset", + "es-define-property", + "es-errors", + "es-object-atoms", + "es-set-tostringtag", + "es-to-primitive", + "function.prototype.name", + "get-intrinsic", + "get-proto", + "get-symbol-description", + "globalthis", + "gopd", + "has-property-descriptors", + "has-proto", + "has-symbols", + "hasown", + "internal-slot", + "is-array-buffer", + "is-callable", + "is-data-view", + "is-regex", + "is-shared-array-buffer", + "is-string", + "is-typed-array", + "is-weakref", + "math-intrinsics", + "object-inspect", + "object-keys", + "object.assign", + "own-keys", + "regexp.prototype.flags", + "safe-array-concat", + "safe-push-apply", + "safe-regex-test", + "set-proto", + "string.prototype.trim", + "string.prototype.trimend", + "string.prototype.trimstart", + "typed-array-buffer", + "typed-array-byte-length", + "typed-array-byte-offset", + "typed-array-length", + "unbox-primitive", + "which-typed-array" + ] + }, + "es-define-property@1.0.1": { + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors@1.3.0": { + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-module-lexer@1.6.0": { + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" + }, + "es-object-atoms@1.1.1": { + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": [ + "es-errors" + ] + }, + "es-set-tostringtag@2.1.0": { + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": [ + "es-errors", + "get-intrinsic", + "has-tostringtag", + "hasown" + ] + }, + "es-to-primitive@1.3.0": { + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dependencies": [ + "is-callable", + "is-date-object", + "is-symbol" + ] + }, + "esbuild@0.24.2": { + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dependencies": [ + "@esbuild/aix-ppc64@0.24.2", + "@esbuild/android-arm@0.24.2", + "@esbuild/android-arm64@0.24.2", + "@esbuild/android-x64@0.24.2", + "@esbuild/darwin-arm64@0.24.2", + "@esbuild/darwin-x64@0.24.2", + "@esbuild/freebsd-arm64@0.24.2", + "@esbuild/freebsd-x64@0.24.2", + "@esbuild/linux-arm@0.24.2", + "@esbuild/linux-arm64@0.24.2", + "@esbuild/linux-ia32@0.24.2", + "@esbuild/linux-loong64@0.24.2", + "@esbuild/linux-mips64el@0.24.2", + "@esbuild/linux-ppc64@0.24.2", + "@esbuild/linux-riscv64@0.24.2", + "@esbuild/linux-s390x@0.24.2", + "@esbuild/linux-x64@0.24.2", + "@esbuild/netbsd-arm64@0.24.2", + "@esbuild/netbsd-x64@0.24.2", + "@esbuild/openbsd-arm64@0.24.2", + "@esbuild/openbsd-x64@0.24.2", + "@esbuild/sunos-x64@0.24.2", + "@esbuild/win32-arm64@0.24.2", + "@esbuild/win32-ia32@0.24.2", + "@esbuild/win32-x64@0.24.2" + ] + }, + "esbuild@0.25.0": { + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dependencies": [ + "@esbuild/aix-ppc64@0.25.0", + "@esbuild/android-arm@0.25.0", + "@esbuild/android-arm64@0.25.0", + "@esbuild/android-x64@0.25.0", + "@esbuild/darwin-arm64@0.25.0", + "@esbuild/darwin-x64@0.25.0", + "@esbuild/freebsd-arm64@0.25.0", + "@esbuild/freebsd-x64@0.25.0", + "@esbuild/linux-arm@0.25.0", + "@esbuild/linux-arm64@0.25.0", + "@esbuild/linux-ia32@0.25.0", + "@esbuild/linux-loong64@0.25.0", + "@esbuild/linux-mips64el@0.25.0", + "@esbuild/linux-ppc64@0.25.0", + "@esbuild/linux-riscv64@0.25.0", + "@esbuild/linux-s390x@0.25.0", + "@esbuild/linux-x64@0.25.0", + "@esbuild/netbsd-arm64@0.25.0", + "@esbuild/netbsd-x64@0.25.0", + "@esbuild/openbsd-arm64@0.25.0", + "@esbuild/openbsd-x64@0.25.0", + "@esbuild/sunos-x64@0.25.0", + "@esbuild/win32-arm64@0.25.0", + "@esbuild/win32-ia32@0.25.0", + "@esbuild/win32-x64@0.25.0" + ] + }, + "escalade@3.2.0": { + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "estree-walker@1.0.1": { + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "estree-walker@2.0.2": { + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "estree-walker@3.0.3": { + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": [ + "@types/estree@1.0.6" + ] + }, + "esutils@2.0.3": { + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "events@3.3.0": { + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "evp_bytestokey@1.0.3": { + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": [ + "md5.js", + "safe-buffer@5.2.1" + ] + }, + "expect-type@1.2.0": { + "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==" + }, + "extend-shallow@2.0.1": { + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": [ + "is-extendable@0.1.1" + ] + }, + "extend-shallow@3.0.2": { + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": [ + "assign-symbols", + "is-extendable@1.0.1" + ] + }, + "fast-deep-equal@3.1.3": { + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify@2.1.0": { + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-uri@3.0.6": { + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==" + }, + "fdir@6.4.3_picomatch@4.0.2": { + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dependencies": [ + "picomatch@4.0.2" + ] + }, + "filelist@1.0.4": { + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": [ + "minimatch@5.1.6" + ] + }, + "find-up@5.0.0": { + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": [ + "locate-path", + "path-exists" + ] + }, + "for-each@0.3.5": { + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": [ + "is-callable" + ] + }, + "foreground-child@3.3.1": { + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": [ + "cross-spawn", + "signal-exit" + ] + }, + "fraction.js@4.3.7": { + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==" + }, + "fs-extra@9.1.0": { + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": [ + "at-least-node", + "graceful-fs", + "jsonfile", + "universalify" + ] + }, + "fs.realpath@1.0.0": { + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents@2.3.2": { + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + }, + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "function.prototype.name@1.1.8": { + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "functions-have-names", + "hasown", + "is-callable" + ] + }, + "functions-have-names@1.2.3": { + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gensync@1.0.0-beta.2": { + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "geojson-equality-ts@1.0.2": { + "integrity": "sha512-h3Ryq+0mCSN/7yLs0eDgrZhvc9af23o/QuC4aTiuuzP/MRCtd6mf5rLsLRY44jX0RPUfM8c4GqERQmlUxPGPoQ==", + "dependencies": [ + "@types/geojson" + ] + }, + "geojson-polygon-self-intersections@1.2.1": { + "integrity": "sha512-/QM1b5u2d172qQVO//9CGRa49jEmclKEsYOQmWP9ooEjj63tBM51m2805xsbxkzlEELQ2REgTf700gUhhlegxA==", + "dependencies": [ + "rbush@2.0.2" + ] + }, + "geojson-vt@4.0.2": { + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + }, + "get-intrinsic@1.3.0": { + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "es-errors", + "es-object-atoms", + "function-bind", + "get-proto", + "gopd", + "has-symbols", + "hasown", + "math-intrinsics" + ] + }, + "get-nonce@1.0.1": { + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, + "get-own-enumerable-property-symbols@3.0.2": { + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-proto@1.0.1": { + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": [ + "dunder-proto", + "es-object-atoms" + ] + }, + "get-stream@6.0.1": { + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description@1.1.0": { + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic" + ] + }, + "get-tsconfig@4.10.0": { + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dependencies": [ + "resolve-pkg-maps" + ] + }, + "get-value@2.0.6": { + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + }, + "gl-matrix@3.4.3": { + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + }, + "glob@10.4.5": { + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": [ + "foreground-child", + "jackspeak", + "minimatch@9.0.5", + "minipass", + "package-json-from-dist", + "path-scurry" + ] + }, + "glob@7.2.3": { + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": [ + "fs.realpath", + "inflight", + "inherits", + "minimatch@3.1.2", + "once", + "path-is-absolute" + ] + }, + "global-prefix@4.0.0": { + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "dependencies": [ + "ini", + "kind-of", + "which@4.0.0" + ] + }, + "globals@11.12.0": { + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis@1.0.4": { + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": [ + "define-properties", + "gopd" + ] + }, + "gopd@1.2.0": { + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "gzipper@8.2.0": { + "integrity": "sha512-JUvhzo8dHQWJp1eyYy1ShaPfcowsPbRc2rvwkD4LRyou/80UUz96bn+EOOYLWO4PG0Y5f3+UlUX9Gmu8RZhrtw==", + "dependencies": [ + "@gfx/zopfli", + "commander@12.1.0", + "simple-zstd" + ] + }, + "happy-dom@17.1.8": { + "integrity": "sha512-Yxbq/FG79z1rhAf/iB6YM8wO2JB/JDQBy99RiLSs+2siEAi5J05x9eW1nnASHZJbpldjJE2KuFLsLZ+AzX/IxA==", + "dependencies": [ + "webidl-conversions@7.0.0", + "whatwg-mimetype" + ] + }, + "has-bigints@1.1.0": { + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==" + }, + "has-flag@4.0.0": { + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors@1.0.2": { + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": [ + "es-define-property" + ] + }, + "has-proto@1.2.0": { + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": [ + "dunder-proto" + ] + }, + "has-symbols@1.1.0": { + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag@1.0.2": { + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": [ + "has-symbols" + ] + }, + "hash-base@3.0.5": { + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", + "dependencies": [ + "inherits", + "safe-buffer@5.2.1" + ] + }, + "hash.js@1.1.7": { + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": [ + "inherits", + "minimalistic-assert" + ] + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, + "hmac-drbg@1.0.1": { + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": [ + "hash.js", + "minimalistic-assert", + "minimalistic-crypto-utils" + ] + }, + "https-browserify@1.0.0": { + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "idb@7.1.1": { + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "ieee754@1.2.1": { + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "immer@10.1.1": { + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==" + }, + "inflight@1.0.6": { + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": [ + "once", + "wrappy" + ] + }, + "inherits@2.0.4": { + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini@4.1.3": { + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==" + }, + "internal-slot@1.1.0": { + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dependencies": [ + "es-errors", + "hasown", + "side-channel" + ] + }, + "is-arguments@1.2.0": { + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-array-buffer@3.0.5": { + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dependencies": [ + "call-bind", + "call-bound", + "get-intrinsic" + ] + }, + "is-async-function@2.1.1": { + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dependencies": [ + "async-function", + "call-bound", + "get-proto", + "has-tostringtag", + "safe-regex-test" + ] + }, + "is-bigint@1.1.0": { + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dependencies": [ + "has-bigints" + ] + }, + "is-boolean-object@1.2.2": { + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-callable@1.2.7": { + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-core-module@2.16.1": { + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": [ + "hasown" + ] + }, + "is-data-view@1.0.2": { + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dependencies": [ + "call-bound", + "get-intrinsic", + "is-typed-array" + ] + }, + "is-date-object@1.1.0": { + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-extendable@0.1.1": { + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, + "is-extendable@1.0.1": { + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": [ + "is-plain-object" + ] + }, + "is-finalizationregistry@1.1.1": { + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": [ + "call-bound" + ] + }, + "is-fullwidth-code-point@3.0.0": { + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function@1.1.0": { + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dependencies": [ + "call-bound", + "get-proto", + "has-tostringtag", + "safe-regex-test" + ] + }, + "is-map@2.0.3": { + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, + "is-module@1.0.0": { + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-nan@1.3.2": { + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": [ + "call-bind", + "define-properties" + ] + }, + "is-number-object@1.1.1": { + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-obj@1.0.1": { + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "is-plain-object@2.0.4": { + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": [ + "isobject" + ] + }, + "is-regex@1.2.1": { + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dependencies": [ + "call-bound", + "gopd", + "has-tostringtag", + "hasown" + ] + }, + "is-regexp@1.0.0": { + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-set@2.0.3": { + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, + "is-shared-array-buffer@1.0.4": { + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dependencies": [ + "call-bound" + ] + }, + "is-stream@2.0.1": { + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string@1.1.1": { + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dependencies": [ + "call-bound", + "has-tostringtag" + ] + }, + "is-symbol@1.1.1": { + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dependencies": [ + "call-bound", + "has-symbols", + "safe-regex-test" + ] + }, + "is-typed-array@1.1.15": { + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": [ + "which-typed-array" + ] + }, + "is-weakmap@2.0.2": { + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, + "is-weakref@1.1.1": { + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dependencies": [ + "call-bound" + ] + }, + "is-weakset@2.0.4": { + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": [ + "call-bound", + "get-intrinsic" + ] + }, + "is-zst@1.0.0": { + "integrity": "sha512-ZA5lvshKAl8z30dX7saXLpVhpsq3d2EHK9uf7qtUjnOtdw4XBpAoWb2RvZ5kyoaebdoidnGI0g2hn9Z7ObPbww==" + }, + "isarray@1.0.0": { + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isarray@2.0.5": { + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe@2.0.0": { + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isexe@3.1.1": { + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==" + }, + "isobject@3.0.1": { + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "isomorphic-timers-promises@1.0.1": { + "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==" + }, + "jackspeak@3.4.3": { + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": [ + "@isaacs/cliui", + "@pkgjs/parseargs" + ] + }, + "jake@10.9.2": { + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dependencies": [ + "async", + "chalk", + "filelist", + "minimatch@3.1.2" + ] + }, + "jiti@2.4.2": { + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==" + }, + "js-cookie@3.0.5": { + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc@3.0.2": { + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" + }, + "jsesc@3.1.0": { + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" + }, + "json-schema-traverse@1.0.0": { + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json-schema@0.4.0": { + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-stringify-pretty-compact@3.0.0": { + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" + }, + "json-stringify-pretty-compact@4.0.0": { + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + }, + "json5@2.2.3": { + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile@6.1.0": { + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": [ + "graceful-fs", + "universalify" + ] + }, + "jsonpointer@5.0.1": { + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, + "jsts@2.7.1": { + "integrity": "sha512-x2wSZHEBK20CY+Wy+BPE7MrFQHW6sIsdaGUMEqmGAio+3gFzQaBYPwLRonUfQf9Ak8pBieqj9tUofX1+WtAEIg==" + }, + "kdbush@4.0.2": { + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, + "kind-of@6.0.3": { + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur@4.1.5": { + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + }, + "leven@3.1.0": { + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "libphonenumber-js@1.12.4": { + "integrity": "sha512-vLmhg7Gan7idyAKfc6pvCtNzvar4/eIzrVVk3hjNFH5+fGqyjD0gQRovdTrDl20wsmZhBtmZpcsR0tOfquwb8g==" + }, + "lightningcss-darwin-arm64@1.29.1": { + "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==" + }, + "lightningcss-darwin-x64@1.29.1": { + "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==" + }, + "lightningcss-freebsd-x64@1.29.1": { + "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==" + }, + "lightningcss-linux-arm-gnueabihf@1.29.1": { + "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==" + }, + "lightningcss-linux-arm64-gnu@1.29.1": { + "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==" + }, + "lightningcss-linux-arm64-musl@1.29.1": { + "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==" + }, + "lightningcss-linux-x64-gnu@1.29.1": { + "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==" + }, + "lightningcss-linux-x64-musl@1.29.1": { + "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==" + }, + "lightningcss-win32-arm64-msvc@1.29.1": { + "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==" + }, + "lightningcss-win32-x64-msvc@1.29.1": { + "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==" + }, + "lightningcss@1.29.1": { + "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==", + "dependencies": [ + "detect-libc", + "lightningcss-darwin-arm64", + "lightningcss-darwin-x64", + "lightningcss-freebsd-x64", + "lightningcss-linux-arm-gnueabihf", + "lightningcss-linux-arm64-gnu", + "lightningcss-linux-arm64-musl", + "lightningcss-linux-x64-gnu", + "lightningcss-linux-x64-musl", + "lightningcss-win32-arm64-msvc", + "lightningcss-win32-x64-msvc" + ] + }, + "locate-path@6.0.0": { + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": [ + "p-locate" + ] + }, + "lodash.debounce@4.0.8": { + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.isequal@4.5.0": { + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.sortby@4.7.0": { + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "lodash@4.17.21": { + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "loupe@3.1.3": { + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==" + }, + "lru-cache@10.4.3": { + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "lru-cache@5.1.1": { + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": [ + "yallist@3.1.1" + ] + }, + "lucide-react@0.477.0_react@19.0.0": { + "integrity": "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw==", + "dependencies": [ + "react" + ] + }, + "lz-string@1.5.0": { + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + }, + "magic-string@0.25.9": { + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": [ + "sourcemap-codec" + ] + }, + "magic-string@0.30.17": { + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, + "maplibre-gl@5.1.1": { + "integrity": "sha512-0Z6ODzyFu/grwT6K1eIBpv6MZE4xnJD1AV+Yq1hPzOh/YCY36r9BlSaU7d7n2/HJOaoKOy0b2YF8cS4dD+iEVQ==", + "dependencies": [ + "@mapbox/geojson-rewind", + "@mapbox/jsonlint-lines-primitives", + "@mapbox/point-geometry", + "@mapbox/tiny-sdf", + "@mapbox/unitbezier", + "@mapbox/vector-tile", + "@mapbox/whoots-js", + "@maplibre/maplibre-gl-style-spec@23.1.0", + "@types/geojson", + "@types/geojson-vt", + "@types/mapbox__point-geometry", + "@types/mapbox__vector-tile", + "@types/pbf", + "@types/supercluster", + "earcut@3.0.1", + "geojson-vt", + "gl-matrix", + "global-prefix", + "kdbush", + "murmurhash-js", + "pbf", + "potpack", + "quickselect@3.0.0", + "supercluster", + "tinyqueue@3.0.0", + "vt-pbf" + ] + }, + "marchingsquares@1.3.3": { + "integrity": "sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg==" + }, + "math-intrinsics@1.1.0": { + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "md5.js@1.3.5": { + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": [ + "hash-base", + "inherits", + "safe-buffer@5.2.1" + ] + }, + "miller-rabin@4.0.1": { + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": [ + "bn.js@4.12.1", + "brorand" + ] + }, + "minimalistic-assert@1.0.1": { + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils@1.0.1": { + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "minimatch@3.1.2": { + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": [ + "brace-expansion@1.1.11" + ] + }, + "minimatch@5.1.6": { + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": [ + "brace-expansion@2.0.1" + ] + }, + "minimatch@9.0.5": { + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": [ + "brace-expansion@2.0.1" + ] + }, + "minimist@1.2.8": { + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass@7.1.2": { + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "minizlib@3.0.1": { + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dependencies": [ + "minipass", + "rimraf" + ] + }, + "mkdirp@3.0.1": { + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" + }, + "mri@1.2.0": { + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "murmurhash-js@1.0.0": { + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" + }, + "nanoid@3.3.8": { + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" + }, + "node-releases@2.0.19": { + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + }, + "node-stdlib-browser@1.3.1": { + "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==", + "dependencies": [ + "assert", + "browser-resolve", + "browserify-zlib", + "buffer", + "console-browserify", + "constants-browserify", + "create-require", + "crypto-browserify", + "domain-browser", + "events", + "https-browserify", + "isomorphic-timers-promises", + "os-browserify", + "path-browserify", + "pkg-dir", + "process", + "punycode@1.4.1", + "querystring-es3", + "readable-stream@3.6.2", + "stream-browserify", + "stream-http", + "string_decoder@1.3.0", + "timers-browserify", + "tty-browserify", + "url", + "util", + "vm-browserify" + ] + }, + "normalize-range@0.1.2": { + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "object-inspect@1.13.4": { + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + }, + "object-is@1.1.6": { + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": [ + "call-bind", + "define-properties" + ] + }, + "object-keys@1.1.1": { + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign@4.1.7": { + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-object-atoms", + "has-symbols", + "object-keys" + ] + }, + "once@1.4.0": { + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": [ + "wrappy" + ] + }, + "os-browserify@0.3.0": { + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "own-keys@1.0.1": { + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dependencies": [ + "get-intrinsic", + "object-keys", + "safe-push-apply" + ] + }, + "p-limit@3.1.0": { + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": [ + "yocto-queue" + ] + }, + "p-locate@5.0.0": { + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": [ + "p-limit" + ] + }, + "package-json-from-dist@1.0.1": { + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "pako@1.0.11": { + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-asn1@5.1.7": { + "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "dependencies": [ + "asn1.js", + "browserify-aes", + "evp_bytestokey", + "hash-base", + "pbkdf2", + "safe-buffer@5.2.1" + ] + }, + "path-browserify@1.0.1": { + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "path-exists@4.0.0": { + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute@1.0.1": { + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key@3.1.1": { + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse@1.0.7": { + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-scurry@1.11.1": { + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": [ + "lru-cache@10.4.3", + "minipass" + ] + }, + "pathe@2.0.3": { + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + }, + "pathval@2.0.0": { + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==" + }, + "pbf@3.3.0": { + "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "dependencies": [ + "ieee754", + "resolve-protobuf-schema" + ] + }, + "pbkdf2@3.1.2": { + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": [ + "create-hash", + "create-hmac", + "ripemd160", + "safe-buffer@5.2.1", + "sha.js" + ] + }, + "peek-stream@1.1.3": { + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dependencies": [ + "buffer-from", + "duplexify", + "through2@2.0.5" + ] + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "picomatch@4.0.2": { + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + }, + "pkg-dir@5.0.0": { + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dependencies": [ + "find-up" + ] + }, + "playwright-core@1.50.1": { + "integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==" + }, + "playwright@1.50.1": { + "integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==", + "dependencies": [ + "fsevents@2.3.2", + "playwright-core" + ] + }, + "point-in-polygon-hao@1.2.4": { + "integrity": "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ==", + "dependencies": [ + "robust-predicates@3.0.2" + ] + }, + "point-in-polygon@1.1.0": { + "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" + }, + "polyclip-ts@0.16.8": { + "integrity": "sha512-JPtKbDRuPEuAjuTdhR62Gph7Is2BS1Szx69CFOO3g71lpJDFo78k4tFyi+qFOMVPePEzdSKkpGU3NBXPHHjvKQ==", + "dependencies": [ + "bignumber.js", + "splaytree-ts" + ] + }, + "possible-typed-array-names@1.1.0": { + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" + }, + "postcss-value-parser@4.2.0": { + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "postcss@8.5.3": { + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "potpack@2.0.0": { + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" + }, + "preact@10.26.4": { + "integrity": "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==" + }, + "pretty-bytes@5.6.0": { + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "pretty-bytes@6.1.1": { + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==" + }, + "pretty-format@27.5.1": { + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": [ + "ansi-regex@5.0.1", + "ansi-styles@5.2.0", + "react-is" + ] + }, + "process-nextick-args@2.0.1": { + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "process-streams@1.0.3": { + "integrity": "sha512-xkIaM5vYnyekB88WyET78YEqXiaJRy0xcvIdE22n+myhvBT7LlLmX6iAtq7jDvVH8CUx2rqQsd32JdRyJMV3NA==", + "dependencies": [ + "duplex-maker" + ] + }, + "process@0.11.10": { + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "protocol-buffers-schema@3.6.0": { + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, + "public-encrypt@4.0.3": { + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": [ + "bn.js@4.12.1", + "browserify-rsa", + "create-hash", + "parse-asn1", + "randombytes", + "safe-buffer@5.2.1" + ] + }, + "punycode@1.4.1": { + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "punycode@2.3.1": { + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "qrcode-generator@1.4.4": { + "integrity": "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==" + }, + "qs@6.14.0": { + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dependencies": [ + "side-channel" + ] + }, + "querystring-es3@0.2.1": { + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==" + }, + "quickselect@1.1.1": { + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + }, + "quickselect@2.0.0": { + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "quickselect@3.0.0": { + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" + }, + "randombytes@2.1.0": { + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": [ + "safe-buffer@5.2.1" + ] + }, + "randomfill@1.0.4": { + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": [ + "randombytes", + "safe-buffer@5.2.1" + ] + }, + "rbush@2.0.2": { + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "dependencies": [ + "quickselect@1.1.1" + ] + }, + "rbush@3.0.1": { + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": [ + "quickselect@2.0.0" + ] + }, + "react-dom@19.0.0_react@19.0.0": { + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "dependencies": [ + "react", + "scheduler" + ] + }, + "react-hook-form@7.54.2_react@19.0.0": { + "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", + "dependencies": [ + "react" + ] + }, + "react-is@17.0.2": { + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-map-gl@8.0.1_maplibre-gl@5.1.1_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-VQjLcZdtyJCPXxy5xVL2QIgfA+YG3v+PzSdt07WWbVmXFhV4wUuy6DZSQYDdfqVH2BujKo/ImdL5zfEJApRnpg==", + "dependencies": [ + "@vis.gl/react-mapbox", + "@vis.gl/react-maplibre", + "maplibre-gl", + "react", + "react-dom" + ] + }, + "react-qrcode-logo@3.0.0_react@19.0.0_react-dom@19.0.0__react@19.0.0": { + "integrity": "sha512-2+vZ3GNBdUpYxIKyt6SFZsDGXa0xniyUQ0wPI4O0hJTzRjttPIx1pPnH9IWQmp/4nDMoN47IBhi3Breu1KudYw==", + "dependencies": [ + "lodash.isequal", + "qrcode-generator", + "react", + "react-dom" + ] + }, + "react-refresh@0.14.2": { + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==" + }, + "react-remove-scroll-bar@2.3.8_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "dependencies": [ + "@types/react", + "react", + "react-style-singleton", + "tslib" + ] + }, + "react-remove-scroll@2.6.3_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "dependencies": [ + "@types/react", + "react", + "react-remove-scroll-bar", + "react-style-singleton", + "tslib", + "use-callback-ref", + "use-sidecar" + ] + }, + "react-scan@0.2.8_react@19.0.0_react-dom@19.0.0__react@19.0.0_preact@10.26.4": { + "integrity": "sha512-+6Gvu9b0UMmzV0JkigA7Y2YcjQABiNrweP9l9j8nrutN5OAYLRe4JgfwiUohPFngMD+Y6I5N0kW+okXhvVLGUw==", + "dependencies": [ + "@babel/core", + "@babel/generator", + "@babel/types", + "@clack/core", + "@clack/prompts", + "@pivanov/utils", + "@preact/signals", + "@rollup/pluginutils@5.1.4_rollup@2.79.2", + "@types/node@20.17.22", + "bippy", + "esbuild@0.24.2", + "estree-walker@3.0.3", + "kleur", + "mri", + "playwright", + "preact", + "react", + "react-dom", + "tsx", + "unplugin" + ] + }, + "react-style-singleton@2.2.3_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "dependencies": [ + "@types/react", + "get-nonce", + "react", + "tslib" + ] + }, + "react@19.0.0": { + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==" + }, + "readable-stream@2.3.8": { + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": [ + "core-util-is", + "inherits", + "isarray@1.0.0", + "process-nextick-args", + "safe-buffer@5.1.2", + "string_decoder@1.1.1", + "util-deprecate" + ] + }, + "readable-stream@3.6.2": { + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": [ + "inherits", + "string_decoder@1.3.0", + "util-deprecate" + ] + }, + "reflect.getprototypeof@1.0.10": { + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dependencies": [ + "call-bind", + "define-properties", + "es-abstract", + "es-errors", + "es-object-atoms", + "get-intrinsic", + "get-proto", + "which-builtin-type" + ] + }, + "regenerate-unicode-properties@10.2.0": { + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dependencies": [ + "regenerate" + ] + }, + "regenerate@1.4.2": { + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerator-runtime@0.14.1": { + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "regenerator-transform@0.15.2": { + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": [ + "@babel/runtime" + ] + }, + "regexp.prototype.flags@1.5.4": { + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dependencies": [ + "call-bind", + "define-properties", + "es-errors", + "get-proto", + "gopd", + "set-function-name" + ] + }, + "regexpu-core@6.2.0": { + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dependencies": [ + "regenerate", + "regenerate-unicode-properties", + "regjsgen", + "regjsparser", + "unicode-match-property-ecmascript", + "unicode-match-property-value-ecmascript" + ] + }, + "regjsgen@0.8.0": { + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, + "regjsparser@0.12.0": { + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dependencies": [ + "jsesc@3.0.2" + ] + }, + "require-from-string@2.0.2": { + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve-pkg-maps@1.0.0": { + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" + }, + "resolve-protobuf-schema@2.1.0": { + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dependencies": [ + "protocol-buffers-schema" + ] + }, + "resolve@1.22.10": { + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": [ + "is-core-module", + "path-parse", + "supports-preserve-symlinks-flag" + ] + }, + "rfc4648@1.5.4": { + "integrity": "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==" + }, + "rimraf@5.0.10": { + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dependencies": [ + "glob@10.4.5" + ] + }, + "ripemd160@2.0.2": { + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": [ + "hash-base", + "inherits" + ] + }, + "robust-predicates@2.0.4": { + "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" + }, + "robust-predicates@3.0.2": { + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "rollup@2.79.2": { + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dependencies": [ + "fsevents@2.3.3" + ] + }, + "rollup@4.34.9": { + "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", + "dependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loongarch64-gnu", + "@rollup/rollup-linux-powerpc64le-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-msvc", + "@types/estree@1.0.6", + "fsevents@2.3.3" + ] + }, + "rw@1.3.3": { + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "safe-array-concat@1.1.3": { + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dependencies": [ + "call-bind", + "call-bound", + "get-intrinsic", + "has-symbols", + "isarray@2.0.5" + ] + }, + "safe-buffer@5.1.2": { + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-buffer@5.2.1": { + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-push-apply@1.0.0": { + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dependencies": [ + "es-errors", + "isarray@2.0.5" + ] + }, + "safe-regex-test@1.1.0": { + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dependencies": [ + "call-bound", + "es-errors", + "is-regex" + ] + }, + "scheduler@0.25.0": { + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" + }, + "semver@6.3.1": { + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "serialize-javascript@6.0.2": { + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": [ + "randombytes" + ] + }, + "set-function-length@1.2.2": { + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": [ + "define-data-property", + "es-errors", + "function-bind", + "get-intrinsic", + "gopd", + "has-property-descriptors" + ] + }, + "set-function-name@2.0.2": { + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": [ + "define-data-property", + "es-errors", + "functions-have-names", + "has-property-descriptors" + ] + }, + "set-proto@1.0.0": { + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": [ + "dunder-proto", + "es-errors", + "es-object-atoms" + ] + }, + "set-value@2.0.1": { + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": [ + "extend-shallow@2.0.1", + "is-extendable@0.1.1", + "is-plain-object", + "split-string" + ] + }, + "setimmediate@1.0.5": { + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "sha.js@2.4.11": { + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": [ + "inherits", + "safe-buffer@5.2.1" + ] + }, + "shebang-command@2.0.0": { + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": [ + "shebang-regex" + ] + }, + "shebang-regex@3.0.0": { + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel-list@1.0.0": { + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": [ + "es-errors", + "object-inspect" + ] + }, + "side-channel-map@1.0.1": { + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect" + ] + }, + "side-channel-weakmap@1.0.2": { + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": [ + "call-bound", + "es-errors", + "get-intrinsic", + "object-inspect", + "side-channel-map" + ] + }, + "side-channel@1.1.0": { + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": [ + "es-errors", + "object-inspect", + "side-channel-list", + "side-channel-map", + "side-channel-weakmap" + ] + }, + "siginfo@2.0.0": { + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + }, + "signal-exit@4.1.0": { + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "simple-zstd@1.4.2": { + "integrity": "sha512-kGYEvT33M5XfyQvvW4wxl3eKcWbdbCc1V7OZzuElnaXft0qbVzoIIXHXiCm3JCUki+MZKKmvjl8p2VGLJc5Y/A==", + "dependencies": [ + "is-zst", + "peek-stream", + "process-streams", + "through2@4.0.2" + ] + }, + "sisteransi@1.0.5": { + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "skmeans@0.9.7": { + "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==" + }, + "smob@1.5.0": { + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" + }, + "sort-asc@0.2.0": { + "integrity": "sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==" + }, + "sort-desc@0.2.0": { + "integrity": "sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==" + }, + "sort-object@3.0.3": { + "integrity": "sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==", + "dependencies": [ + "bytewise", + "get-value", + "is-extendable@0.1.1", + "sort-asc", + "sort-desc", + "union-value" + ] + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "source-map-support@0.5.21": { + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": [ + "buffer-from", + "source-map@0.6.1" + ] + }, + "source-map@0.6.1": { + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map@0.8.0-beta.0": { + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": [ + "whatwg-url" + ] + }, + "sourcemap-codec@1.4.8": { + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "splaytree-ts@1.0.2": { + "integrity": "sha512-0kGecIZNIReCSiznK3uheYB8sbstLjCZLiwcQwbmLhgHJj2gz6OnSPkVzJQCMnmEz1BQ4gPK59ylhBoEWOhGNA==" + }, + "split-string@3.1.0": { + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": [ + "extend-shallow@3.0.2" + ] + }, + "stackback@0.0.2": { + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + }, + "std-env@3.8.0": { + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + }, + "stream-browserify@3.0.0": { + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dependencies": [ + "inherits", + "readable-stream@3.6.2" + ] + }, + "stream-http@3.2.0": { + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dependencies": [ + "builtin-status-codes", + "inherits", + "readable-stream@3.6.2", + "xtend" + ] + }, + "stream-shift@1.0.3": { + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "string-width@4.2.3": { + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": [ + "emoji-regex@8.0.0", + "is-fullwidth-code-point", + "strip-ansi@6.0.1" + ] + }, + "string-width@5.1.2": { + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": [ + "eastasianwidth", + "emoji-regex@9.2.2", + "strip-ansi@7.1.0" + ] + }, + "string.prototype.matchall@4.0.12": { + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-abstract", + "es-errors", + "es-object-atoms", + "get-intrinsic", + "gopd", + "has-symbols", + "internal-slot", + "regexp.prototype.flags", + "set-function-name", + "side-channel" + ] + }, + "string.prototype.trim@1.2.10": { + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dependencies": [ + "call-bind", + "call-bound", + "define-data-property", + "define-properties", + "es-abstract", + "es-object-atoms", + "has-property-descriptors" + ] + }, + "string.prototype.trimend@1.0.9": { + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dependencies": [ + "call-bind", + "call-bound", + "define-properties", + "es-object-atoms" + ] + }, + "string.prototype.trimstart@1.0.8": { + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": [ + "call-bind", + "define-properties", + "es-object-atoms" + ] + }, + "string_decoder@1.1.1": { + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": [ + "safe-buffer@5.1.2" + ] + }, + "string_decoder@1.3.0": { + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": [ + "safe-buffer@5.2.1" + ] + }, + "stringify-object@3.3.0": { + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": [ + "get-own-enumerable-property-symbols", + "is-obj", + "is-regexp" + ] + }, + "strip-ansi@6.0.1": { + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": [ + "ansi-regex@5.0.1" + ] + }, + "strip-ansi@7.1.0": { + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": [ + "ansi-regex@6.1.0" + ] + }, + "strip-comments@2.0.1": { + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==" + }, + "supercluster@8.0.1": { + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "dependencies": [ + "kdbush" + ] + }, + "supports-color@7.2.0": { + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": [ + "has-flag" + ] + }, + "supports-preserve-symlinks-flag@1.0.0": { + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sweepline-intersections@1.5.0": { + "integrity": "sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ==", + "dependencies": [ + "tinyqueue@2.0.3" + ] + }, + "tailwind-merge@3.0.2": { + "integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==" + }, + "tailwindcss-animate@1.0.7_tailwindcss@4.0.9": { + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dependencies": [ + "tailwindcss" + ] + }, + "tailwindcss@4.0.9": { + "integrity": "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==" + }, + "tapable@2.2.1": { + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "tar@7.4.3": { + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dependencies": [ + "@isaacs/fs-minipass", + "chownr", + "minipass", + "minizlib", + "mkdirp", + "yallist@5.0.0" + ] + }, + "temp-dir@2.0.0": { + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "tempy@0.6.0": { + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": [ + "is-stream", + "temp-dir", + "type-fest@0.16.0", + "unique-string" + ] + }, + "terser@5.39.0": { + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dependencies": [ + "@jridgewell/source-map", + "acorn", + "commander@2.20.3", + "source-map-support" + ] + }, + "through2@2.0.5": { + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": [ + "readable-stream@2.3.8", + "xtend" + ] + }, + "through2@4.0.2": { + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": [ + "readable-stream@3.6.2" + ] + }, + "timers-browserify@2.0.12": { + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": [ + "setimmediate" + ] + }, + "tinybench@2.9.0": { + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" + }, + "tinyexec@0.3.2": { + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + }, + "tinyglobby@0.2.12_picomatch@4.0.2": { + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dependencies": [ + "fdir", + "picomatch@4.0.2" + ] + }, + "tinypool@1.0.2": { + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==" + }, + "tinyqueue@2.0.3": { + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tinyqueue@3.0.0": { + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + }, + "tinyrainbow@2.0.0": { + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==" + }, + "tinyspy@3.0.2": { + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==" + }, + "topojson-client@3.1.0": { + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dependencies": [ + "commander@2.20.3" + ] + }, + "topojson-server@3.0.1": { + "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", + "dependencies": [ + "commander@2.20.3" + ] + }, + "tr46@1.0.1": { + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": [ + "punycode@2.3.1" + ] + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "tsx@4.19.3": { + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dependencies": [ + "esbuild@0.25.0", + "fsevents@2.3.3", + "get-tsconfig" + ] + }, + "tty-browserify@0.0.1": { + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "type-fest@0.16.0": { + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + }, + "type-fest@2.19.0": { + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "typed-array-buffer@1.0.3": { + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": [ + "call-bound", + "es-errors", + "is-typed-array" + ] + }, + "typed-array-byte-length@1.0.3": { + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array" + ] + }, + "typed-array-byte-offset@1.0.4": { + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "for-each", + "gopd", + "has-proto", + "is-typed-array", + "reflect.getprototypeof" + ] + }, + "typed-array-length@1.0.7": { + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": [ + "call-bind", + "for-each", + "gopd", + "is-typed-array", + "possible-typed-array-names", + "reflect.getprototypeof" + ] + }, + "typescript@5.8.2": { + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==" + }, + "typewise-core@1.2.0": { + "integrity": "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==" + }, + "typewise@1.0.3": { + "integrity": "sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==", + "dependencies": [ + "typewise-core" + ] + }, + "unbox-primitive@1.1.0": { + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dependencies": [ + "call-bound", + "has-bigints", + "has-symbols", + "which-boxed-primitive" + ] + }, + "undici-types@6.19.8": { + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "undici-types@6.20.0": { + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "unicode-canonical-property-names-ecmascript@2.0.1": { + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==" + }, + "unicode-match-property-ecmascript@2.0.0": { + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": [ + "unicode-canonical-property-names-ecmascript", + "unicode-property-aliases-ecmascript" + ] + }, + "unicode-match-property-value-ecmascript@2.2.0": { + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==" + }, + "unicode-property-aliases-ecmascript@2.1.0": { + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "union-value@1.0.1": { + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": [ + "arr-union", + "get-value", + "is-extendable@0.1.1", + "set-value" + ] + }, + "unique-string@2.0.0": { + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": [ + "crypto-random-string@2.0.0" + ] + }, + "universalify@2.0.1": { + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + }, + "unplugin@2.1.0": { + "integrity": "sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==", + "dependencies": [ + "acorn", + "webpack-virtual-modules" + ] + }, + "upath@1.2.0": { + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db@1.1.3_browserslist@4.24.4": { + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dependencies": [ + "browserslist", + "escalade", + "picocolors" + ] + }, + "url@0.11.4": { + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dependencies": [ + "punycode@1.4.1", + "qs" + ] + }, + "use-callback-ref@1.3.3_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "dependencies": [ + "@types/react", + "react", + "tslib" + ] + }, + "use-sidecar@1.1.3_@types+react@19.0.10_react@19.0.0": { + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "dependencies": [ + "@types/react", + "detect-node-es", + "react", + "tslib" + ] + }, + "use-sync-external-store@1.4.0_react@19.0.0": { + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "dependencies": [ + "react" + ] + }, + "util-deprecate@1.0.2": { + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "util@0.12.5": { + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": [ + "inherits", + "is-arguments", + "is-generator-function", + "is-typed-array", + "which-typed-array" + ] + }, + "validator@13.12.0": { + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==" + }, + "vite-node@3.0.7_@types+node@22.13.8": { + "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", + "dependencies": [ + "cac", + "debug", + "es-module-lexer", + "pathe", + "vite" + ] + }, + "vite-plugin-node-polyfills@0.23.0_vite@6.2.0__@types+node@22.13.8_@types+node@22.13.8": { + "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", + "dependencies": [ + "@rollup/plugin-inject", + "node-stdlib-browser", + "vite" + ] + }, + "vite-plugin-pwa@0.21.1_vite@6.2.0__@types+node@22.13.8_workbox-build@7.3.0__ajv@8.17.1__@babel+core@7.26.9__rollup@2.79.2_workbox-window@7.3.0_@types+node@22.13.8": { + "integrity": "sha512-rkTbKFbd232WdiRJ9R3u+hZmf5SfQljX1b45NF6oLA6DSktEKpYllgTo1l2lkiZWMWV78pABJtFjNXfBef3/3Q==", + "dependencies": [ + "debug", + "pretty-bytes@6.1.1", + "tinyglobby", + "vite", + "workbox-build", + "workbox-window" + ] + }, + "vite@6.2.0_@types+node@22.13.8": { + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", + "dependencies": [ + "@types/node@22.13.8", + "esbuild@0.25.0", + "fsevents@2.3.3", + "postcss", + "rollup@4.34.9" + ] + }, + "vitest@3.0.7_@types+node@22.13.8_happy-dom@17.1.8_vite@6.2.0__@types+node@22.13.8": { + "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==", + "dependencies": [ + "@types/node@22.13.8", + "@vitest/expect", + "@vitest/mocker", + "@vitest/pretty-format", + "@vitest/runner", + "@vitest/snapshot", + "@vitest/spy", + "@vitest/utils", + "chai", + "debug", + "expect-type", + "happy-dom", + "magic-string@0.30.17", + "pathe", + "std-env", + "tinybench", + "tinyexec", + "tinypool", + "tinyrainbow", + "vite", + "vite-node", + "why-is-node-running" + ] + }, + "vm-browserify@1.1.2": { + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "vt-pbf@3.1.3": { + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "dependencies": [ + "@mapbox/point-geometry", + "@mapbox/vector-tile", + "pbf" + ] + }, + "webidl-conversions@4.0.2": { + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "webidl-conversions@7.0.0": { + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "webpack-virtual-modules@0.6.2": { + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" + }, + "whatwg-mimetype@3.0.0": { + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url@7.1.0": { + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": [ + "lodash.sortby", + "tr46", + "webidl-conversions@4.0.2" + ] + }, + "which-boxed-primitive@1.1.1": { + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dependencies": [ + "is-bigint", + "is-boolean-object", + "is-number-object", + "is-string", + "is-symbol" + ] + }, + "which-builtin-type@1.2.1": { + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dependencies": [ + "call-bound", + "function.prototype.name", + "has-tostringtag", + "is-async-function", + "is-date-object", + "is-finalizationregistry", + "is-generator-function", + "is-regex", + "is-weakref", + "isarray@2.0.5", + "which-boxed-primitive", + "which-collection", + "which-typed-array" + ] + }, + "which-collection@1.0.2": { + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": [ + "is-map", + "is-set", + "is-weakmap", + "is-weakset" + ] + }, + "which-typed-array@1.1.18": { + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dependencies": [ + "available-typed-arrays", + "call-bind", + "call-bound", + "for-each", + "gopd", + "has-tostringtag" + ] + }, + "which@2.0.2": { + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": [ + "isexe@2.0.0" + ] + }, + "which@4.0.0": { + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dependencies": [ + "isexe@3.1.1" + ] + }, + "why-is-node-running@2.3.0": { + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dependencies": [ + "siginfo", + "stackback" + ] + }, + "workbox-background-sync@7.3.0": { + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", + "dependencies": [ + "idb", + "workbox-core" + ] + }, + "workbox-broadcast-update@7.3.0": { + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", + "dependencies": [ + "workbox-core" + ] + }, + "workbox-build@7.3.0_ajv@8.17.1_@babel+core@7.26.9_rollup@2.79.2": { + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "dependencies": [ + "@apideck/better-ajv-errors", + "@babel/core", + "@babel/preset-env", + "@babel/runtime", + "@rollup/plugin-babel", + "@rollup/plugin-node-resolve", + "@rollup/plugin-replace", + "@rollup/plugin-terser", + "@surma/rollup-plugin-off-main-thread", + "ajv", + "common-tags", + "fast-json-stable-stringify", + "fs-extra", + "glob@7.2.3", + "lodash", + "pretty-bytes@5.6.0", + "rollup@2.79.2", + "source-map@0.8.0-beta.0", + "stringify-object", + "strip-comments", + "tempy", + "upath", + "workbox-background-sync", + "workbox-broadcast-update", + "workbox-cacheable-response", + "workbox-core", + "workbox-expiration", + "workbox-google-analytics", + "workbox-navigation-preload", + "workbox-precaching", + "workbox-range-requests", + "workbox-recipes", + "workbox-routing", + "workbox-strategies", + "workbox-streams", + "workbox-sw", + "workbox-window" + ] + }, + "workbox-cacheable-response@7.3.0": { + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "dependencies": [ + "workbox-core" + ] + }, + "workbox-core@7.3.0": { + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==" + }, + "workbox-expiration@7.3.0": { + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "dependencies": [ + "idb", + "workbox-core" + ] + }, + "workbox-google-analytics@7.3.0": { + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "dependencies": [ + "workbox-background-sync", + "workbox-core", + "workbox-routing", + "workbox-strategies" + ] + }, + "workbox-navigation-preload@7.3.0": { + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "dependencies": [ + "workbox-core" + ] + }, + "workbox-precaching@7.3.0": { + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "dependencies": [ + "workbox-core", + "workbox-routing", + "workbox-strategies" + ] + }, + "workbox-range-requests@7.3.0": { + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "dependencies": [ + "workbox-core" + ] + }, + "workbox-recipes@7.3.0": { + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "dependencies": [ + "workbox-cacheable-response", + "workbox-core", + "workbox-expiration", + "workbox-precaching", + "workbox-routing", + "workbox-strategies" + ] + }, + "workbox-routing@7.3.0": { + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "dependencies": [ + "workbox-core" + ] + }, + "workbox-strategies@7.3.0": { + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "dependencies": [ + "workbox-core" + ] + }, + "workbox-streams@7.3.0": { + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "dependencies": [ + "workbox-core", + "workbox-routing" + ] + }, + "workbox-sw@7.3.0": { + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==" + }, + "workbox-window@7.3.0": { + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "dependencies": [ + "@types/trusted-types", + "workbox-core" + ] + }, + "wrap-ansi@7.0.0": { + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": [ + "ansi-styles@4.3.0", + "string-width@4.2.3", + "strip-ansi@6.0.1" + ] + }, + "wrap-ansi@8.1.0": { + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": [ + "ansi-styles@6.2.1", + "string-width@5.1.2", + "strip-ansi@7.1.0" + ] + }, + "wrappy@1.0.2": { + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xtend@4.0.2": { + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist@3.1.1": { + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yallist@5.0.0": { + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + }, + "yocto-queue@0.1.0": { + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zustand@5.0.3_@types+react@19.0.10_immer@10.1.1_react@19.0.0": { + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "dependencies": [ + "@types/react", + "immer", + "react" + ] + } + }, + "workspace": { + "packageJson": { + "dependencies": [ + "npm:@bufbuild/protobuf@^2.2.3", + "npm:@jsr/meshtastic__core@2.6.0-0", + "npm:@jsr/meshtastic__js@2.6.0-0", + "npm:@jsr/meshtastic__transport-http@*", + "npm:@jsr/meshtastic__transport-web-serial@*", + "npm:@noble/curves@^1.8.1", + "npm:@radix-ui/react-accordion@^1.2.3", + "npm:@radix-ui/react-checkbox@^1.1.4", + "npm:@radix-ui/react-dialog@^1.1.6", + "npm:@radix-ui/react-dropdown-menu@^2.1.6", + "npm:@radix-ui/react-label@^2.1.2", + "npm:@radix-ui/react-menubar@^1.1.6", + "npm:@radix-ui/react-popover@^1.1.6", + "npm:@radix-ui/react-scroll-area@^1.2.3", + "npm:@radix-ui/react-select@^2.1.6", + "npm:@radix-ui/react-separator@^1.1.2", + "npm:@radix-ui/react-switch@^1.1.3", + "npm:@radix-ui/react-tabs@^1.1.3", + "npm:@radix-ui/react-toast@^1.2.6", + "npm:@radix-ui/react-tooltip@^1.1.8", + "npm:@tailwindcss/postcss@^4.0.9", + "npm:@testing-library/react@^16.2.0", + "npm:@turf/turf@^7.2.0", + "npm:@types/chrome@^0.0.307", + "npm:@types/js-cookie@^3.0.6", + "npm:@types/node@^22.13.7", + "npm:@types/react-dom@^19.0.4", + "npm:@types/react@^19.0.10", + "npm:@types/serviceworker@^0.0.123", + "npm:@types/w3c-web-serial@^1.0.8", + "npm:@types/web-bluetooth@^0.0.21", + "npm:@vitejs/plugin-react@^4.3.4", + "npm:autoprefixer@^10.4.20", + "npm:base64-js@^1.5.1", + "npm:class-validator@~0.14.1", + "npm:class-variance-authority@~0.7.1", + "npm:clsx@^2.1.1", + "npm:cmdk@^1.0.4", + "npm:crypto-random-string@5", + "npm:gzipper@^8.2.0", + "npm:happy-dom@^17.1.8", + "npm:immer@^10.1.1", + "npm:js-cookie@^3.0.5", + "npm:lucide-react@0.477", + "npm:maplibre-gl@5.1.1", + "npm:postcss@^8.5.3", + "npm:react-dom@19", + "npm:react-hook-form@^7.54.2", + "npm:react-map-gl@8.0.1", + "npm:react-qrcode-logo@3", + "npm:react-scan@~0.2.8", + "npm:react@19", + "npm:rfc4648@^1.5.4", + "npm:simple-git-hooks@^2.11.1", + "npm:tailwind-merge@^3.0.2", + "npm:tailwindcss-animate@^1.0.7", + "npm:tailwindcss@^4.0.9", + "npm:tar@^7.4.3", + "npm:typescript@^5.8.2", + "npm:vite-plugin-node-polyfills@0.23", + "npm:vite-plugin-pwa@~0.21.1", + "npm:vite@^6.2.0", + "npm:vitest@^3.0.7", + "npm:zustand@5.0.3" + ] + } + } +} diff --git a/package.json b/package.json index d6a69a43..b7179487 100644 --- a/package.json +++ b/package.json @@ -5,29 +5,20 @@ "description": "Meshtastic web client", "license": "GPL-3.0-only", "scripts": { - "build": "vite build", - "build:analyze": "BUNDLE_ANALYZE=true vite build", - "check": "biome check src/", - "check:fix": "pnpm check --write src/", - "format": "biome format --write src/", - "dev": "vite dev --open", - "dev:scan": "VITE_DEBUG_SCAN=true vite dev", - "test": "vitest", - "test:ui": "vitest --ui", - "test:run": "vitest run", - "preview": "vite preview", - "package": "gzipper c -i html,js,css,png,ico,svg,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ $(ls ./dist/output/)", - "postinstall": "npx simple-git-hooks" - }, - "simple-git-hooks": { - "pre-commit": "bun run check:fix && bun run format" - }, - "lint-staged": { - "*.{ts,tsx}": [ - "bun run check:fix", - "bun run format" - ] + "build": "deno run -A npm:vite build", + "build:analyze": "BUNDLE_ANALYZE=true deno task build", + "lint": "deno lint src/", + "lint:fix": "deno lint --write src/", + "format": "deno fmt --write src/", + "dev": "deno task dev:ui", + "dev:ui": "deno run -A npm:vite dev", + "dev:scan": "VITE_DEBUG_SCAN=true deno task dev:ui", + "test": "deno run vitest", + "test:ui": "deno task test --ui", + "preview": "deno run --allow-net npm:vite preview", + "package": "deno run -A npm:gzipper c -i html,js,css,png,ico,svg,webmanifest,txt dist dist/output && deno run -A --allow-run tar -cvf dist/build.tar -C ./dist/output/ ." }, + "repository": { "type": "git", "url": "git+https://github.com/meshtastic/web.git" @@ -79,7 +70,6 @@ "zustand": "5.0.3" }, "devDependencies": { - "@biomejs/biome": "^1.9.4", "@tailwindcss/postcss": "^4.0.9", "@testing-library/react": "^16.2.0", "@types/chrome": "^0.0.307", diff --git a/tsconfig.json b/tsconfig.json index 91f1dff3..e93e1141 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,19 +4,24 @@ "target": "ESNext", "useDefineForClassFields": true, "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, + "composite": true, + "module": "ESNext", "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "NodeNext", - "moduleResolution": "nodenext", + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, + "moduleDetection": "force", "noEmit": true, "jsx": "react-jsx", - "baseUrl": "./", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + /* Path Aliases */ "paths": { "@app/*": ["./src/*"], "@pages/*": ["./src/pages/*"], @@ -34,7 +39,6 @@ "@types/w3c-web-serial" ], "strictPropertyInitialization": false, - "experimentalDecorators": true, - "allowImportingTsExtensions": true + "experimentalDecorators": true } } diff --git a/vite.config.ts b/vite.config.ts index 0c04caec..267215f6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'vitest/config' import react from '@vitejs/plugin-react'; import { VitePWA } from 'vite-plugin-pwa'; import { execSync } from 'node:child_process'; -import path from 'path'; +import path from 'node:path'; let hash = ''; try { From 50eb2a827f08c076a521a8b718f14118fa9eea46 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 14:46:02 -0500 Subject: [PATCH 02/15] chore: fixes from deno linting/formatting --- deno.json | 36 +++ package.json | 14 +- src/App.tsx | 37 +-- src/components/CommandPalette.tsx | 14 +- src/components/DeviceSelector.tsx | 21 +- src/components/DeviceSelectorButton.tsx | 7 +- src/components/Dialog/DialogManager.tsx | 8 +- src/components/Dialog/ImportDialog.tsx | 27 +- .../Dialog/LocationResponseDialog.tsx | 13 +- src/components/Dialog/NewDeviceDialog.tsx | 30 +- src/components/Dialog/NodeDetailsDialog.tsx | 287 ++++++++++-------- src/components/Dialog/NodeOptionsDialog.tsx | 24 +- src/components/Dialog/PKIBackupDialog.tsx | 10 +- src/components/Dialog/PkiRegenerateDialog.tsx | 2 +- src/components/Dialog/QRDialog.tsx | 12 +- src/components/Dialog/RebootDialog.tsx | 2 +- src/components/Dialog/RemoveNodeDialog.tsx | 4 +- src/components/Dialog/ShutdownDialog.tsx | 2 +- .../Dialog/TracerouteResponseDialog.tsx | 16 +- src/components/Form/DynamicForm.tsx | 17 +- src/components/Form/DynamicFormField.tsx | 14 +- src/components/Form/FormInput.tsx | 20 +- src/components/Form/FormMultiSelect.tsx | 6 +- src/components/Form/FormPasswordGenerator.tsx | 18 +- src/components/Form/FormSelect.tsx | 16 +- src/components/KeyBackupReminder.tsx | 7 +- src/components/PageComponents/Channel.tsx | 71 +++-- .../PageComponents/Config/Bluetooth.tsx | 7 +- .../PageComponents/Config/Device.tsx | 2 +- .../PageComponents/Config/Display.tsx | 2 +- src/components/PageComponents/Config/LoRa.tsx | 2 +- .../PageComponents/Config/Network.tsx | 2 +- .../PageComponents/Config/Position.tsx | 2 +- .../PageComponents/Config/Power.tsx | 2 +- .../Config/Security/Security.tsx | 11 +- .../Config/Security/securityReducer.tsx | 2 +- .../PageComponents/Config/Security/types.ts | 6 +- src/components/PageComponents/Connect/BLE.tsx | 4 +- .../PageComponents/Connect/HTTP.tsx | 23 +- .../PageComponents/Connect/Serial.tsx | 4 +- .../PageComponents/Map/NodeDetail.tsx | 54 ++-- .../PageComponents/Messages/ChannelChat.tsx | 11 +- .../PageComponents/Messages/Message.tsx | 28 +- .../PageComponents/Messages/MessageInput.tsx | 22 +- .../PageComponents/Messages/TraceRoute.tsx | 39 +-- .../ModuleConfig/AmbientLighting.tsx | 2 +- .../PageComponents/ModuleConfig/Audio.tsx | 2 +- .../ModuleConfig/CannedMessage.tsx | 17 +- .../ModuleConfig/DetectionSensor.tsx | 2 +- .../ModuleConfig/ExternalNotification.tsx | 2 +- .../PageComponents/ModuleConfig/MQTT.tsx | 53 ++-- .../ModuleConfig/NeighborInfo.tsx | 2 +- .../ModuleConfig/Paxcounter.tsx | 2 +- .../PageComponents/ModuleConfig/RangeTest.tsx | 2 +- .../PageComponents/ModuleConfig/Serial.tsx | 2 +- .../ModuleConfig/StoreForward.tsx | 2 +- .../PageComponents/ModuleConfig/Telemetry.tsx | 2 +- src/components/PageLayout.tsx | 8 +- src/components/Sidebar.tsx | 128 ++++---- src/components/ThemeSwitcher.tsx | 12 +- src/components/Toaster.tsx | 4 +- src/components/UI/Avatar.tsx | 2 +- src/components/UI/Button.tsx | 8 +- src/components/UI/Command.tsx | 6 +- src/components/UI/Dialog.tsx | 8 +- src/components/UI/DropdownMenu.tsx | 12 +- src/components/UI/Footer.tsx | 9 +- src/components/UI/Generator.tsx | 1 - src/components/UI/Input.tsx | 5 +- src/components/UI/Menubar.tsx | 16 +- src/components/UI/Modal.tsx | 25 -- src/components/UI/MultiSelect.tsx | 7 +- src/components/UI/Popover.tsx | 2 +- src/components/UI/Select.tsx | 8 +- src/components/UI/Sidebar/sidebarButton.tsx | 5 +- src/components/UI/Spinner.tsx | 2 +- src/components/UI/Tabs.tsx | 2 +- src/components/UI/Toast.tsx | 20 +- src/components/UI/Tooltip.tsx | 4 +- src/components/UI/Typography/Blockquote.tsx | 2 +- src/components/UI/Typography/Code.tsx | 2 +- src/components/UI/Typography/H1.tsx | 2 +- src/components/UI/Typography/H2.tsx | 2 +- src/components/UI/Typography/H3.tsx | 2 +- src/components/UI/Typography/H4.tsx | 2 +- src/components/UI/Typography/H5.tsx | 2 +- src/components/UI/Typography/Link.tsx | 6 +- src/components/UI/Typography/P.tsx | 2 +- src/components/UI/Typography/Subtle.tsx | 2 +- src/components/generic/Blur.tsx | 2 +- src/components/generic/Mono.tsx | 2 +- src/components/generic/Table/index.tsx | 14 +- src/components/generic/ThemeProvider.tsx | 67 ---- src/components/generic/TimeAgo.tsx | 3 +- src/components/generic/Uptime.tsx | 4 +- src/core/hooks/useBrowserFeatureDetection.ts | 4 +- src/core/hooks/useKeyBackupReminder.tsx | 13 +- src/core/hooks/useTheme.ts | 6 +- src/core/hooks/useToast.ts | 34 +-- src/core/stores/appStore.ts | 4 +- src/core/stores/deviceStore.ts | 32 +- src/core/subscriptions.ts | 4 +- src/core/utils/debounce.test.ts | 2 +- src/core/utils/ip.test.ts | 2 +- src/core/utils/ip.ts | 4 +- src/core/utils/randId.test.ts | 2 +- src/index.css | 10 +- src/pages/Channels.tsx | 6 +- src/pages/Config/DeviceConfig.tsx | 2 +- src/pages/Config/ModuleConfig.tsx | 2 +- src/pages/Config/index.tsx | 24 +- src/pages/Dashboard/index.tsx | 139 +++++---- src/pages/Map/index.tsx | 45 +-- src/pages/Messages.tsx | 72 ++--- src/pages/Nodes.tsx | 44 +-- src/validation/channel.ts | 6 +- src/validation/config/bluetooth.ts | 12 +- src/validation/config/device.ts | 3 +- src/validation/config/display.ts | 3 +- src/validation/config/lora.ts | 3 +- src/validation/config/network.ts | 15 +- src/validation/config/position.ts | 14 +- src/validation/config/power.ts | 9 +- src/validation/config/security.ts | 12 +- .../moduleConfig/ambientLighting.ts | 12 +- src/validation/moduleConfig/audio.ts | 4 +- src/validation/moduleConfig/cannedMessage.ts | 18 +- .../moduleConfig/detectionSensor.ts | 12 +- .../moduleConfig/externalNotification.ts | 12 +- src/validation/moduleConfig/mqtt.ts | 15 +- src/validation/moduleConfig/neighborInfo.ts | 3 +- src/validation/moduleConfig/paxcounter.ts | 3 +- src/validation/moduleConfig/rangeTest.ts | 3 +- src/validation/moduleConfig/serial.ts | 3 +- src/validation/moduleConfig/storeForward.ts | 12 +- src/validation/moduleConfig/telemetry.ts | 3 +- 136 files changed, 1011 insertions(+), 1075 deletions(-) create mode 100644 deno.json delete mode 100644 src/components/UI/Modal.tsx delete mode 100644 src/components/generic/ThemeProvider.tsx diff --git a/deno.json b/deno.json new file mode 100644 index 00000000..4fd0c9ba --- /dev/null +++ b/deno.json @@ -0,0 +1,36 @@ +{ + "imports": { + "@meshtastic/core": "jsr:@meshtastic/core@^2.6.0", + "@meshtastic/js": "jsr:@meshtastic/js@^2.3.4", + "@meshtastic/transport-http": "jsr:@meshtastic/transport-http@^0.2.1", + "@meshtastic/transport-web-serial": "jsr:@meshtastic/transport-web-serial@^0.2.1", + "@app/": "./src/", + "@pages/": "./src/pages/", + "@components/": "./src/components/", + "@core/": "./src/core/", + "@layouts/": "./src/layouts/" + }, + "compilerOptions": { + "lib": [ + "DOM", + "DOM.Iterable", + "ESNext" + ], + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "strictNullChecks": true, + "types": [ + "vite/client", + "node", + "@types/web-bluetooth", + "@types/w3c-web-serial" + ], + "strictPropertyInitialization": false + }, + "unstable": [ + "sloppy-imports" + ] +} diff --git a/package.json b/package.json index b7179487..4765b90c 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "build": "deno run -A npm:vite build", "build:analyze": "BUNDLE_ANALYZE=true deno task build", "lint": "deno lint src/", - "lint:fix": "deno lint --write src/", - "format": "deno fmt --write src/", + "lint:fix": "deno lint --fix src/", + "format": "deno fmt src/", "dev": "deno task dev:ui", "dev:ui": "deno run -A npm:vite dev", "dev:scan": "VITE_DEBUG_SCAN=true deno task dev:ui", @@ -18,7 +18,6 @@ "preview": "deno run --allow-net npm:vite preview", "package": "deno run -A npm:gzipper c -i html,js,css,png,ico,svg,webmanifest,txt dist dist/output && deno run -A --allow-run tar -cvf dist/build.tar -C ./dist/output/ ." }, - "repository": { "type": "git", "url": "git+https://github.com/meshtastic/web.git" @@ -26,6 +25,15 @@ "bugs": { "url": "https://github.com/meshtastic/web/issues" }, + "simple-git-hooks": { + "pre-commit": "deno task lint:fix && deno task format" + }, + "lint-staged": { + "*.{ts,tsx}": [ + "deno task lint:fix", + "deno task format" + ] + }, "homepage": "https://meshtastic.org", "dependencies": { "@bufbuild/protobuf": "^2.2.3", diff --git a/src/App.tsx b/src/App.tsx index 2d02ab5b..a86b50f1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,20 +1,19 @@ import { DeviceWrapper } from "@app/DeviceWrapper.tsx"; import { PageRouter } from "@app/PageRouter.tsx"; -import { ThemeProvider } from "@app/components/generic/ThemeProvider"; import { CommandPalette } from "@components/CommandPalette.tsx"; import { DeviceSelector } from "@components/DeviceSelector.tsx"; -import { DialogManager } from "@components/Dialog/DialogManager"; +import { DialogManager } from "@components/Dialog/DialogManager.tsx"; import { NewDeviceDialog } from "@components/Dialog/NewDeviceDialog.tsx"; -import { KeyBackupReminder } from "@components/KeyBackupReminder"; +import { KeyBackupReminder } from "@components/KeyBackupReminder.tsx"; import { Toaster } from "@components/Toaster.tsx"; import Footer from "@components/UI/Footer.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; import { Dashboard } from "@pages/Dashboard/index.tsx"; -import type { JSX } from "react"; + import { MapProvider } from "react-map-gl/maplibre"; -export const App = (): JSX.Element => { +export const App = () => { const { getDevice } = useDeviceStore(); const { selectedDevice, setConnectDialogOpen, connectDialogOpen } = useAppStore(); @@ -36,19 +35,21 @@ export const App = (): JSX.Element => {
- {device ? ( -
- - - - -
- ) : ( - <> - -
- - )} + {device + ? ( +
+ + + + +
+ ) + : ( + <> + +
+ + )}
diff --git a/src/components/CommandPalette.tsx b/src/components/CommandPalette.tsx index c0f0a94d..54659fcb 100644 --- a/src/components/CommandPalette.tsx +++ b/src/components/CommandPalette.tsx @@ -1,4 +1,4 @@ -import { Avatar } from "@components/UI/Avatar"; +import { Avatar } from "./UI/Avatar.tsx"; import { CommandDialog, CommandEmpty, @@ -117,13 +117,11 @@ export const CommandPalette = () => { return { label: device.nodes.get(device.hardware.myNodeNum)?.user?.longName ?? - device.hardware.myNodeNum.toString(), + device.hardware.myNodeNum.toString(), icon: ( ), action() { @@ -241,8 +239,8 @@ export const CommandPalette = () => { } }; - window.addEventListener("keydown", handleKeydown); - return () => window.removeEventListener("keydown", handleKeydown); + globalThis.addEventListener("keydown", handleKeydown); + return () => globalThis.removeEventListener("keydown", handleKeydown); }, [setCommandPaletteOpen]); return ( diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx index 08c6dedb..76751900 100644 --- a/src/components/DeviceSelector.tsx +++ b/src/components/DeviceSelector.tsx @@ -5,10 +5,11 @@ import { Code } from "@components/UI/Typography/Code.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; import { HomeIcon, PlusIcon, SearchIcon } from "lucide-react"; -import type { JSX } from "react"; -import { Avatar } from "./UI/Avatar"; -export const DeviceSelector = (): JSX.Element => { +import { Avatar } from "./UI/Avatar.tsx"; +import process from "node:process"; + +export const DeviceSelector = () => { const { getDevices } = useDeviceStore(); const { selectedDevice, @@ -38,11 +39,9 @@ export const DeviceSelector = (): JSX.Element => { active={selectedDevice === device.id} > ))} @@ -66,9 +65,11 @@ export const DeviceSelector = (): JSX.Element => { {/* TODO: This is being commented out until its fixed */} - {/* */} + */ + } {process.env.COMMIT_HASH} diff --git a/src/components/DeviceSelectorButton.tsx b/src/components/DeviceSelectorButton.tsx index 8c50df8e..62c2bc2a 100644 --- a/src/components/DeviceSelectorButton.tsx +++ b/src/components/DeviceSelectorButton.tsx @@ -5,7 +5,6 @@ export interface DeviceSelectorButtonProps { } export const DeviceSelectorButton = ({ - active, onClick, children, }: DeviceSelectorButtonProps) => ( @@ -14,9 +13,11 @@ export const DeviceSelectorButton = ({ onClick={onClick} onKeyDown={onClick} > - {/* {active && ( + { + /* {active && (
- )} */} + )} */ + }
{children}
diff --git a/src/components/Dialog/DialogManager.tsx b/src/components/Dialog/DialogManager.tsx index d571ffcb..f0ac96d6 100644 --- a/src/components/Dialog/DialogManager.tsx +++ b/src/components/Dialog/DialogManager.tsx @@ -1,15 +1,15 @@ import { RemoveNodeDialog } from "@app/components/Dialog/RemoveNodeDialog.tsx"; import { DeviceNameDialog } from "@components/Dialog/DeviceNameDialog.tsx"; import { ImportDialog } from "@components/Dialog/ImportDialog.tsx"; -import { PkiBackupDialog } from "@components/Dialog/PKIBackupDialog"; +import { PkiBackupDialog } from "./PKIBackupDialog.tsx"; import { QRDialog } from "@components/Dialog/QRDialog.tsx"; import { RebootDialog } from "@components/Dialog/RebootDialog.tsx"; import { ShutdownDialog } from "@components/Dialog/ShutdownDialog.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; -import type { JSX } from "react"; -import { NodeDetailsDialog } from "./NodeDetailsDialog"; -export const DialogManager = (): JSX.Element => { +import { NodeDetailsDialog } from "./NodeDetailsDialog.tsx"; + +export const DialogManager = () => { const { channels, config, dialog, setDialogOpen } = useDevice(); return ( <> diff --git a/src/components/Dialog/ImportDialog.tsx b/src/components/Dialog/ImportDialog.tsx index ed37351e..9a5ac133 100644 --- a/src/components/Dialog/ImportDialog.tsx +++ b/src/components/Dialog/ImportDialog.tsx @@ -15,7 +15,7 @@ import { Switch } from "@components/UI/Switch.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; import { toByteArray } from "base64-js"; -import { type JSX, useEffect, useState } from "react"; +import { useEffect, useState } from "react"; export interface ImportDialogProps { open: boolean; @@ -26,7 +26,7 @@ export interface ImportDialogProps { export const ImportDialog = ({ open, onOpenChange, -}: ImportDialogProps): JSX.Element => { +}: ImportDialogProps) => { const [importDialogInput, setImportDialogInput] = useState(""); const [channelSet, setChannelSet] = useState(); const [validUrl, setValidUrl] = useState(false); @@ -62,7 +62,7 @@ export const ImportDialog = ({ ), ); setValidUrl(true); - } catch (error) { + } catch (_error) { setValidUrl(false); setChannelSet(undefined); } @@ -73,10 +73,9 @@ export const ImportDialog = ({ connection?.setChannel( create(Protobuf.Channel.ChannelSchema, { index, - role: - index === 0 - ? Protobuf.Channel.Channel_Role.PRIMARY - : Protobuf.Channel.Channel_Role.SECONDARY, + role: index === 0 + ? Protobuf.Channel.Channel_Role.PRIMARY + : Protobuf.Channel.Channel_Role.SECONDARY, settings: ch, }), ); @@ -119,25 +118,29 @@ export const ImportDialog = ({
- {/* */} + */ + }
- {/* */} + */ + } Channels: diff --git a/src/components/Dialog/LocationResponseDialog.tsx b/src/components/Dialog/LocationResponseDialog.tsx index b885667c..ce6766ca 100644 --- a/src/components/Dialog/LocationResponseDialog.tsx +++ b/src/components/Dialog/LocationResponseDialog.tsx @@ -1,14 +1,13 @@ -import { useDevice } from "@app/core/stores/deviceStore"; +import { useDevice } from "../../core/stores/deviceStore.ts"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, -} from "@components/UI/Dialog"; +} from "../UI/Dialog.tsx"; import type { Protobuf, Types } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; -import type { JSX } from "react"; export interface LocationResponseDialogProps { location: Types.PacketMetadata | undefined; @@ -20,15 +19,13 @@ export const LocationResponseDialog = ({ location, open, onOpenChange, -}: LocationResponseDialogProps): JSX.Element => { +}: LocationResponseDialogProps) => { const { nodes } = useDevice(); const from = nodes.get(location?.from ?? 0); - const longName = - from?.user?.longName ?? + const longName = from?.user?.longName ?? (from ? `!${numberToHexUnpadded(from?.num)}` : "Unknown"); - const shortName = - from?.user?.shortName ?? + const shortName = from?.user?.shortName ?? (from ? `${numberToHexUnpadded(from?.num).substring(0, 4)}` : "UNK"); return ( diff --git a/src/components/Dialog/NewDeviceDialog.tsx b/src/components/Dialog/NewDeviceDialog.tsx index 6be6d58d..192c51a6 100644 --- a/src/components/Dialog/NewDeviceDialog.tsx +++ b/src/components/Dialog/NewDeviceDialog.tsx @@ -1,7 +1,7 @@ import { type BrowserFeature, useBrowserFeatureDetection, -} from "@app/core/hooks/useBrowserFeatureDetection"; +} from "../../core/hooks/useBrowserFeatureDetection.ts"; import { BLE } from "@components/PageComponents/Connect/BLE.tsx"; import { HTTP } from "@components/PageComponents/Connect/HTTP.tsx"; import { Serial } from "@components/PageComponents/Connect/Serial.tsx"; @@ -18,9 +18,9 @@ import { TabsTrigger, } from "@components/UI/Tabs.tsx"; import { Subtle } from "@components/UI/Typography/Subtle.tsx"; -import { AlertCircle, InfoIcon } from "lucide-react"; -import { Fragment, type JSX } from "react/jsx-runtime"; -import { Link } from "../UI/Typography/Link"; +import { AlertCircle } from "lucide-react"; +import { Link } from "../UI/Typography/Link.tsx"; +import { Fragment } from "react/jsx-runtime"; export interface TabElementProps { closeDialog: () => void; @@ -85,14 +85,16 @@ const ErrorMessage = ({ missingFeatures }: FeatureErrorProps) => {

{browserFeatures.length > 0 && ( <> - This application requires {formatFeatureList(browserFeatures)}. - Please use a Chromium-based browser like Chrome or Edge. + This application requires{" "} + {formatFeatureList(browserFeatures)}. Please use a + Chromium-based browser like Chrome or Edge. )} {needsSecureContext && ( <> {browserFeatures.length > 0 && " Additionally, it"} - {browserFeatures.length === 0 && "This application"} requires a{" "} + {browserFeatures.length === 0 && "This application"} requires a + {" "} secure context. Please connect using HTTPS or localhost. @@ -107,7 +109,7 @@ const ErrorMessage = ({ missingFeatures }: FeatureErrorProps) => { export const NewDeviceDialog = ({ open, onOpenChange, -}: NewDeviceProps): JSX.Element => { +}: NewDeviceProps) => { const { unsupported } = useBrowserFeatureDetection(); const tabs: TabManifest[] = [ @@ -119,15 +121,13 @@ export const NewDeviceDialog = ({ { label: "Bluetooth", element: BLE, - isDisabled: - unsupported.includes("Web Bluetooth") || + isDisabled: unsupported.includes("Web Bluetooth") || unsupported.includes("Secure Context"), }, { label: "Serial", element: Serial, - isDisabled: - unsupported.includes("Web Serial") || + isDisabled: unsupported.includes("Web Serial") || unsupported.includes("Secure Context"), }, ]; @@ -149,9 +149,9 @@ export const NewDeviceDialog = ({ {tabs.map((tab) => (

- {tab.isDisabled ? ( - - ) : null} + {tab.isDisabled + ? + : null} onOpenChange(false)} />
diff --git a/src/components/Dialog/NodeDetailsDialog.tsx b/src/components/Dialog/NodeDetailsDialog.tsx index ab76aa2f..c84af0b2 100644 --- a/src/components/Dialog/NodeDetailsDialog.tsx +++ b/src/components/Dialog/NodeDetailsDialog.tsx @@ -1,23 +1,23 @@ -import { useAppStore } from "@app/core/stores/appStore"; -import { useDevice } from "@app/core/stores/deviceStore"; +import { useAppStore } from "../../core/stores/appStore.ts"; +import { useDevice } from "../../core/stores/deviceStore.ts"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, -} from "@components/UI/Accordion"; +} from "../UI/Accordion.tsx"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, -} from "@components/UI/Dialog"; +} from "../UI/Dialog.tsx"; import { Protobuf } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; -import { DeviceImage } from "../generic/DeviceImage"; -import { TimeAgo } from "../generic/TimeAgo"; -import { Uptime } from "../generic/Uptime"; +import { DeviceImage } from "../generic/DeviceImage.tsx"; +import { TimeAgo } from "../generic/TimeAgo.tsx"; +import { Uptime } from "../generic/Uptime.tsx"; export interface NodeDetailsDialogProps { open: boolean; @@ -32,134 +32,159 @@ export const NodeDetailsDialog = ({ const { nodeNumDetails } = useAppStore(); const device: Protobuf.Mesh.NodeInfo = nodes.get(nodeNumDetails); - return device ? ( - - - - - Node Details for {device.user?.longName ?? "UNKNOWN"} ( - {device.user?.shortName ?? "UNK"}) - - - -
- -
-

- Details: -

-

- Hardware:{" "} - {Protobuf.Mesh.HardwareModel[device.user?.hwModel ?? 0]} -

-

Node Number: {device.num}

-

Node HEX: !{numberToHexUnpadded(device.num)}

-

- Role:{" "} - { - Protobuf.Config.Config_DeviceConfig_Role[ - device.user?.role ?? 0 - ] - } -

-

- Last Heard:{" "} - {device.lastHeard === 0 ? ( - "Never" - ) : ( - - )} -

-
- - {device.position ? ( -
+ return device + ? ( + + + + + Node Details for {device.user?.longName ?? "UNKNOWN"} ( + {device.user?.shortName ?? "UNK"}) + + + +
+ +

- Position: + Details:

- {device.position.latitudeI && device.position.longitudeI ? ( -

- Coordinates:{" "} - - {device.position.latitudeI / 1e7},{" "} - {device.position.longitudeI / 1e7} - -

- ) : null} - {device.position.altitude ? ( -

Altitude: {device.position.altitude}m

- ) : null} -
- ) : null} - - {device.deviceMetrics ? ( -
-

- Device Metrics: +

+ Hardware:{" "} + {Protobuf.Mesh.HardwareModel[device.user?.hwModel ?? 0]} +

+

Node Number: {device.num}

+

Node HEX: !{numberToHexUnpadded(device.num)}

+

+ Role: {Protobuf.Config.Config_DeviceConfig_Role[ + device.user?.role ?? 0 + ]} +

+

+ Last Heard: {device.lastHeard === 0 + ? ( + "Never" + ) + : }

- {device.deviceMetrics.airUtilTx ? ( -

- Air TX utilization:{" "} - {device.deviceMetrics.airUtilTx.toFixed(2)}% -

- ) : null} - {device.deviceMetrics.channelUtilization ? ( -

- Channel utilization:{" "} - {device.deviceMetrics.channelUtilization.toFixed(2)}% -

- ) : null} - {device.deviceMetrics.batteryLevel ? ( -

- Battery level:{" "} - {device.deviceMetrics.batteryLevel.toFixed(2)}% -

- ) : null} - {device.deviceMetrics.voltage ? ( -

Voltage: {device.deviceMetrics.voltage.toFixed(2)}V

- ) : null} - {device.deviceMetrics.uptimeSeconds ? ( -

- Uptime:{" "} - -

- ) : null}
- ) : null} - {device ? ( -
- - - -

- All Raw Metrics: -

-
- -
+              {device.position
+                ? (
+                  
+

+ Position: +

+ {device.position.latitudeI && device.position.longitudeI + ? ( +

+ Coordinates:{" "} + + {device.position.latitudeI / 1e7},{" "} + {device.position.longitudeI / 1e7} + +

+ ) + : null} + {device.position.altitude + ?

Altitude: {device.position.altitude}m

+ : null} +
+ ) + : null} + + {device.deviceMetrics + ? ( +
+

+ Device Metrics: +

+ {device.deviceMetrics.airUtilTx + ? ( +

+ Air TX utilization:{" "} + {device.deviceMetrics.airUtilTx.toFixed(2)}% +

+ ) + : null} + {device.deviceMetrics.channelUtilization + ? ( +

+ Channel utilization:{" "} + {device.deviceMetrics.channelUtilization.toFixed(2)}% +

+ ) + : null} + {device.deviceMetrics.batteryLevel + ? ( +

+ Battery level:{" "} + {device.deviceMetrics.batteryLevel.toFixed(2)}% +

+ ) + : null} + {device.deviceMetrics.voltage + ? ( +

+ Voltage: {device.deviceMetrics.voltage.toFixed(2)}V +

+ ) + : null} + {device.deviceMetrics.uptimeSeconds + ? ( +

+ Uptime:{" "} + +

+ ) + : null} +
+ ) + : null} + + {device + ? ( +
+ + + +

+ All Raw Metrics: +

+
+ +
                         {JSON.stringify(device, null, 2)}
-                      
-
-
-
-
- ) : null} -
- - -
- ) : null; + + + + +
+ ) + : null} +
+
+
+
+ ) + : null; }; diff --git a/src/components/Dialog/NodeOptionsDialog.tsx b/src/components/Dialog/NodeOptionsDialog.tsx index 0161bb22..34603f6f 100644 --- a/src/components/Dialog/NodeOptionsDialog.tsx +++ b/src/components/Dialog/NodeOptionsDialog.tsx @@ -1,17 +1,17 @@ -import { toast } from "@app/core/hooks/useToast"; -import { useAppStore } from "@app/core/stores/appStore"; -import { useDevice } from "@app/core/stores/deviceStore"; +import { toast } from "../../core/hooks/useToast.ts"; +import { useAppStore } from "../../core/stores/appStore.ts"; +import { useDevice } from "../../core/stores/deviceStore.ts"; import { Dialog, DialogContent, DialogHeader, DialogTitle, -} from "@components/UI/Dialog"; +} from "../UI/Dialog.tsx"; import type { Protobuf } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; import { TrashIcon } from "lucide-react"; -import type { JSX } from "react"; -import { Button } from "../UI/Button"; + +import { Button } from "../UI/Button.tsx"; export interface NodeOptionsDialogProps { node: Protobuf.Mesh.NodeInfo | undefined; @@ -23,7 +23,7 @@ export const NodeOptionsDialog = ({ node, open, onOpenChange, -}: NodeOptionsDialogProps): JSX.Element => { +}: NodeOptionsDialogProps) => { const { setDialogOpen, connection, setActivePage } = useDevice(); const { setNodeNumToBeRemoved, @@ -31,11 +31,9 @@ export const NodeOptionsDialog = ({ setChatType, setActiveChat, } = useAppStore(); - const longName = - node?.user?.longName ?? + const longName = node?.user?.longName ?? (node ? `!${numberToHexUnpadded(node?.num)}` : "Unknown"); - const shortName = - node?.user?.shortName ?? + const shortName = node?.user?.shortName ?? (node ? `${numberToHexUnpadded(node?.num).substring(0, 4)}` : "UNK"); function handleDirectMessage() { @@ -53,7 +51,7 @@ export const NodeOptionsDialog = ({ connection?.requestPosition(node.num).then(() => toast({ title: "Position request sent.", - }), + }) ); onOpenChange(); } @@ -66,7 +64,7 @@ export const NodeOptionsDialog = ({ connection?.traceRoute(node.num).then(() => toast({ title: "Traceroute sent.", - }), + }) ); onOpenChange(); } diff --git a/src/components/Dialog/PKIBackupDialog.tsx b/src/components/Dialog/PKIBackupDialog.tsx index 9b6c18d8..7304ba03 100644 --- a/src/components/Dialog/PKIBackupDialog.tsx +++ b/src/components/Dialog/PKIBackupDialog.tsx @@ -1,5 +1,5 @@ -import { useDevice } from "@app/core/stores/deviceStore"; -import { Button } from "@components/UI/Button"; +import { useDevice } from "../../core/stores/deviceStore.ts"; +import { Button } from "../UI/Button.tsx"; import { Dialog, DialogContent, @@ -40,7 +40,7 @@ export const PkiBackupDialog = ({ const renderPrintWindow = React.useCallback(() => { if (!privateKey || !publicKey) return; - const printWindow = window.open("", "_blank"); + const printWindow = globalThis.open("", "_blank"); if (printWindow) { printWindow.document.write(` @@ -116,14 +116,14 @@ export const PkiBackupDialog = ({ - diff --git a/src/components/Dialog/PkiRegenerateDialog.tsx b/src/components/Dialog/PkiRegenerateDialog.tsx index 818e7207..e36b2048 100644 --- a/src/components/Dialog/PkiRegenerateDialog.tsx +++ b/src/components/Dialog/PkiRegenerateDialog.tsx @@ -18,7 +18,7 @@ export const PkiRegenerateDialog = ({ open, onOpenChange, onSubmit, -}: PkiRegenerateDialogProps): JSX.Element => { +}: PkiRegenerateDialogProps) => { return ( diff --git a/src/components/Dialog/QRDialog.tsx b/src/components/Dialog/QRDialog.tsx index 54e7aec8..f6b542cb 100644 --- a/src/components/Dialog/QRDialog.tsx +++ b/src/components/Dialog/QRDialog.tsx @@ -28,7 +28,7 @@ export const QRDialog = ({ onOpenChange, loraConfig, channels, -}: QRDialogProps): JSX.Element => { +}: QRDialogProps) => { const [selectedChannels, setSelectedChannels] = useState([0]); const [qrCodeUrl, setQrCodeUrl] = useState(""); const [qrCodeAdd, setQrCodeAdd] = useState(); @@ -77,8 +77,8 @@ export const QRDialog = ({ {channel.settings?.name.length ? channel.settings.name : channel.role === Protobuf.Channel.Channel_Role.PRIMARY - ? "Primary" - : `Channel: ${channel.index}`} + ? "Primary" + : `Channel: ${channel.index}`} { if (selectedChannels.includes(channel.index)) { setSelectedChannels( - selectedChannels.filter((c) => c !== channel.index), + selectedChannels.filter((c) => + c !== channel.index + ), ); } else { setSelectedChannels([ @@ -130,7 +132,7 @@ export const QRDialog = ({ { +}: RebootDialogProps) => { const { connection } = useDevice(); const [time, setTime] = useState(5); diff --git a/src/components/Dialog/RemoveNodeDialog.tsx b/src/components/Dialog/RemoveNodeDialog.tsx index 81bfcd04..a0b2db83 100644 --- a/src/components/Dialog/RemoveNodeDialog.tsx +++ b/src/components/Dialog/RemoveNodeDialog.tsx @@ -1,4 +1,4 @@ -import { useAppStore } from "@app/core/stores/appStore"; +import { useAppStore } from "../../core/stores/appStore.ts"; import { useDevice } from "@app/core/stores/deviceStore.ts"; import { Button } from "@components/UI/Button.tsx"; import { @@ -19,7 +19,7 @@ export interface RemoveNodeDialogProps { export const RemoveNodeDialog = ({ open, onOpenChange, -}: RemoveNodeDialogProps): JSX.Element => { +}: RemoveNodeDialogProps) => { const { connection, nodes, removeNode } = useDevice(); const { nodeNumToBeRemoved } = useAppStore(); diff --git a/src/components/Dialog/ShutdownDialog.tsx b/src/components/Dialog/ShutdownDialog.tsx index 398896e5..ef7b87ac 100644 --- a/src/components/Dialog/ShutdownDialog.tsx +++ b/src/components/Dialog/ShutdownDialog.tsx @@ -19,7 +19,7 @@ export interface ShutdownDialogProps { export const ShutdownDialog = ({ open, onOpenChange, -}: ShutdownDialogProps): JSX.Element => { +}: ShutdownDialogProps) => { const { connection } = useDevice(); const [time, setTime] = useState(5); diff --git a/src/components/Dialog/TracerouteResponseDialog.tsx b/src/components/Dialog/TracerouteResponseDialog.tsx index 0427a299..6c7ad17e 100644 --- a/src/components/Dialog/TracerouteResponseDialog.tsx +++ b/src/components/Dialog/TracerouteResponseDialog.tsx @@ -1,15 +1,15 @@ -import { useDevice } from "@app/core/stores/deviceStore"; +import { useDevice } from "../../core/stores/deviceStore.ts"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, -} from "@components/UI/Dialog"; +} from "../UI/Dialog.tsx"; import type { Protobuf, Types } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; -import type { JSX } from "react"; -import { TraceRoute } from "../PageComponents/Messages/TraceRoute"; + +import { TraceRoute } from "../PageComponents/Messages/TraceRoute.tsx"; export interface TracerouteResponseDialogProps { traceroute: Types.PacketMetadata | undefined; @@ -21,18 +21,16 @@ export const TracerouteResponseDialog = ({ traceroute, open, onOpenChange, -}: TracerouteResponseDialogProps): JSX.Element => { +}: TracerouteResponseDialogProps) => { const { nodes } = useDevice(); const route: number[] = traceroute?.data.route ?? []; const routeBack: number[] = traceroute?.data.routeBack ?? []; const snrTowards = traceroute?.data.snrTowards ?? []; const snrBack = traceroute?.data.snrBack ?? []; const from = nodes.get(traceroute?.from ?? 0); - const longName = - from?.user?.longName ?? + const longName = from?.user?.longName ?? (from ? `!${numberToHexUnpadded(from?.num)}` : "Unknown"); - const shortName = - from?.user?.shortName ?? + const shortName = from?.user?.shortName ?? (from ? `${numberToHexUnpadded(from?.num).substring(0, 4)}` : "UNK"); const to = nodes.get(traceroute?.to ?? 0); return ( diff --git a/src/components/Form/DynamicForm.tsx b/src/components/Form/DynamicForm.tsx index e883b004..3dd4d5eb 100644 --- a/src/components/Form/DynamicForm.tsx +++ b/src/components/Form/DynamicForm.tsx @@ -74,10 +74,11 @@ export function DynamicForm({ const value = getValues(field.fieldName); if (value === "always") return true; if (typeof value === "boolean") return field.invert ? value : !value; - if (typeof value === "number") + if (typeof value === "number") { return field.invert ? field.selector !== value : field.selector === value; + } return false; }); }; @@ -85,11 +86,9 @@ export function DynamicForm({ return (
{fieldGroups.map((fieldGroup) => (
@@ -105,10 +104,8 @@ export function DynamicForm({ label={field.label} fieldName={field.name} description={field.description} - valid={ - field.validationText === undefined || - field.validationText === "" - } + valid={field.validationText === undefined || + field.validationText === ""} validationText={field.validationText} > ({ case "toggle": return ( - + ); case "select": return ( - + ); case "passwordGenerator": return ( diff --git a/src/components/Form/FormInput.tsx b/src/components/Form/FormInput.tsx index d50af067..a9398bc8 100644 --- a/src/components/Form/FormInput.tsx +++ b/src/components/Form/FormInput.tsx @@ -40,17 +40,15 @@ export function GenericInput({ control={control} render={({ field: { value, onChange, ...rest } }) => ( extends BaseFormBuilderProps { type: "multiSelect"; @@ -28,8 +28,8 @@ export function MultiSelectInput({ // Make sure to filter out the UNSET value, as it shouldn't be shown in the UI const optionsEnumValues = enumValue ? Object.entries(enumValue) - .filter((value) => typeof value[1] === "number") - .filter((value) => value[0] !== "UNSET") + .filter((value) => typeof value[1] === "number") + .filter((value) => value[0] !== "UNSET") : []; const formatName = (name: string) => { diff --git a/src/components/Form/FormPasswordGenerator.tsx b/src/components/Form/FormPasswordGenerator.tsx index 6fc4aac7..f4b8fbcb 100644 --- a/src/components/Form/FormPasswordGenerator.tsx +++ b/src/components/Form/FormPasswordGenerator.tsx @@ -2,10 +2,10 @@ import type { BaseFormBuilderProps, GenericFormElementProps, } from "@components/Form/DynamicForm.tsx"; -import type { ButtonVariant } from "@components/UI/Button"; +import type { ButtonVariant } from "../UI/Button.tsx"; import { Generator } from "@components/UI/Generator.tsx"; import { Eye, EyeOff } from "lucide-react"; -import type { ChangeEventHandler, MouseEventHandler } from "react"; +import type { ChangeEventHandler } from "react"; import { useState } from "react"; import { Controller, type FieldValues } from "react-hook-form"; @@ -43,14 +43,12 @@ export function PasswordGenerator({ ({ field.properties; const optionsEnumValues = enumValue ? Object.entries(enumValue).filter( - (value) => typeof value[1] === "number", - ) + (value) => typeof value[1] === "number", + ) : []; return ( { +}: TraceRouteProps) => { const { nodes } = useDevice(); return ( @@ -38,23 +37,25 @@ export const TraceRoute = ({ ))} {from?.user?.longName} - {routeBack ? ( - -

Route back:

-

{from?.user?.longName}

-

↓ {snrBack?.[0] ? snrBack[0] : "??"}dB

- {routeBack.map((hop, i) => ( - -

- {nodes.get(hop)?.user?.longName ?? - `!${numberToHexUnpadded(hop)}`} -

-

↓ {snrBack?.[i + 1] ? snrBack[i + 1] : "??"}dB

-
- ))} - {to?.user?.longName} -
- ) : null} + {routeBack + ? ( + +

Route back:

+

{from?.user?.longName}

+

↓ {snrBack?.[0] ? snrBack[0] : "??"}dB

+ {routeBack.map((hop, i) => ( + +

+ {nodes.get(hop)?.user?.longName ?? + `!${numberToHexUnpadded(hop)}`} +

+

↓ {snrBack?.[i + 1] ? snrBack[i + 1] : "??"}dB

+
+ ))} + {to?.user?.longName} +
+ ) + : null}
); }; diff --git a/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx b/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx index effe7471..6ea06354 100644 --- a/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx +++ b/src/components/PageComponents/ModuleConfig/AmbientLighting.tsx @@ -4,7 +4,7 @@ import { create } from "@bufbuild/protobuf"; import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { Protobuf } from "@meshtastic/core"; -export const AmbientLighting = (): JSX.Element => { +export const AmbientLighting = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: AmbientLightingValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/Audio.tsx b/src/components/PageComponents/ModuleConfig/Audio.tsx index 08960704..4297f09f 100644 --- a/src/components/PageComponents/ModuleConfig/Audio.tsx +++ b/src/components/PageComponents/ModuleConfig/Audio.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const Audio = (): JSX.Element => { +export const Audio = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: AudioValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/CannedMessage.tsx b/src/components/PageComponents/ModuleConfig/CannedMessage.tsx index b800035d..661a9f01 100644 --- a/src/components/PageComponents/ModuleConfig/CannedMessage.tsx +++ b/src/components/PageComponents/ModuleConfig/CannedMessage.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const CannedMessage = (): JSX.Element => { +export const CannedMessage = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: CannedMessageValidation) => { @@ -63,9 +63,8 @@ export const CannedMessage = (): JSX.Element => { label: "Clockwise event", description: "Select input event.", properties: { - enumValue: - Protobuf.ModuleConfig - .ModuleConfig_CannedMessageConfig_InputEventChar, + enumValue: Protobuf.ModuleConfig + .ModuleConfig_CannedMessageConfig_InputEventChar, }, }, { @@ -74,9 +73,8 @@ export const CannedMessage = (): JSX.Element => { label: "Counter Clockwise event", description: "Select input event.", properties: { - enumValue: - Protobuf.ModuleConfig - .ModuleConfig_CannedMessageConfig_InputEventChar, + enumValue: Protobuf.ModuleConfig + .ModuleConfig_CannedMessageConfig_InputEventChar, }, }, { @@ -85,9 +83,8 @@ export const CannedMessage = (): JSX.Element => { label: "Press event", description: "Select input event", properties: { - enumValue: - Protobuf.ModuleConfig - .ModuleConfig_CannedMessageConfig_InputEventChar, + enumValue: Protobuf.ModuleConfig + .ModuleConfig_CannedMessageConfig_InputEventChar, }, }, { diff --git a/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx b/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx index 056c48dd..ff698094 100644 --- a/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx +++ b/src/components/PageComponents/ModuleConfig/DetectionSensor.tsx @@ -4,7 +4,7 @@ import { create } from "@bufbuild/protobuf"; import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { Protobuf } from "@meshtastic/core"; -export const DetectionSensor = (): JSX.Element => { +export const DetectionSensor = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: DetectionSensorValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx b/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx index 6d767ea1..ecaa8cbf 100644 --- a/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx +++ b/src/components/PageComponents/ModuleConfig/ExternalNotification.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const ExternalNotification = (): JSX.Element => { +export const ExternalNotification = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: ExternalNotificationValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/MQTT.tsx b/src/components/PageComponents/ModuleConfig/MQTT.tsx index 28e3cba9..c20907cf 100644 --- a/src/components/PageComponents/ModuleConfig/MQTT.tsx +++ b/src/components/PageComponents/ModuleConfig/MQTT.tsx @@ -4,7 +4,7 @@ import { create } from "@bufbuild/protobuf"; import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { Protobuf } from "@meshtastic/core"; -export const MQTT = (): JSX.Element => { +export const MQTT = () => { const { config, moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: MqttValidation) => { @@ -165,32 +165,31 @@ export const MQTT = (): JSX.Element => { description: "Position shared will be accurate within this distance", properties: { - enumValue: - config.display?.units === 0 - ? { - "Within 23 km": 10, - "Within 12 km": 11, - "Within 5.8 km": 12, - "Within 2.9 km": 13, - "Within 1.5 km": 14, - "Within 700 m": 15, - "Within 350 m": 16, - "Within 200 m": 17, - "Within 90 m": 18, - "Within 50 m": 19, - } - : { - "Within 15 miles": 10, - "Within 7.3 miles": 11, - "Within 3.6 miles": 12, - "Within 1.8 miles": 13, - "Within 0.9 miles": 14, - "Within 0.5 miles": 15, - "Within 0.2 miles": 16, - "Within 600 feet": 17, - "Within 300 feet": 18, - "Within 150 feet": 19, - }, + enumValue: config.display?.units === 0 + ? { + "Within 23 km": 10, + "Within 12 km": 11, + "Within 5.8 km": 12, + "Within 2.9 km": 13, + "Within 1.5 km": 14, + "Within 700 m": 15, + "Within 350 m": 16, + "Within 200 m": 17, + "Within 90 m": 18, + "Within 50 m": 19, + } + : { + "Within 15 miles": 10, + "Within 7.3 miles": 11, + "Within 3.6 miles": 12, + "Within 1.8 miles": 13, + "Within 0.9 miles": 14, + "Within 0.5 miles": 15, + "Within 0.2 miles": 16, + "Within 600 feet": 17, + "Within 300 feet": 18, + "Within 150 feet": 19, + }, }, disabledBy: [ { diff --git a/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx b/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx index b3391f0f..aaf154de 100644 --- a/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx +++ b/src/components/PageComponents/ModuleConfig/NeighborInfo.tsx @@ -4,7 +4,7 @@ import { create } from "@bufbuild/protobuf"; import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { Protobuf } from "@meshtastic/core"; -export const NeighborInfo = (): JSX.Element => { +export const NeighborInfo = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: NeighborInfoValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/Paxcounter.tsx b/src/components/PageComponents/ModuleConfig/Paxcounter.tsx index fd5b372f..9f2804cf 100644 --- a/src/components/PageComponents/ModuleConfig/Paxcounter.tsx +++ b/src/components/PageComponents/ModuleConfig/Paxcounter.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const Paxcounter = (): JSX.Element => { +export const Paxcounter = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: PaxcounterValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/RangeTest.tsx b/src/components/PageComponents/ModuleConfig/RangeTest.tsx index e0fbdf2f..5949385f 100644 --- a/src/components/PageComponents/ModuleConfig/RangeTest.tsx +++ b/src/components/PageComponents/ModuleConfig/RangeTest.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const RangeTest = (): JSX.Element => { +export const RangeTest = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: RangeTestValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/Serial.tsx b/src/components/PageComponents/ModuleConfig/Serial.tsx index 05713f20..eb9b53c9 100644 --- a/src/components/PageComponents/ModuleConfig/Serial.tsx +++ b/src/components/PageComponents/ModuleConfig/Serial.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const Serial = (): JSX.Element => { +export const Serial = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: SerialValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/StoreForward.tsx b/src/components/PageComponents/ModuleConfig/StoreForward.tsx index 72ca9bee..f091f586 100644 --- a/src/components/PageComponents/ModuleConfig/StoreForward.tsx +++ b/src/components/PageComponents/ModuleConfig/StoreForward.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const StoreForward = (): JSX.Element => { +export const StoreForward = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: StoreForwardValidation) => { diff --git a/src/components/PageComponents/ModuleConfig/Telemetry.tsx b/src/components/PageComponents/ModuleConfig/Telemetry.tsx index c2de366e..8138a77d 100644 --- a/src/components/PageComponents/ModuleConfig/Telemetry.tsx +++ b/src/components/PageComponents/ModuleConfig/Telemetry.tsx @@ -4,7 +4,7 @@ import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf } from "@meshtastic/core"; -export const Telemetry = (): JSX.Element => { +export const Telemetry = () => { const { moduleConfig, setWorkingModuleConfig } = useDevice(); const onSubmit = (data: TelemetryValidation) => { diff --git a/src/components/PageLayout.tsx b/src/components/PageLayout.tsx index d15a8dda..63834845 100644 --- a/src/components/PageLayout.tsx +++ b/src/components/PageLayout.tsx @@ -1,7 +1,7 @@ import { cn } from "@app/core/utils/cn.ts"; import { AlignLeftIcon, type LucideIcon } from "lucide-react"; -import Footer from "./UI/Footer"; -import { Spinner } from "./UI/Spinner"; +import Footer from "./UI/Footer.tsx"; +import { Spinner } from "./UI/Spinner.tsx"; export interface PageLayoutProps { label: string; @@ -44,9 +44,7 @@ export const PageLayout = ({ className="transition-all hover:text-accent" onClick={action.onClick} > - {action?.isLoading ? ( - - ) : ( + {action?.isLoading ? : ( { +export const Sidebar = ({ children }: SidebarProps) => { const { hardware, nodes, metadata } = useDevice(); const myNode = nodes.get(hardware.myNodeNum); const myMetadata = metadata.get(0); @@ -64,69 +64,71 @@ export const Sidebar = ({ children }: SidebarProps): JSX.Element => { }, ]; - return showSidebar ? ( -
-
-
- - {myNode?.user?.shortName ?? "UNK"} - - {myNode?.user?.longName ?? "UNK"} + return showSidebar + ? ( +
+
+
+ + {myNode?.user?.shortName ?? "UNK"} + + {myNode?.user?.longName ?? "UNK"} +
+ +
- - -
-
-
- - - {myNode?.deviceMetrics?.batteryLevel - ? myNode?.deviceMetrics?.batteryLevel > 100 - ? "Charging" - : `${myNode?.deviceMetrics?.batteryLevel}%` - : "UNK"} - -
-
- - - {myNode?.deviceMetrics?.voltage?.toPrecision(3) ?? "UNK"} volts - -
-
- - v{myMetadata?.firmwareVersion ?? "UNK"} +
+
+ + + {myNode?.deviceMetrics?.batteryLevel + ? myNode?.deviceMetrics?.batteryLevel > 100 + ? "Charging" + : `${myNode?.deviceMetrics?.batteryLevel}%` + : "UNK"} + +
+
+ + + {myNode?.deviceMetrics?.voltage?.toPrecision(3) ?? "UNK"} volts + +
+
+ + v{myMetadata?.firmwareVersion ?? "UNK"} +
-
- - {pages.map((link) => ( - { - setActivePage(link.page); - }} - active={link.page === activePage} - /> - ))} - - {children} -
- ) : ( -
- -
- ); + + {pages.map((link) => ( + { + setActivePage(link.page); + }} + active={link.page === activePage} + /> + ))} + + {children} +
+ ) + : ( +
+ +
+ ); }; diff --git a/src/components/ThemeSwitcher.tsx b/src/components/ThemeSwitcher.tsx index a4fa2f8a..c662eda2 100644 --- a/src/components/ThemeSwitcher.tsx +++ b/src/components/ThemeSwitcher.tsx @@ -1,5 +1,5 @@ -import { useTheme } from "@app/core/hooks/useTheme"; -import { cn } from "@app/core/utils/cn"; +import { useTheme } from "../core/hooks/useTheme.ts"; +import { cn } from "../core/utils/cn.ts"; import { Monitor, Moon, Sun } from "lucide-react"; type ThemePreference = "light" | "dark" | "system"; @@ -32,11 +32,9 @@ export default function ThemeSwitcher({ className, )} onClick={toggleTheme} - aria-label={ - preference === "system" - ? `System theme (currently ${theme}). Click to change theme.` - : `Current theme: ${theme}. Click to change theme.` - } + aria-label={preference === "system" + ? `System theme (currently ${theme}). Click to change theme.` + : `Current theme: ${theme}. Click to change theme.`} > {themeIcons[preference]} diff --git a/src/components/Toaster.tsx b/src/components/Toaster.tsx index d50ba3b8..b42044bb 100644 --- a/src/components/Toaster.tsx +++ b/src/components/Toaster.tsx @@ -5,8 +5,8 @@ import { ToastProvider, ToastTitle, ToastViewport, -} from "@components/UI/Toast"; -import { useToast } from "@core/hooks/useToast"; +} from "./UI/Toast.tsx"; +import { useToast } from "../core/hooks/useToast.ts"; export function Toaster() { const { toasts } = useToast(); diff --git a/src/components/UI/Avatar.tsx b/src/components/UI/Avatar.tsx index bbb21cb2..4b8b94cb 100644 --- a/src/components/UI/Avatar.tsx +++ b/src/components/UI/Avatar.tsx @@ -1,4 +1,4 @@ -import { cn } from "@app/core/utils/cn"; +import { cn } from "../../core/utils/cn.ts"; import type React from "react"; type RGBColor = { diff --git a/src/components/UI/Button.tsx b/src/components/UI/Button.tsx index 924f7b34..5c4bde4c 100644 --- a/src/components/UI/Button.tsx +++ b/src/components/UI/Button.tsx @@ -1,4 +1,4 @@ -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; import { cn } from "@core/utils/cn.ts"; @@ -20,7 +20,8 @@ const buttonVariants = cva( "bg-slate-100 text-slate-700 hover:bg-slate-200 dark:bg-slate-500 dark:text-white dark:hover:bg-slate-400", ghost: "bg-transparent hover:bg-slate-100 dark:hover:bg-slate-800 dark:text-slate-100 dark:hover:text-slate-100 data-[state=open]:bg-transparent dark:data-[state=open]:bg-transparent", - link: "bg-transparent underline-offset-4 hover:underline text-slate-900 dark:text-slate-100 hover:bg-transparent dark:hover:bg-transparent", + link: + "bg-transparent underline-offset-4 hover:underline text-slate-900 dark:text-slate-100 hover:bg-transparent dark:hover:bg-transparent", }, size: { default: "h-10 py-2 px-4", @@ -38,7 +39,8 @@ const buttonVariants = cva( export type ButtonVariant = VariantProps["variant"]; export interface ButtonProps - extends React.ButtonHTMLAttributes, + extends + React.ButtonHTMLAttributes, VariantProps {} const Button = React.forwardRef( diff --git a/src/components/UI/Command.tsx b/src/components/UI/Command.tsx index b700782e..3173179c 100644 --- a/src/components/UI/Command.tsx +++ b/src/components/UI/Command.tsx @@ -144,11 +144,11 @@ CommandShortcut.displayName = "CommandShortcut"; export { Command, CommandDialog, - CommandInput, - CommandList, CommandEmpty, CommandGroup, + CommandInput, CommandItem, - CommandShortcut, + CommandList, CommandSeparator, + CommandShortcut, }; diff --git a/src/components/UI/Dialog.tsx b/src/components/UI/Dialog.tsx index 23f7143d..bf580a79 100644 --- a/src/components/UI/Dialog.tsx +++ b/src/components/UI/Dialog.tsx @@ -23,7 +23,7 @@ DialogPortal.displayName = DialogPrimitive.Portal.displayName; const DialogOverlay = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( +>(({ className, ...props }, ref) => ( {} const Footer = React.forwardRef( - ({ className, ...props }, ref) => { + ({ className, ...props }) => { return ( -
-
-
-
- - - ); - })} - - ) : ( -
- -

No Devices

- Connect at least one device to get started - -
- )} + + + ); + })} + + ) + : ( +
+ +

No Devices

+ Connect at least one device to get started + +
+ )}
diff --git a/src/pages/Map/index.tsx b/src/pages/Map/index.tsx index c1c484a5..a3ec823d 100644 --- a/src/pages/Map/index.tsx +++ b/src/pages/Map/index.tsx @@ -1,14 +1,13 @@ -import { NodeDetail } from "@app/components/PageComponents/Map/NodeDetail"; -import { Avatar } from "@app/components/UI/Avatar"; -import { useTheme } from "@app/core/hooks/useTheme"; +import { NodeDetail } from "../../components/PageComponents/Map/NodeDetail.tsx"; +import { Avatar } from "../../components/UI/Avatar.tsx"; +import { useTheme } from "../../core/hooks/useTheme.ts"; import { PageLayout } from "@components/PageLayout.tsx"; import { Sidebar } from "@components/Sidebar.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import type { Protobuf } from "@meshtastic/core"; import { bbox, lineString } from "@turf/turf"; -import { current } from "immer"; import { MapPinIcon } from "lucide-react"; -import { type JSX, useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useState } from "react"; import { AttributionControl, GeolocateControl, @@ -33,15 +32,16 @@ const convertToLatLng = (position: { longitude: (position.longitudeI ?? 0) / 1e7, }); -const MapPage = (): JSX.Element => { +const MapPage = () => { const { nodes, waypoints } = useDevice(); - const currentTheme = useTheme(); + const { theme } = useTheme(); const { default: map } = useMap(); - const darkMode = currentTheme === "dark"; + const darkMode = theme === "dark"; - const [selectedNode, setSelectedNode] = - useState(null); + const [selectedNode, setSelectedNode] = useState< + Protobuf.Mesh.NodeInfo | null + >(null); // Filter out nodes without a valid position const validNodes = useMemo( @@ -140,13 +140,12 @@ const MapPage = (): JSX.Element => { return ( <> - + { ))} {markers} - {selectedNode ? ( - setSelectedNode(null)} - > - - - ) : null} + {selectedNode + ? ( + setSelectedNode(null)} + > + + + ) + : null} diff --git a/src/pages/Messages.tsx b/src/pages/Messages.tsx index c4060804..b520f906 100644 --- a/src/pages/Messages.tsx +++ b/src/pages/Messages.tsx @@ -1,4 +1,4 @@ -import { useAppStore } from "@app/core/stores/appStore"; +import { useAppStore } from "../core/stores/appStore.ts"; import { ChannelChat } from "@components/PageComponents/Messages/ChannelChat.tsx"; import { PageLayout } from "@components/PageLayout.tsx"; import { Sidebar } from "@components/Sidebar.tsx"; @@ -10,12 +10,11 @@ import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf, Types } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; import { getChannelName } from "@pages/Channels.tsx"; -import { HashIcon, LockIcon, LockOpenIcon, WaypointsIcon } from "lucide-react"; +import { HashIcon, LockIcon, LockOpenIcon } from "lucide-react"; import { useState } from "react"; export const MessagesPage = () => { - const { channels, nodes, hardware, messages, traceroutes, connection } = - useDevice(); + const { channels, nodes, hardware, messages } = useDevice(); const { activeChat, chatType, setActiveChat, setChatType } = useAppStore(); const [searchTerm, setSearchTerm] = useState(""); const filteredNodes = Array.from(nodes.values()).filter((node) => { @@ -39,13 +38,11 @@ export const MessagesPage = () => { {filteredChannels.map((channel) => ( { setChatType("broadcast"); @@ -69,9 +66,8 @@ export const MessagesPage = () => { {filteredNodes.map((node) => ( { setChatType("direct"); @@ -94,32 +90,30 @@ export const MessagesPage = () => { chatType === "broadcast" && currentChannel ? getChannelName(currentChannel) : chatType === "direct" && nodes.get(activeChat) - ? (nodes.get(activeChat)?.user?.longName ?? nodeHex) - : "Loading..." + ? (nodes.get(activeChat)?.user?.longName ?? nodeHex) + : "Loading..." }`} - actions={ - chatType === "direct" - ? [ - { - icon: nodes.get(activeChat)?.user?.publicKey.length - ? LockIcon - : LockOpenIcon, - iconClasses: nodes.get(activeChat)?.user?.publicKey.length - ? "text-green-600" - : "text-yellow-300", - async onClick() { - const targetNode = nodes.get(activeChat)?.num; - if (targetNode === undefined) return; - toast({ - title: nodes.get(activeChat)?.user?.publicKey.length - ? "Chat is using PKI encryption." - : "Chat is using PSK encryption.", - }); - }, - }, - ] - : [] - } + actions={chatType === "direct" + ? [ + { + icon: nodes.get(activeChat)?.user?.publicKey.length + ? LockIcon + : LockOpenIcon, + iconClasses: nodes.get(activeChat)?.user?.publicKey.length + ? "text-green-600" + : "text-yellow-300", + onClick() { + const targetNode = nodes.get(activeChat)?.num; + if (targetNode === undefined) return; + toast({ + title: nodes.get(activeChat)?.user?.publicKey.length + ? "Chat is using PKI encryption." + : "Chat is using PSK encryption.", + }); + }, + }, + ] + : []} > {allChannels.map( (channel) => diff --git a/src/pages/Nodes.tsx b/src/pages/Nodes.tsx index 429fcbdd..dbcc6094 100644 --- a/src/pages/Nodes.tsx +++ b/src/pages/Nodes.tsx @@ -1,7 +1,7 @@ -import { LocationResponseDialog } from "@app/components/Dialog/LocationResponseDialog"; -import { NodeOptionsDialog } from "@app/components/Dialog/NodeOptionsDialog"; -import { TracerouteResponseDialog } from "@app/components/Dialog/TracerouteResponseDialog"; -import Footer from "@app/components/UI/Footer"; +import { LocationResponseDialog } from "../components/Dialog/LocationResponseDialog.tsx"; +import { NodeOptionsDialog } from "../components/Dialog/NodeOptionsDialog.tsx"; +import { TracerouteResponseDialog } from "../components/Dialog/TracerouteResponseDialog.tsx"; +import Footer from "../components/UI/Footer.tsx"; import { Sidebar } from "@components/Sidebar.tsx"; import { Avatar } from "@components/UI/Avatar.tsx"; import { Mono } from "@components/generic/Mono.tsx"; @@ -11,7 +11,7 @@ import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf, type Types } from "@meshtastic/core"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; import { LockIcon, LockOpenIcon } from "lucide-react"; -import { Fragment, type JSX, useCallback, useEffect, useState } from "react"; +import { Fragment, useCallback, useEffect, useState } from "react"; import { base16 } from "rfc4648"; export interface DeleteNoteDialogProps { @@ -19,7 +19,7 @@ export interface DeleteNoteDialogProps { onOpenChange: (open: boolean) => void; } -const NodesPage = (): JSX.Element => { +const NodesPage = () => { const { nodes, hardware, connection } = useDevice(); const [selectedNode, setSelectedNode] = useState< Protobuf.Mesh.NodeInfo | undefined @@ -107,9 +107,11 @@ const NodesPage = (): JSX.Element => { > {node.user?.shortName ?? (node.user?.macaddr - ? `${base16 + ? `${ + base16 .stringify(node.user?.macaddr.subarray(4, 6) ?? []) - .toLowerCase()}` + .toLowerCase() + }` : `${numberToHexUnpadded(node.num).slice(-4)}`)} , @@ -120,9 +122,11 @@ const NodesPage = (): JSX.Element => { > {node.user?.longName ?? (node.user?.macaddr - ? `Meshtastic ${base16 + ? `Meshtastic ${ + base16 .stringify(node.user?.macaddr.subarray(4, 6) ?? []) - .toLowerCase()}` + .toLowerCase() + }` : `!${numberToHexUnpadded(node.num)}`)} , @@ -136,11 +140,9 @@ const NodesPage = (): JSX.Element => { ?.join(":") ?? "UNK"} , - {node.lastHeard === 0 ? ( -

Never

- ) : ( - - )} + {node.lastHeard === 0 + ?

Never

+ : }
, {node.snr}db/ @@ -148,19 +150,17 @@ const NodesPage = (): JSX.Element => { {(node.snr + 10) * 5}raw , - {node.user?.publicKey && node.user?.publicKey.length > 0 ? ( - - ) : ( - - )} + {node.user?.publicKey && node.user?.publicKey.length > 0 + ? + : } , {node.lastHeard !== 0 ? node.viaMqtt === false && node.hopsAway === 0 ? "Direct" : `${node.hopsAway.toString()} ${ - node.hopsAway > 1 ? "hops" : "hop" - } away` + node.hopsAway > 1 ? "hops" : "hop" + } away` : "-"} {node.viaMqtt === true ? ", via MQTT" : ""} , diff --git a/src/validation/channel.ts b/src/validation/channel.ts index 6316ce4e..4f4d43bb 100644 --- a/src/validation/channel.ts +++ b/src/validation/channel.ts @@ -10,8 +10,7 @@ import { } from "class-validator"; export class ChannelValidation - implements Omit -{ + implements Omit { @IsNumber() index: number; @@ -22,8 +21,7 @@ export class ChannelValidation } export class Channel_SettingsValidation - implements Omit -{ + implements Omit { @IsNumber() channelNum: number; diff --git a/src/validation/config/bluetooth.ts b/src/validation/config/bluetooth.ts index e84d8f27..67492240 100644 --- a/src/validation/config/bluetooth.ts +++ b/src/validation/config/bluetooth.ts @@ -2,13 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsEnum, IsInt } from "class-validator"; -export class BluetoothValidation - implements - Omit< - Protobuf.Config.Config_BluetoothConfig, - keyof Message | "deviceLoggingEnabled" - > -{ +export class BluetoothValidation implements + Omit< + Protobuf.Config.Config_BluetoothConfig, + keyof Message | "deviceLoggingEnabled" + > { @IsBoolean() enabled: boolean; diff --git a/src/validation/config/device.ts b/src/validation/config/device.ts index 5c79d583..0858e6a7 100644 --- a/src/validation/config/device.ts +++ b/src/validation/config/device.ts @@ -3,8 +3,7 @@ import { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsEnum, IsInt, IsString } from "class-validator"; export class DeviceValidation - implements Omit -{ + implements Omit { @IsEnum(Protobuf.Config.Config_DeviceConfig_Role) role: Protobuf.Config.Config_DeviceConfig_Role; diff --git a/src/validation/config/display.ts b/src/validation/config/display.ts index ed21d3f9..6f38164b 100644 --- a/src/validation/config/display.ts +++ b/src/validation/config/display.ts @@ -3,8 +3,7 @@ import { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsEnum, IsInt } from "class-validator"; export class DisplayValidation - implements Omit -{ + implements Omit { @IsInt() screenOnSecs: number; diff --git a/src/validation/config/lora.ts b/src/validation/config/lora.ts index 4fb5646a..ad70b586 100644 --- a/src/validation/config/lora.ts +++ b/src/validation/config/lora.ts @@ -4,8 +4,7 @@ import { IsArray, IsBoolean, IsEnum, IsInt, Max, Min } from "class-validator"; export class LoRaValidation implements - Omit -{ + Omit { @IsBoolean() usePreset: boolean; diff --git a/src/validation/config/network.ts b/src/validation/config/network.ts index 922f9563..f37796cc 100644 --- a/src/validation/config/network.ts +++ b/src/validation/config/network.ts @@ -11,8 +11,7 @@ import { export class NetworkValidation implements - Omit -{ + Omit { @IsBoolean() wifiEnabled: boolean; @@ -39,13 +38,11 @@ export class NetworkValidation rsyslogServer: string; } -export class NetworkValidationIpV4Config - implements - Omit< - Protobuf.Config.Config_NetworkConfig_IpV4Config, - keyof Message | "ip" | "gateway" | "subnet" | "dns" - > -{ +export class NetworkValidationIpV4Config implements + Omit< + Protobuf.Config.Config_NetworkConfig_IpV4Config, + keyof Message | "ip" | "gateway" | "subnet" | "dns" + > { @IsIP() @IsOptional() ip: string; diff --git a/src/validation/config/position.ts b/src/validation/config/position.ts index 97822bb4..84e67603 100644 --- a/src/validation/config/position.ts +++ b/src/validation/config/position.ts @@ -1,16 +1,14 @@ import type { Message } from "@bufbuild/protobuf"; import { Protobuf } from "@meshtastic/core"; -import { IsArray, IsBoolean, IsEnum, IsInt } from "class-validator"; +import { IsBoolean, IsEnum, IsInt } from "class-validator"; const DeprecatedPositionValidationFields = ["gpsEnabled", "gpsAttemptTime"]; -export class PositionValidation - implements - Omit< - Protobuf.Config.Config_PositionConfig, - keyof Message | (typeof DeprecatedPositionValidationFields)[number] - > -{ +export class PositionValidation implements + Omit< + Protobuf.Config.Config_PositionConfig, + keyof Message | (typeof DeprecatedPositionValidationFields)[number] + > { @IsInt() positionBroadcastSecs: number; diff --git a/src/validation/config/power.ts b/src/validation/config/power.ts index 0e1012d3..a83f5f15 100644 --- a/src/validation/config/power.ts +++ b/src/validation/config/power.ts @@ -2,10 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import type { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsInt, IsNumber, Max, Min } from "class-validator"; -export class PowerValidation - implements - Omit -{ +export class PowerValidation implements + Omit< + Protobuf.Config.Config_PowerConfig, + keyof Message | "powermonEnables" + > { @IsBoolean() isPowerSaving: boolean; diff --git a/src/validation/config/security.ts b/src/validation/config/security.ts index 0b9aa7d4..b856d521 100644 --- a/src/validation/config/security.ts +++ b/src/validation/config/security.ts @@ -2,13 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import type { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsString } from "class-validator"; -export class SecurityValidation - implements - Omit< - Protobuf.Config.Config_SecurityConfig, - keyof Message | "adminKey" | "privateKey" | "publicKey" - > -{ +export class SecurityValidation implements + Omit< + Protobuf.Config.Config_SecurityConfig, + keyof Message | "adminKey" | "privateKey" | "publicKey" + > { @IsBoolean() adminChannelEnabled: boolean; diff --git a/src/validation/moduleConfig/ambientLighting.ts b/src/validation/moduleConfig/ambientLighting.ts index 30801067..93124502 100644 --- a/src/validation/moduleConfig/ambientLighting.ts +++ b/src/validation/moduleConfig/ambientLighting.ts @@ -2,13 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import type { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsInt } from "class-validator"; -export class AmbientLightingValidation - implements - Omit< - Protobuf.ModuleConfig.ModuleConfig_AmbientLightingConfig, - keyof Message - > -{ +export class AmbientLightingValidation implements + Omit< + Protobuf.ModuleConfig.ModuleConfig_AmbientLightingConfig, + keyof Message + > { @IsBoolean() ledState: boolean; diff --git a/src/validation/moduleConfig/audio.ts b/src/validation/moduleConfig/audio.ts index 091350f7..b70e3dae 100644 --- a/src/validation/moduleConfig/audio.ts +++ b/src/validation/moduleConfig/audio.ts @@ -3,8 +3,8 @@ import { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsEnum, IsInt } from "class-validator"; export class AudioValidation - implements Omit -{ + implements + Omit { @IsBoolean() codec2Enabled: boolean; diff --git a/src/validation/moduleConfig/cannedMessage.ts b/src/validation/moduleConfig/cannedMessage.ts index 6701c553..2b70eaf5 100644 --- a/src/validation/moduleConfig/cannedMessage.ts +++ b/src/validation/moduleConfig/cannedMessage.ts @@ -2,10 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsEnum, IsInt, Length } from "class-validator"; -export class CannedMessageValidation - implements - Omit -{ +export class CannedMessageValidation implements + Omit< + Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig, + keyof Message + > { @IsBoolean() rotary1Enabled: boolean; @@ -19,13 +20,16 @@ export class CannedMessageValidation inputbrokerPinPress: number; @IsEnum(Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar) - inputbrokerEventCw: Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar; + inputbrokerEventCw: + Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar; @IsEnum(Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar) - inputbrokerEventCcw: Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar; + inputbrokerEventCcw: + Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar; @IsEnum(Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar) - inputbrokerEventPress: Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar; + inputbrokerEventPress: + Protobuf.ModuleConfig.ModuleConfig_CannedMessageConfig_InputEventChar; @IsBoolean() updown1Enabled: boolean; diff --git a/src/validation/moduleConfig/detectionSensor.ts b/src/validation/moduleConfig/detectionSensor.ts index b6acaa98..b812df17 100644 --- a/src/validation/moduleConfig/detectionSensor.ts +++ b/src/validation/moduleConfig/detectionSensor.ts @@ -2,13 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import type { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsInt, Length } from "class-validator"; -export class DetectionSensorValidation - implements - Omit< - Protobuf.ModuleConfig.ModuleConfig_DetectionSensorConfig, - keyof Message - > -{ +export class DetectionSensorValidation implements + Omit< + Protobuf.ModuleConfig.ModuleConfig_DetectionSensorConfig, + keyof Message + > { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/externalNotification.ts b/src/validation/moduleConfig/externalNotification.ts index e7b9e044..5b68ffa3 100644 --- a/src/validation/moduleConfig/externalNotification.ts +++ b/src/validation/moduleConfig/externalNotification.ts @@ -2,13 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import type { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsInt } from "class-validator"; -export class ExternalNotificationValidation - implements - Omit< - Protobuf.ModuleConfig.ModuleConfig_ExternalNotificationConfig, - keyof Message - > -{ +export class ExternalNotificationValidation implements + Omit< + Protobuf.ModuleConfig.ModuleConfig_ExternalNotificationConfig, + keyof Message + > { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/mqtt.ts b/src/validation/moduleConfig/mqtt.ts index 79608610..44312c8e 100644 --- a/src/validation/moduleConfig/mqtt.ts +++ b/src/validation/moduleConfig/mqtt.ts @@ -8,13 +8,11 @@ import { Length, } from "class-validator"; -export class MqttValidation - implements - Omit< - Protobuf.ModuleConfig.ModuleConfig_MQTTConfig, - keyof Message | "mapReportSettings" - > -{ +export class MqttValidation implements + Omit< + Protobuf.ModuleConfig.ModuleConfig_MQTTConfig, + keyof Message | "mapReportSettings" + > { @IsBoolean() enabled: boolean; @@ -50,8 +48,7 @@ export class MqttValidation export class MqttValidationMapReportSettings implements - Omit -{ + Omit { @IsNumber() @IsOptional() publishIntervalSecs: number; diff --git a/src/validation/moduleConfig/neighborInfo.ts b/src/validation/moduleConfig/neighborInfo.ts index b81a04d6..513b8d7c 100644 --- a/src/validation/moduleConfig/neighborInfo.ts +++ b/src/validation/moduleConfig/neighborInfo.ts @@ -4,8 +4,7 @@ import { IsBoolean, IsInt } from "class-validator"; export class NeighborInfoValidation implements - Omit -{ + Omit { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/paxcounter.ts b/src/validation/moduleConfig/paxcounter.ts index 10d0ece0..6b3eeb9b 100644 --- a/src/validation/moduleConfig/paxcounter.ts +++ b/src/validation/moduleConfig/paxcounter.ts @@ -4,8 +4,7 @@ import { IsBoolean, IsInt } from "class-validator"; export class PaxcounterValidation implements - Omit -{ + Omit { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/rangeTest.ts b/src/validation/moduleConfig/rangeTest.ts index fa7a1feb..5debf256 100644 --- a/src/validation/moduleConfig/rangeTest.ts +++ b/src/validation/moduleConfig/rangeTest.ts @@ -4,8 +4,7 @@ import { IsBoolean, IsInt } from "class-validator"; export class RangeTestValidation implements - Omit -{ + Omit { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/serial.ts b/src/validation/moduleConfig/serial.ts index db69c7c5..c814a71b 100644 --- a/src/validation/moduleConfig/serial.ts +++ b/src/validation/moduleConfig/serial.ts @@ -4,8 +4,7 @@ import { IsBoolean, IsEnum, IsInt } from "class-validator"; export class SerialValidation implements - Omit -{ + Omit { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/storeForward.ts b/src/validation/moduleConfig/storeForward.ts index 39007de8..e539dd4b 100644 --- a/src/validation/moduleConfig/storeForward.ts +++ b/src/validation/moduleConfig/storeForward.ts @@ -2,13 +2,11 @@ import type { Message } from "@bufbuild/protobuf"; import type { Protobuf } from "@meshtastic/core"; import { IsBoolean, IsInt } from "class-validator"; -export class StoreForwardValidation - implements - Omit< - Protobuf.ModuleConfig.ModuleConfig_StoreForwardConfig, - keyof Message | "isServer" - > -{ +export class StoreForwardValidation implements + Omit< + Protobuf.ModuleConfig.ModuleConfig_StoreForwardConfig, + keyof Message | "isServer" + > { @IsBoolean() enabled: boolean; diff --git a/src/validation/moduleConfig/telemetry.ts b/src/validation/moduleConfig/telemetry.ts index 08cc3d70..921fb04a 100644 --- a/src/validation/moduleConfig/telemetry.ts +++ b/src/validation/moduleConfig/telemetry.ts @@ -4,8 +4,7 @@ import { IsBoolean, IsInt } from "class-validator"; export class TelemetryValidation implements - Omit -{ + Omit { @IsInt() deviceUpdateInterval: number; From 99a66bfdc710f98a7076b68bb5582790def08e3e Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 14:52:46 -0500 Subject: [PATCH 03/15] chore: updated readme --- README.md | 75 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 52a70bad..10e4678d 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,53 @@ You'll need to download the package manager used with this repo. You can install it by visiting [deno.com](https://deno.com/) and following the installation instructions listed on the home page. +### Development + +Install the dependencies. + +```bash +deno i +``` + +Start the development server: + +```bash +deno task dev +``` + +### Building and Packaging + +Build the project: + +```bash +deno task build +``` + +GZip the output: + +```bash +deno task package +``` + +### Why Deno? + +Meshtastic Web uses Deno as its development platform for several compelling +reasons: + +- **Built-in Security**: Deno's security-first approach requires explicit + permissions for file, network, and environment access, reducing vulnerability + risks. +- **TypeScript Support**: Native TypeScript support without additional + configuration, enhancing code quality and developer experience. +- **Modern JavaScript**: First-class support for ESM imports, top-level await, + and other modern JavaScript features. +- **Simplified Tooling**: Built-in formatter, linter, test runner, and bundler + eliminate the need for multiple third-party tools. +- **Reproducible Builds**: Lockfile ensures consistent builds across all + environments. +- **Web Standard APIs**: Uses browser-compatible APIs, making code more portable + between server and client environments. + ### Debugging #### Debugging with React Scan @@ -135,31 +182,3 @@ This will allow you to discover the following about your components and pages: Use these insights to apply targeted optimizations like `React.memo()`, `useCallback()`, or `useMemo()` where they'll have the most impact. - -### Building and Packaging - -Build the project: - -```bash -deno task build -``` - -GZip the output: - -```bash -deno task package -``` - -### Development - -Install the dependencies. - -```bash -deno i -``` - -Start the development server: - -```bash -deno task dev -``` From 88587f358dd0f8f0869892d952fb50a8ab5014f6 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 15:23:22 -0500 Subject: [PATCH 04/15] refactor: move tsconfig into deno.json --- .npmrc | 1 + deno.json | 8 +++--- deno.lock | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 44 ------------------------------ 4 files changed, 79 insertions(+), 49 deletions(-) create mode 100644 .npmrc delete mode 100644 tsconfig.json diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..41583e36 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/deno.json b/deno.json index 4fd0c9ba..2ab367be 100644 --- a/deno.json +++ b/deno.json @@ -1,9 +1,5 @@ { "imports": { - "@meshtastic/core": "jsr:@meshtastic/core@^2.6.0", - "@meshtastic/js": "jsr:@meshtastic/js@^2.3.4", - "@meshtastic/transport-http": "jsr:@meshtastic/transport-http@^0.2.1", - "@meshtastic/transport-web-serial": "jsr:@meshtastic/transport-web-serial@^0.2.1", "@app/": "./src/", "@pages/": "./src/pages/", "@components/": "./src/components/", @@ -14,7 +10,9 @@ "lib": [ "DOM", "DOM.Iterable", - "ESNext" + "ESNext", + "deno.window", + "deno.ns" ], "jsx": "react-jsx", "strict": true, diff --git a/deno.lock b/deno.lock index 31626c83..83c24b5c 100644 --- a/deno.lock +++ b/deno.lock @@ -2,6 +2,10 @@ "version": "4", "specifiers": { "npm:@bufbuild/protobuf@^2.2.3": "2.2.3", + "npm:@jsr/meshtastic__core@2.6.0-0": "2.6.0-0", + "npm:@jsr/meshtastic__js@2.6.0-0": "2.6.0-0", + "npm:@jsr/meshtastic__transport-http@*": "0.2.1", + "npm:@jsr/meshtastic__transport-web-serial@*": "0.2.1", "npm:@noble/curves@^1.8.1": "1.8.1", "npm:@radix-ui/react-accordion@^1.2.3": "1.2.3_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", "npm:@radix-ui/react-checkbox@^1.1.4": "1.1.4_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10_react@19.0.0_react-dom@19.0.0__react@19.0.0", @@ -36,6 +40,7 @@ "npm:class-variance-authority@~0.7.1": "0.7.1", "npm:clsx@^2.1.1": "2.1.1", "npm:cmdk@^1.0.4": "1.0.4_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+react@19.0.10_@types+react-dom@19.0.4__@types+react@19.0.10", + "npm:crc@^4.3.2": "4.3.2", "npm:crypto-random-string@5": "5.0.0", "npm:gzipper@^8.2.0": "8.2.0", "npm:happy-dom@^17.1.8": "17.1.8", @@ -51,10 +56,14 @@ "npm:react-scan@~0.2.8": "0.2.8_react@19.0.0_react-dom@19.0.0__react@19.0.0_preact@10.26.4", "npm:react@19": "19.0.0", "npm:rfc4648@^1.5.4": "1.5.4", + "npm:simple-git-hooks@^2.11.1": "2.11.1", + "npm:ste-simple-events@^3.0.11": "3.0.11", "npm:tailwind-merge@^3.0.2": "3.0.2", "npm:tailwindcss-animate@^1.0.7": "1.0.7_tailwindcss@4.0.9", "npm:tailwindcss@^4.0.9": "4.0.9", "npm:tar@^7.4.3": "7.4.3", + "npm:tslog@^4.9.2": "4.9.3", + "npm:tslog@^4.9.3": "4.9.3", "npm:typescript@^5.8.2": "5.8.2", "npm:vite-plugin-node-polyfills@0.23": "0.23.0_vite@6.2.0__@types+node@22.13.8_@types+node@22.13.8", "npm:vite-plugin-pwa@~0.21.1": "0.21.1_vite@6.2.0__@types+node@22.13.8_workbox-build@7.3.0__ajv@8.17.1__@babel+core@7.26.9__rollup@2.79.2_workbox-window@7.3.0_@types+node@22.13.8", @@ -1091,6 +1100,54 @@ "@jridgewell/sourcemap-codec" ] }, + "@jsr/meshtastic__core@2.6.0": { + "integrity": "sha512-+Ik6gzZnfi5sW+WC06bRayA6KGF2NI+zi3bqKbvA8mGDNSOPgsFhA4VZ79DKY4bSflTW170MRIUeyYo0IWQQuw==", + "dependencies": [ + "@bufbuild/protobuf", + "@jsr/meshtastic__protobufs", + "crc", + "ste-simple-events", + "tslog" + ] + }, + "@jsr/meshtastic__core@2.6.0-0": { + "integrity": "sha512-Ks71sRagbBipotznULpsJZ1EMcQIqCEJQx6mf628dmCNVf2YECi2zi/i/5zErp1hGPgfbDvCz9oPogvsd/7fMA==", + "dependencies": [ + "@bufbuild/protobuf", + "@jsr/meshtastic__protobufs", + "crc", + "ste-simple-events", + "tslog" + ] + }, + "@jsr/meshtastic__js@2.6.0-0": { + "integrity": "sha512-+xpZpxK6oUIVOuEs7C+LyxRr2druvc7UNNNTK9Rl8ioXj63Jz1uQXlYe2Gj0xjnRAiSQLR7QVaPef21BR/YTxA==", + "dependencies": [ + "@bufbuild/protobuf", + "@jsr/meshtastic__protobufs", + "crc", + "ste-simple-events", + "tslog" + ] + }, + "@jsr/meshtastic__protobufs@2.6.0": { + "integrity": "sha512-CGlgBdzAuQCZuGPrnzP8zU+EcLlmyYeeMbqFHuJ834cYfArWXDjDh1UYaPo2rI03LTjqa3MeWpfqDlzBR8kIMg==", + "dependencies": [ + "@bufbuild/protobuf" + ] + }, + "@jsr/meshtastic__transport-http@0.2.1": { + "integrity": "sha512-lmQKr3aIINKvtGROU4HchmSVqbZSbkIHqajowRRC8IAjsnR0zNTyxz210QyY4pFUF9hpcW3GRjwq5h/VO2JuGg==", + "dependencies": [ + "@jsr/meshtastic__core@2.6.0" + ] + }, + "@jsr/meshtastic__transport-web-serial@0.2.1": { + "integrity": "sha512-yumjEGLkAuJYOC3aWKvZzbQqi/LnqaKfNpVCY7Ki7oLtAshNiZrBLiwiFhN7+ZR9FfMdJThyBMqREBDRRWTO1Q==", + "dependencies": [ + "@jsr/meshtastic__core@2.6.0" + ] + }, "@mapbox/geojson-rewind@0.5.2": { "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", "dependencies": [ @@ -3899,6 +3956,9 @@ "core-util-is@1.0.3": { "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "crc@4.3.2": { + "integrity": "sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==" + }, "create-ecdh@4.0.4": { "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dependencies": [ @@ -5804,6 +5864,9 @@ "signal-exit@4.1.0": { "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" }, + "simple-git-hooks@2.11.1": { + "integrity": "sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==" + }, "simple-zstd@1.4.2": { "integrity": "sha512-kGYEvT33M5XfyQvvW4wxl3eKcWbdbCc1V7OZzuElnaXft0qbVzoIIXHXiCm3JCUki+MZKKmvjl8p2VGLJc5Y/A==", "dependencies": [ @@ -5876,6 +5939,15 @@ "std-env@3.8.0": { "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" }, + "ste-core@3.0.11": { + "integrity": "sha512-ivkRENMh0mdGoPlZ4xVcEaC8rXQfTEfvonRw5m8VDKV7kgcbZbaNd1TnKl08wXbcLdT7okSc63HNP8cVhy95zg==" + }, + "ste-simple-events@3.0.11": { + "integrity": "sha512-PDoQajqiTtJLNDWfJCihzACiTVZyFsXi6hNAVNelNJoNmqj+BaWuhJ/NHaAHxzfSRoMbL+hFgfPqFmxiHhAQSQ==", + "dependencies": [ + "ste-core" + ] + }, "stream-browserify@3.0.0": { "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dependencies": [ @@ -6129,6 +6201,9 @@ "tslib@2.8.1": { "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, + "tslog@4.9.3": { + "integrity": "sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw==" + }, "tsx@4.19.3": { "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", "dependencies": [ diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index e93e1141..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "include": ["src"], - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "composite": true, - "module": "ESNext", - "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - /* Path Aliases */ - "paths": { - "@app/*": ["./src/*"], - "@pages/*": ["./src/pages/*"], - "@components/*": ["./src/components/*"], - "@core/*": ["./src/core/*"], - "@layouts/*": ["./src/layouts/*"] - }, - "importHelpers": true, - "removeComments": true, - "strictNullChecks": true, - "types": [ - "vite/client", - "node", - "@types/web-bluetooth", - "@types/w3c-web-serial" - ], - "strictPropertyInitialization": false, - "experimentalDecorators": true - } -} From 81a1e0e550af31316034c2eb0099332d7f13e643 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 15:23:57 -0500 Subject: [PATCH 05/15] fix: update process.env to import.meta --- src/components/DeviceSelector.tsx | 7 +-- .../Config/Security/Security.tsx | 10 +--- src/components/UI/Footer.tsx | 57 +++++++++---------- src/components/UI/Generator.tsx | 7 +-- vite.config.ts | 50 +++++++++------- 5 files changed, 66 insertions(+), 65 deletions(-) diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx index 76751900..d53f5051 100644 --- a/src/components/DeviceSelector.tsx +++ b/src/components/DeviceSelector.tsx @@ -5,9 +5,7 @@ import { Code } from "@components/UI/Typography/Code.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; import { HomeIcon, PlusIcon, SearchIcon } from "lucide-react"; - -import { Avatar } from "./UI/Avatar.tsx"; -import process from "node:process"; +import { Avatar } from "@components/UI/Avatar.tsx"; export const DeviceSelector = () => { const { getDevices } = useDeviceStore(); @@ -17,6 +15,7 @@ export const DeviceSelector = () => { setCommandPaletteOpen, setConnectDialogOpen, } = useAppStore(); + console.log(import.meta.env.VITE_COMMIT_HASH); return ( ); diff --git a/src/components/PageComponents/Config/Security/Security.tsx b/src/components/PageComponents/Config/Security/Security.tsx index 1953e129..52bf2cd4 100644 --- a/src/components/PageComponents/Config/Security/Security.tsx +++ b/src/components/PageComponents/Config/Security/Security.tsx @@ -58,8 +58,7 @@ export const Security = () => { if (input.length % 4 !== 0) { addError( fieldName, - `${ - fieldName === "privateKey" ? "Private" : "Admin" + `${fieldName === "privateKey" ? "Private" : "Admin" } Key is required to be a 256 bit pre-shared key (PSK)`, ); return; @@ -74,8 +73,7 @@ export const Security = () => { console.error(e); addError( fieldName, - `Invalid ${ - fieldName === "privateKey" ? "Private" : "Admin" + `Invalid ${fieldName === "privateKey" ? "Private" : "Admin" } Key format`, ); } @@ -85,8 +83,6 @@ export const Security = () => { if (hasErrors()) { return; } - console.log(toByteArray(state.adminKey)); - setWorkingConfig( create(Protobuf.Config.ConfigSchema, { payloadVariant: { @@ -248,7 +244,7 @@ export const Security = () => { ? getErrorMessage("adminKey") : "", inputChange: adminKeyInputChangeEvent, - selectChange: () => {}, + selectChange: () => { }, bits: [{ text: "256 bit", value: "32", key: "bit256" }], devicePSKBitCount: state.privateKeyBitCount, hide: !state.adminKeyVisible, diff --git a/src/components/UI/Footer.tsx b/src/components/UI/Footer.tsx index 2678b15a..775b68d7 100644 --- a/src/components/UI/Footer.tsx +++ b/src/components/UI/Footer.tsx @@ -1,33 +1,32 @@ -import { cn } from "../../core/utils/cn.ts"; -import React from "react"; +import { cn } from "@core/utils/cn.ts" -export interface FooterProps extends React.HTMLAttributes {} +type FooterProps = { + className?: string; +} -const Footer = React.forwardRef( - ({ className, ...props }) => { - return ( -
- ); - }, -); +const Footer = ({ className, ...props }: FooterProps) => { + return ( + + ); +} export default Footer; diff --git a/src/components/UI/Generator.tsx b/src/components/UI/Generator.tsx index 4179d81e..7306b076 100644 --- a/src/components/UI/Generator.tsx +++ b/src/components/UI/Generator.tsx @@ -33,7 +33,7 @@ export interface GeneratorProps extends React.BaseHTMLAttributes { disabled?: boolean; } -const Generator = React.forwardRef( +const Generator = ( { type, @@ -53,7 +53,7 @@ const Generator = React.forwardRef( action, disabled, ...props - }, + }: GeneratorProps ) => { const inputRef = React.useRef(null); @@ -115,8 +115,7 @@ const Generator = React.forwardRef( ); - }, -); + } Generator.displayName = "Button"; export { Generator }; diff --git a/vite.config.ts b/vite.config.ts index 267215f6..a154ba5e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,40 +1,48 @@ -import { defineConfig } from 'vitest/config' +import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { VitePWA } from 'vite-plugin-pwa'; -import { execSync } from 'node:child_process'; import path from 'node:path'; let hash = ''; try { - hash = execSync('git rev-parse --short HEAD').toString().trim(); + const process = new Deno.Command('git', { + args: ['rev-parse', '--short', 'HEAD'], + stdout: 'piped' + }); + const output = await process.output(); + hash = new TextDecoder().decode(output.stdout).trim(); } catch (error) { + console.error('Error getting git hash:', error); hash = 'DEV'; } +console.log('Commit hash:', hash); + export default defineConfig({ - plugins: [react(), - VitePWA({ - registerType: 'autoUpdate', - strategies: 'generateSW', - devOptions: { - enabled: true - }, - workbox: { - cleanupOutdatedCaches: true, - sourcemap: true - } - }) + plugins: [ + react(), + VitePWA({ + registerType: 'autoUpdate', + strategies: 'generateSW', + devOptions: { + enabled: true + }, + workbox: { + cleanupOutdatedCaches: true, + sourcemap: true + } + }) ], define: { - 'process.env.COMMIT_HASH': JSON.stringify(hash), + 'import.meta.env.VITE_COMMIT_HASH': JSON.stringify(hash), }, resolve: { alias: { - '@app': path.resolve(__dirname, './src'), - '@pages': path.resolve(__dirname, './src/pages'), - '@components': path.resolve(__dirname, './src/components'), - '@core': path.resolve(__dirname, './src/core'), - '@layouts': path.resolve(__dirname, './src/layouts'), + '@app': path.resolve(Deno.cwd(), './src'), + '@pages': path.resolve(Deno.cwd(), './src/pages'), + '@components': path.resolve(Deno.cwd(), './src/components'), + '@core': path.resolve(Deno.cwd(), './src/core'), + '@layouts': path.resolve(Deno.cwd(), './src/layouts'), }, }, server: { From fc713f55fe061e8a0c9c3b970de0deb854efad73 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 15:54:30 -0500 Subject: [PATCH 06/15] fix: update package json scripts commands --- package.json | 8 ++++---- vite.config.ts | 21 ++++++++------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 4765b90c..d3d0cbbf 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "Meshtastic web client", "license": "GPL-3.0-only", "scripts": { - "build": "deno run -A npm:vite build", + "build": "vite build", "build:analyze": "BUNDLE_ANALYZE=true deno task build", "lint": "deno lint src/", "lint:fix": "deno lint --fix src/", @@ -13,10 +13,10 @@ "dev": "deno task dev:ui", "dev:ui": "deno run -A npm:vite dev", "dev:scan": "VITE_DEBUG_SCAN=true deno task dev:ui", - "test": "deno run vitest", + "test": "deno run -A npm:vitest", "test:ui": "deno task test --ui", - "preview": "deno run --allow-net npm:vite preview", - "package": "deno run -A npm:gzipper c -i html,js,css,png,ico,svg,webmanifest,txt dist dist/output && deno run -A --allow-run tar -cvf dist/build.tar -C ./dist/output/ ." + "preview": "deno run -A npm:vite preview", + "package": "gzipper c -i html,js,css,png,ico,svg,webmanifest,txt dist dist/output && tar -cvf dist/build.tar -C ./dist/output/ ." }, "repository": { "type": "git", diff --git a/vite.config.ts b/vite.config.ts index a154ba5e..fc165f30 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,22 +2,16 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { VitePWA } from 'vite-plugin-pwa'; import path from 'node:path'; +import { execSync } from 'node:child_process'; let hash = ''; try { - const process = new Deno.Command('git', { - args: ['rev-parse', '--short', 'HEAD'], - stdout: 'piped' - }); - const output = await process.output(); - hash = new TextDecoder().decode(output.stdout).trim(); + hash = execSync('git rev-parse --short HEAD', { encoding: 'utf8' }).trim(); } catch (error) { console.error('Error getting git hash:', error); hash = 'DEV'; } -console.log('Commit hash:', hash); - export default defineConfig({ plugins: [ react(), @@ -38,11 +32,12 @@ export default defineConfig({ }, resolve: { alias: { - '@app': path.resolve(Deno.cwd(), './src'), - '@pages': path.resolve(Deno.cwd(), './src/pages'), - '@components': path.resolve(Deno.cwd(), './src/components'), - '@core': path.resolve(Deno.cwd(), './src/core'), - '@layouts': path.resolve(Deno.cwd(), './src/layouts'), + // Using Node's path and process.cwd() instead of Deno.cwd() + '@app': path.resolve(process.cwd(), './src'), + '@pages': path.resolve(process.cwd(), './src/pages'), + '@components': path.resolve(process.cwd(), './src/components'), + '@core': path.resolve(process.cwd(), './src/core'), + '@layouts': path.resolve(process.cwd(), './src/layouts'), }, }, server: { From f9066eced04f7420622e388e4bd6019cff0ca192 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 01:43:07 -0500 Subject: [PATCH 07/15] fix: added a notes fild to Dynamic form allowing for notes to inform users about using BLE and wifi at the same time. (#474) --- src/components/Form/DynamicForm.tsx | 3 +++ src/components/PageComponents/Config/Bluetooth.tsx | 4 +++- src/components/PageComponents/Config/Network.tsx | 2 ++ src/components/PageComponents/Connect/Serial.tsx | 11 +++++++---- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/components/Form/DynamicForm.tsx b/src/components/Form/DynamicForm.tsx index 3dd4d5eb..839e8094 100644 --- a/src/components/Form/DynamicForm.tsx +++ b/src/components/Form/DynamicForm.tsx @@ -27,6 +27,7 @@ export interface BaseFormBuilderProps { disabledBy?: DisabledBy[]; label: string; description?: string; + notes?: string; validationText?: string; properties?: Record; } @@ -45,6 +46,7 @@ export interface DynamicFormProps { fieldGroups: { label: string; description: string; + notes?: string; valid?: boolean; validationText?: string; fields: FieldProps[]; @@ -95,6 +97,7 @@ export function DynamicForm({

{fieldGroup.label}

{fieldGroup.description} + {fieldGroup?.notes}
{fieldGroup.fields.map((field) => { diff --git a/src/components/PageComponents/Config/Bluetooth.tsx b/src/components/PageComponents/Config/Bluetooth.tsx index e5d5e333..ce02e0f3 100644 --- a/src/components/PageComponents/Config/Bluetooth.tsx +++ b/src/components/PageComponents/Config/Bluetooth.tsx @@ -70,7 +70,9 @@ export const Bluetooth = () => { fieldGroups={[ { label: "Bluetooth Settings", - description: "Settings for the Bluetooth module", + description: "Settings for the Bluetooth module ", + notes: + "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", fields: [ { type: "toggle", diff --git a/src/components/PageComponents/Config/Network.tsx b/src/components/PageComponents/Config/Network.tsx index a3dc219f..1c991cb4 100644 --- a/src/components/PageComponents/Config/Network.tsx +++ b/src/components/PageComponents/Config/Network.tsx @@ -53,6 +53,8 @@ export const Network = () => { { label: "WiFi Config", description: "WiFi radio configuration", + notes: + "Note: Some devices (ESP32) cannot use both Bluetooth and WiFi at the same time.", fields: [ { type: "toggle", diff --git a/src/components/PageComponents/Connect/Serial.tsx b/src/components/PageComponents/Connect/Serial.tsx index 49fb53d9..b6cdf5f9 100644 --- a/src/components/PageComponents/Connect/Serial.tsx +++ b/src/components/PageComponents/Connect/Serial.tsx @@ -18,7 +18,9 @@ export const Serial = ({ closeDialog }: TabElementProps) => { setSerialPorts(await navigator?.serial.getPorts()); }, []); - navigator?.serial?.addEventListener("connect", () => { + navigator?.serial?.addEventListener("connect", (event) => { + console.log(event); + updateSerialPortList(); }); navigator?.serial?.addEventListener("disconnect", () => { @@ -45,6 +47,8 @@ export const Serial = ({ closeDialog }: TabElementProps) => {
{serialPorts.map((port, index) => { + console.log(port); + const { usbProductId, usbVendorId } = port.getInfo(); return ( ); })} From d28b4ce6d91ec2c08deb5ae1494285a57bbe6147 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sat, 22 Feb 2025 13:51:50 -0500 Subject: [PATCH 08/15] feat: add error boundary --- bun.lock | 110 +++++++----------- package.json | 1 + src/App.tsx | 53 ++++----- src/PageRouter.tsx | 42 +++++-- src/components/Form/DynamicForm.tsx | 6 +- .../PageComponents/Map/NodeDetail.tsx | 25 ++-- .../PageComponents/Messages/Message.tsx | 2 +- src/components/UI/ErrorPage.tsx | 81 +++++++++++++ src/components/UI/Sidebar/SidebarSection.tsx | 6 +- src/components/UI/Typography/H1.tsx | 9 -- src/components/UI/Typography/H2.tsx | 9 -- src/components/UI/Typography/H3.tsx | 9 -- src/components/UI/Typography/H4.tsx | 17 --- src/components/UI/Typography/H5.tsx | 14 --- src/components/UI/Typography/Heading.tsx | 30 +++++ src/core/utils/github.ts | 88 ++++++++++++++ src/index.css | 4 + src/pages/Dashboard/index.tsx | 30 ++--- 18 files changed, 342 insertions(+), 194 deletions(-) create mode 100644 src/components/UI/ErrorPage.tsx delete mode 100644 src/components/UI/Typography/H1.tsx delete mode 100644 src/components/UI/Typography/H2.tsx delete mode 100644 src/components/UI/Typography/H3.tsx delete mode 100644 src/components/UI/Typography/H4.tsx delete mode 100644 src/components/UI/Typography/H5.tsx create mode 100644 src/components/UI/Typography/Heading.tsx create mode 100644 src/core/utils/github.ts diff --git a/bun.lock b/bun.lock index 39ee8366..8618493f 100644 --- a/bun.lock +++ b/bun.lock @@ -37,6 +37,7 @@ "maplibre-gl": "5.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-error-boundary": "^5.0.0", "react-hook-form": "^7.54.2", "react-map-gl": "8.0.1", "react-qrcode-logo": "^3.0.0", @@ -46,7 +47,6 @@ "zustand": "5.0.3", }, "devDependencies": { - "@biomejs/biome": "^1.9.4", "@tailwindcss/postcss": "^4.0.9", "@testing-library/react": "^16.2.0", "@types/chrome": "^0.0.307", @@ -261,24 +261,6 @@ "@babel/types": ["@babel/types@7.26.9", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw=="], - "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], - - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], - - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], - - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], - - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], - - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], - - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], - - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], - - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], - "@bufbuild/protobuf": ["@bufbuild/protobuf@2.2.3", "", {}, "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg=="], "@clack/core": ["@clack/core@0.3.5", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ=="], @@ -361,7 +343,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@jsr/meshtastic__core": ["@jsr/meshtastic__core@2.6.0-1", "https://npm.jsr.io/~/11/@jsr/meshtastic__core/2.6.0-1.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@jsr/meshtastic__protobufs": "^2.6.0", "crc": "^4.3.2", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" } }, "sha512-fVlFVImuthS5oIH3J5Glue+0OizGmhtvzTWEmAJwdgmYyUn7mfA2iEvoUHFv3EiEDq6BJ9SjkLzOSqMTRPSNuw=="], + "@jsr/meshtastic__core": ["@jsr/meshtastic__core@2.6.0", "https://npm.jsr.io/~/11/@jsr/meshtastic__core/2.6.0.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@jsr/meshtastic__protobufs": "^2.6.0", "crc": "^4.3.2", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" } }, "sha512-+Ik6gzZnfi5sW+WC06bRayA6KGF2NI+zi3bqKbvA8mGDNSOPgsFhA4VZ79DKY4bSflTW170MRIUeyYo0IWQQuw=="], "@jsr/meshtastic__protobufs": ["@jsr/meshtastic__protobufs@2.6.0", "https://npm.jsr.io/~/11/@jsr/meshtastic__protobufs/2.6.0.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3" } }, "sha512-CGlgBdzAuQCZuGPrnzP8zU+EcLlmyYeeMbqFHuJ834cYfArWXDjDh1UYaPo2rI03LTjqa3MeWpfqDlzBR8kIMg=="], @@ -369,8 +351,6 @@ "@mapbox/jsonlint-lines-primitives": ["@mapbox/jsonlint-lines-primitives@2.0.2", "", {}, "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ=="], - "@mapbox/mapbox-gl-supported": ["@mapbox/mapbox-gl-supported@3.0.0", "", {}, "sha512-2XghOwu16ZwPJLOFVuIOaLbN0iKMn867evzXFyf0P22dqugezfJwLmdanAgU25ITvz1TvOfVP4jsDImlDJzcWg=="], - "@mapbox/point-geometry": ["@mapbox/point-geometry@0.1.0", "", {}, "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="], "@mapbox/tiny-sdf": ["@mapbox/tiny-sdf@2.0.6", "", {}, "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA=="], @@ -387,9 +367,9 @@ "@meshtastic/js": ["@jsr/meshtastic__js@2.6.0-0", "https://npm.jsr.io/~/11/@jsr/meshtastic__js/2.6.0-0.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@jsr/meshtastic__protobufs": "^2.6.0", "crc": "^4.3.2", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" } }, "sha512-+xpZpxK6oUIVOuEs7C+LyxRr2druvc7UNNNTK9Rl8ioXj63Jz1uQXlYe2Gj0xjnRAiSQLR7QVaPef21BR/YTxA=="], - "@meshtastic/transport-http": ["@jsr/meshtastic__transport-http@0.1.0", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-http/0.1.0.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.0-1" } }, "sha512-+cICcTAowbnTz9yffUod1c2XxuPgJRw6VfXYHZgJZ3oaBXtUoUFHl9WdMdZLE0juzMRpTARZY2/bAH3brCf0rw=="], + "@meshtastic/transport-http": ["@jsr/meshtastic__transport-http@0.2.1", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-http/0.2.1.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.0" } }, "sha512-lmQKr3aIINKvtGROU4HchmSVqbZSbkIHqajowRRC8IAjsnR0zNTyxz210QyY4pFUF9hpcW3GRjwq5h/VO2JuGg=="], - "@meshtastic/transport-web-serial": ["@jsr/meshtastic__transport-web-serial@0.2.0", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-web-serial/0.2.0.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.0-0" } }, "sha512-mP/nxOj0syABh3FkG5iIolWhUMiFh/qtJtvqihxLkaRoxdabUyW62mOtfhCMBEjxgVnKg4Gy7GkaXfC/eFy19Q=="], + "@meshtastic/transport-web-serial": ["@jsr/meshtastic__transport-web-serial@0.2.1", "https://npm.jsr.io/~/11/@jsr/meshtastic__transport-web-serial/0.2.1.tgz", { "dependencies": { "@jsr/meshtastic__core": "^2.6.0" } }, "sha512-yumjEGLkAuJYOC3aWKvZzbQqi/LnqaKfNpVCY7Ki7oLtAshNiZrBLiwiFhN7+ZR9FfMdJThyBMqREBDRRWTO1Q=="], "@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], @@ -499,43 +479,43 @@ "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.8", "", { "os": "android", "cpu": "arm" }, "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.34.9", "", { "os": "android", "cpu": "arm" }, "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.8", "", { "os": "android", "cpu": "arm64" }, "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.34.9", "", { "os": "android", "cpu": "arm64" }, "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.34.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.34.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.34.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.34.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.34.9", "", { "os": "linux", "cpu": "arm" }, "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.8", "", { "os": "linux", "cpu": "arm" }, "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.34.9", "", { "os": "linux", "cpu": "arm" }, "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.34.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.34.9", "", { "os": "linux", "cpu": "none" }, "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.34.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.8", "", { "os": "linux", "cpu": "none" }, "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.34.9", "", { "os": "linux", "cpu": "none" }, "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.34.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.8", "", { "os": "linux", "cpu": "x64" }, "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.34.9", "", { "os": "linux", "cpu": "x64" }, "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.34.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.34.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.8", "", { "os": "win32", "cpu": "x64" }, "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.34.9", "", { "os": "win32", "cpu": "x64" }, "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw=="], "@surma/rollup-plugin-off-main-thread": ["@surma/rollup-plugin-off-main-thread@2.2.3", "", { "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", "magic-string": "^0.25.0", "string.prototype.matchall": "^4.0.6" } }, "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ=="], @@ -833,7 +813,7 @@ "@types/mapbox__vector-tile": ["@types/mapbox__vector-tile@1.3.4", "", { "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", "@types/pbf": "*" } }, "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg=="], - "@types/node": ["@types/node@22.13.7", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-oU2q+BsQldB9lYxHNp/5aZO+/Bs0Usa74Abo9mAKulz4ahQyXRHK6UVKYIN8KSC8HXwhWSi7b49JnX+txuac0w=="], + "@types/node": ["@types/node@22.13.9", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw=="], "@types/pbf": ["@types/pbf@3.0.5", "", {}, "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA=="], @@ -965,16 +945,14 @@ "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "caniuse-lite": ["caniuse-lite@1.0.30001700", "", {}, "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001701", "", {}, "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw=="], "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "cheap-ruler": ["cheap-ruler@4.0.0", "", {}, "sha512-0BJa8f4t141BYKQyn9NSQt1PguFQXMXwZiA5shfoaBYHAb2fFk2RAX+tiWMoQU+Agtzt3mdt0JtuyshAXqZ+Vw=="], - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], @@ -1007,7 +985,7 @@ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "core-js-compat": ["core-js-compat@3.40.0", "", { "dependencies": { "browserslist": "^4.24.3" } }, "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ=="], + "core-js-compat": ["core-js-compat@3.41.0", "", { "dependencies": { "browserslist": "^4.24.4" } }, "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A=="], "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], @@ -1027,8 +1005,6 @@ "crypto-random-string": ["crypto-random-string@5.0.0", "", { "dependencies": { "type-fest": "^2.12.2" } }, "sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ=="], - "csscolorparser": ["csscolorparser@1.0.3", "", {}, "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="], - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], "d3-array": ["d3-array@1.2.4", "", {}, "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="], @@ -1079,7 +1055,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.102", "", {}, "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q=="], + "electron-to-chromium": ["electron-to-chromium@1.5.111", "", {}, "sha512-vJyJlO95wQRAw6K2ZGF/8nol7AcbCOnp8S6H91mwOOBbXoS9seDBYxCTPYAFsvXLxl3lc0jLXXe9GLxC4nXVog=="], "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], @@ -1115,7 +1091,7 @@ "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="], - "expect-type": ["expect-type@1.1.0", "", {}, "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA=="], + "expect-type": ["expect-type@1.2.0", "", {}, "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA=="], "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], @@ -1133,7 +1109,7 @@ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], @@ -1157,7 +1133,7 @@ "geojson-vt": ["geojson-vt@4.0.2", "", {}, "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A=="], - "get-intrinsic": ["get-intrinsic@1.2.7", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], @@ -1187,11 +1163,9 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "grid-index": ["grid-index@1.1.0", "", {}, "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA=="], - "gzipper": ["gzipper@8.2.0", "", { "dependencies": { "@gfx/zopfli": "^1.0.15", "commander": "^12.1.0", "simple-zstd": "^1.4.2" }, "bin": { "gzipper": "bin/index.js" } }, "sha512-JUvhzo8dHQWJp1eyYy1ShaPfcowsPbRc2rvwkD4LRyou/80UUz96bn+EOOYLWO4PG0Y5f3+UlUX9Gmu8RZhrtw=="], - "happy-dom": ["happy-dom@17.1.8", "", { "dependencies": { "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" } }, "sha512-Yxbq/FG79z1rhAf/iB6YM8wO2JB/JDQBy99RiLSs+2siEAi5J05x9eW1nnASHZJbpldjJE2KuFLsLZ+AzX/IxA=="], + "happy-dom": ["happy-dom@17.1.9", "", { "dependencies": { "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" } }, "sha512-HL26ajjMVe/wr3xlzjF0sCPCiAKaZJcIRFZHmG4yKHRJp4YAkHPG5X6GfWxCeDTpOmuHhNiOyNKUoZjjnm0tjw=="], "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], @@ -1333,7 +1307,7 @@ "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], - "libphonenumber-js": ["libphonenumber-js@1.11.20", "", {}, "sha512-/ipwAMvtSZRdiQBHqW1qxqeYiBMzncOQLVA+62MWYr7N4m7Q2jqpJ0WgT7zlOEOpyLRSqrMXidbJpC0J77AaKA=="], + "libphonenumber-js": ["libphonenumber-js@1.12.4", "", {}, "sha512-vLmhg7Gan7idyAKfc6pvCtNzvar4/eIzrVVk3hjNFH5+fGqyjD0gQRovdTrDl20wsmZhBtmZpcsR0tOfquwb8g=="], "lightningcss": ["lightningcss@1.29.1", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.1", "lightningcss-darwin-x64": "1.29.1", "lightningcss-freebsd-x64": "1.29.1", "lightningcss-linux-arm-gnueabihf": "1.29.1", "lightningcss-linux-arm64-gnu": "1.29.1", "lightningcss-linux-arm64-musl": "1.29.1", "lightningcss-linux-x64-gnu": "1.29.1", "lightningcss-linux-x64-musl": "1.29.1", "lightningcss-win32-arm64-msvc": "1.29.1", "lightningcss-win32-x64-msvc": "1.29.1" } }, "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q=="], @@ -1377,8 +1351,6 @@ "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], - "mapbox-gl": ["mapbox-gl@3.10.0", "", { "dependencies": { "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/mapbox-gl-supported": "^3.0.0", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^2.0.6", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "^3.2.5", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", "@types/supercluster": "^7.1.3", "cheap-ruler": "^4.0.0", "csscolorparser": "~1.0.3", "earcut": "^3.0.0", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "grid-index": "^1.1.0", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^3.2.1", "potpack": "^2.0.0", "quickselect": "^3.0.0", "serialize-to-js": "^3.1.2", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0", "vt-pbf": "^3.1.3" } }, "sha512-YnQxjlthuv/tidcxGYU2C8nRDVXMlAHa3qFhuOJeX4AfRP72OMRBf9ApL+M+k5VWcAXi2fcNOUVgphknjLumjA=="], - "maplibre-gl": ["maplibre-gl@5.1.1", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/tiny-sdf": "^2.0.6", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", "@maplibre/maplibre-gl-style-spec": "^23.1.0", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", "@types/pbf": "^3.0.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.1", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "global-prefix": "^4.0.0", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^3.3.0", "potpack": "^2.0.0", "quickselect": "^3.0.0", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0", "vt-pbf": "^3.1.3" } }, "sha512-0Z6ODzyFu/grwT6K1eIBpv6MZE4xnJD1AV+Yq1hPzOh/YCY36r9BlSaU7d7n2/HJOaoKOy0b2YF8cS4dD+iEVQ=="], "marchingsquares": ["marchingsquares@1.3.3", "", {}, "sha512-gz6nNQoVK7Lkh2pZulrT4qd4347S/toG9RXH2pyzhLgkL5mLkBoqgv4EvAGXcV0ikDW72n/OQb3Xe8bGagQZCg=="], @@ -1487,7 +1459,7 @@ "potpack": ["potpack@2.0.0", "", {}, "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw=="], - "preact": ["preact@10.26.2", "", {}, "sha512-0gNmv4qpS9HaN3+40CLBAnKe0ZfyE4ZWo5xKlC1rVrr0ckkEvJvAQqKaHANdFKsGstoxrY4AItZ7kZSGVoVjgg=="], + "preact": ["preact@10.26.4", "", {}, "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w=="], "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], @@ -1523,6 +1495,8 @@ "react-dom": ["react-dom@19.0.0", "", { "dependencies": { "scheduler": "^0.25.0" }, "peerDependencies": { "react": "^19.0.0" } }, "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ=="], + "react-error-boundary": ["react-error-boundary@5.0.0", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "react": ">=16.13.1" } }, "sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ=="], + "react-hook-form": ["react-hook-form@7.54.2", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg=="], "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], @@ -1577,7 +1551,7 @@ "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], - "rollup": ["rollup@4.34.8", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.34.8", "@rollup/rollup-android-arm64": "4.34.8", "@rollup/rollup-darwin-arm64": "4.34.8", "@rollup/rollup-darwin-x64": "4.34.8", "@rollup/rollup-freebsd-arm64": "4.34.8", "@rollup/rollup-freebsd-x64": "4.34.8", "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", "@rollup/rollup-linux-arm-musleabihf": "4.34.8", "@rollup/rollup-linux-arm64-gnu": "4.34.8", "@rollup/rollup-linux-arm64-musl": "4.34.8", "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", "@rollup/rollup-linux-riscv64-gnu": "4.34.8", "@rollup/rollup-linux-s390x-gnu": "4.34.8", "@rollup/rollup-linux-x64-gnu": "4.34.8", "@rollup/rollup-linux-x64-musl": "4.34.8", "@rollup/rollup-win32-arm64-msvc": "4.34.8", "@rollup/rollup-win32-ia32-msvc": "4.34.8", "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ=="], + "rollup": ["rollup@4.34.9", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.34.9", "@rollup/rollup-android-arm64": "4.34.9", "@rollup/rollup-darwin-arm64": "4.34.9", "@rollup/rollup-darwin-x64": "4.34.9", "@rollup/rollup-freebsd-arm64": "4.34.9", "@rollup/rollup-freebsd-x64": "4.34.9", "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", "@rollup/rollup-linux-arm-musleabihf": "4.34.9", "@rollup/rollup-linux-arm64-gnu": "4.34.9", "@rollup/rollup-linux-arm64-musl": "4.34.9", "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", "@rollup/rollup-linux-riscv64-gnu": "4.34.9", "@rollup/rollup-linux-s390x-gnu": "4.34.9", "@rollup/rollup-linux-x64-gnu": "4.34.9", "@rollup/rollup-linux-x64-musl": "4.34.9", "@rollup/rollup-win32-arm64-msvc": "4.34.9", "@rollup/rollup-win32-ia32-msvc": "4.34.9", "@rollup/rollup-win32-x64-msvc": "4.34.9", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ=="], "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], @@ -1595,8 +1569,6 @@ "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], - "serialize-to-js": ["serialize-to-js@3.1.2", "", {}, "sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w=="], - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], @@ -1655,7 +1627,7 @@ "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "std-env": ["std-env@3.8.0", "", {}, "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w=="], + "std-env": ["std-env@3.8.1", "", {}, "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA=="], "ste-core": ["ste-core@3.0.11", "", {}, "sha512-ivkRENMh0mdGoPlZ4xVcEaC8rXQfTEfvonRw5m8VDKV7kgcbZbaNd1TnKl08wXbcLdT7okSc63HNP8cVhy95zg=="], @@ -1783,7 +1755,7 @@ "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], - "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="], @@ -1879,8 +1851,6 @@ "zustand": ["zustand@5.0.3", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg=="], - "@meshtastic/transport-web-serial/@jsr/meshtastic__core": ["@jsr/meshtastic__core@2.6.0-0", "https://npm.jsr.io/~/11/@jsr/meshtastic__core/2.6.0-0.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@jsr/meshtastic__protobufs": "^2.6.0", "crc": "^4.3.2", "ste-simple-events": "^3.0.11", "tslog": "^4.9.3" } }, "sha512-Ks71sRagbBipotznULpsJZ1EMcQIqCEJQx6mf628dmCNVf2YECi2zi/i/5zErp1hGPgfbDvCz9oPogvsd/7fMA=="], - "@rollup/plugin-babel/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], "@rollup/plugin-babel/rollup": ["rollup@2.79.2", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ=="], @@ -1939,7 +1909,7 @@ "rbush/quickselect": ["quickselect@2.0.0", "", {}, "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="], - "react-scan/@types/node": ["@types/node@20.17.19", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A=="], + "react-scan/@types/node": ["@types/node@20.17.23", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-8PCGZ1ZJbEZuYNTMqywO+Sj4vSKjSjT6Ua+6RFOYlEvIvKQABPtrNkoVSLSKDb4obYcMhspVKmsw8Cm10NFRUg=="], "react-scan/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], diff --git a/package.json b/package.json index d3d0cbbf..7059ab83 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "maplibre-gl": "5.1.1", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-error-boundary": "^5.0.0", "react-hook-form": "^7.54.2", "react-map-gl": "8.0.1", "react-qrcode-logo": "^3.0.0", diff --git a/src/App.tsx b/src/App.tsx index a86b50f1..164e5743 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,8 @@ import Footer from "@components/UI/Footer.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; import { Dashboard } from "@pages/Dashboard/index.tsx"; - +import { ErrorBoundary } from "react-error-boundary"; +import { ErrorPage } from "./components/UI/ErrorPage.tsx"; import { MapProvider } from "react-map-gl/maplibre"; export const App = () => { @@ -21,7 +22,7 @@ export const App = () => { const device = getDevice(selectedDevice); return ( - <> + { @@ -29,32 +30,32 @@ export const App = () => { }} /> - - -
-
- -
- {device - ? ( -
- - - + +
+
+ +
+ {device + ? ( +
+ + + + -
- ) - : ( - <> - -
- - )} -
+ +
+ ) + : ( + <> + +
+ + )}
- - - +
+ + ); }; diff --git a/src/PageRouter.tsx b/src/PageRouter.tsx index e0e33084..33888dfe 100644 --- a/src/PageRouter.tsx +++ b/src/PageRouter.tsx @@ -4,16 +4,44 @@ import ChannelsPage from "@pages/Channels.tsx"; import ConfigPage from "@pages/Config/index.tsx"; import MessagesPage from "@pages/Messages.tsx"; import NodesPage from "@pages/Nodes.tsx"; +import { ErrorBoundary } from "react-error-boundary"; +import { ErrorPage } from "./components/UI/ErrorPage"; + +export const ErrorBoundaryWrapper = ({ + children, +}: { children: React.ReactNode }) => ( + {children} +); export const PageRouter = () => { const { activePage } = useDevice(); return ( - <> - {activePage === "messages" && } - {activePage === "map" && } - {activePage === "config" && } - {activePage === "channels" && } - {activePage === "nodes" && } - + + {activePage === "messages" && ( + + + + )} + {activePage === "map" && ( + + + + )} + {activePage === "config" && ( + + + + )} + {activePage === "channels" && ( + + + + )} + {activePage === "nodes" && ( + + + + )} + ); }; diff --git a/src/components/Form/DynamicForm.tsx b/src/components/Form/DynamicForm.tsx index 839e8094..9e3fa995 100644 --- a/src/components/Form/DynamicForm.tsx +++ b/src/components/Form/DynamicForm.tsx @@ -4,7 +4,6 @@ import { } from "@components/Form/DynamicFormField.tsx"; import { FieldWrapper } from "@components/Form/FormWrapper.tsx"; import { Button } from "@components/UI/Button.tsx"; -import { H4 } from "@components/UI/Typography/H4.tsx"; import { Subtle } from "@components/UI/Typography/Subtle.tsx"; import { type Control, @@ -14,6 +13,7 @@ import { type SubmitHandler, useForm, } from "react-hook-form"; +import { Heading } from "../UI/Typography/Heading"; interface DisabledBy { fieldName: Path; @@ -95,7 +95,9 @@ export function DynamicForm({ {fieldGroups.map((fieldGroup) => (
-

{fieldGroup.label}

+ + {fieldGroup.label} + {fieldGroup.description} {fieldGroup?.notes}
diff --git a/src/components/PageComponents/Map/NodeDetail.tsx b/src/components/PageComponents/Map/NodeDetail.tsx index 7879d97c..427804c8 100644 --- a/src/components/PageComponents/Map/NodeDetail.tsx +++ b/src/components/PageComponents/Map/NodeDetail.tsx @@ -1,8 +1,8 @@ -import { Separator } from "../../UI/Seperator.tsx"; -import { H5 } from "@app/components/UI/Typography/H5.tsx"; +import { Separator } from "@app/components/UI/Seperator.tsx"; +import { Heading } from "@app/components/UI/Typography/Heading.tsx"; import { Subtle } from "@app/components/UI/Typography/Subtle.tsx"; -import { formatQuantity } from "../../../core/utils/string.ts"; -import { Avatar } from "../../UI/Avatar.tsx"; +import { formatQuantity } from "@app/core/utils/string.ts"; +import { Avatar } from "@components/UI/Avatar.tsx"; import { Mono } from "@components/generic/Mono.tsx"; import { TimeAgo } from "@components/generic/TimeAgo.tsx"; import { Protobuf } from "@meshtastic/core"; @@ -34,7 +34,7 @@ export const NodeDetail = ({ node }: NodeDetailProps) => {
- +
{node.user?.publicKey && node.user?.publicKey.length > 0 @@ -64,24 +64,23 @@ export const NodeDetail = ({ node }: NodeDetailProps) => {
-
{name}
+ {name} {hardwareType !== "UNSET" && {hardwareType}} {!!node.deviceMetrics?.batteryLevel && (
{node.deviceMetrics?.batteryLevel > 100 ? : node.deviceMetrics?.batteryLevel > 80 - ? - : node.deviceMetrics?.batteryLevel > 20 - ? - : } + ? + : node.deviceMetrics?.batteryLevel > 20 + ? + : } {node.deviceMetrics?.batteryLevel > 100 ? "Charging" diff --git a/src/components/PageComponents/Messages/Message.tsx b/src/components/PageComponents/Messages/Message.tsx index 40193a83..c1c93f66 100644 --- a/src/components/PageComponents/Messages/Message.tsx +++ b/src/components/PageComponents/Messages/Message.tsx @@ -146,7 +146,7 @@ export const Message = ({ lastMsgSameUser, message, sender }: MessageProps) => { {!lastMsgSameUser ? (
- +
{messageUser?.longName} diff --git a/src/components/UI/ErrorPage.tsx b/src/components/UI/ErrorPage.tsx new file mode 100644 index 00000000..ca0921f0 --- /dev/null +++ b/src/components/UI/ErrorPage.tsx @@ -0,0 +1,81 @@ +import newGithubIssueUrl from "@app/core/utils/github"; +import { ExternalLink } from "lucide-react"; +import { Heading } from "./Typography/Heading"; +import { Link } from "./Typography/Link"; +import { P } from "./Typography/P"; + +export function ErrorPage({ error }: { error: Error }) { + if (!error) { + return null; + } + + return ( +
+
+ + This is a little embarrassing... + +

+ We are really sorry but an error occured in the web client that caused + it to crash. This is not supposed to happen and we are working hard to + fix it. +

+

+ The best way to prevent this from happening again to you or anyone + else is to report the issue to us. +

+

Please include the following information in your report:

+
    +
  • What you were doing when the error occured
  • +
  • What you expected to happen
  • +
  • What actually happened
  • +
  • Any other information you think might be relevant
  • +
+

+ You can report the issue to our{" "} + ", + logs: error?.stack, + })} + > + Github + + +

+

+ Return to the dashboard +

+ +
+ Error Details + + {error?.message ? ( + <> + +
{`${error.message}`}
+ + ) : null} + {error?.stack ? ( + <> + +
{`${error.stack}`}
+ + ) : null} + {!error?.message && !error?.stack ? ( +
{error.toString()}
+ ) : null} +
+
+
+
+ ); +} diff --git a/src/components/UI/Sidebar/SidebarSection.tsx b/src/components/UI/Sidebar/SidebarSection.tsx index 33306288..6fd53c3f 100644 --- a/src/components/UI/Sidebar/SidebarSection.tsx +++ b/src/components/UI/Sidebar/SidebarSection.tsx @@ -1,4 +1,4 @@ -import { H4 } from "@components/UI/Typography/H4.tsx"; +import { Heading } from "../Typography/Heading"; export interface SidebarSectionProps { label: string; @@ -11,7 +11,9 @@ export const SidebarSection = ({ children, }: SidebarSectionProps) => (
-

{title}

+ + {title} +
{children}
); diff --git a/src/components/UI/Typography/H1.tsx b/src/components/UI/Typography/H1.tsx deleted file mode 100644 index ec9d6615..00000000 --- a/src/components/UI/Typography/H1.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export interface H1Props { - children: React.ReactNode; -} - -export const H1 = ({ children }: H1Props) => ( -

- {children} -

-); diff --git a/src/components/UI/Typography/H2.tsx b/src/components/UI/Typography/H2.tsx deleted file mode 100644 index 4a46721c..00000000 --- a/src/components/UI/Typography/H2.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export interface H2Props { - children: React.ReactNode; -} - -export const H2 = ({ children }: H2Props) => ( -

- {children} -

-); diff --git a/src/components/UI/Typography/H3.tsx b/src/components/UI/Typography/H3.tsx deleted file mode 100644 index e393ef3e..00000000 --- a/src/components/UI/Typography/H3.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export interface H3Props { - children: React.ReactNode; -} - -export const H3 = ({ children }: H3Props) => ( -

- {children} -

-); diff --git a/src/components/UI/Typography/H4.tsx b/src/components/UI/Typography/H4.tsx deleted file mode 100644 index 6acc773d..00000000 --- a/src/components/UI/Typography/H4.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { cn } from "@app/core/utils/cn.ts"; - -export interface H4Props { - className?: string; - children: React.ReactNode; -} - -export const H4 = ({ className, children }: H4Props) => ( -

- {children} -

-); diff --git a/src/components/UI/Typography/H5.tsx b/src/components/UI/Typography/H5.tsx deleted file mode 100644 index f5e0654f..00000000 --- a/src/components/UI/Typography/H5.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { cn } from "@app/core/utils/cn.ts"; - -export interface H5Props { - className?: string; - children: React.ReactNode; -} - -export const H5 = ({ className, children }: H5Props) => ( -
- {children} -
-); diff --git a/src/components/UI/Typography/Heading.tsx b/src/components/UI/Typography/Heading.tsx new file mode 100644 index 00000000..f8a6f0f0 --- /dev/null +++ b/src/components/UI/Typography/Heading.tsx @@ -0,0 +1,30 @@ +import type React from "react"; + +const headingStyles = { + h1: "scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl", + h2: "scroll-m-20 border-b border-b-slate-200 pb-2 text-3xl font-semibold tracking-tight transition-colors first:mt-0 dark:border-b-slate-700", + h3: "scroll-m-20 text-2xl font-semibold tracking-tight", + h4: "scroll-m-20 text-xl font-semibold tracking-tight", + h5: "scroll-m-20 text-lg font-medium tracking-tight", +}; + +interface HeadingProps { + as?: "h1" | "h2" | "h3" | "h4" | "h5"; + children: React.ReactNode; + className?: string; +} + +export const Heading = ({ + as: Component = "h1", + children, + className = "", + ...props +}: HeadingProps) => { + const baseStyles = headingStyles[Component] || headingStyles.h1; + + return ( + + {children} + + ); +}; diff --git a/src/core/utils/github.ts b/src/core/utils/github.ts new file mode 100644 index 00000000..bed2941b --- /dev/null +++ b/src/core/utils/github.ts @@ -0,0 +1,88 @@ +interface RepoIdentifier { + user: string; + repo: string; +} + +interface GithubIssueUrlOptions extends Partial { + repoUrl?: string; + body?: string; + title?: string; + labels?: string[]; + template?: string; + assignee?: string; + projects?: string[]; + logs?: string; + version?: number; +} + +type ValidatedOptions = { + repoUrl: string; +} & Omit; + +const VALID_PARAMS = [ + "body", + "title", + "labels", + "template", + "assignee", + "projects", + "version", + "logs", +] as const; + +/** + * Generates a URL for creating a new GitHub issue + * @param options Configuration options for the GitHub issue URL + * @returns A formatted URL string for creating a new GitHub issue + * @throws {Error} If repository information is missing or invalid + * @throws {TypeError} If labels or projects are not arrays when provided + */ +export default function newGithubIssueUrl( + options: GithubIssueUrlOptions = {}, +): string { + const validatedOptions = validateOptions(options); + const url = new URL(`${validatedOptions.repoUrl}/issues/new`); + + for (const key of VALID_PARAMS) { + const value = validatedOptions[key]; + + if (value === undefined) { + continue; + } + + if ((key === "labels" || key === "projects") && Array.isArray(value)) { + url.searchParams.set(key, value.join(",")); + continue; + } + + url.searchParams.set(key, String(value)); + } + + return url.toString(); +} + +function validateOptions(options: GithubIssueUrlOptions): ValidatedOptions { + const repoUrl = + options.repoUrl ?? + (options.user && options.repo + ? `https://github.com/${options.user}/${options.repo}` + : undefined); + + if (!repoUrl) { + throw new Error( + "You need to specify either the `repoUrl` option or both the `user` and `repo` options", + ); + } + + for (const key of ["labels", "projects"] as const) { + const value = options[key]; + if (value !== undefined && !Array.isArray(value)) { + throw new TypeError(`The \`${key}\` option should be an array`); + } + } + + return { + ...options, + repoUrl, + }; +} diff --git a/src/index.css b/src/index.css index 687931df..7c1ffc76 100644 --- a/src/index.css +++ b/src/index.css @@ -78,6 +78,10 @@ ::file-selector-button { border-color: var(--color-slate-200, currentColor); } + + body { + font-family: var(--font-sans); + } } @layer components { diff --git a/src/pages/Dashboard/index.tsx b/src/pages/Dashboard/index.tsx index a2cf1098..06fb94bf 100644 --- a/src/pages/Dashboard/index.tsx +++ b/src/pages/Dashboard/index.tsx @@ -1,8 +1,8 @@ +import { Heading } from "../../components/UI/Typography/Heading.tsx"; import { useAppStore } from "@app/core/stores/appStore.ts"; import { useDeviceStore } from "@app/core/stores/deviceStore.ts"; import { Button } from "@components/UI/Button.tsx"; import { Separator } from "@components/UI/Seperator.tsx"; -import { H3 } from "@components/UI/Typography/H3.tsx"; import { Subtle } from "@components/UI/Typography/Subtle.tsx"; import { BluetoothIcon, @@ -25,7 +25,7 @@ export const Dashboard = () => {
-

Connected Devices

+ Connected Devices Manage, connect and disconnect devices
@@ -71,17 +71,17 @@ export const Dashboard = () => { )}
-
-
-
-
@@ -96,10 +96,10 @@ export const Dashboard = () => { size={48} className="mx-auto text-text-secondary" /> -

No Devices

+ No Devices Connect at least one device to get started
- + ); }; From 04ecdd55fec2ffd90895433f7e52f61eb6918b53 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Tue, 25 Feb 2025 11:47:51 -0500 Subject: [PATCH 11/15] fix overflow issue with stack trace --- src/components/UI/ErrorPage.tsx | 145 ++++++++++++++++---------------- 1 file changed, 73 insertions(+), 72 deletions(-) diff --git a/src/components/UI/ErrorPage.tsx b/src/components/UI/ErrorPage.tsx index a94af94d..26df17e8 100644 --- a/src/components/UI/ErrorPage.tsx +++ b/src/components/UI/ErrorPage.tsx @@ -10,84 +10,85 @@ export function ErrorPage({ error }: { error: Error }) { } return ( -
-
-
-
- - This is a little embarrassing... - -

- We are really sorry but an error occured in the web client that - caused it to crash. This is not supposed to happen and we are - working hard to fix it. -

-

- The best way to prevent this from happening again to you or anyone - else is to report the issue to us. -

-

Please include the following information in your report:

-
    -
  • What you were doing when the error occured
  • -
  • What you expected to happen
  • -
  • What actually happened
  • -
  • Any other information you think might be relevant
  • -
-

- You can report the issue to our{" "} - ", - logs: error?.stack, - })} - > - Github - - -

-

- Return to the dashboard -

+
+
+
+ + This is a little embarrassing... + +

+ 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. +

+

+ The best way to prevent this from happening again to you or anyone + else is to report the issue to us. +

+

Please include the following information in your report:

+
    +
  • What you were doing when the error occurred
  • +
  • What you expected to happen
  • +
  • What actually happened
  • +
  • Any other relevant information
  • +
+

+ You can report the issue to our{" "} + ", + logs: error?.stack, + })} + > + Github + + +

+

+ Return to the dashboard +

+
-
- Error Details - - {error?.message ? ( - <> - -
{`${error.message}`}
- - ) : null} - {error?.stack ? ( - <> - -
{`${error.stack}`}
- - ) : null} - {!error?.message && !error?.stack ? ( -
-                    {error.toString()}
-                  
- ) : null} -
-
-
+
Chripy the Meshtastic error
+
+ Error Details + + {error?.message && ( + <> + +

+ {error.message} +

+ + )} + {error?.stack && ( + <> + +

+ {error.stack} +

+ + )} + {!error?.message && !error?.stack && ( +

{error.toString()}

+ )} +
+
); } From 9ad6c049f283d41d61cca663d3d938637bdaa7c3 Mon Sep 17 00:00:00 2001 From: Hunter275 Date: Sun, 2 Mar 2025 22:22:02 -0500 Subject: [PATCH 12/15] fix nodes page error, more cleanup is probably required for "undefined" hops away --- src/pages/Nodes.tsx | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/pages/Nodes.tsx b/src/pages/Nodes.tsx index dbcc6094..c4dc1cc4 100644 --- a/src/pages/Nodes.tsx +++ b/src/pages/Nodes.tsx @@ -1,7 +1,7 @@ -import { LocationResponseDialog } from "../components/Dialog/LocationResponseDialog.tsx"; -import { NodeOptionsDialog } from "../components/Dialog/NodeOptionsDialog.tsx"; -import { TracerouteResponseDialog } from "../components/Dialog/TracerouteResponseDialog.tsx"; -import Footer from "../components/UI/Footer.tsx"; +import { LocationResponseDialog } from "@components/Dialog/LocationResponseDialog.tsx"; +import { NodeOptionsDialog } from "@components/Dialog/NodeOptionsDialog.tsx"; +import { TracerouteResponseDialog } from "@components/Dialog/TracerouteResponseDialog.tsx"; +import Footer from "@components/UI/Footer.tsx"; import { Sidebar } from "@components/Sidebar.tsx"; import { Avatar } from "@components/UI/Avatar.tsx"; import { Mono } from "@components/generic/Mono.tsx"; @@ -107,10 +107,9 @@ const NodesPage = () => { > {node.user?.shortName ?? (node.user?.macaddr - ? `${ - base16 - .stringify(node.user?.macaddr.subarray(4, 6) ?? []) - .toLowerCase() + ? `${base16 + .stringify(node.user?.macaddr.subarray(4, 6) ?? []) + .toLowerCase() }` : `${numberToHexUnpadded(node.num).slice(-4)}`)} , @@ -122,10 +121,9 @@ const NodesPage = () => { > {node.user?.longName ?? (node.user?.macaddr - ? `Meshtastic ${ - base16 - .stringify(node.user?.macaddr.subarray(4, 6) ?? []) - .toLowerCase() + ? `Meshtastic ${base16 + .stringify(node.user?.macaddr.subarray(4, 6) ?? []) + .toLowerCase() }` : `!${numberToHexUnpadded(node.num)}`)} , @@ -150,16 +148,17 @@ const NodesPage = () => { {(node.snr + 10) * 5}raw , - {node.user?.publicKey && node.user?.publicKey.length > 0 - ? - : } + {node.user?.publicKey && node.user?.publicKey.length > 0 ? ( + + ) : ( + + )} , - {node.lastHeard !== 0 - ? node.viaMqtt === false && node.hopsAway === 0 + {node?.lastHeard !== 0 + ? node?.viaMqtt === false && node?.hopsAway === 0 ? "Direct" - : `${node.hopsAway.toString()} ${ - node.hopsAway > 1 ? "hops" : "hop" + : `${node?.hopsAway?.toString()} ${node?.hopsAway > 1 ? "hops" : "hop" } away` : "-"} {node.viaMqtt === true ? ", via MQTT" : ""} From 7c84a582ba0bc1b6638cb05a3aa35a8425318c3f Mon Sep 17 00:00:00 2001 From: Hunter275 Date: Sun, 2 Mar 2025 22:42:55 -0500 Subject: [PATCH 13/15] fix padding on last heard --- src/pages/Nodes.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/pages/Nodes.tsx b/src/pages/Nodes.tsx index c4dc1cc4..e3f5b69a 100644 --- a/src/pages/Nodes.tsx +++ b/src/pages/Nodes.tsx @@ -137,11 +137,13 @@ const NodesPage = () => { .match(/.{1,2}/g) ?.join(":") ?? "UNK"} , - - {node.lastHeard === 0 - ?

Never

- : } -
, + + {node.lastHeard === 0 ? ( +

Never

+ ) : ( + + )} +
, {node.snr}db/ {Math.min(Math.max((node.snr + 10) * 5, 0), 100)}%/ From 796899409077e2857c414af9dbc40fda14451d39 Mon Sep 17 00:00:00 2001 From: Hunter275 Date: Sun, 2 Mar 2025 22:44:59 -0500 Subject: [PATCH 14/15] fix for 'never' as well --- src/pages/Nodes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Nodes.tsx b/src/pages/Nodes.tsx index e3f5b69a..e5dfc046 100644 --- a/src/pages/Nodes.tsx +++ b/src/pages/Nodes.tsx @@ -139,7 +139,7 @@ const NodesPage = () => { , {node.lastHeard === 0 ? ( -

Never

+

Never

) : ( )} From 75596e7153130195552526debc94f34d5853d100 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sun, 2 Mar 2025 14:46:02 -0500 Subject: [PATCH 15/15] chore: fixes from deno linting/formatting --- src/App.tsx | 38 +++++++++---------- src/PageRouter.tsx | 2 +- src/components/DeviceSelector.tsx | 1 - src/components/Dialog/DeviceNameDialog.tsx | 2 +- src/components/Dialog/DialogManager.tsx | 2 +- src/components/Dialog/RemoveNodeDialog.tsx | 2 +- src/components/Form/DynamicForm.tsx | 2 +- .../Config/Security/Security.tsx | 12 +++--- .../PageComponents/Connect/HTTP.tsx | 6 +-- .../PageComponents/Connect/Serial.tsx | 5 ++- .../PageComponents/Map/NodeDetail.tsx | 8 ++-- .../PageComponents/Messages/ChannelChat.tsx | 5 +-- .../PageComponents/Messages/Message.tsx | 6 +-- .../PageComponents/Messages/TraceRoute.tsx | 2 +- .../ModuleConfig/AmbientLighting.tsx | 2 +- .../ModuleConfig/DetectionSensor.tsx | 2 +- .../PageComponents/ModuleConfig/MQTT.tsx | 2 +- .../ModuleConfig/NeighborInfo.tsx | 2 +- src/components/PageLayout.tsx | 2 +- src/components/UI/ErrorPage.tsx | 8 ++-- src/components/UI/Sidebar/SidebarSection.tsx | 2 +- src/components/UI/Typography/Heading.tsx | 3 +- src/components/UI/Typography/P.tsx | 2 +- src/components/UI/Typography/Subtle.tsx | 2 +- src/core/utils/github.ts | 3 +- src/pages/Channels.tsx | 2 +- src/pages/Config/ModuleConfig.tsx | 6 +-- src/pages/Config/index.tsx | 2 +- src/pages/Dashboard/index.tsx | 8 ++-- src/pages/Nodes.tsx | 18 ++++----- 30 files changed, 76 insertions(+), 83 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 164e5743..29e80aa1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,11 +10,13 @@ import Footer from "@components/UI/Footer.tsx"; import { useAppStore } from "@core/stores/appStore.ts"; import { useDeviceStore } from "@core/stores/deviceStore.ts"; import { Dashboard } from "@pages/Dashboard/index.tsx"; +import type { JSX } from "react"; import { ErrorBoundary } from "react-error-boundary"; -import { ErrorPage } from "./components/UI/ErrorPage.tsx"; +import { ErrorPage } from "@components/UI/ErrorPage.tsx"; import { MapProvider } from "react-map-gl/maplibre"; -export const App = () => { + +export const App = (): JSX.Element => { const { getDevice } = useDeviceStore(); const { selectedDevice, setConnectDialogOpen, connectDialogOpen } = useAppStore(); @@ -35,23 +37,21 @@ export const App = () => {
- {device - ? ( -
- - - - - - -
- ) - : ( - <> - -
- - )} + {device ? ( +
+ + + + + + +
+ ) : ( + <> + +
+ + )}
diff --git a/src/PageRouter.tsx b/src/PageRouter.tsx index ceff7bdb..f59cb6fe 100644 --- a/src/PageRouter.tsx +++ b/src/PageRouter.tsx @@ -5,7 +5,7 @@ import ConfigPage from "@pages/Config/index.tsx"; import MessagesPage from "@pages/Messages.tsx"; import NodesPage from "@pages/Nodes.tsx"; import { ErrorBoundary } from "react-error-boundary"; -import { ErrorPage } from "./components/UI/ErrorPage"; +import { ErrorPage } from "./components/UI/ErrorPage.tsx"; export const ErrorBoundaryWrapper = ({ children, diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx index d53f5051..872b9c04 100644 --- a/src/components/DeviceSelector.tsx +++ b/src/components/DeviceSelector.tsx @@ -15,7 +15,6 @@ export const DeviceSelector = () => { setCommandPaletteOpen, setConnectDialogOpen, } = useAppStore(); - console.log(import.meta.env.VITE_COMMIT_HASH); return (