From 14a756a96d022f795f0cdcfa2796f3d2681ec612 Mon Sep 17 00:00:00 2001 From: Tr3vah <77978611+sage-sudo@users.noreply.github.com> Date: Fri, 19 Dec 2025 12:34:58 +0000 Subject: [PATCH 1/2] Initial commit --- .devcontainer/devcontainer.json | 26 + .devcontainer/icon.svg | 9 + .gitignore | 127 + .vscode/launch.json | 20 + LICENSE | 21 + README.md | 70 + index.html | 35 + jsconfig.json | 5 + package-lock.json | 6399 +++++++++++++++++++++++++++++++ package.json | 49 + public/Octocat.png | Bin 0 -> 2131769 bytes public/favicon.ico | Bin 0 -> 3870 bytes public/logo192.png | Bin 0 -> 5347 bytes public/logo512.png | Bin 0 -> 9664 bytes public/manifest.json | 25 + public/robots.txt | 3 + src/App.css | 31 + src/App.jsx | 29 + src/App.test.jsx | 9 + src/index.css | 13 + src/index.jsx | 17 + src/logo.svg | 1 + src/reportWebVitals.js | 13 + src/setupTests.js | 5 + vite.config.js | 11 + 25 files changed, 6918 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/icon.svg create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 index.html create mode 100644 jsconfig.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/Octocat.png create mode 100644 public/favicon.ico create mode 100644 public/logo192.png create mode 100644 public/logo512.png create mode 100644 public/manifest.json create mode 100644 public/robots.txt create mode 100644 src/App.css create mode 100644 src/App.jsx create mode 100644 src/App.test.jsx create mode 100644 src/index.css create mode 100644 src/index.jsx create mode 100644 src/logo.svg create mode 100644 src/reportWebVitals.js create mode 100644 src/setupTests.js create mode 100644 vite.config.js diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..d03abbcfd --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,26 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "hostRequirements": { + "cpus": 4 + }, + "waitFor": "onCreateCommand", + "updateContentCommand": "npm install", + "postCreateCommand": "", + "postAttachCommand": { + "server": "npm start" + }, + "customizations": { + "codespaces": { + "openFiles": [ + "src/App.jsx" + ] + } + }, + "portsAttributes": { + "3000": { + "label": "Application", + "onAutoForward": "openPreview" + } + }, + "forwardPorts": [3000] +} diff --git a/.devcontainer/icon.svg b/.devcontainer/icon.svg new file mode 100644 index 000000000..ea77a618d --- /dev/null +++ b/.devcontainer/icon.svg @@ -0,0 +1,9 @@ + + React Logo + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..6a1037fdf --- /dev/null +++ b/.gitignore @@ -0,0 +1,127 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..374d16e50 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run application", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "runtimeExecutable": "npm", + "runtimeArgs": [ + "run-script", + "start" + ], + "skipFiles": [ + "/**" + ] + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..fac6e630f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 GitHub + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..f360b3fb1 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# GitHub Codespaces ♥️ React + +Welcome to your shiny new Codespace running React! We've got everything fired up and running for you to explore React. + +You've got a blank canvas to work on from a git perspective as well. There's a single initial commit with the what you're seeing right now - where you go from here is up to you! + +Everything you do here is contained within this one codespace. There is no repository on GitHub yet. If and when you’re ready you can click "Publish Branch" and we’ll create your repository and push up your project. If you were just exploring then and have no further need for this code then you can simply delete your codespace and it's gone forever. + +This project was bootstrapped for you with [Vite](https://vitejs.dev/). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +We've already run this for you in the `Codespaces: server` terminal window below. If you need to stop the server for any reason you can just run `npm start` again to bring it back online. + +Runs the app in the development mode.\ +Open [http://localhost:3000/](http://localhost:3000/) in the built-in Simple Browser (`Cmd/Ctrl + Shift + P > Simple Browser: Show`) to view your running application. + +The page will reload automatically when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +## Learn More + +You can learn more in the [Vite documentation](https://vitejs.dev/guide/). + +To learn Vitest, a Vite-native testing framework, go to [Vitest documentation](https://vitest.dev/guide/) + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://sambitsahoo.com/blog/vite-code-splitting-that-works.html](https://sambitsahoo.com/blog/vite-code-splitting-that-works.html) + +### Analyzing the Bundle Size + +This section has moved here: [https://github.com/btd/rollup-plugin-visualizer#rollup-plugin-visualizer](https://github.com/btd/rollup-plugin-visualizer#rollup-plugin-visualizer) + +### Making a Progressive Web App + +This section has moved here: [https://dev.to/hamdankhan364/simplifying-progressive-web-app-pwa-development-with-vite-a-beginners-guide-38cf](https://dev.to/hamdankhan364/simplifying-progressive-web-app-pwa-development-with-vite-a-beginners-guide-38cf) + +### Advanced Configuration + +This section has moved here: [https://vitejs.dev/guide/build.html#advanced-base-options](https://vitejs.dev/guide/build.html#advanced-base-options) + +### Deployment + +This section has moved here: [https://vitejs.dev/guide/build.html](https://vitejs.dev/guide/build.html) + +### Troubleshooting + +This section has moved here: [https://vitejs.dev/guide/troubleshooting.html](https://vitejs.dev/guide/troubleshooting.html) diff --git a/index.html b/index.html new file mode 100644 index 000000000..452ca1f32 --- /dev/null +++ b/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + React App + + + +
+ + + + diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 000000000..8e881cf9c --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "moduleResolution": "node" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..9c2f07869 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6399 @@ +{ + "name": "codespaces-react", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "codespaces-react", + "version": "0.1.0", + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "web-vitals": "^3.1.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.7.0", + "jsdom": "^26.1.0", + "vite": "^6.3.6", + "vitest": "^3.0.7" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", + "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", + "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", + "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", + "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", + "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", + "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", + "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", + "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", + "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", + "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", + "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", + "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", + "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", + "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", + "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", + "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", + "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", + "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", + "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", + "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", + "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", + "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@testing-library/dom": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.1.tgz", + "integrity": "sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", + "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.5.tgz", + "integrity": "sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", + "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz", + "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==", + "dev": true, + "dependencies": { + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz", + "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==", + "dev": true, + "dependencies": { + "@vitest/spy": "3.0.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz", + "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==", + "dev": true, + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz", + "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==", + "dev": true, + "dependencies": { + "@vitest/utils": "3.0.7", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz", + "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "3.0.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz", + "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz", + "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "3.0.7", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.15.tgz", + "integrity": "sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.189", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.189.tgz", + "integrity": "sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@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" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dependencies": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", + "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", + "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.1", + "@rollup/rollup-android-arm64": "4.50.1", + "@rollup/rollup-darwin-arm64": "4.50.1", + "@rollup/rollup-darwin-x64": "4.50.1", + "@rollup/rollup-freebsd-arm64": "4.50.1", + "@rollup/rollup-freebsd-x64": "4.50.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", + "@rollup/rollup-linux-arm-musleabihf": "4.50.1", + "@rollup/rollup-linux-arm64-gnu": "4.50.1", + "@rollup/rollup-linux-arm64-musl": "4.50.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", + "@rollup/rollup-linux-ppc64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-musl": "4.50.1", + "@rollup/rollup-linux-s390x-gnu": "4.50.1", + "@rollup/rollup-linux-x64-gnu": "4.50.1", + "@rollup/rollup-linux-x64-musl": "4.50.1", + "@rollup/rollup-openharmony-arm64": "4.50.1", + "@rollup/rollup-win32-arm64-msvc": "4.50.1", + "@rollup/rollup-win32-ia32-msvc": "4.50.1", + "@rollup/rollup-win32-x64-msvc": "4.50.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "dev": true + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/terser": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", + "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz", + "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==", + "dev": true, + "dependencies": { + "@vitest/expect": "3.0.7", + "@vitest/mocker": "3.0.7", + "@vitest/pretty-format": "^3.0.7", + "@vitest/runner": "3.0.7", + "@vitest/snapshot": "3.0.7", + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.7", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.7", + "@vitest/ui": "3.0.7", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web-vitals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.1.0.tgz", + "integrity": "sha512-zCeQ+bOjWjJbXv5ZL0r8Py3XP2doCQMZXNKlBGfUjPAVZWokApdeF/kFlK1peuKlCt8sL9TFkKzyXE9/cmNJQA==" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + }, + "dependencies": { + "@adobe/css-tools": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" + }, + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "requires": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } + }, + "@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "requires": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "dev": true + }, + "@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + } + }, + "@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "dev": true, + "requires": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true + }, + "@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true + }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true + }, + "@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "requires": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + } + }, + "@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "dev": true, + "requires": { + "@babel/types": "^7.28.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + } + }, + "@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + } + }, + "@babel/types": { + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", + "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + } + }, + "@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true + }, + "@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "requires": {} + }, + "@csstools/css-color-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "dev": true, + "requires": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.4" + } + }, + "@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true + }, + "@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "dev": true, + "optional": true + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "requires": { + "@sinclair/typebox": "^0.27.8" + }, + "dependencies": { + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + } + } + }, + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", + "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", + "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", + "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", + "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", + "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-x64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", + "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", + "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", + "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", + "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", + "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", + "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", + "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", + "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", + "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", + "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", + "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", + "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-openharmony-arm64": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", + "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", + "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", + "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", + "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "dev": true, + "optional": true + }, + "@testing-library/dom": { + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.19.1.tgz", + "integrity": "sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + } + }, + "@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "requires": { + "@adobe/css-tools": "^4.3.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + } + }, + "@testing-library/user-event": { + "version": "14.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", + "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "requires": {} + }, + "@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.5.tgz", + "integrity": "sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw==", + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/react": { + "version": "18.0.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz", + "integrity": "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", + "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "requires": { + "@types/jest": "*" + } + }, + "@types/yargs": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", + "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "requires": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + } + }, + "@vitest/expect": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz", + "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==", + "dev": true, + "requires": { + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + } + }, + "@vitest/mocker": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz", + "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==", + "dev": true, + "requires": { + "@vitest/spy": "3.0.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + } + }, + "@vitest/pretty-format": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz", + "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==", + "dev": true, + "requires": { + "tinyrainbow": "^2.0.0" + } + }, + "@vitest/runner": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz", + "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==", + "dev": true, + "requires": { + "@vitest/utils": "3.0.7", + "pathe": "^2.0.3" + } + }, + "@vitest/snapshot": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz", + "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==", + "dev": true, + "requires": { + "@vitest/pretty-format": "3.0.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + } + }, + "@vitest/spy": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz", + "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==", + "dev": true, + "requires": { + "tinyspy": "^3.0.2" + } + }, + "@vitest/utils": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz", + "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==", + "dev": true, + "requires": { + "@vitest/pretty-format": "3.0.7", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + } + }, + "acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "optional": true, + "peer": true + }, + "agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "dev": true + }, + "chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "requires": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true + }, + "ci-info": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "requires": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "requires": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true + }, + "deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true + }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==" + }, + "dom-accessibility-api": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.15.tgz", + "integrity": "sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw==" + }, + "electron-to-chromium": { + "version": "1.5.189", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.189.tgz", + "integrity": "sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ==", + "dev": true + }, + "entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", + "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true + }, + "esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dev": true, + "requires": { + "@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": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0" + } + }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "expect-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", + "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", + "dev": true + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^3.1.1" + } + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==" + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "requires": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + } + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" + }, + "magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "requires": { + "entities": "^6.0.0" + } + }, + "pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "rollup": { + "version": "4.50.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", + "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.50.1", + "@rollup/rollup-android-arm64": "4.50.1", + "@rollup/rollup-darwin-arm64": "4.50.1", + "@rollup/rollup-darwin-x64": "4.50.1", + "@rollup/rollup-freebsd-arm64": "4.50.1", + "@rollup/rollup-freebsd-x64": "4.50.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", + "@rollup/rollup-linux-arm-musleabihf": "4.50.1", + "@rollup/rollup-linux-arm64-gnu": "4.50.1", + "@rollup/rollup-linux-arm64-musl": "4.50.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", + "@rollup/rollup-linux-ppc64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-gnu": "4.50.1", + "@rollup/rollup-linux-riscv64-musl": "4.50.1", + "@rollup/rollup-linux-s390x-gnu": "4.50.1", + "@rollup/rollup-linux-x64-gnu": "4.50.1", + "@rollup/rollup-linux-x64-musl": "4.50.1", + "@rollup/rollup-openharmony-arm64": "4.50.1", + "@rollup/rollup-win32-arm64-msvc": "4.50.1", + "@rollup/rollup-win32-ia32-msvc": "4.50.1", + "@rollup/rollup-win32-x64-msvc": "4.50.1", + "@types/estree": "1.0.8", + "fsevents": "~2.3.2" + } + }, + "rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "std-env": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "terser": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, + "tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "requires": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "dependencies": { + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } + }, + "tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true + }, + "tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true + }, + "tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true + }, + "tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "requires": { + "tldts-core": "^6.1.86" + } + }, + "tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "requires": { + "tldts": "^6.1.32" + } + }, + "tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "requires": { + "punycode": "^2.3.1" + } + }, + "update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "vite": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "dev": true, + "requires": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "fsevents": "~2.3.3", + "picomatch": "^4.0.2", + "postcss": "^8.4.31", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "dependencies": { + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } + }, + "vite-node": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", + "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + } + }, + "vitest": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz", + "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==", + "dev": true, + "requires": { + "@vitest/expect": "3.0.7", + "@vitest/mocker": "3.0.7", + "@vitest/pretty-format": "^3.0.7", + "@vitest/runner": "3.0.7", + "@vitest/snapshot": "3.0.7", + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.7", + "why-is-node-running": "^2.3.0" + } + }, + "w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "requires": { + "xml-name-validator": "^5.0.0" + } + }, + "web-vitals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.1.0.tgz", + "integrity": "sha512-zCeQ+bOjWjJbXv5ZL0r8Py3XP2doCQMZXNKlBGfUjPAVZWokApdeF/kFlK1peuKlCt8sL9TFkKzyXE9/cmNJQA==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true + }, + "whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "requires": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..5e1b6b8c4 --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "codespaces-react", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "web-vitals": "^3.1.0" + }, + "overrides": { + "@svgr/webpack": "^8.0.1", + "@adobe/css-tools": "^4.3.1", + "postcss": "^8.4.31" + }, + "scripts": { + "start": "BROWSER=none WDS_SOCKET_PORT=0 vite --port 3000", + "build": "vite build", + "preview": "vite preview", + "test": "vitest" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.7.0", + "jsdom": "^26.1.0", + "vite": "^6.3.6", + "vitest": "^3.0.7" + } +} diff --git a/public/Octocat.png b/public/Octocat.png new file mode 100644 index 0000000000000000000000000000000000000000..91057da49614551224149b182ae0fc2d843e9368 GIT binary patch literal 2131769 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 literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/public/logo192.png b/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/App.css b/src/App.css new file mode 100644 index 000000000..fce9cc9d8 --- /dev/null +++ b/src/App.css @@ -0,0 +1,31 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +.heart { + color: #ff0000; +} + +.small { + font-size: 0.75rem; +} \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 000000000..8b32d0718 --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,29 @@ +import './App.css'; + +function App() { + return ( + + ); +} + +export default App; diff --git a/src/App.test.jsx b/src/App.test.jsx new file mode 100644 index 000000000..5e9824933 --- /dev/null +++ b/src/App.test.jsx @@ -0,0 +1,9 @@ +import { expect, test } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeDefined(); +}); diff --git a/src/index.css b/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/src/index.jsx b/src/index.jsx new file mode 100644 index 000000000..d563c0fb1 --- /dev/null +++ b/src/index.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/src/logo.svg b/src/logo.svg new file mode 100644 index 000000000..9dfc1c058 --- /dev/null +++ b/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js new file mode 100644 index 000000000..5253d3ad9 --- /dev/null +++ b/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 000000000..248c2f847 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + }, +}) From 9c3796ce84f1821874cb4f86678d30bff5a290cd Mon Sep 17 00:00:00 2001 From: Tr3vah <77978611+sage-sudo@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:46:33 +0000 Subject: [PATCH 2/2] THIRD-ish PHASE --- BACKUPS/FIRST_PHASE/README_FIRST_PHASE.md | 42 ++ BACKUPS/FIRST_PHASE/index.html | 35 ++ BACKUPS/FIRST_PHASE/package.json | 49 ++ BACKUPS/FIRST_PHASE/src/App.css | 387 ++++++++++++ BACKUPS/FIRST_PHASE/src/App.jsx | 24 + BACKUPS/FIRST_PHASE/src/App.test.jsx | 9 + .../src/components/AdminComponents.jsx | 291 +++++++++ .../src/components/ErrorBoundary.jsx | 34 + .../src/components/TradingDashboard.jsx | 170 +++++ .../src/components/YFinanceComponents.jsx | 339 ++++++++++ .../FIRST_PHASE/src/core/BaseVendorAdapter.js | 51 ++ BACKUPS/FIRST_PHASE/src/core/VendorManager.js | 54 ++ BACKUPS/FIRST_PHASE/src/index.css | 13 + BACKUPS/FIRST_PHASE/src/index.jsx | 17 + BACKUPS/FIRST_PHASE/src/logo.svg | 1 + BACKUPS/FIRST_PHASE/src/reportWebVitals.js | 13 + BACKUPS/FIRST_PHASE/src/setupTests.js | 5 + .../FIRST_PHASE/src/utils/VendorRegistry.js | 56 ++ .../FIRST_PHASE/src/vendors/ExampleVendorA.js | 76 +++ .../FIRST_PHASE/src/vendors/ExampleVendorB.js | 66 ++ .../FIRST_PHASE/src/vendors/VendorTemplate.js | 141 +++++ .../FIRST_PHASE/src/vendors/YFinanceVendor.js | 232 +++++++ BACKUPS/FIRST_PHASE/vite.config.js | 11 + BACKUPS/SECOND_PHASE/README_SECOND_PHASE.md | 37 ++ BACKUPS/SECOND_PHASE/index.html | 35 ++ BACKUPS/SECOND_PHASE/package.json | 49 ++ BACKUPS/SECOND_PHASE/src/App.css | 488 +++++++++++++++ BACKUPS/SECOND_PHASE/src/App.jsx | 24 + BACKUPS/SECOND_PHASE/src/App.test.jsx | 9 + .../src/components/AdminComponents.jsx | 323 ++++++++++ .../src/components/CodeEditor.jsx | 75 +++ .../src/components/ErrorBoundary.jsx | 34 + .../src/components/TradingDashboard.jsx | 170 +++++ .../src/components/YFinanceComponents.jsx | 339 ++++++++++ .../src/core/BaseVendorAdapter.js | 51 ++ .../SECOND_PHASE/src/core/VendorManager.js | 54 ++ BACKUPS/SECOND_PHASE/src/index.css | 13 + BACKUPS/SECOND_PHASE/src/index.jsx | 17 + BACKUPS/SECOND_PHASE/src/logo.svg | 1 + BACKUPS/SECOND_PHASE/src/reportWebVitals.js | 13 + BACKUPS/SECOND_PHASE/src/setupTests.js | 5 + .../SECOND_PHASE/src/utils/VendorRegistry.js | 56 ++ .../src/vendors/ExampleVendorA.js | 76 +++ .../src/vendors/ExampleVendorB.js | 66 ++ .../src/vendors/VendorTemplate.js | 141 +++++ .../src/vendors/YFinanceVendor.js | 232 +++++++ BACKUPS/SECOND_PHASE/vite.config.js | 11 + BACKUPS/restore_phases.md | 25 + README_VENDOR_INTEGRATION.md | 81 +++ package-lock.json | 175 ++++++ package.json | 1 + src/App.css | 584 +++++++++++++++++- src/App.jsx | 35 +- src/components/AdminComponents.jsx | 365 +++++++++++ src/components/CodeEditor.jsx | 75 +++ src/components/ErrorBoundary.jsx | 34 + src/components/TradingDashboard.jsx | 178 ++++++ src/components/TreeViewer.jsx | 198 ++++++ src/components/YFinanceComponents.jsx | 339 ++++++++++ src/core/BaseVendorAdapter.js | 51 ++ src/core/VendorManager.js | 54 ++ src/utils/VendorRegistry.js | 56 ++ src/vendors/ExampleVendorA.js | 76 +++ src/vendors/ExampleVendorB.js | 66 ++ src/vendors/VendorTemplate.js | 141 +++++ src/vendors/YFinanceVendor.js | 232 +++++++ 66 files changed, 7165 insertions(+), 36 deletions(-) create mode 100644 BACKUPS/FIRST_PHASE/README_FIRST_PHASE.md create mode 100644 BACKUPS/FIRST_PHASE/index.html create mode 100644 BACKUPS/FIRST_PHASE/package.json create mode 100644 BACKUPS/FIRST_PHASE/src/App.css create mode 100644 BACKUPS/FIRST_PHASE/src/App.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/App.test.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/components/AdminComponents.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/components/ErrorBoundary.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/components/TradingDashboard.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/components/YFinanceComponents.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/core/BaseVendorAdapter.js create mode 100644 BACKUPS/FIRST_PHASE/src/core/VendorManager.js create mode 100644 BACKUPS/FIRST_PHASE/src/index.css create mode 100644 BACKUPS/FIRST_PHASE/src/index.jsx create mode 100644 BACKUPS/FIRST_PHASE/src/logo.svg create mode 100644 BACKUPS/FIRST_PHASE/src/reportWebVitals.js create mode 100644 BACKUPS/FIRST_PHASE/src/setupTests.js create mode 100644 BACKUPS/FIRST_PHASE/src/utils/VendorRegistry.js create mode 100644 BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorA.js create mode 100644 BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorB.js create mode 100644 BACKUPS/FIRST_PHASE/src/vendors/VendorTemplate.js create mode 100644 BACKUPS/FIRST_PHASE/src/vendors/YFinanceVendor.js create mode 100644 BACKUPS/FIRST_PHASE/vite.config.js create mode 100644 BACKUPS/SECOND_PHASE/README_SECOND_PHASE.md create mode 100644 BACKUPS/SECOND_PHASE/index.html create mode 100644 BACKUPS/SECOND_PHASE/package.json create mode 100644 BACKUPS/SECOND_PHASE/src/App.css create mode 100644 BACKUPS/SECOND_PHASE/src/App.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/App.test.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/components/AdminComponents.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/components/CodeEditor.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/components/ErrorBoundary.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/components/TradingDashboard.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/components/YFinanceComponents.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/core/BaseVendorAdapter.js create mode 100644 BACKUPS/SECOND_PHASE/src/core/VendorManager.js create mode 100644 BACKUPS/SECOND_PHASE/src/index.css create mode 100644 BACKUPS/SECOND_PHASE/src/index.jsx create mode 100644 BACKUPS/SECOND_PHASE/src/logo.svg create mode 100644 BACKUPS/SECOND_PHASE/src/reportWebVitals.js create mode 100644 BACKUPS/SECOND_PHASE/src/setupTests.js create mode 100644 BACKUPS/SECOND_PHASE/src/utils/VendorRegistry.js create mode 100644 BACKUPS/SECOND_PHASE/src/vendors/ExampleVendorA.js create mode 100644 BACKUPS/SECOND_PHASE/src/vendors/ExampleVendorB.js create mode 100644 BACKUPS/SECOND_PHASE/src/vendors/VendorTemplate.js create mode 100644 BACKUPS/SECOND_PHASE/src/vendors/YFinanceVendor.js create mode 100644 BACKUPS/SECOND_PHASE/vite.config.js create mode 100644 BACKUPS/restore_phases.md create mode 100644 README_VENDOR_INTEGRATION.md create mode 100644 src/components/AdminComponents.jsx create mode 100644 src/components/CodeEditor.jsx create mode 100644 src/components/ErrorBoundary.jsx create mode 100644 src/components/TradingDashboard.jsx create mode 100644 src/components/TreeViewer.jsx create mode 100644 src/components/YFinanceComponents.jsx create mode 100644 src/core/BaseVendorAdapter.js create mode 100644 src/core/VendorManager.js create mode 100644 src/utils/VendorRegistry.js create mode 100644 src/vendors/ExampleVendorA.js create mode 100644 src/vendors/ExampleVendorB.js create mode 100644 src/vendors/VendorTemplate.js create mode 100644 src/vendors/YFinanceVendor.js diff --git a/BACKUPS/FIRST_PHASE/README_FIRST_PHASE.md b/BACKUPS/FIRST_PHASE/README_FIRST_PHASE.md new file mode 100644 index 000000000..e609fe1c9 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/README_FIRST_PHASE.md @@ -0,0 +1,42 @@ +# FIRST PHASE BACKUP + +**Date:** $(date) +**Status:** LOCKED - Working State + +## Features Included: +- ✅ Vendor Management System +- ✅ YFinance Integration +- ✅ Trading Dashboard with Tabs +- ✅ Market Data Fetching +- ✅ Analytics & Bulk Download +- ✅ Admin Tab with Code Viewer +- ✅ Error Boundaries +- ✅ Fault Isolation + +## Architecture: +- **Core System:** VendorManager, BaseVendorAdapter +- **Vendors:** ExampleVendorA, ExampleVendorB, YFinanceVendor +- **Components:** TradingDashboard, YFinanceComponents, AdminComponents +- **UI:** Responsive design with tabbed interface + +## Restore Instructions: +```bash +# To restore this phase: +rm -rf src/ +cp -r BACKUPS/FIRST_PHASE/src/ ./ +cp BACKUPS/FIRST_PHASE/package.json ./ +cp BACKUPS/FIRST_PHASE/vite.config.js ./ +cp BACKUPS/FIRST_PHASE/index.html ./ +``` + +## Key Files: +- src/core/VendorManager.js +- src/core/BaseVendorAdapter.js +- src/vendors/YFinanceVendor.js +- src/components/TradingDashboard.jsx +- src/components/YFinanceComponents.jsx +- src/components/AdminComponents.jsx +- src/App.jsx +- src/App.css + +**⚠️ DO NOT MODIFY THIS BACKUP ⚠️** \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/index.html b/BACKUPS/FIRST_PHASE/index.html new file mode 100644 index 000000000..452ca1f32 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + React App + + + +
+ + + + diff --git a/BACKUPS/FIRST_PHASE/package.json b/BACKUPS/FIRST_PHASE/package.json new file mode 100644 index 000000000..5e1b6b8c4 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/package.json @@ -0,0 +1,49 @@ +{ + "name": "codespaces-react", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "web-vitals": "^3.1.0" + }, + "overrides": { + "@svgr/webpack": "^8.0.1", + "@adobe/css-tools": "^4.3.1", + "postcss": "^8.4.31" + }, + "scripts": { + "start": "BROWSER=none WDS_SOCKET_PORT=0 vite --port 3000", + "build": "vite build", + "preview": "vite preview", + "test": "vitest" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.7.0", + "jsdom": "^26.1.0", + "vite": "^6.3.6", + "vitest": "^3.0.7" + } +} diff --git a/BACKUPS/FIRST_PHASE/src/App.css b/BACKUPS/FIRST_PHASE/src/App.css new file mode 100644 index 000000000..f73ff0f34 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/App.css @@ -0,0 +1,387 @@ +.trading-dashboard { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; +} + +.dashboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; + padding-bottom: 20px; + border-bottom: 2px solid #e0e0e0; +} + +.dashboard-header h1 { + margin: 0; + color: #333; + font-size: 2rem; +} + +.vendor-selector { + padding: 8px 16px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; + min-width: 150px; +} + +.tab-navigation { + display: flex; + gap: 4px; + margin-bottom: 20px; + border-bottom: 1px solid #e0e0e0; +} + +.tab { + padding: 12px 24px; + border: none; + background: none; + cursor: pointer; + font-size: 14px; + font-weight: 500; + color: #666; + border-bottom: 3px solid transparent; + transition: all 0.2s ease; +} + +.tab:hover { + color: #333; + background-color: #f5f5f5; +} + +.tab.active { + color: #007acc; + border-bottom-color: #007acc; +} + +.dashboard-content { + min-height: 400px; +} + +.tab-content { + padding: 20px; + background: #f9f9f9; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.tab-content h2 { + margin-top: 0; + color: #333; +} + +.error-boundary { + padding: 20px; + background: #fff3cd; + border: 1px solid #ffeaa7; + border-radius: 8px; + text-align: center; +} + +.error-boundary h3 { + color: #856404; + margin-top: 0; +} + +.error-boundary button { + padding: 8px 16px; + background: #007acc; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + margin-top: 10px; +} + +.error-boundary button:hover { + background: #005a9e; +} + +.fetch-controls, .analytics-controls, .bulk-controls { + background: white; + padding: 20px; + border-radius: 8px; + border: 1px solid #e0e0e0; + margin-bottom: 20px; +} + +.control-row { + display: flex; + gap: 15px; + margin-bottom: 15px; + flex-wrap: wrap; +} + +.control-group { + flex: 1; + min-width: 150px; +} + +.control-group label { + display: block; + margin-bottom: 5px; + font-weight: 500; + font-size: 14px; +} + +.control-group input, .control-group select { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +.control-group input[type="checkbox"] { + width: auto; + margin-right: 8px; +} + +.fetch-btn { + background: #007acc; + color: white; + border: none; + padding: 12px 24px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + font-weight: 500; + width: 100%; + margin-top: 10px; +} + +.fetch-btn:disabled { + background: #ccc; + cursor: not-allowed; +} + +.fetch-btn:hover:not(:disabled) { + background: #005a9e; +} + +.quote-display { + background: white; + padding: 20px; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.price-info { + display: flex; + align-items: center; + gap: 15px; + margin: 10px 0; +} + +.price { + font-size: 2rem; + font-weight: bold; + color: #333; +} + +.change.positive { + color: #28a745; +} + +.change.negative { + color: #dc3545; +} + +.historical-summary { + background: #f8f9fa; + padding: 15px; + border-radius: 6px; + margin-top: 15px; +} + +.historical-summary p { + margin: 5px 0; + font-size: 14px; +} + +.analytics-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 15px; + margin-top: 20px; +} + +.metric { + background: white; + padding: 15px; + border-radius: 6px; + border: 1px solid #e0e0e0; + text-align: center; +} + +.metric label { + display: block; + font-size: 12px; + color: #666; + margin-bottom: 5px; +} + +.metric span { + font-size: 16px; + font-weight: bold; +} + +.volatility.high, .recommendation.sell { + color: #dc3545; +} + +.volatility.medium, .recommendation.hold { + color: #ffc107; +} + +.volatility.low, .recommendation.buy, .trend.up { + color: #28a745; +} + +.trend.down { + color: #dc3545; +} + +.bulk-downloader { + margin-top: 30px; + padding: 20px; + background: white; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.download-results { + margin-top: 15px; + padding: 10px; + background: #d4edda; + border: 1px solid #c3e6cb; + border-radius: 4px; + color: #155724; +} + +.admin-nav { + display: flex; + gap: 10px; + margin-bottom: 20px; +} + +.admin-btn { + padding: 8px 16px; + border: 1px solid #ddd; + background: white; + cursor: pointer; + border-radius: 4px; +} + +.admin-btn.active { + background: #007acc; + color: white; + border-color: #007acc; +} + +.code-viewer { + background: white; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.code-tabs { + display: flex; + border-bottom: 1px solid #e0e0e0; +} + +.code-tab { + padding: 12px 20px; + border: none; + background: none; + cursor: pointer; + border-bottom: 3px solid transparent; +} + +.code-tab.active { + background: #f8f9fa; + border-bottom-color: #007acc; +} + +.code-display { + padding: 20px; +} + +.code-block { + background: #f8f9fa; + padding: 15px; + border-radius: 6px; + overflow-x: auto; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; + font-size: 13px; + line-height: 1.4; + border: 1px solid #e9ecef; +} + +.vendor-status { + background: white; + padding: 20px; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.status-btn { + background: #28a745; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + margin-bottom: 20px; +} + +.status-grid { + display: grid; + gap: 15px; +} + +.status-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + background: #f8f9fa; + border-radius: 4px; +} + +.status-item label { + font-weight: 500; +} + +.connected { + color: #28a745; +} + +.disconnected { + color: #dc3545; +} + +.capabilities { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.capability { + padding: 4px 8px; + border-radius: 4px; + font-size: 12px; +} + +.capability.enabled { + background: #d4edda; + color: #155724; +} + +.capability.disabled { + background: #f8d7da; + color: #721c24; +} \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/App.jsx b/BACKUPS/FIRST_PHASE/src/App.jsx new file mode 100644 index 000000000..f3a1bf21a --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/App.jsx @@ -0,0 +1,24 @@ +import React, { useEffect } from 'react'; +import './App.css'; +import TradingDashboard from './components/TradingDashboard'; +import VendorManager from './core/VendorManager'; +import ExampleVendorA from './vendors/ExampleVendorA'; +import ExampleVendorB from './vendors/ExampleVendorB'; +import YFinanceVendor from './vendors/YFinanceVendor'; + +function App() { + useEffect(() => { + // Register vendors on app startup + VendorManager.registerVendor('vendorA', new ExampleVendorA()); + VendorManager.registerVendor('vendorB', new ExampleVendorB()); + VendorManager.registerVendor('yfinance', new YFinanceVendor()); + }, []); + + return ( +
+ +
+ ); +} + +export default App; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/App.test.jsx b/BACKUPS/FIRST_PHASE/src/App.test.jsx new file mode 100644 index 000000000..5e9824933 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/App.test.jsx @@ -0,0 +1,9 @@ +import { expect, test } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeDefined(); +}); diff --git a/BACKUPS/FIRST_PHASE/src/components/AdminComponents.jsx b/BACKUPS/FIRST_PHASE/src/components/AdminComponents.jsx new file mode 100644 index 000000000..c1dfce7d8 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/components/AdminComponents.jsx @@ -0,0 +1,291 @@ +import React, { useState } from 'react'; +import VendorManager from '../core/VendorManager'; + +export const CodeViewer = ({ vendor }) => { + const [activeCode, setActiveCode] = useState('fetch'); + + const codeExamples = { + fetch: { + title: 'Data Fetching Code', + code: `// Market Data Fetch +const fetchMarketData = async (symbol, interval = '1d') => { + const url = \`https://query1.finance.yahoo.com/v8/finance/chart/\${symbol}?interval=\${interval}&range=1d\`; + const response = await fetch(url); + const data = await response.json(); + return parseYahooResponse(data, symbol); +}; + +// Historical Data Fetch +const fetchHistoricalData = async (symbol, interval, period) => { + const url = \`https://query1.finance.yahoo.com/v8/finance/chart/\${symbol}?interval=\${interval}&range=\${period}\`; + const response = await fetch(url); + const data = await response.json(); + return parseHistoricalData(data, symbol); +}; + +// Bulk Download +const bulkDownload = async (symbols, intervals, options) => { + const results = {}; + const batchSize = options.batchSize || 10; + + for (let i = 0; i < symbols.length; i += batchSize) { + const batch = symbols.slice(i, i + batchSize); + + for (const symbol of batch) { + for (const interval of intervals) { + const data = await fetchHistoricalData(symbol, interval, options.period); + if (!results[symbol]) results[symbol] = {}; + results[symbol][interval] = data; + } + } + + // Rate limiting + if (i + batchSize < symbols.length) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + + return results; +};` + }, + parser: { + title: 'Data Parser Code', + code: `// Yahoo Response Parser +const parseYahooResponse = (data, symbol) => { + const chart = data.chart?.result?.[0]; + const meta = chart.meta; + const quote = chart.indicators?.quote?.[0]; + + return { + symbol, + price: meta.regularMarketPrice || 0, + change: (meta.regularMarketPrice - meta.previousClose) || 0, + changePercent: ((meta.regularMarketPrice - meta.previousClose) / meta.previousClose * 100) || 0, + volume: meta.regularMarketVolume || 0, + high: quote?.high?.[quote.high.length - 1] || meta.regularMarketDayHigh, + low: quote?.low?.[quote.low.length - 1] || meta.regularMarketDayLow, + open: quote?.open?.[0] || meta.regularMarketDayLow, + previousClose: meta.previousClose || 0, + timestamp: Date.now() + }; +}; + +// Historical Data Parser +const parseHistoricalData = (data, symbol) => { + const chart = data.chart?.result?.[0]; + const timestamps = chart.timestamp || []; + const quote = chart.indicators?.quote?.[0] || {}; + + return { + symbol, + data: timestamps.map((ts, i) => ({ + timestamp: new Date(ts * 1000).toISOString(), + open: quote.open?.[i] || null, + high: quote.high?.[i] || null, + low: quote.low?.[i] || null, + close: quote.close?.[i] || null, + volume: quote.volume?.[i] || null + })).filter(item => item.close !== null) + }; +};` + }, + analytics: { + title: 'Analytics Code', + code: `// Volatility Calculator +const calculateVolatility = (dailyData, weeklyData) => { + const dailyChange = Math.abs(dailyData.changePercent || 0); + const weeklyChange = Math.abs(weeklyData.changePercent || 0); + + if (dailyChange > 5 || weeklyChange > 15) return 'HIGH'; + if (dailyChange > 2 || weeklyChange > 8) return 'MEDIUM'; + return 'LOW'; +}; + +// Recommendation Generator +const generateRecommendation = (data) => { + const { changePercent, volume, pe } = data; + + let score = 0; + if (changePercent > 2) score += 1; + if (changePercent < -2) score -= 1; + if (volume > 1000000) score += 0.5; + if (pe && pe < 15) score += 0.5; + if (pe && pe > 30) score -= 0.5; + + if (score > 1) return 'BUY'; + if (score < -1) return 'SELL'; + return 'HOLD'; +}; + +// Analytics Fetch +const getAnalytics = async (symbol, timeframe = '1mo') => { + const [daily, weekly] = await Promise.all([ + getMarketData(symbol, '1d'), + getMarketData(symbol, '1wk') + ]); + + return { + symbol, + price: daily.data.price, + change: daily.data.change, + changePercent: daily.data.changePercent, + volume: daily.data.volume, + volatility: calculateVolatility(daily.data, weekly.data), + weeklyTrend: weekly.data.change > 0 ? 'UP' : 'DOWN', + recommendation: generateRecommendation(daily.data) + }; +};` + }, + vendor: { + title: 'Vendor Adapter Code', + code: `// YFinance Vendor Class +class YFinanceVendor extends BaseVendorAdapter { + constructor(config = {}) { + super('Yahoo Finance', { + baseUrl: 'https://query1.finance.yahoo.com/v8/finance/chart/', + intervals: ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo'], + ...config + }); + this.cache = new Map(); + this.cacheTimeout = 30000; // 30 seconds + } + + getCapabilities() { + return { + marketData: true, + orderManagement: false, + portfolio: false, + analytics: true, + realtime: true + }; + } + + async connect() { + try { + const testResult = await this.getMarketData('AAPL'); + this.isConnected = testResult.success; + return { success: this.isConnected }; + } catch (error) { + return this.handleError(error, 'connect'); + } + } + + async getMarketData(symbol, interval = '1d') { + try { + const cacheKey = \`\${symbol}_\${interval}\`; + const cached = this.cache.get(cacheKey); + + if (cached && Date.now() - cached.timestamp < this.cacheTimeout) { + return { success: true, data: cached.data }; + } + + const url = \`\${this.config.baseUrl}\${symbol}?interval=\${interval}&range=1d\`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(\`HTTP \${response.status}: \${response.statusText}\`); + } + + const data = await response.json(); + const result = this.parseYahooResponse(data, symbol); + + this.cache.set(cacheKey, { + data: result, + timestamp: Date.now() + }); + + return { success: true, data: result }; + } catch (error) { + return this.handleError(error, 'getMarketData'); + } + } +}` + } + }; + + return ( +
+
+ {Object.entries(codeExamples).map(([key, example]) => ( + + ))} +
+ +
+

{codeExamples[activeCode].title}

+
+          {codeExamples[activeCode].code}
+        
+
+
+ ); +}; + +export const VendorStatus = ({ vendor }) => { + const [status, setStatus] = useState(null); + + const checkStatus = async () => { + try { + const vendorInstance = VendorManager.getVendor(vendor); + const capabilities = VendorManager.getVendorCapabilities(vendor); + + setStatus({ + name: vendorInstance?.name || 'Unknown', + connected: vendorInstance?.isConnected || false, + capabilities, + cacheSize: vendorInstance?.cache?.size || 0 + }); + } catch (error) { + setStatus({ error: error.message }); + } + }; + + return ( +
+ + + {status && ( +
+ {status.error ? ( +
Error: {status.error}
+ ) : ( +
+
+ + {status.name} +
+
+ + + {status.connected ? 'Connected' : 'Disconnected'} + +
+
+ + {status.cacheSize} items +
+
+ +
+ {Object.entries(status.capabilities).map(([cap, enabled]) => ( + + {cap}: {enabled ? '✓' : '✗'} + + ))} +
+
+
+ )} +
+ )} +
+ ); +}; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/components/ErrorBoundary.jsx b/BACKUPS/FIRST_PHASE/src/components/ErrorBoundary.jsx new file mode 100644 index 000000000..9028075a8 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/components/ErrorBoundary.jsx @@ -0,0 +1,34 @@ +import React from 'react'; + +class ErrorBoundary extends React.Component { + constructor(props) { + super(props); + this.state = { hasError: false, error: null }; + } + + static getDerivedStateFromError(error) { + return { hasError: true, error }; + } + + componentDidCatch(error, errorInfo) { + console.error('ErrorBoundary caught an error:', error, errorInfo); + } + + render() { + if (this.state.hasError) { + return ( +
+

Something went wrong

+

{this.props.fallbackMessage || 'This section is temporarily unavailable'}

+ +
+ ); + } + + return this.props.children; + } +} + +export default ErrorBoundary; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/components/TradingDashboard.jsx b/BACKUPS/FIRST_PHASE/src/components/TradingDashboard.jsx new file mode 100644 index 000000000..8b6db8b21 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/components/TradingDashboard.jsx @@ -0,0 +1,170 @@ +import React, { useState, useEffect } from 'react'; +import ErrorBoundary from './ErrorBoundary'; +import VendorManager from '../core/VendorManager'; +import { YFinanceMarketData, YFinanceAnalytics, YFinanceBulkDownloader } from './YFinanceComponents'; +import { CodeViewer, VendorStatus } from './AdminComponents'; + +const TradingDashboard = () => { + const [activeTab, setActiveTab] = useState('market'); + const [vendors, setVendors] = useState([]); + const [selectedVendor, setSelectedVendor] = useState(''); + + useEffect(() => { + setVendors(VendorManager.getAllVendors()); + if (VendorManager.getAllVendors().length > 0) { + setSelectedVendor(VendorManager.getAllVendors()[0]); + } + }, []); + + const tabs = [ + { id: 'market', label: 'Market Data', capability: 'marketData' }, + { id: 'orders', label: 'Orders', capability: 'orderManagement' }, + { id: 'portfolio', label: 'Portfolio', capability: 'portfolio' }, + { id: 'analytics', label: 'Analytics', capability: 'analytics' }, + { id: 'admin', label: 'Admin', capability: 'admin' } + ]; + + const getAvailableTabs = () => { + if (!selectedVendor) return []; + const capabilities = VendorManager.getVendorCapabilities(selectedVendor); + return tabs.filter(tab => tab.capability === 'admin' || capabilities[tab.capability]); + }; + + const renderTabContent = () => { + const availableTabs = getAvailableTabs(); + const currentTab = availableTabs.find(tab => tab.id === activeTab); + + if (!currentTab) { + return
Feature not available for selected vendor
; + } + + switch (activeTab) { + case 'market': + return ; + case 'orders': + return ; + case 'portfolio': + return ; + case 'analytics': + return ; + case 'admin': + return ; + default: + return
Select a tab
; + } + }; + + return ( +
+
+

Trading Dashboard

+ +
+ + + +
+ + {renderTabContent()} + +
+
+ ); +}; + +const MarketDataTab = ({ vendor }) => { + if (vendor === 'yfinance') { + return ( +
+

Market Data - Yahoo Finance

+ +
+ ); + } + return ( +
+

Market Data - {vendor}

+

Market data functionality for {vendor}

+
+ ); +}; + +const OrdersTab = ({ vendor }) => ( +
+

Order Management - {vendor}

+

Order management functionality for {vendor}

+
+); + +const PortfolioTab = ({ vendor }) => ( +
+

Portfolio - {vendor}

+

Portfolio functionality for {vendor}

+
+); + +const AnalyticsTab = ({ vendor }) => { + if (vendor === 'yfinance') { + return ( +
+

Analytics - Yahoo Finance

+ + +
+ ); + } + return ( +
+

Analytics - {vendor}

+

Analytics functionality for {vendor}

+
+ ); +}; + +const AdminTab = ({ vendor }) => { + const [activeAdmin, setActiveAdmin] = useState('code'); + + return ( +
+

Admin - {vendor}

+
+ + +
+ + {activeAdmin === 'code' && } + {activeAdmin === 'status' && } +
+ ); +}; + +export default TradingDashboard; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/components/YFinanceComponents.jsx b/BACKUPS/FIRST_PHASE/src/components/YFinanceComponents.jsx new file mode 100644 index 000000000..a9ece5aec --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/components/YFinanceComponents.jsx @@ -0,0 +1,339 @@ +import React, { useState, useEffect } from 'react'; +import VendorManager from '../core/VendorManager'; + +export const YFinanceMarketData = ({ vendor }) => { + const [symbol, setSymbol] = useState('AAPL'); + const [assetType, setAssetType] = useState('stocks'); + const [interval, setInterval] = useState('1d'); + const [period, setPeriod] = useState('1mo'); + const [customStart, setCustomStart] = useState(''); + const [customEnd, setCustomEnd] = useState(''); + const [useCustomRange, setUseCustomRange] = useState(false); + const [data, setData] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const assetTypes = { + stocks: { label: 'Stocks', examples: 'AAPL, GOOGL, MSFT' }, + forex: { label: 'Forex', examples: 'EURUSD=X, GBPUSD=X, USDJPY=X' }, + crypto: { label: 'Crypto', examples: 'BTC-USD, ETH-USD, ADA-USD' }, + commodities: { label: 'Commodities', examples: 'GC=F, CL=F, SI=F' }, + indices: { label: 'Indices', examples: '^GSPC, ^DJI, ^IXIC' } + }; + + const intervals = ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']; + const periods = ['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']; + + const fetchData = async () => { + if (!symbol.trim()) return; + + setLoading(true); + setError(null); + + try { + const fetchParams = { + symbol: symbol.toUpperCase(), + interval, + period: useCustomRange ? null : period, + start: useCustomRange ? customStart : null, + end: useCustomRange ? customEnd : null + }; + + const result = useCustomRange || period !== '1d' + ? await VendorManager.executeVendorMethod(vendor, 'getHistoricalData', fetchParams.symbol, fetchParams.interval, fetchParams.period || '1mo') + : await VendorManager.executeVendorMethod(vendor, 'getMarketData', fetchParams.symbol, fetchParams.interval); + + if (result.success) { + setData(result.data); + } else { + setError(result.error); + } + } catch (err) { + setError(err.message); + } finally { + setLoading(false); + } + }; + + return ( +
+
+
+
+ + +
+
+ + setSymbol(e.target.value)} + placeholder={assetTypes[assetType].examples} + onKeyPress={(e) => e.key === 'Enter' && fetchData()} + /> +
+
+ +
+
+ + +
+
+ +
+
+ + {useCustomRange ? ( +
+
+ + setCustomStart(e.target.value)} + /> +
+
+ + setCustomEnd(e.target.value)} + /> +
+
+ ) : ( +
+
+ + +
+
+ )} + + +
+ + {error &&
Error: {error}
} + + {data && ( +
+

{data.symbol}

+ {data.price ? ( +
+ ${data.price?.toFixed(2)} + = 0 ? 'positive' : 'negative'}`}> + {data.change >= 0 ? '+' : ''}{data.change?.toFixed(2)} + ({data.changePercent?.toFixed(2)}%) + +
+ ) : null} + {data.data && ( +
+

Historical data: {data.data.length} records

+

Latest: ${data.data[data.data.length - 1]?.close?.toFixed(2)}

+
+ )} +
+ )} +
+ ); +}; + +export const YFinanceAnalytics = ({ vendor }) => { + const [symbol, setSymbol] = useState('AAPL'); + const [timeframe, setTimeframe] = useState('1mo'); + const [analytics, setAnalytics] = useState(null); + const [loading, setLoading] = useState(false); + + const timeframes = ['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y']; + + const fetchAnalytics = async () => { + if (!symbol.trim()) return; + + setLoading(true); + try { + const result = await VendorManager.executeVendorMethod(vendor, 'getAnalytics', symbol.toUpperCase(), timeframe); + if (result.success) { + setAnalytics(result.data); + } + } catch (err) { + console.error('Analytics error:', err); + } finally { + setLoading(false); + } + }; + + return ( +
+
+
+ + setSymbol(e.target.value)} + placeholder="Enter symbol for analysis" + onKeyPress={(e) => e.key === 'Enter' && fetchAnalytics()} + /> +
+
+ + +
+ +
+ + {analytics && ( +
+

Analysis for {analytics.symbol} ({timeframe})

+
+
+ + ${analytics.price?.toFixed(2)} +
+
+ + + {analytics.volatility} + +
+
+ + + {analytics.weeklyTrend} + +
+
+ + + {analytics.recommendation} + +
+
+
+ )} +
+ ); +}; + +export const YFinanceBulkDownloader = ({ vendor }) => { + const [symbols, setSymbols] = useState('AAPL,GOOGL,MSFT'); + const [intervals, setIntervals] = useState(['1d']); + const [period, setPeriod] = useState('1mo'); + const [batchSize, setBatchSize] = useState(5); + const [downloading, setDownloading] = useState(false); + const [results, setResults] = useState(null); + + const availableIntervals = ['1m', '5m', '15m', '1h', '1d', '1wk', '1mo']; + const periods = ['1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', 'max']; + + const handleBulkDownload = async () => { + const symbolList = symbols.split(',').map(s => s.trim().toUpperCase()).filter(s => s); + if (symbolList.length === 0) return; + + setDownloading(true); + try { + const result = await VendorManager.executeVendorMethod( + vendor, + 'bulkDownload', + symbolList, + intervals, + { period, batchSize } + ); + setResults(result); + } catch (err) { + console.error('Bulk download error:', err); + } finally { + setDownloading(false); + } + }; + + return ( +
+

Bulk Historical Data Download

+
+
+ + setSymbols(e.target.value)} + placeholder="AAPL,GOOGL,MSFT,BTC-USD,EURUSD=X" + /> +
+
+
+ + +
+
+ + +
+
+ + setBatchSize(parseInt(e.target.value))} + min="1" + max="50" + /> +
+
+
+ + + {results && ( +
+
Download Complete
+

Downloaded data for {Object.keys(results.data || {}).length} symbols

+
+ )} +
+ ); +}; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/core/BaseVendorAdapter.js b/BACKUPS/FIRST_PHASE/src/core/BaseVendorAdapter.js new file mode 100644 index 000000000..f5f979cd7 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/core/BaseVendorAdapter.js @@ -0,0 +1,51 @@ +export class BaseVendorAdapter { + constructor(name, config = {}) { + this.name = name; + this.config = config; + this.isConnected = false; + } + + getCapabilities() { + return { + marketData: false, + orderManagement: false, + portfolio: false, + analytics: false, + realtime: false + }; + } + + async connect() { + throw new Error('connect() must be implemented by vendor adapter'); + } + + async disconnect() { + this.isConnected = false; + } + + async getMarketData(symbol) { + throw new Error('getMarketData() not implemented'); + } + + async placeOrder(orderData) { + throw new Error('placeOrder() not implemented'); + } + + async getPortfolio() { + throw new Error('getPortfolio() not implemented'); + } + + async getAnalytics(symbol) { + throw new Error('getAnalytics() not implemented'); + } + + handleError(error, context) { + console.error(`${this.name} Error in ${context}:`, error); + return { + success: false, + error: error.message, + vendor: this.name, + context + }; + } +} \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/core/VendorManager.js b/BACKUPS/FIRST_PHASE/src/core/VendorManager.js new file mode 100644 index 000000000..b4bafabc8 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/core/VendorManager.js @@ -0,0 +1,54 @@ +class VendorManager { + constructor() { + this.vendors = new Map(); + this.capabilities = new Map(); + } + + registerVendor(vendorId, vendorAdapter) { + try { + if (!vendorAdapter.name || !vendorAdapter.getCapabilities) { + throw new Error(`Invalid vendor adapter for ${vendorId}`); + } + + this.vendors.set(vendorId, vendorAdapter); + this.capabilities.set(vendorId, vendorAdapter.getCapabilities()); + return true; + } catch (error) { + console.error(`Failed to register vendor ${vendorId}:`, error); + return false; + } + } + + getVendor(vendorId) { + return this.vendors.get(vendorId); + } + + getVendorCapabilities(vendorId) { + return this.capabilities.get(vendorId) || {}; + } + + getAllVendors() { + return Array.from(this.vendors.keys()); + } + + getVendorsWithCapability(capability) { + return Array.from(this.vendors.keys()).filter(vendorId => + this.getVendorCapabilities(vendorId)[capability] + ); + } + + async executeVendorMethod(vendorId, method, ...args) { + try { + const vendor = this.getVendor(vendorId); + if (!vendor || !vendor[method]) { + throw new Error(`Method ${method} not available for vendor ${vendorId}`); + } + return await vendor[method](...args); + } catch (error) { + console.error(`Error executing ${method} for vendor ${vendorId}:`, error); + throw error; + } + } +} + +export default new VendorManager(); \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/index.css b/BACKUPS/FIRST_PHASE/src/index.css new file mode 100644 index 000000000..ec2585e8c --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/BACKUPS/FIRST_PHASE/src/index.jsx b/BACKUPS/FIRST_PHASE/src/index.jsx new file mode 100644 index 000000000..d563c0fb1 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/index.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/BACKUPS/FIRST_PHASE/src/logo.svg b/BACKUPS/FIRST_PHASE/src/logo.svg new file mode 100644 index 000000000..9dfc1c058 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/reportWebVitals.js b/BACKUPS/FIRST_PHASE/src/reportWebVitals.js new file mode 100644 index 000000000..5253d3ad9 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/BACKUPS/FIRST_PHASE/src/setupTests.js b/BACKUPS/FIRST_PHASE/src/setupTests.js new file mode 100644 index 000000000..8f2609b7b --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/BACKUPS/FIRST_PHASE/src/utils/VendorRegistry.js b/BACKUPS/FIRST_PHASE/src/utils/VendorRegistry.js new file mode 100644 index 000000000..cb45320c8 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/utils/VendorRegistry.js @@ -0,0 +1,56 @@ +import VendorManager from '../core/VendorManager'; + +export const registerNewVendor = (vendorId, VendorClass, config = {}) => { + try { + const vendorInstance = new VendorClass(config); + const success = VendorManager.registerVendor(vendorId, vendorInstance); + + if (success) { + console.log(`✅ Vendor ${vendorId} registered successfully`); + return true; + } else { + console.error(`❌ Failed to register vendor ${vendorId}`); + return false; + } + } catch (error) { + console.error(`❌ Error registering vendor ${vendorId}:`, error); + return false; + } +}; + +export const getVendorInfo = (vendorId) => { + const vendor = VendorManager.getVendor(vendorId); + const capabilities = VendorManager.getVendorCapabilities(vendorId); + + return { + exists: !!vendor, + name: vendor?.name || 'Unknown', + capabilities, + isConnected: vendor?.isConnected || false + }; +}; + +export const testVendor = async (vendorId) => { + try { + const vendor = VendorManager.getVendor(vendorId); + if (!vendor) { + return { success: false, error: 'Vendor not found' }; + } + + const connectionResult = await vendor.connect(); + const capabilities = vendor.getCapabilities(); + + return { + success: true, + connection: connectionResult, + capabilities, + vendor: vendor.name + }; + } catch (error) { + return { + success: false, + error: error.message, + vendor: vendorId + }; + } +}; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorA.js b/BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorA.js new file mode 100644 index 000000000..46f8cdd42 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorA.js @@ -0,0 +1,76 @@ +import { BaseVendorAdapter } from '../core/BaseVendorAdapter'; + +class ExampleVendorA extends BaseVendorAdapter { + constructor() { + super('Vendor A', { + apiUrl: 'https://api.vendora.com', + apiKey: 'your-api-key' + }); + } + + getCapabilities() { + return { + marketData: true, + orderManagement: true, + portfolio: true, + analytics: false, + realtime: true + }; + } + + async connect() { + try { + this.isConnected = true; + return { success: true }; + } catch (error) { + return this.handleError(error, 'connect'); + } + } + + async getMarketData(symbol) { + try { + return { + success: true, + data: { + symbol, + price: Math.random() * 100, + change: Math.random() * 10 - 5, + volume: Math.floor(Math.random() * 1000000) + } + }; + } catch (error) { + return this.handleError(error, 'getMarketData'); + } + } + + async placeOrder(orderData) { + try { + return { + success: true, + orderId: `VA_${Date.now()}`, + status: 'pending' + }; + } catch (error) { + return this.handleError(error, 'placeOrder'); + } + } + + async getPortfolio() { + try { + return { + success: true, + data: { + totalValue: 50000, + positions: [ + { symbol: 'AAPL', quantity: 10, value: 1500 }, + { symbol: 'GOOGL', quantity: 5, value: 12500 } + ] + } + }; + } catch (error) { + return this.handleError(error, 'getPortfolio'); + } + } +} + +export default ExampleVendorA; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorB.js b/BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorB.js new file mode 100644 index 000000000..66167fc33 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/vendors/ExampleVendorB.js @@ -0,0 +1,66 @@ +import { BaseVendorAdapter } from '../core/BaseVendorAdapter'; + +class ExampleVendorB extends BaseVendorAdapter { + constructor() { + super('Vendor B', { + baseUrl: 'https://vendorb-api.com/v2', + token: 'bearer-token' + }); + } + + getCapabilities() { + return { + marketData: true, + orderManagement: false, + portfolio: false, + analytics: true, + realtime: false + }; + } + + async connect() { + try { + this.isConnected = true; + return { success: true }; + } catch (error) { + return this.handleError(error, 'connect'); + } + } + + async getMarketData(symbol) { + try { + return { + success: true, + data: { + symbol, + price: Math.random() * 200, + bid: Math.random() * 190, + ask: Math.random() * 210, + timestamp: Date.now() + } + }; + } catch (error) { + return this.handleError(error, 'getMarketData'); + } + } + + async getAnalytics(symbol) { + try { + return { + success: true, + data: { + symbol, + rsi: Math.random() * 100, + macd: Math.random() * 5 - 2.5, + sma20: Math.random() * 150, + sma50: Math.random() * 140, + recommendation: ['BUY', 'SELL', 'HOLD'][Math.floor(Math.random() * 3)] + } + }; + } catch (error) { + return this.handleError(error, 'getAnalytics'); + } + } +} + +export default ExampleVendorB; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/vendors/VendorTemplate.js b/BACKUPS/FIRST_PHASE/src/vendors/VendorTemplate.js new file mode 100644 index 000000000..c411953db --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/vendors/VendorTemplate.js @@ -0,0 +1,141 @@ +import { BaseVendorAdapter } from '../core/BaseVendorAdapter'; + +/** + * Template for creating new vendor adapters + * Copy this file and implement your vendor-specific logic + */ +class VendorTemplate extends BaseVendorAdapter { + constructor(config = {}) { + super('Vendor Name', { + apiUrl: config.apiUrl || '', + apiKey: config.apiKey || '', + ...config + }); + } + + /** + * Define what this vendor can do + * Set to true only for features this vendor supports + */ + getCapabilities() { + return { + marketData: false, + orderManagement: false, + portfolio: false, + analytics: false, + realtime: false + }; + } + + /** + * Connect to vendor API + */ + async connect() { + try { + // TODO: Implement your connection logic + // Example: await fetch(this.config.apiUrl + '/connect') + + this.isConnected = true; + return { success: true }; + } catch (error) { + return this.handleError(error, 'connect'); + } + } + + /** + * Get market data for a symbol + * Only implement if marketData capability is true + */ + async getMarketData(symbol) { + try { + // TODO: Implement your market data API call + // Example: + // const response = await fetch(`${this.config.apiUrl}/market/${symbol}`); + // const data = await response.json(); + + return { + success: true, + data: { + symbol, + price: 0, + change: 0, + volume: 0 + } + }; + } catch (error) { + return this.handleError(error, 'getMarketData'); + } + } + + /** + * Place an order + * Only implement if orderManagement capability is true + */ + async placeOrder(orderData) { + try { + // TODO: Implement your order placement logic + + return { + success: true, + orderId: '', + status: 'pending' + }; + } catch (error) { + return this.handleError(error, 'placeOrder'); + } + } + + /** + * Get portfolio data + * Only implement if portfolio capability is true + */ + async getPortfolio() { + try { + // TODO: Implement your portfolio API call + + return { + success: true, + data: { + totalValue: 0, + positions: [] + } + }; + } catch (error) { + return this.handleError(error, 'getPortfolio'); + } + } + + /** + * Get analytics for a symbol + * Only implement if analytics capability is true + */ + async getAnalytics(symbol) { + try { + // TODO: Implement your analytics API call + + return { + success: true, + data: { + symbol, + indicators: {} + } + }; + } catch (error) { + return this.handleError(error, 'getAnalytics'); + } + } + + /** + * Add any custom methods your vendor needs + */ + async customMethod() { + try { + // Your custom implementation + return { success: true }; + } catch (error) { + return this.handleError(error, 'customMethod'); + } + } +} + +export default VendorTemplate; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/src/vendors/YFinanceVendor.js b/BACKUPS/FIRST_PHASE/src/vendors/YFinanceVendor.js new file mode 100644 index 000000000..963720653 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/src/vendors/YFinanceVendor.js @@ -0,0 +1,232 @@ +import { BaseVendorAdapter } from '../core/BaseVendorAdapter'; + +class YFinanceVendor extends BaseVendorAdapter { + constructor(config = {}) { + super('Yahoo Finance', { + baseUrl: 'https://query1.finance.yahoo.com/v8/finance/chart/', + intervals: ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo'], + ...config + }); + this.cache = new Map(); + this.cacheTimeout = 30000; // 30 seconds + } + + getCapabilities() { + return { + marketData: true, + orderManagement: false, + portfolio: false, + analytics: true, + realtime: true + }; + } + + async connect() { + try { + // Test connection with a simple quote + const testResult = await this.getMarketData('AAPL'); + this.isConnected = testResult.success; + return { success: this.isConnected }; + } catch (error) { + return this.handleError(error, 'connect'); + } + } + + async getMarketData(symbol, interval = '1d') { + try { + const cacheKey = `${symbol}_${interval}`; + const cached = this.cache.get(cacheKey); + + if (cached && Date.now() - cached.timestamp < this.cacheTimeout) { + return { success: true, data: cached.data }; + } + + // Use Yahoo Finance API directly (simplified version of the Python script logic) + const url = `${this.config.baseUrl}${symbol}?interval=${interval}&range=1d`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + const result = this.parseYahooResponse(data, symbol); + + // Cache the result + this.cache.set(cacheKey, { + data: result, + timestamp: Date.now() + }); + + return { success: true, data: result }; + } catch (error) { + return this.handleError(error, 'getMarketData'); + } + } + + async getHistoricalData(symbol, interval = '1d', period = '1mo') { + try { + const url = `${this.config.baseUrl}${symbol}?interval=${interval}&range=${period}`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + return { + success: true, + data: this.parseHistoricalData(data, symbol) + }; + } catch (error) { + return this.handleError(error, 'getHistoricalData'); + } + } + + async getAnalytics(symbol) { + try { + // Get multiple timeframes for analytics + const [daily, weekly] = await Promise.all([ + this.getMarketData(symbol, '1d'), + this.getMarketData(symbol, '1wk') + ]); + + if (!daily.success || !weekly.success) { + throw new Error('Failed to fetch data for analytics'); + } + + return { + success: true, + data: { + symbol, + price: daily.data.price, + change: daily.data.change, + changePercent: daily.data.changePercent, + volume: daily.data.volume, + marketCap: daily.data.marketCap, + pe: daily.data.pe, + weeklyTrend: weekly.data.change > 0 ? 'UP' : 'DOWN', + volatility: this.calculateVolatility(daily.data, weekly.data), + recommendation: this.generateRecommendation(daily.data) + } + }; + } catch (error) { + return this.handleError(error, 'getAnalytics'); + } + } + + parseYahooResponse(data, symbol) { + try { + const chart = data.chart?.result?.[0]; + if (!chart) { + throw new Error('Invalid response format'); + } + + const meta = chart.meta; + const quote = chart.indicators?.quote?.[0]; + + return { + symbol, + price: meta.regularMarketPrice || 0, + change: (meta.regularMarketPrice - meta.previousClose) || 0, + changePercent: ((meta.regularMarketPrice - meta.previousClose) / meta.previousClose * 100) || 0, + volume: meta.regularMarketVolume || 0, + marketCap: meta.marketCap || null, + pe: meta.trailingPE || null, + high: quote?.high?.[quote.high.length - 1] || meta.regularMarketDayHigh, + low: quote?.low?.[quote.low.length - 1] || meta.regularMarketDayLow, + open: quote?.open?.[0] || meta.regularMarketDayLow, + previousClose: meta.previousClose || 0, + timestamp: Date.now() + }; + } catch (error) { + throw new Error(`Failed to parse Yahoo response: ${error.message}`); + } + } + + parseHistoricalData(data, symbol) { + try { + const chart = data.chart?.result?.[0]; + if (!chart) { + throw new Error('Invalid historical data format'); + } + + const timestamps = chart.timestamp || []; + const quote = chart.indicators?.quote?.[0] || {}; + + return { + symbol, + data: timestamps.map((ts, i) => ({ + timestamp: new Date(ts * 1000).toISOString(), + open: quote.open?.[i] || null, + high: quote.high?.[i] || null, + low: quote.low?.[i] || null, + close: quote.close?.[i] || null, + volume: quote.volume?.[i] || null + })).filter(item => item.close !== null) + }; + } catch (error) { + throw new Error(`Failed to parse historical data: ${error.message}`); + } + } + + calculateVolatility(dailyData, weeklyData) { + // Simple volatility calculation + const dailyChange = Math.abs(dailyData.changePercent || 0); + const weeklyChange = Math.abs(weeklyData.changePercent || 0); + + if (dailyChange > 5 || weeklyChange > 15) return 'HIGH'; + if (dailyChange > 2 || weeklyChange > 8) return 'MEDIUM'; + return 'LOW'; + } + + generateRecommendation(data) { + const { changePercent, volume, pe } = data; + + let score = 0; + if (changePercent > 2) score += 1; + if (changePercent < -2) score -= 1; + if (volume > 1000000) score += 0.5; + if (pe && pe < 15) score += 0.5; + if (pe && pe > 30) score -= 0.5; + + if (score > 1) return 'BUY'; + if (score < -1) return 'SELL'; + return 'HOLD'; + } + + // Bulk download method (adapted from Python script) + async bulkDownload(symbols, intervals = ['1d'], options = {}) { + try { + const results = {}; + const batchSize = options.batchSize || 10; + + for (let i = 0; i < symbols.length; i += batchSize) { + const batch = symbols.slice(i, i + batchSize); + + for (const symbol of batch) { + for (const interval of intervals) { + try { + const data = await this.getHistoricalData(symbol, interval, options.period || '1mo'); + if (!results[symbol]) results[symbol] = {}; + results[symbol][interval] = data; + } catch (error) { + console.warn(`Failed to download ${symbol} ${interval}:`, error); + } + } + } + + // Rate limiting (like the Python script) + if (i + batchSize < symbols.length) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + + return { success: true, data: results }; + } catch (error) { + return this.handleError(error, 'bulkDownload'); + } + } +} + +export default YFinanceVendor; \ No newline at end of file diff --git a/BACKUPS/FIRST_PHASE/vite.config.js b/BACKUPS/FIRST_PHASE/vite.config.js new file mode 100644 index 000000000..248c2f847 --- /dev/null +++ b/BACKUPS/FIRST_PHASE/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + test: { + globals: true, + environment: 'jsdom', + }, +}) diff --git a/BACKUPS/SECOND_PHASE/README_SECOND_PHASE.md b/BACKUPS/SECOND_PHASE/README_SECOND_PHASE.md new file mode 100644 index 000000000..5b5303469 --- /dev/null +++ b/BACKUPS/SECOND_PHASE/README_SECOND_PHASE.md @@ -0,0 +1,37 @@ +# SECOND PHASE BACKUP + +**Date:** $(date) +**Status:** LOCKED - Working State with Code Editor + +## Features Added in Second Phase: +- ✅ Code Refactoring Capability +- ✅ Live Code Editor in Admin Tab +- ✅ Version History (5 versions per code section) +- ✅ Edit/View Mode Toggle +- ✅ One-click Revert System +- ✅ Safe Non-destructive Editing + +## All First Phase Features: +- ✅ Vendor Management System +- ✅ YFinance Integration +- ✅ Trading Dashboard with Tabs +- ✅ Market Data Fetching +- ✅ Analytics & Bulk Download +- ✅ Admin Tab with Code Viewer +- ✅ Error Boundaries +- ✅ Fault Isolation + +## New Components: +- src/components/CodeEditor.jsx + +## Restore Instructions: +```bash +# To restore this phase: +rm -rf src/ +cp -r BACKUPS/SECOND_PHASE/src/ ./ +cp BACKUPS/SECOND_PHASE/package.json ./ +cp BACKUPS/SECOND_PHASE/vite.config.js ./ +cp BACKUPS/SECOND_PHASE/index.html ./ +``` + +**⚠️ DO NOT MODIFY THIS BACKUP ⚠️** \ No newline at end of file diff --git a/BACKUPS/SECOND_PHASE/index.html b/BACKUPS/SECOND_PHASE/index.html new file mode 100644 index 000000000..452ca1f32 --- /dev/null +++ b/BACKUPS/SECOND_PHASE/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + React App + + + +
+ + + + diff --git a/BACKUPS/SECOND_PHASE/package.json b/BACKUPS/SECOND_PHASE/package.json new file mode 100644 index 000000000..5e1b6b8c4 --- /dev/null +++ b/BACKUPS/SECOND_PHASE/package.json @@ -0,0 +1,49 @@ +{ + "name": "codespaces-react", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "web-vitals": "^3.1.0" + }, + "overrides": { + "@svgr/webpack": "^8.0.1", + "@adobe/css-tools": "^4.3.1", + "postcss": "^8.4.31" + }, + "scripts": { + "start": "BROWSER=none WDS_SOCKET_PORT=0 vite --port 3000", + "build": "vite build", + "preview": "vite preview", + "test": "vitest" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.7.0", + "jsdom": "^26.1.0", + "vite": "^6.3.6", + "vitest": "^3.0.7" + } +} diff --git a/BACKUPS/SECOND_PHASE/src/App.css b/BACKUPS/SECOND_PHASE/src/App.css new file mode 100644 index 000000000..f7e4a489b --- /dev/null +++ b/BACKUPS/SECOND_PHASE/src/App.css @@ -0,0 +1,488 @@ +.trading-dashboard { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; +} + +.dashboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; + padding-bottom: 20px; + border-bottom: 2px solid #e0e0e0; +} + +.dashboard-header h1 { + margin: 0; + color: #333; + font-size: 2rem; +} + +.vendor-selector { + padding: 8px 16px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; + min-width: 150px; +} + +.tab-navigation { + display: flex; + gap: 4px; + margin-bottom: 20px; + border-bottom: 1px solid #e0e0e0; +} + +.tab { + padding: 12px 24px; + border: none; + background: none; + cursor: pointer; + font-size: 14px; + font-weight: 500; + color: #666; + border-bottom: 3px solid transparent; + transition: all 0.2s ease; +} + +.tab:hover { + color: #333; + background-color: #f5f5f5; +} + +.tab.active { + color: #007acc; + border-bottom-color: #007acc; +} + +.dashboard-content { + min-height: 400px; +} + +.tab-content { + padding: 20px; + background: #f9f9f9; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.tab-content h2 { + margin-top: 0; + color: #333; +} + +.error-boundary { + padding: 20px; + background: #fff3cd; + border: 1px solid #ffeaa7; + border-radius: 8px; + text-align: center; +} + +.error-boundary h3 { + color: #856404; + margin-top: 0; +} + +.error-boundary button { + padding: 8px 16px; + background: #007acc; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + margin-top: 10px; +} + +.error-boundary button:hover { + background: #005a9e; +} + +.fetch-controls, .analytics-controls, .bulk-controls { + background: white; + padding: 20px; + border-radius: 8px; + border: 1px solid #e0e0e0; + margin-bottom: 20px; +} + +.control-row { + display: flex; + gap: 15px; + margin-bottom: 15px; + flex-wrap: wrap; +} + +.control-group { + flex: 1; + min-width: 150px; +} + +.control-group label { + display: block; + margin-bottom: 5px; + font-weight: 500; + font-size: 14px; +} + +.control-group input, .control-group select { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +.control-group input[type="checkbox"] { + width: auto; + margin-right: 8px; +} + +.fetch-btn { + background: #007acc; + color: white; + border: none; + padding: 12px 24px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + font-weight: 500; + width: 100%; + margin-top: 10px; +} + +.fetch-btn:disabled { + background: #ccc; + cursor: not-allowed; +} + +.fetch-btn:hover:not(:disabled) { + background: #005a9e; +} + +.quote-display { + background: white; + padding: 20px; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.price-info { + display: flex; + align-items: center; + gap: 15px; + margin: 10px 0; +} + +.price { + font-size: 2rem; + font-weight: bold; + color: #333; +} + +.change.positive { + color: #28a745; +} + +.change.negative { + color: #dc3545; +} + +.historical-summary { + background: #f8f9fa; + padding: 15px; + border-radius: 6px; + margin-top: 15px; +} + +.historical-summary p { + margin: 5px 0; + font-size: 14px; +} + +.analytics-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 15px; + margin-top: 20px; +} + +.metric { + background: white; + padding: 15px; + border-radius: 6px; + border: 1px solid #e0e0e0; + text-align: center; +} + +.metric label { + display: block; + font-size: 12px; + color: #666; + margin-bottom: 5px; +} + +.metric span { + font-size: 16px; + font-weight: bold; +} + +.volatility.high, .recommendation.sell { + color: #dc3545; +} + +.volatility.medium, .recommendation.hold { + color: #ffc107; +} + +.volatility.low, .recommendation.buy, .trend.up { + color: #28a745; +} + +.trend.down { + color: #dc3545; +} + +.bulk-downloader { + margin-top: 30px; + padding: 20px; + background: white; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.download-results { + margin-top: 15px; + padding: 10px; + background: #d4edda; + border: 1px solid #c3e6cb; + border-radius: 4px; + color: #155724; +} + +.admin-nav { + display: flex; + gap: 10px; + margin-bottom: 20px; +} + +.admin-btn { + padding: 8px 16px; + border: 1px solid #ddd; + background: white; + cursor: pointer; + border-radius: 4px; +} + +.admin-btn.active { + background: #007acc; + color: white; + border-color: #007acc; +} + +.code-viewer { + background: white; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.code-tabs { + display: flex; + border-bottom: 1px solid #e0e0e0; +} + +.code-tab { + padding: 12px 20px; + border: none; + background: none; + cursor: pointer; + border-bottom: 3px solid transparent; +} + +.code-tab.active { + background: #f8f9fa; + border-bottom-color: #007acc; +} + +.code-display { + padding: 20px; +} + +.code-block { + background: #f8f9fa; + padding: 15px; + border-radius: 6px; + overflow-x: auto; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; + font-size: 13px; + line-height: 1.4; + border: 1px solid #e9ecef; +} + +.vendor-status { + background: white; + padding: 20px; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.status-btn { + background: #28a745; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + margin-bottom: 20px; +} + +.status-grid { + display: grid; + gap: 15px; +} + +.status-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + background: #f8f9fa; + border-radius: 4px; +} + +.status-item label { + font-weight: 500; +} + +.connected { + color: #28a745; +} + +.disconnected { + color: #dc3545; +} + +.capabilities { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.capability { + padding: 4px 8px; + border-radius: 4px; + font-size: 12px; +} + +.capability.enabled { + background: #d4edda; + color: #155724; +} + +.capability.disabled { + background: #f8d7da; + color: #721c24; +} + +.code-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #e0e0e0; +} + +.edit-toggle { + padding: 6px 12px; + border: 1px solid #007acc; + background: white; + color: #007acc; + cursor: pointer; + border-radius: 4px; + margin: 10px; + font-size: 12px; +} + +.edit-toggle.active { + background: #007acc; + color: white; +} + +.code-editor { + background: white; +} + +.editor-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 15px; + border-bottom: 1px solid #e0e0e0; + background: #f8f9fa; +} + +.editor-controls { + display: flex; + gap: 8px; +} + +.history-btn, .save-btn { + padding: 4px 8px; + border: 1px solid #ddd; + background: white; + cursor: pointer; + border-radius: 3px; + font-size: 11px; +} + +.save-btn { + background: #28a745; + color: white; + border-color: #28a745; +} + +.code-textarea { + width: 100%; + min-height: 300px; + padding: 15px; + border: none; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; + font-size: 12px; + line-height: 1.4; + resize: vertical; + outline: none; + background: #f8f9fa; +} + +.code-history { + background: #fff3cd; + padding: 10px; + border-bottom: 1px solid #e0e0e0; +} + +.history-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 5px 8px; + margin: 3px 0; + background: white; + border-radius: 3px; + border: 1px solid #e0e0e0; +} + +.history-time { + font-size: 11px; + color: #666; +} + +.revert-btn { + padding: 2px 6px; + background: #ffc107; + color: #212529; + border: none; + border-radius: 2px; + cursor: pointer; + font-size: 10px; +} \ No newline at end of file diff --git a/BACKUPS/SECOND_PHASE/src/App.jsx b/BACKUPS/SECOND_PHASE/src/App.jsx new file mode 100644 index 000000000..f3a1bf21a --- /dev/null +++ b/BACKUPS/SECOND_PHASE/src/App.jsx @@ -0,0 +1,24 @@ +import React, { useEffect } from 'react'; +import './App.css'; +import TradingDashboard from './components/TradingDashboard'; +import VendorManager from './core/VendorManager'; +import ExampleVendorA from './vendors/ExampleVendorA'; +import ExampleVendorB from './vendors/ExampleVendorB'; +import YFinanceVendor from './vendors/YFinanceVendor'; + +function App() { + useEffect(() => { + // Register vendors on app startup + VendorManager.registerVendor('vendorA', new ExampleVendorA()); + VendorManager.registerVendor('vendorB', new ExampleVendorB()); + VendorManager.registerVendor('yfinance', new YFinanceVendor()); + }, []); + + return ( +
+ +
+ ); +} + +export default App; \ No newline at end of file diff --git a/BACKUPS/SECOND_PHASE/src/App.test.jsx b/BACKUPS/SECOND_PHASE/src/App.test.jsx new file mode 100644 index 000000000..5e9824933 --- /dev/null +++ b/BACKUPS/SECOND_PHASE/src/App.test.jsx @@ -0,0 +1,9 @@ +import { expect, test } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeDefined(); +}); diff --git a/BACKUPS/SECOND_PHASE/src/components/AdminComponents.jsx b/BACKUPS/SECOND_PHASE/src/components/AdminComponents.jsx new file mode 100644 index 000000000..953d9581b --- /dev/null +++ b/BACKUPS/SECOND_PHASE/src/components/AdminComponents.jsx @@ -0,0 +1,323 @@ +import React, { useState } from 'react'; +import VendorManager from '../core/VendorManager'; +import { CodeEditor } from './CodeEditor'; + +export const CodeViewer = ({ vendor }) => { + const [activeCode, setActiveCode] = useState('fetch'); + const [editMode, setEditMode] = useState(false); + const [customCode, setCustomCode] = useState({}); + + const codeExamples = { + fetch: { + title: 'Data Fetching Code', + code: `// Market Data Fetch +const fetchMarketData = async (symbol, interval = '1d') => { + const url = \`https://query1.finance.yahoo.com/v8/finance/chart/\${symbol}?interval=\${interval}&range=1d\`; + const response = await fetch(url); + const data = await response.json(); + return parseYahooResponse(data, symbol); +}; + +// Historical Data Fetch +const fetchHistoricalData = async (symbol, interval, period) => { + const url = \`https://query1.finance.yahoo.com/v8/finance/chart/\${symbol}?interval=\${interval}&range=\${period}\`; + const response = await fetch(url); + const data = await response.json(); + return parseHistoricalData(data, symbol); +}; + +// Bulk Download +const bulkDownload = async (symbols, intervals, options) => { + const results = {}; + const batchSize = options.batchSize || 10; + + for (let i = 0; i < symbols.length; i += batchSize) { + const batch = symbols.slice(i, i + batchSize); + + for (const symbol of batch) { + for (const interval of intervals) { + const data = await fetchHistoricalData(symbol, interval, options.period); + if (!results[symbol]) results[symbol] = {}; + results[symbol][interval] = data; + } + } + + // Rate limiting + if (i + batchSize < symbols.length) { + await new Promise(resolve => setTimeout(resolve, 1000)); + } + } + + return results; +};` + }, + parser: { + title: 'Data Parser Code', + code: `// Yahoo Response Parser +const parseYahooResponse = (data, symbol) => { + const chart = data.chart?.result?.[0]; + const meta = chart.meta; + const quote = chart.indicators?.quote?.[0]; + + return { + symbol, + price: meta.regularMarketPrice || 0, + change: (meta.regularMarketPrice - meta.previousClose) || 0, + changePercent: ((meta.regularMarketPrice - meta.previousClose) / meta.previousClose * 100) || 0, + volume: meta.regularMarketVolume || 0, + high: quote?.high?.[quote.high.length - 1] || meta.regularMarketDayHigh, + low: quote?.low?.[quote.low.length - 1] || meta.regularMarketDayLow, + open: quote?.open?.[0] || meta.regularMarketDayLow, + previousClose: meta.previousClose || 0, + timestamp: Date.now() + }; +}; + +// Historical Data Parser +const parseHistoricalData = (data, symbol) => { + const chart = data.chart?.result?.[0]; + const timestamps = chart.timestamp || []; + const quote = chart.indicators?.quote?.[0] || {}; + + return { + symbol, + data: timestamps.map((ts, i) => ({ + timestamp: new Date(ts * 1000).toISOString(), + open: quote.open?.[i] || null, + high: quote.high?.[i] || null, + low: quote.low?.[i] || null, + close: quote.close?.[i] || null, + volume: quote.volume?.[i] || null + })).filter(item => item.close !== null) + }; +};` + }, + analytics: { + title: 'Analytics Code', + code: `// Volatility Calculator +const calculateVolatility = (dailyData, weeklyData) => { + const dailyChange = Math.abs(dailyData.changePercent || 0); + const weeklyChange = Math.abs(weeklyData.changePercent || 0); + + if (dailyChange > 5 || weeklyChange > 15) return 'HIGH'; + if (dailyChange > 2 || weeklyChange > 8) return 'MEDIUM'; + return 'LOW'; +}; + +// Recommendation Generator +const generateRecommendation = (data) => { + const { changePercent, volume, pe } = data; + + let score = 0; + if (changePercent > 2) score += 1; + if (changePercent < -2) score -= 1; + if (volume > 1000000) score += 0.5; + if (pe && pe < 15) score += 0.5; + if (pe && pe > 30) score -= 0.5; + + if (score > 1) return 'BUY'; + if (score < -1) return 'SELL'; + return 'HOLD'; +}; + +// Analytics Fetch +const getAnalytics = async (symbol, timeframe = '1mo') => { + const [daily, weekly] = await Promise.all([ + getMarketData(symbol, '1d'), + getMarketData(symbol, '1wk') + ]); + + return { + symbol, + price: daily.data.price, + change: daily.data.change, + changePercent: daily.data.changePercent, + volume: daily.data.volume, + volatility: calculateVolatility(daily.data, weekly.data), + weeklyTrend: weekly.data.change > 0 ? 'UP' : 'DOWN', + recommendation: generateRecommendation(daily.data) + }; +};` + }, + vendor: { + title: 'Vendor Adapter Code', + code: `// YFinance Vendor Class +class YFinanceVendor extends BaseVendorAdapter { + constructor(config = {}) { + super('Yahoo Finance', { + baseUrl: 'https://query1.finance.yahoo.com/v8/finance/chart/', + intervals: ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo'], + ...config + }); + this.cache = new Map(); + this.cacheTimeout = 30000; // 30 seconds + } + + getCapabilities() { + return { + marketData: true, + orderManagement: false, + portfolio: false, + analytics: true, + realtime: true + }; + } + + async connect() { + try { + const testResult = await this.getMarketData('AAPL'); + this.isConnected = testResult.success; + return { success: this.isConnected }; + } catch (error) { + return this.handleError(error, 'connect'); + } + } + + async getMarketData(symbol, interval = '1d') { + try { + const cacheKey = \`\${symbol}_\${interval}\`; + const cached = this.cache.get(cacheKey); + + if (cached && Date.now() - cached.timestamp < this.cacheTimeout) { + return { success: true, data: cached.data }; + } + + const url = \`\${this.config.baseUrl}\${symbol}?interval=\${interval}&range=1d\`; + const response = await fetch(url); + + if (!response.ok) { + throw new Error(\`HTTP \${response.status}: \${response.statusText}\`); + } + + const data = await response.json(); + const result = this.parseYahooResponse(data, symbol); + + this.cache.set(cacheKey, { + data: result, + timestamp: Date.now() + }); + + return { success: true, data: result }; + } catch (error) { + return this.handleError(error, 'getMarketData'); + } + } +}` + } + }; + + const handleCodeSave = (code) => { + setCustomCode(prev => ({ + ...prev, + [activeCode]: code + })); + }; + + const getCurrentCode = () => { + return customCode[activeCode] || codeExamples[activeCode].code; + }; + + return ( +
+
+
+ {Object.entries(codeExamples).map(([key, example]) => ( + + ))} +
+ +
+ +
+ {editMode ? ( + + ) : ( +
+

{codeExamples[activeCode].title}

+
+              {getCurrentCode()}
+            
+
+ )} +
+
+ ); +}; + +export const VendorStatus = ({ vendor }) => { + const [status, setStatus] = useState(null); + + const checkStatus = async () => { + try { + const vendorInstance = VendorManager.getVendor(vendor); + const capabilities = VendorManager.getVendorCapabilities(vendor); + + setStatus({ + name: vendorInstance?.name || 'Unknown', + connected: vendorInstance?.isConnected || false, + capabilities, + cacheSize: vendorInstance?.cache?.size || 0 + }); + } catch (error) { + setStatus({ error: error.message }); + } + }; + + return ( +
+ + + {status && ( +
+ {status.error ? ( +
Error: {status.error}
+ ) : ( +
+
+ + {status.name} +
+
+ + + {status.connected ? 'Connected' : 'Disconnected'} + +
+
+ + {status.cacheSize} items +
+
+ +
+ {Object.entries(status.capabilities).map(([cap, enabled]) => ( + + {cap}: {enabled ? '✓' : '✗'} + + ))} +
+
+
+ )} +
+ )} +
+ ); +}; \ No newline at end of file diff --git a/BACKUPS/SECOND_PHASE/src/components/CodeEditor.jsx b/BACKUPS/SECOND_PHASE/src/components/CodeEditor.jsx new file mode 100644 index 000000000..c499444bf --- /dev/null +++ b/BACKUPS/SECOND_PHASE/src/components/CodeEditor.jsx @@ -0,0 +1,75 @@ +import React, { useState, useEffect } from 'react'; + +export const CodeEditor = ({ initialCode, title, onSave }) => { + const [code, setCode] = useState(initialCode); + const [history, setHistory] = useState([]); + const [showHistory, setShowHistory] = useState(false); + + useEffect(() => { + setCode(initialCode); + }, [initialCode]); + + const saveCode = () => { + const newVersion = { + code, + timestamp: new Date().toISOString(), + id: Date.now() + }; + + const newHistory = [newVersion, ...history].slice(0, 5); + setHistory(newHistory); + + if (onSave) onSave(code); + }; + + const revertToVersion = (version) => { + setCode(version.code); + setShowHistory(false); + }; + + return ( +
+
+

{title}

+
+ + +
+
+ + {showHistory && ( +
+
Version History (Last 5)
+ {history.length === 0 ? ( +

No saved versions yet

+ ) : ( + history.map((version) => ( +
+ + {new Date(version.timestamp).toLocaleString()} + + +
+ )) + )} +
+ )} + +