├── .gitignore ├── LICENSE ├── README.md ├── client └── lan.js ├── decktap-web ├── .gitignore ├── README.md ├── eslint.config.js ├── index.html ├── package-lock.json ├── package.json ├── public │ └── decktap-logo.svg ├── src │ ├── App.css │ ├── App.tsx │ ├── components │ │ ├── ConnectionStatus.tsx │ │ ├── Controller.tsx │ │ └── Timer.tsx │ ├── hooks │ │ └── useWebSocket.ts │ ├── index.css │ ├── main.tsx │ ├── styles │ │ ├── controller.css │ │ └── timer.css │ └── vite-env.d.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── images ├── computer-client.png ├── hero.png └── phone-controller.png ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # vitepress build output 108 | **/.vitepress/dist 109 | 110 | # vitepress cache directory 111 | **/.vitepress/cache 112 | 113 | # Docusaurus cache and generated files 114 | .docusaurus 115 | 116 | # Serverless directories 117 | .serverless/ 118 | 119 | # FuseBox cache 120 | .fusebox/ 121 | 122 | # DynamoDB Local files 123 | .dynamodb/ 124 | 125 | # TernJS port file 126 | .tern-port 127 | 128 | # Stores VSCode versions used for testing VSCode extensions 129 | .vscode-test 130 | .vscode 131 | 132 | # yarn v2 133 | .yarn/cache 134 | .yarn/unplugged 135 | .yarn/build-state.yml 136 | .yarn/install-state.gz 137 | .pnp.* 138 | 139 | # distributions 140 | decktap-linux 141 | decktap-win.exe 142 | decktap-macos 143 | 144 | .DS_Store 145 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Ruikang Tao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DeckTap (LAN MVP) 2 | 3 | Alternate Text 4 | 5 | 📡 DeckTap is a lightweight local-network remote for controlling presentations. 6 | Use your phone to wirelessly control PowerPoint, Keynote, PDF slideshows — no app installation needed. 7 | 8 | --- 9 | 10 | ## ✨ Features 11 | 12 | - 📱 Control slides via your phone browser 13 | - 🌐 Works over local Wi-Fi/Hotspot network 14 | - 🖥 Simulates keyboard arrow keys to navigate slides 15 | - 🚀 Minimal setup: run a local Node.js server and scan a QR code 16 | - 🔒 No internet required, **safe** and **private** 17 | 18 | --- 19 | 20 | ## 📦 Project Structure 21 | ```yaml 22 | decktap/ 23 | ├── client/ # Computer side agent 24 | │ ├── lan.js # LAN control 25 | │ ├── cloud.js # Connect cloud relay server in the future 26 | │ └── config.js 27 | │ 28 | ├── controller/ # Mobile phone controller web page 29 | │ └── index.html 30 | │ 31 | ├── server-cloud/ # Cloud server for remote control in the future 32 | │ └── server.js 33 | │ 34 | ├── README.md 35 | ├── LICENSE 36 | ├── package.json 37 | └── .gitignore 38 | ``` 39 | --- 40 | 41 | ## 🔧 Prerequisites 42 | 43 | ### macOS Permissions 44 | DeckTap uses `@nut-tree/nut-js` to simulate keyboard events. On macOS, you need to grant Accessibility permissions to your terminal: 45 | 46 | 1. Open **System Settings** > **Privacy & Security** > **Accessibility** 47 | 2. Click the lock icon 🔒 to make changes 48 | 3. Click the **+** button 49 | 4. Select `Terminal.app` (or iTerm, VS Code, etc. depending on what you use) 50 | 5. Check the box next to your terminal app 51 | 52 | > **Note**: Without these permissions, DeckTap won't be able to control your presentations. 53 | 54 | --- 55 | 56 | ## 🚀 Getting Started (LAN Mode) 57 | 1. Install dependencies: 58 | ```bash 59 | cd decktap-web && npm install && npm run build 60 | cd .. && npm install 61 | ``` 62 | 63 | 2. Grant accessibility permissions (macOS only): 64 | - Follow the steps in [macOS Permissions](#macos-permissions) 65 | - Restart your terminal after granting permissions 66 | 67 | 3. Start the server: 68 | ```bash 69 | npm start 70 | ``` 71 | 72 | 4. Connect with your phone: 73 | - Connect your phone to the same WiFi network(only support private WiFi without vlan, not working on campus network) as your computer 74 | - Open the displayed URL in your phone's browser or Scan the QR code 75 | - 76 | - Start controlling your presentation (Use 👉 to switch left and right hand mode) 77 | - 78 | 79 | 80 | --- 81 | 82 | ## ~🖱️ Standalone Distribution Quick Start~ (Not available yet, an Electron client will be developed in the future) 83 | 84 | If you received a **standalone executable version** of DeckTap (such as `decktap-macos`, `decktap-win.exe`, or `decktap-linux`), you can run it directly without installing Node.js or any dependencies. 85 | 86 | ### Steps 87 | 1. **macOS / Linux users:** 88 | - Before the first run, grant execute permission (only needed once): 89 | ```bash 90 | chmod +x decktap-macos 91 | ``` 92 | - Run: 93 | ```bash 94 | ./decktap-macos 95 | ``` 96 | 2. **Windows users:** 97 | - Run it in the command prompt: 98 | ```bat 99 | decktap-win.exe 100 | ``` 101 | 3. **First run on macOS:** Please follow the terminal prompts to grant Accessibility permissions (see above [macOS Permissions](#macos-permissions)). 102 | 103 | 4. **Scan the QR code or open the displayed URL on your phone to start controlling your presentation!** 104 | 105 | --- 106 | 107 | > If you encounter issues such as failure to run, insufficient permissions, or cannot access the page, please send the terminal error message to the developer for help. 108 | -------------------------------------------------------------------------------- /client/lan.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const http = require('http'); 3 | const WebSocket = require('ws'); 4 | const { keyboard, Key } = require("@nut-tree/nut-js"); 5 | const os = require('os'); 6 | const qrcode = require('qrcode-terminal'); 7 | const path = require('path'); 8 | 9 | const app = express(); 10 | const server = http.createServer(app); 11 | const wss = new WebSocket.Server({ server }); 12 | const port = 9999; 13 | 14 | const staticPath = path.join(__dirname, '..', 'decktap-web', 'dist'); 15 | 16 | console.log('📂 Static files path:', staticPath); 17 | app.use(express.static(staticPath)); 18 | 19 | // WebSocket 连接处理 20 | wss.on('connection', (ws) => { 21 | console.log('📲 Mobile phone controller connected'); 22 | ws.on('message', (message) => { 23 | const msg = message.toString(); 24 | console.log('🔍 Received message:', msg); 25 | if (msg === 'next') { 26 | try { 27 | (async () => { 28 | await keyboard.pressKey(Key.Right); 29 | await keyboard.releaseKey(Key.Right); 30 | })(); 31 | } catch (error) { 32 | console.error('❌ Key simulation failed:', error); 33 | } 34 | } else if (msg === 'prev') { 35 | try { 36 | (async () => { 37 | await keyboard.pressKey(Key.Left); 38 | await keyboard.releaseKey(Key.Left); 39 | })(); 40 | } catch (error) { 41 | console.error('❌ Key simulation failed:', error); 42 | } 43 | } else { 44 | console.log('❌ Unknown message type:', msg); 45 | } 46 | }); 47 | 48 | ws.on('error', (error) => { 49 | console.error('❌ WebSocket error:', error); 50 | }); 51 | 52 | ws.on('close', () => { 53 | console.log('🔌 The phone controller has been disconnected'); 54 | }); 55 | }); 56 | 57 | server.listen(port, () => { 58 | const controlUrl = `http://${getLocalIP()}:${port}`; 59 | console.log(`\n✅ DeckTap LAN service has been started:${controlUrl}`); 60 | console.log('\n🔗 Please open the above link with your mobile phone under the same Wi-Fi, or scan the QR code below:\n'); 61 | qrcode.generate(controlUrl, { small: true }); 62 | }); 63 | 64 | process.on('SIGINT', () => { 65 | ioHook.unload(); 66 | ioHook.stop(); 67 | process.exit(); 68 | }); 69 | 70 | function getLocalIP() { 71 | const interfaces = os.networkInterfaces(); 72 | console.log('🔍 Scanning the network interface......'); 73 | 74 | // 存储所有找到的 IP 地址 75 | const ipAddresses = []; 76 | 77 | for (let [name, iface] of Object.entries(interfaces)) { 78 | for (let config of iface) { 79 | if (config.family === 'IPv4' && !config.internal) { 80 | // 检查是否是有效的单播地址(不是网络地址或广播地址) 81 | const ipParts = config.address.split('.').map(Number); 82 | const lastOctet = ipParts[3]; 83 | if (lastOctet !== 0 && lastOctet !== 255) { // 排除网络地址和广播地址 84 | console.log(`📡 Discover network interfaces: ${name}`); 85 | console.log(` IP Address: ${config.address}`); 86 | console.log(` Subnet Mask: ${config.netmask}`); 87 | ipAddresses.push({ 88 | name, 89 | address: config.address, 90 | netmask: config.netmask, 91 | // 添加优先级分数 92 | priority: getPriorityScore(config.address, name) 93 | }); 94 | } 95 | } 96 | } 97 | } 98 | 99 | // 按优先级排序 100 | ipAddresses.sort((a, b) => b.priority - a.priority); 101 | 102 | if (ipAddresses.length > 0) { 103 | const selectedIP = ipAddresses[0]; 104 | console.log(`✅ Choose Local IP: ${selectedIP.address} (${selectedIP.name})`); 105 | return selectedIP.address; 106 | } 107 | 108 | console.log('❌ No available network interface was found, use localhost'); 109 | return 'localhost'; 110 | } 111 | 112 | // 计算 IP 地址的优先级分数 113 | function getPriorityScore(address, interfaceName) { 114 | let score = 0; 115 | 116 | // 优先选择常见的本地网络接口名称 117 | if (interfaceName.includes('en0') || interfaceName.includes('wlan0')) { 118 | score += 100; 119 | } 120 | 121 | // 优先选择 192.168.x.x 地址(最常见的本地网络) 122 | if (address.startsWith('192.168.')) { 123 | score += 50; 124 | } 125 | 126 | // 优先选择 172.16.x.x - 172.31.x.x 地址 127 | if (address.startsWith('172.')) { 128 | const secondOctet = parseInt(address.split('.')[1]); 129 | if (secondOctet >= 16 && secondOctet <= 31) { 130 | score += 40; 131 | } 132 | } 133 | 134 | // 优先选择 10.x.x.x 地址 135 | if (address.startsWith('10.')) { 136 | score += 30; 137 | } 138 | 139 | // 排除一些特殊的网络接口 140 | if (interfaceName.includes('vmnet') || 141 | interfaceName.includes('docker') || 142 | interfaceName.includes('veth')) { 143 | score -= 100; 144 | } 145 | 146 | return score; 147 | } 148 | -------------------------------------------------------------------------------- /decktap-web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /decktap-web/README.md: -------------------------------------------------------------------------------- 1 | # React + TypeScript + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | 10 | ## Expanding the ESLint configuration 11 | 12 | If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: 13 | 14 | ```js 15 | export default tseslint.config({ 16 | extends: [ 17 | // Remove ...tseslint.configs.recommended and replace with this 18 | ...tseslint.configs.recommendedTypeChecked, 19 | // Alternatively, use this for stricter rules 20 | ...tseslint.configs.strictTypeChecked, 21 | // Optionally, add this for stylistic rules 22 | ...tseslint.configs.stylisticTypeChecked, 23 | ], 24 | languageOptions: { 25 | // other options... 26 | parserOptions: { 27 | project: ['./tsconfig.node.json', './tsconfig.app.json'], 28 | tsconfigRootDir: import.meta.dirname, 29 | }, 30 | }, 31 | }) 32 | ``` 33 | 34 | You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: 35 | 36 | ```js 37 | // eslint.config.js 38 | import reactX from 'eslint-plugin-react-x' 39 | import reactDom from 'eslint-plugin-react-dom' 40 | 41 | export default tseslint.config({ 42 | plugins: { 43 | // Add the react-x and react-dom plugins 44 | 'react-x': reactX, 45 | 'react-dom': reactDom, 46 | }, 47 | rules: { 48 | // other rules... 49 | // Enable its recommended typescript rules 50 | ...reactX.configs['recommended-typescript'].rules, 51 | ...reactDom.configs.recommended.rules, 52 | }, 53 | }) 54 | ``` 55 | -------------------------------------------------------------------------------- /decktap-web/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import reactHooks from 'eslint-plugin-react-hooks' 4 | import reactRefresh from 'eslint-plugin-react-refresh' 5 | import tseslint from 'typescript-eslint' 6 | 7 | export default tseslint.config( 8 | { ignores: ['dist'] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ['**/*.{ts,tsx}'], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | 'react-hooks': reactHooks, 18 | 'react-refresh': reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | 'react-refresh/only-export-components': [ 23 | 'warn', 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /decktap-web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | DeckTap 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /decktap-web/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "decktap-web", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "decktap-web", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "react": "^19.1.0", 12 | "react-dom": "^19.1.0" 13 | }, 14 | "devDependencies": { 15 | "@eslint/js": "^9.25.0", 16 | "@types/react": "^19.1.2", 17 | "@types/react-dom": "^19.1.2", 18 | "@vitejs/plugin-react": "^4.4.1", 19 | "eslint": "^9.25.0", 20 | "eslint-plugin-react-hooks": "^5.2.0", 21 | "eslint-plugin-react-refresh": "^0.4.19", 22 | "globals": "^16.0.0", 23 | "typescript": "~5.8.3", 24 | "typescript-eslint": "^8.30.1", 25 | "vite": "^6.3.5" 26 | } 27 | }, 28 | "node_modules/@ampproject/remapping": { 29 | "version": "2.3.0", 30 | "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", 31 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 32 | "dev": true, 33 | "license": "Apache-2.0", 34 | "dependencies": { 35 | "@jridgewell/gen-mapping": "^0.3.5", 36 | "@jridgewell/trace-mapping": "^0.3.24" 37 | }, 38 | "engines": { 39 | "node": ">=6.0.0" 40 | } 41 | }, 42 | "node_modules/@babel/code-frame": { 43 | "version": "7.27.1", 44 | "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", 45 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 46 | "dev": true, 47 | "license": "MIT", 48 | "dependencies": { 49 | "@babel/helper-validator-identifier": "^7.27.1", 50 | "js-tokens": "^4.0.0", 51 | "picocolors": "^1.1.1" 52 | }, 53 | "engines": { 54 | "node": ">=6.9.0" 55 | } 56 | }, 57 | "node_modules/@babel/compat-data": { 58 | "version": "7.27.2", 59 | "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.2.tgz", 60 | "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", 61 | "dev": true, 62 | "license": "MIT", 63 | "engines": { 64 | "node": ">=6.9.0" 65 | } 66 | }, 67 | "node_modules/@babel/core": { 68 | "version": "7.27.1", 69 | "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.27.1.tgz", 70 | "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", 71 | "dev": true, 72 | "license": "MIT", 73 | "dependencies": { 74 | "@ampproject/remapping": "^2.2.0", 75 | "@babel/code-frame": "^7.27.1", 76 | "@babel/generator": "^7.27.1", 77 | "@babel/helper-compilation-targets": "^7.27.1", 78 | "@babel/helper-module-transforms": "^7.27.1", 79 | "@babel/helpers": "^7.27.1", 80 | "@babel/parser": "^7.27.1", 81 | "@babel/template": "^7.27.1", 82 | "@babel/traverse": "^7.27.1", 83 | "@babel/types": "^7.27.1", 84 | "convert-source-map": "^2.0.0", 85 | "debug": "^4.1.0", 86 | "gensync": "^1.0.0-beta.2", 87 | "json5": "^2.2.3", 88 | "semver": "^6.3.1" 89 | }, 90 | "engines": { 91 | "node": ">=6.9.0" 92 | }, 93 | "funding": { 94 | "type": "opencollective", 95 | "url": "https://opencollective.com/babel" 96 | } 97 | }, 98 | "node_modules/@babel/generator": { 99 | "version": "7.27.1", 100 | "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.27.1.tgz", 101 | "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", 102 | "dev": true, 103 | "license": "MIT", 104 | "dependencies": { 105 | "@babel/parser": "^7.27.1", 106 | "@babel/types": "^7.27.1", 107 | "@jridgewell/gen-mapping": "^0.3.5", 108 | "@jridgewell/trace-mapping": "^0.3.25", 109 | "jsesc": "^3.0.2" 110 | }, 111 | "engines": { 112 | "node": ">=6.9.0" 113 | } 114 | }, 115 | "node_modules/@babel/helper-compilation-targets": { 116 | "version": "7.27.2", 117 | "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 118 | "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 119 | "dev": true, 120 | "license": "MIT", 121 | "dependencies": { 122 | "@babel/compat-data": "^7.27.2", 123 | "@babel/helper-validator-option": "^7.27.1", 124 | "browserslist": "^4.24.0", 125 | "lru-cache": "^5.1.1", 126 | "semver": "^6.3.1" 127 | }, 128 | "engines": { 129 | "node": ">=6.9.0" 130 | } 131 | }, 132 | "node_modules/@babel/helper-module-imports": { 133 | "version": "7.27.1", 134 | "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 135 | "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 136 | "dev": true, 137 | "license": "MIT", 138 | "dependencies": { 139 | "@babel/traverse": "^7.27.1", 140 | "@babel/types": "^7.27.1" 141 | }, 142 | "engines": { 143 | "node": ">=6.9.0" 144 | } 145 | }, 146 | "node_modules/@babel/helper-module-transforms": { 147 | "version": "7.27.1", 148 | "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", 149 | "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", 150 | "dev": true, 151 | "license": "MIT", 152 | "dependencies": { 153 | "@babel/helper-module-imports": "^7.27.1", 154 | "@babel/helper-validator-identifier": "^7.27.1", 155 | "@babel/traverse": "^7.27.1" 156 | }, 157 | "engines": { 158 | "node": ">=6.9.0" 159 | }, 160 | "peerDependencies": { 161 | "@babel/core": "^7.0.0" 162 | } 163 | }, 164 | "node_modules/@babel/helper-plugin-utils": { 165 | "version": "7.27.1", 166 | "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", 167 | "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", 168 | "dev": true, 169 | "license": "MIT", 170 | "engines": { 171 | "node": ">=6.9.0" 172 | } 173 | }, 174 | "node_modules/@babel/helper-string-parser": { 175 | "version": "7.27.1", 176 | "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 177 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 178 | "dev": true, 179 | "license": "MIT", 180 | "engines": { 181 | "node": ">=6.9.0" 182 | } 183 | }, 184 | "node_modules/@babel/helper-validator-identifier": { 185 | "version": "7.27.1", 186 | "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 187 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 188 | "dev": true, 189 | "license": "MIT", 190 | "engines": { 191 | "node": ">=6.9.0" 192 | } 193 | }, 194 | "node_modules/@babel/helper-validator-option": { 195 | "version": "7.27.1", 196 | "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 197 | "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 198 | "dev": true, 199 | "license": "MIT", 200 | "engines": { 201 | "node": ">=6.9.0" 202 | } 203 | }, 204 | "node_modules/@babel/helpers": { 205 | "version": "7.27.1", 206 | "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.1.tgz", 207 | "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", 208 | "dev": true, 209 | "license": "MIT", 210 | "dependencies": { 211 | "@babel/template": "^7.27.1", 212 | "@babel/types": "^7.27.1" 213 | }, 214 | "engines": { 215 | "node": ">=6.9.0" 216 | } 217 | }, 218 | "node_modules/@babel/parser": { 219 | "version": "7.27.2", 220 | "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.27.2.tgz", 221 | "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", 222 | "dev": true, 223 | "license": "MIT", 224 | "dependencies": { 225 | "@babel/types": "^7.27.1" 226 | }, 227 | "bin": { 228 | "parser": "bin/babel-parser.js" 229 | }, 230 | "engines": { 231 | "node": ">=6.0.0" 232 | } 233 | }, 234 | "node_modules/@babel/plugin-transform-react-jsx-self": { 235 | "version": "7.27.1", 236 | "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", 237 | "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", 238 | "dev": true, 239 | "license": "MIT", 240 | "dependencies": { 241 | "@babel/helper-plugin-utils": "^7.27.1" 242 | }, 243 | "engines": { 244 | "node": ">=6.9.0" 245 | }, 246 | "peerDependencies": { 247 | "@babel/core": "^7.0.0-0" 248 | } 249 | }, 250 | "node_modules/@babel/plugin-transform-react-jsx-source": { 251 | "version": "7.27.1", 252 | "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", 253 | "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", 254 | "dev": true, 255 | "license": "MIT", 256 | "dependencies": { 257 | "@babel/helper-plugin-utils": "^7.27.1" 258 | }, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | }, 262 | "peerDependencies": { 263 | "@babel/core": "^7.0.0-0" 264 | } 265 | }, 266 | "node_modules/@babel/template": { 267 | "version": "7.27.2", 268 | "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", 269 | "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 270 | "dev": true, 271 | "license": "MIT", 272 | "dependencies": { 273 | "@babel/code-frame": "^7.27.1", 274 | "@babel/parser": "^7.27.2", 275 | "@babel/types": "^7.27.1" 276 | }, 277 | "engines": { 278 | "node": ">=6.9.0" 279 | } 280 | }, 281 | "node_modules/@babel/traverse": { 282 | "version": "7.27.1", 283 | "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.27.1.tgz", 284 | "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", 285 | "dev": true, 286 | "license": "MIT", 287 | "dependencies": { 288 | "@babel/code-frame": "^7.27.1", 289 | "@babel/generator": "^7.27.1", 290 | "@babel/parser": "^7.27.1", 291 | "@babel/template": "^7.27.1", 292 | "@babel/types": "^7.27.1", 293 | "debug": "^4.3.1", 294 | "globals": "^11.1.0" 295 | }, 296 | "engines": { 297 | "node": ">=6.9.0" 298 | } 299 | }, 300 | "node_modules/@babel/traverse/node_modules/globals": { 301 | "version": "11.12.0", 302 | "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", 303 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 304 | "dev": true, 305 | "license": "MIT", 306 | "engines": { 307 | "node": ">=4" 308 | } 309 | }, 310 | "node_modules/@babel/types": { 311 | "version": "7.27.1", 312 | "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.27.1.tgz", 313 | "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", 314 | "dev": true, 315 | "license": "MIT", 316 | "dependencies": { 317 | "@babel/helper-string-parser": "^7.27.1", 318 | "@babel/helper-validator-identifier": "^7.27.1" 319 | }, 320 | "engines": { 321 | "node": ">=6.9.0" 322 | } 323 | }, 324 | "node_modules/@esbuild/aix-ppc64": { 325 | "version": "0.25.4", 326 | "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", 327 | "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", 328 | "cpu": [ 329 | "ppc64" 330 | ], 331 | "dev": true, 332 | "license": "MIT", 333 | "optional": true, 334 | "os": [ 335 | "aix" 336 | ], 337 | "engines": { 338 | "node": ">=18" 339 | } 340 | }, 341 | "node_modules/@esbuild/android-arm": { 342 | "version": "0.25.4", 343 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz", 344 | "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", 345 | "cpu": [ 346 | "arm" 347 | ], 348 | "dev": true, 349 | "license": "MIT", 350 | "optional": true, 351 | "os": [ 352 | "android" 353 | ], 354 | "engines": { 355 | "node": ">=18" 356 | } 357 | }, 358 | "node_modules/@esbuild/android-arm64": { 359 | "version": "0.25.4", 360 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", 361 | "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", 362 | "cpu": [ 363 | "arm64" 364 | ], 365 | "dev": true, 366 | "license": "MIT", 367 | "optional": true, 368 | "os": [ 369 | "android" 370 | ], 371 | "engines": { 372 | "node": ">=18" 373 | } 374 | }, 375 | "node_modules/@esbuild/android-x64": { 376 | "version": "0.25.4", 377 | "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz", 378 | "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", 379 | "cpu": [ 380 | "x64" 381 | ], 382 | "dev": true, 383 | "license": "MIT", 384 | "optional": true, 385 | "os": [ 386 | "android" 387 | ], 388 | "engines": { 389 | "node": ">=18" 390 | } 391 | }, 392 | "node_modules/@esbuild/darwin-arm64": { 393 | "version": "0.25.4", 394 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", 395 | "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", 396 | "cpu": [ 397 | "arm64" 398 | ], 399 | "dev": true, 400 | "license": "MIT", 401 | "optional": true, 402 | "os": [ 403 | "darwin" 404 | ], 405 | "engines": { 406 | "node": ">=18" 407 | } 408 | }, 409 | "node_modules/@esbuild/darwin-x64": { 410 | "version": "0.25.4", 411 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", 412 | "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", 413 | "cpu": [ 414 | "x64" 415 | ], 416 | "dev": true, 417 | "license": "MIT", 418 | "optional": true, 419 | "os": [ 420 | "darwin" 421 | ], 422 | "engines": { 423 | "node": ">=18" 424 | } 425 | }, 426 | "node_modules/@esbuild/freebsd-arm64": { 427 | "version": "0.25.4", 428 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", 429 | "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", 430 | "cpu": [ 431 | "arm64" 432 | ], 433 | "dev": true, 434 | "license": "MIT", 435 | "optional": true, 436 | "os": [ 437 | "freebsd" 438 | ], 439 | "engines": { 440 | "node": ">=18" 441 | } 442 | }, 443 | "node_modules/@esbuild/freebsd-x64": { 444 | "version": "0.25.4", 445 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", 446 | "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", 447 | "cpu": [ 448 | "x64" 449 | ], 450 | "dev": true, 451 | "license": "MIT", 452 | "optional": true, 453 | "os": [ 454 | "freebsd" 455 | ], 456 | "engines": { 457 | "node": ">=18" 458 | } 459 | }, 460 | "node_modules/@esbuild/linux-arm": { 461 | "version": "0.25.4", 462 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", 463 | "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", 464 | "cpu": [ 465 | "arm" 466 | ], 467 | "dev": true, 468 | "license": "MIT", 469 | "optional": true, 470 | "os": [ 471 | "linux" 472 | ], 473 | "engines": { 474 | "node": ">=18" 475 | } 476 | }, 477 | "node_modules/@esbuild/linux-arm64": { 478 | "version": "0.25.4", 479 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", 480 | "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", 481 | "cpu": [ 482 | "arm64" 483 | ], 484 | "dev": true, 485 | "license": "MIT", 486 | "optional": true, 487 | "os": [ 488 | "linux" 489 | ], 490 | "engines": { 491 | "node": ">=18" 492 | } 493 | }, 494 | "node_modules/@esbuild/linux-ia32": { 495 | "version": "0.25.4", 496 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", 497 | "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", 498 | "cpu": [ 499 | "ia32" 500 | ], 501 | "dev": true, 502 | "license": "MIT", 503 | "optional": true, 504 | "os": [ 505 | "linux" 506 | ], 507 | "engines": { 508 | "node": ">=18" 509 | } 510 | }, 511 | "node_modules/@esbuild/linux-loong64": { 512 | "version": "0.25.4", 513 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", 514 | "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", 515 | "cpu": [ 516 | "loong64" 517 | ], 518 | "dev": true, 519 | "license": "MIT", 520 | "optional": true, 521 | "os": [ 522 | "linux" 523 | ], 524 | "engines": { 525 | "node": ">=18" 526 | } 527 | }, 528 | "node_modules/@esbuild/linux-mips64el": { 529 | "version": "0.25.4", 530 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", 531 | "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", 532 | "cpu": [ 533 | "mips64el" 534 | ], 535 | "dev": true, 536 | "license": "MIT", 537 | "optional": true, 538 | "os": [ 539 | "linux" 540 | ], 541 | "engines": { 542 | "node": ">=18" 543 | } 544 | }, 545 | "node_modules/@esbuild/linux-ppc64": { 546 | "version": "0.25.4", 547 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", 548 | "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", 549 | "cpu": [ 550 | "ppc64" 551 | ], 552 | "dev": true, 553 | "license": "MIT", 554 | "optional": true, 555 | "os": [ 556 | "linux" 557 | ], 558 | "engines": { 559 | "node": ">=18" 560 | } 561 | }, 562 | "node_modules/@esbuild/linux-riscv64": { 563 | "version": "0.25.4", 564 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", 565 | "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", 566 | "cpu": [ 567 | "riscv64" 568 | ], 569 | "dev": true, 570 | "license": "MIT", 571 | "optional": true, 572 | "os": [ 573 | "linux" 574 | ], 575 | "engines": { 576 | "node": ">=18" 577 | } 578 | }, 579 | "node_modules/@esbuild/linux-s390x": { 580 | "version": "0.25.4", 581 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", 582 | "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", 583 | "cpu": [ 584 | "s390x" 585 | ], 586 | "dev": true, 587 | "license": "MIT", 588 | "optional": true, 589 | "os": [ 590 | "linux" 591 | ], 592 | "engines": { 593 | "node": ">=18" 594 | } 595 | }, 596 | "node_modules/@esbuild/linux-x64": { 597 | "version": "0.25.4", 598 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", 599 | "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", 600 | "cpu": [ 601 | "x64" 602 | ], 603 | "dev": true, 604 | "license": "MIT", 605 | "optional": true, 606 | "os": [ 607 | "linux" 608 | ], 609 | "engines": { 610 | "node": ">=18" 611 | } 612 | }, 613 | "node_modules/@esbuild/netbsd-arm64": { 614 | "version": "0.25.4", 615 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", 616 | "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", 617 | "cpu": [ 618 | "arm64" 619 | ], 620 | "dev": true, 621 | "license": "MIT", 622 | "optional": true, 623 | "os": [ 624 | "netbsd" 625 | ], 626 | "engines": { 627 | "node": ">=18" 628 | } 629 | }, 630 | "node_modules/@esbuild/netbsd-x64": { 631 | "version": "0.25.4", 632 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", 633 | "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", 634 | "cpu": [ 635 | "x64" 636 | ], 637 | "dev": true, 638 | "license": "MIT", 639 | "optional": true, 640 | "os": [ 641 | "netbsd" 642 | ], 643 | "engines": { 644 | "node": ">=18" 645 | } 646 | }, 647 | "node_modules/@esbuild/openbsd-arm64": { 648 | "version": "0.25.4", 649 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", 650 | "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", 651 | "cpu": [ 652 | "arm64" 653 | ], 654 | "dev": true, 655 | "license": "MIT", 656 | "optional": true, 657 | "os": [ 658 | "openbsd" 659 | ], 660 | "engines": { 661 | "node": ">=18" 662 | } 663 | }, 664 | "node_modules/@esbuild/openbsd-x64": { 665 | "version": "0.25.4", 666 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", 667 | "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", 668 | "cpu": [ 669 | "x64" 670 | ], 671 | "dev": true, 672 | "license": "MIT", 673 | "optional": true, 674 | "os": [ 675 | "openbsd" 676 | ], 677 | "engines": { 678 | "node": ">=18" 679 | } 680 | }, 681 | "node_modules/@esbuild/sunos-x64": { 682 | "version": "0.25.4", 683 | "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", 684 | "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", 685 | "cpu": [ 686 | "x64" 687 | ], 688 | "dev": true, 689 | "license": "MIT", 690 | "optional": true, 691 | "os": [ 692 | "sunos" 693 | ], 694 | "engines": { 695 | "node": ">=18" 696 | } 697 | }, 698 | "node_modules/@esbuild/win32-arm64": { 699 | "version": "0.25.4", 700 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", 701 | "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", 702 | "cpu": [ 703 | "arm64" 704 | ], 705 | "dev": true, 706 | "license": "MIT", 707 | "optional": true, 708 | "os": [ 709 | "win32" 710 | ], 711 | "engines": { 712 | "node": ">=18" 713 | } 714 | }, 715 | "node_modules/@esbuild/win32-ia32": { 716 | "version": "0.25.4", 717 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", 718 | "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", 719 | "cpu": [ 720 | "ia32" 721 | ], 722 | "dev": true, 723 | "license": "MIT", 724 | "optional": true, 725 | "os": [ 726 | "win32" 727 | ], 728 | "engines": { 729 | "node": ">=18" 730 | } 731 | }, 732 | "node_modules/@esbuild/win32-x64": { 733 | "version": "0.25.4", 734 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", 735 | "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", 736 | "cpu": [ 737 | "x64" 738 | ], 739 | "dev": true, 740 | "license": "MIT", 741 | "optional": true, 742 | "os": [ 743 | "win32" 744 | ], 745 | "engines": { 746 | "node": ">=18" 747 | } 748 | }, 749 | "node_modules/@eslint-community/eslint-utils": { 750 | "version": "4.7.0", 751 | "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", 752 | "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 753 | "dev": true, 754 | "license": "MIT", 755 | "dependencies": { 756 | "eslint-visitor-keys": "^3.4.3" 757 | }, 758 | "engines": { 759 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 760 | }, 761 | "funding": { 762 | "url": "https://opencollective.com/eslint" 763 | }, 764 | "peerDependencies": { 765 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 766 | } 767 | }, 768 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 769 | "version": "3.4.3", 770 | "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 771 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 772 | "dev": true, 773 | "license": "Apache-2.0", 774 | "engines": { 775 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 776 | }, 777 | "funding": { 778 | "url": "https://opencollective.com/eslint" 779 | } 780 | }, 781 | "node_modules/@eslint-community/regexpp": { 782 | "version": "4.12.1", 783 | "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 784 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 785 | "dev": true, 786 | "license": "MIT", 787 | "engines": { 788 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 789 | } 790 | }, 791 | "node_modules/@eslint/config-array": { 792 | "version": "0.20.0", 793 | "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.20.0.tgz", 794 | "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", 795 | "dev": true, 796 | "license": "Apache-2.0", 797 | "dependencies": { 798 | "@eslint/object-schema": "^2.1.6", 799 | "debug": "^4.3.1", 800 | "minimatch": "^3.1.2" 801 | }, 802 | "engines": { 803 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 804 | } 805 | }, 806 | "node_modules/@eslint/config-helpers": { 807 | "version": "0.2.2", 808 | "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", 809 | "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", 810 | "dev": true, 811 | "license": "Apache-2.0", 812 | "engines": { 813 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 814 | } 815 | }, 816 | "node_modules/@eslint/core": { 817 | "version": "0.14.0", 818 | "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.14.0.tgz", 819 | "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", 820 | "dev": true, 821 | "license": "Apache-2.0", 822 | "dependencies": { 823 | "@types/json-schema": "^7.0.15" 824 | }, 825 | "engines": { 826 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 827 | } 828 | }, 829 | "node_modules/@eslint/eslintrc": { 830 | "version": "3.3.1", 831 | "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 832 | "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 833 | "dev": true, 834 | "license": "MIT", 835 | "dependencies": { 836 | "ajv": "^6.12.4", 837 | "debug": "^4.3.2", 838 | "espree": "^10.0.1", 839 | "globals": "^14.0.0", 840 | "ignore": "^5.2.0", 841 | "import-fresh": "^3.2.1", 842 | "js-yaml": "^4.1.0", 843 | "minimatch": "^3.1.2", 844 | "strip-json-comments": "^3.1.1" 845 | }, 846 | "engines": { 847 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 848 | }, 849 | "funding": { 850 | "url": "https://opencollective.com/eslint" 851 | } 852 | }, 853 | "node_modules/@eslint/eslintrc/node_modules/globals": { 854 | "version": "14.0.0", 855 | "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", 856 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 857 | "dev": true, 858 | "license": "MIT", 859 | "engines": { 860 | "node": ">=18" 861 | }, 862 | "funding": { 863 | "url": "https://github.com/sponsors/sindresorhus" 864 | } 865 | }, 866 | "node_modules/@eslint/js": { 867 | "version": "9.27.0", 868 | "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.27.0.tgz", 869 | "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", 870 | "dev": true, 871 | "license": "MIT", 872 | "engines": { 873 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 874 | }, 875 | "funding": { 876 | "url": "https://eslint.org/donate" 877 | } 878 | }, 879 | "node_modules/@eslint/object-schema": { 880 | "version": "2.1.6", 881 | "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz", 882 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 883 | "dev": true, 884 | "license": "Apache-2.0", 885 | "engines": { 886 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 887 | } 888 | }, 889 | "node_modules/@eslint/plugin-kit": { 890 | "version": "0.3.1", 891 | "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", 892 | "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", 893 | "dev": true, 894 | "license": "Apache-2.0", 895 | "dependencies": { 896 | "@eslint/core": "^0.14.0", 897 | "levn": "^0.4.1" 898 | }, 899 | "engines": { 900 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 901 | } 902 | }, 903 | "node_modules/@humanfs/core": { 904 | "version": "0.19.1", 905 | "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", 906 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 907 | "dev": true, 908 | "license": "Apache-2.0", 909 | "engines": { 910 | "node": ">=18.18.0" 911 | } 912 | }, 913 | "node_modules/@humanfs/node": { 914 | "version": "0.16.6", 915 | "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.6.tgz", 916 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 917 | "dev": true, 918 | "license": "Apache-2.0", 919 | "dependencies": { 920 | "@humanfs/core": "^0.19.1", 921 | "@humanwhocodes/retry": "^0.3.0" 922 | }, 923 | "engines": { 924 | "node": ">=18.18.0" 925 | } 926 | }, 927 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 928 | "version": "0.3.1", 929 | "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.3.1.tgz", 930 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 931 | "dev": true, 932 | "license": "Apache-2.0", 933 | "engines": { 934 | "node": ">=18.18" 935 | }, 936 | "funding": { 937 | "type": "github", 938 | "url": "https://github.com/sponsors/nzakas" 939 | } 940 | }, 941 | "node_modules/@humanwhocodes/module-importer": { 942 | "version": "1.0.1", 943 | "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 944 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 945 | "dev": true, 946 | "license": "Apache-2.0", 947 | "engines": { 948 | "node": ">=12.22" 949 | }, 950 | "funding": { 951 | "type": "github", 952 | "url": "https://github.com/sponsors/nzakas" 953 | } 954 | }, 955 | "node_modules/@humanwhocodes/retry": { 956 | "version": "0.4.3", 957 | "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", 958 | "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 959 | "dev": true, 960 | "license": "Apache-2.0", 961 | "engines": { 962 | "node": ">=18.18" 963 | }, 964 | "funding": { 965 | "type": "github", 966 | "url": "https://github.com/sponsors/nzakas" 967 | } 968 | }, 969 | "node_modules/@jridgewell/gen-mapping": { 970 | "version": "0.3.8", 971 | "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 972 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 973 | "dev": true, 974 | "license": "MIT", 975 | "dependencies": { 976 | "@jridgewell/set-array": "^1.2.1", 977 | "@jridgewell/sourcemap-codec": "^1.4.10", 978 | "@jridgewell/trace-mapping": "^0.3.24" 979 | }, 980 | "engines": { 981 | "node": ">=6.0.0" 982 | } 983 | }, 984 | "node_modules/@jridgewell/resolve-uri": { 985 | "version": "3.1.2", 986 | "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 987 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 988 | "dev": true, 989 | "license": "MIT", 990 | "engines": { 991 | "node": ">=6.0.0" 992 | } 993 | }, 994 | "node_modules/@jridgewell/set-array": { 995 | "version": "1.2.1", 996 | "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", 997 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 998 | "dev": true, 999 | "license": "MIT", 1000 | "engines": { 1001 | "node": ">=6.0.0" 1002 | } 1003 | }, 1004 | "node_modules/@jridgewell/sourcemap-codec": { 1005 | "version": "1.5.0", 1006 | "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1007 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1008 | "dev": true, 1009 | "license": "MIT" 1010 | }, 1011 | "node_modules/@jridgewell/trace-mapping": { 1012 | "version": "0.3.25", 1013 | "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1014 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1015 | "dev": true, 1016 | "license": "MIT", 1017 | "dependencies": { 1018 | "@jridgewell/resolve-uri": "^3.1.0", 1019 | "@jridgewell/sourcemap-codec": "^1.4.14" 1020 | } 1021 | }, 1022 | "node_modules/@nodelib/fs.scandir": { 1023 | "version": "2.1.5", 1024 | "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1025 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1026 | "dev": true, 1027 | "license": "MIT", 1028 | "dependencies": { 1029 | "@nodelib/fs.stat": "2.0.5", 1030 | "run-parallel": "^1.1.9" 1031 | }, 1032 | "engines": { 1033 | "node": ">= 8" 1034 | } 1035 | }, 1036 | "node_modules/@nodelib/fs.stat": { 1037 | "version": "2.0.5", 1038 | "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1039 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1040 | "dev": true, 1041 | "license": "MIT", 1042 | "engines": { 1043 | "node": ">= 8" 1044 | } 1045 | }, 1046 | "node_modules/@nodelib/fs.walk": { 1047 | "version": "1.2.8", 1048 | "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1049 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1050 | "dev": true, 1051 | "license": "MIT", 1052 | "dependencies": { 1053 | "@nodelib/fs.scandir": "2.1.5", 1054 | "fastq": "^1.6.0" 1055 | }, 1056 | "engines": { 1057 | "node": ">= 8" 1058 | } 1059 | }, 1060 | "node_modules/@rollup/rollup-android-arm-eabi": { 1061 | "version": "4.41.0", 1062 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", 1063 | "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", 1064 | "cpu": [ 1065 | "arm" 1066 | ], 1067 | "dev": true, 1068 | "license": "MIT", 1069 | "optional": true, 1070 | "os": [ 1071 | "android" 1072 | ] 1073 | }, 1074 | "node_modules/@rollup/rollup-android-arm64": { 1075 | "version": "4.41.0", 1076 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", 1077 | "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", 1078 | "cpu": [ 1079 | "arm64" 1080 | ], 1081 | "dev": true, 1082 | "license": "MIT", 1083 | "optional": true, 1084 | "os": [ 1085 | "android" 1086 | ] 1087 | }, 1088 | "node_modules/@rollup/rollup-darwin-arm64": { 1089 | "version": "4.41.0", 1090 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", 1091 | "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", 1092 | "cpu": [ 1093 | "arm64" 1094 | ], 1095 | "dev": true, 1096 | "license": "MIT", 1097 | "optional": true, 1098 | "os": [ 1099 | "darwin" 1100 | ] 1101 | }, 1102 | "node_modules/@rollup/rollup-darwin-x64": { 1103 | "version": "4.41.0", 1104 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", 1105 | "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", 1106 | "cpu": [ 1107 | "x64" 1108 | ], 1109 | "dev": true, 1110 | "license": "MIT", 1111 | "optional": true, 1112 | "os": [ 1113 | "darwin" 1114 | ] 1115 | }, 1116 | "node_modules/@rollup/rollup-freebsd-arm64": { 1117 | "version": "4.41.0", 1118 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", 1119 | "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", 1120 | "cpu": [ 1121 | "arm64" 1122 | ], 1123 | "dev": true, 1124 | "license": "MIT", 1125 | "optional": true, 1126 | "os": [ 1127 | "freebsd" 1128 | ] 1129 | }, 1130 | "node_modules/@rollup/rollup-freebsd-x64": { 1131 | "version": "4.41.0", 1132 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", 1133 | "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", 1134 | "cpu": [ 1135 | "x64" 1136 | ], 1137 | "dev": true, 1138 | "license": "MIT", 1139 | "optional": true, 1140 | "os": [ 1141 | "freebsd" 1142 | ] 1143 | }, 1144 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1145 | "version": "4.41.0", 1146 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", 1147 | "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", 1148 | "cpu": [ 1149 | "arm" 1150 | ], 1151 | "dev": true, 1152 | "license": "MIT", 1153 | "optional": true, 1154 | "os": [ 1155 | "linux" 1156 | ] 1157 | }, 1158 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1159 | "version": "4.41.0", 1160 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", 1161 | "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", 1162 | "cpu": [ 1163 | "arm" 1164 | ], 1165 | "dev": true, 1166 | "license": "MIT", 1167 | "optional": true, 1168 | "os": [ 1169 | "linux" 1170 | ] 1171 | }, 1172 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1173 | "version": "4.41.0", 1174 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", 1175 | "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", 1176 | "cpu": [ 1177 | "arm64" 1178 | ], 1179 | "dev": true, 1180 | "license": "MIT", 1181 | "optional": true, 1182 | "os": [ 1183 | "linux" 1184 | ] 1185 | }, 1186 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1187 | "version": "4.41.0", 1188 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", 1189 | "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", 1190 | "cpu": [ 1191 | "arm64" 1192 | ], 1193 | "dev": true, 1194 | "license": "MIT", 1195 | "optional": true, 1196 | "os": [ 1197 | "linux" 1198 | ] 1199 | }, 1200 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1201 | "version": "4.41.0", 1202 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", 1203 | "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", 1204 | "cpu": [ 1205 | "loong64" 1206 | ], 1207 | "dev": true, 1208 | "license": "MIT", 1209 | "optional": true, 1210 | "os": [ 1211 | "linux" 1212 | ] 1213 | }, 1214 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1215 | "version": "4.41.0", 1216 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", 1217 | "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", 1218 | "cpu": [ 1219 | "ppc64" 1220 | ], 1221 | "dev": true, 1222 | "license": "MIT", 1223 | "optional": true, 1224 | "os": [ 1225 | "linux" 1226 | ] 1227 | }, 1228 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1229 | "version": "4.41.0", 1230 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", 1231 | "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", 1232 | "cpu": [ 1233 | "riscv64" 1234 | ], 1235 | "dev": true, 1236 | "license": "MIT", 1237 | "optional": true, 1238 | "os": [ 1239 | "linux" 1240 | ] 1241 | }, 1242 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 1243 | "version": "4.41.0", 1244 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", 1245 | "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", 1246 | "cpu": [ 1247 | "riscv64" 1248 | ], 1249 | "dev": true, 1250 | "license": "MIT", 1251 | "optional": true, 1252 | "os": [ 1253 | "linux" 1254 | ] 1255 | }, 1256 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1257 | "version": "4.41.0", 1258 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", 1259 | "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", 1260 | "cpu": [ 1261 | "s390x" 1262 | ], 1263 | "dev": true, 1264 | "license": "MIT", 1265 | "optional": true, 1266 | "os": [ 1267 | "linux" 1268 | ] 1269 | }, 1270 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1271 | "version": "4.41.0", 1272 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", 1273 | "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", 1274 | "cpu": [ 1275 | "x64" 1276 | ], 1277 | "dev": true, 1278 | "license": "MIT", 1279 | "optional": true, 1280 | "os": [ 1281 | "linux" 1282 | ] 1283 | }, 1284 | "node_modules/@rollup/rollup-linux-x64-musl": { 1285 | "version": "4.41.0", 1286 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", 1287 | "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", 1288 | "cpu": [ 1289 | "x64" 1290 | ], 1291 | "dev": true, 1292 | "license": "MIT", 1293 | "optional": true, 1294 | "os": [ 1295 | "linux" 1296 | ] 1297 | }, 1298 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1299 | "version": "4.41.0", 1300 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", 1301 | "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", 1302 | "cpu": [ 1303 | "arm64" 1304 | ], 1305 | "dev": true, 1306 | "license": "MIT", 1307 | "optional": true, 1308 | "os": [ 1309 | "win32" 1310 | ] 1311 | }, 1312 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1313 | "version": "4.41.0", 1314 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", 1315 | "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", 1316 | "cpu": [ 1317 | "ia32" 1318 | ], 1319 | "dev": true, 1320 | "license": "MIT", 1321 | "optional": true, 1322 | "os": [ 1323 | "win32" 1324 | ] 1325 | }, 1326 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1327 | "version": "4.41.0", 1328 | "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", 1329 | "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", 1330 | "cpu": [ 1331 | "x64" 1332 | ], 1333 | "dev": true, 1334 | "license": "MIT", 1335 | "optional": true, 1336 | "os": [ 1337 | "win32" 1338 | ] 1339 | }, 1340 | "node_modules/@types/babel__core": { 1341 | "version": "7.20.5", 1342 | "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", 1343 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1344 | "dev": true, 1345 | "license": "MIT", 1346 | "dependencies": { 1347 | "@babel/parser": "^7.20.7", 1348 | "@babel/types": "^7.20.7", 1349 | "@types/babel__generator": "*", 1350 | "@types/babel__template": "*", 1351 | "@types/babel__traverse": "*" 1352 | } 1353 | }, 1354 | "node_modules/@types/babel__generator": { 1355 | "version": "7.27.0", 1356 | "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", 1357 | "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 1358 | "dev": true, 1359 | "license": "MIT", 1360 | "dependencies": { 1361 | "@babel/types": "^7.0.0" 1362 | } 1363 | }, 1364 | "node_modules/@types/babel__template": { 1365 | "version": "7.4.4", 1366 | "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", 1367 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1368 | "dev": true, 1369 | "license": "MIT", 1370 | "dependencies": { 1371 | "@babel/parser": "^7.1.0", 1372 | "@babel/types": "^7.0.0" 1373 | } 1374 | }, 1375 | "node_modules/@types/babel__traverse": { 1376 | "version": "7.20.7", 1377 | "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", 1378 | "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", 1379 | "dev": true, 1380 | "license": "MIT", 1381 | "dependencies": { 1382 | "@babel/types": "^7.20.7" 1383 | } 1384 | }, 1385 | "node_modules/@types/estree": { 1386 | "version": "1.0.7", 1387 | "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", 1388 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 1389 | "dev": true, 1390 | "license": "MIT" 1391 | }, 1392 | "node_modules/@types/json-schema": { 1393 | "version": "7.0.15", 1394 | "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", 1395 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1396 | "dev": true, 1397 | "license": "MIT" 1398 | }, 1399 | "node_modules/@types/react": { 1400 | "version": "19.1.4", 1401 | "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.1.4.tgz", 1402 | "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", 1403 | "dev": true, 1404 | "license": "MIT", 1405 | "dependencies": { 1406 | "csstype": "^3.0.2" 1407 | } 1408 | }, 1409 | "node_modules/@types/react-dom": { 1410 | "version": "19.1.5", 1411 | "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.1.5.tgz", 1412 | "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", 1413 | "dev": true, 1414 | "license": "MIT", 1415 | "peerDependencies": { 1416 | "@types/react": "^19.0.0" 1417 | } 1418 | }, 1419 | "node_modules/@typescript-eslint/eslint-plugin": { 1420 | "version": "8.32.1", 1421 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", 1422 | "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", 1423 | "dev": true, 1424 | "license": "MIT", 1425 | "dependencies": { 1426 | "@eslint-community/regexpp": "^4.10.0", 1427 | "@typescript-eslint/scope-manager": "8.32.1", 1428 | "@typescript-eslint/type-utils": "8.32.1", 1429 | "@typescript-eslint/utils": "8.32.1", 1430 | "@typescript-eslint/visitor-keys": "8.32.1", 1431 | "graphemer": "^1.4.0", 1432 | "ignore": "^7.0.0", 1433 | "natural-compare": "^1.4.0", 1434 | "ts-api-utils": "^2.1.0" 1435 | }, 1436 | "engines": { 1437 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1438 | }, 1439 | "funding": { 1440 | "type": "opencollective", 1441 | "url": "https://opencollective.com/typescript-eslint" 1442 | }, 1443 | "peerDependencies": { 1444 | "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", 1445 | "eslint": "^8.57.0 || ^9.0.0", 1446 | "typescript": ">=4.8.4 <5.9.0" 1447 | } 1448 | }, 1449 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { 1450 | "version": "7.0.4", 1451 | "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.4.tgz", 1452 | "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", 1453 | "dev": true, 1454 | "license": "MIT", 1455 | "engines": { 1456 | "node": ">= 4" 1457 | } 1458 | }, 1459 | "node_modules/@typescript-eslint/parser": { 1460 | "version": "8.32.1", 1461 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.32.1.tgz", 1462 | "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", 1463 | "dev": true, 1464 | "license": "MIT", 1465 | "dependencies": { 1466 | "@typescript-eslint/scope-manager": "8.32.1", 1467 | "@typescript-eslint/types": "8.32.1", 1468 | "@typescript-eslint/typescript-estree": "8.32.1", 1469 | "@typescript-eslint/visitor-keys": "8.32.1", 1470 | "debug": "^4.3.4" 1471 | }, 1472 | "engines": { 1473 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1474 | }, 1475 | "funding": { 1476 | "type": "opencollective", 1477 | "url": "https://opencollective.com/typescript-eslint" 1478 | }, 1479 | "peerDependencies": { 1480 | "eslint": "^8.57.0 || ^9.0.0", 1481 | "typescript": ">=4.8.4 <5.9.0" 1482 | } 1483 | }, 1484 | "node_modules/@typescript-eslint/scope-manager": { 1485 | "version": "8.32.1", 1486 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", 1487 | "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", 1488 | "dev": true, 1489 | "license": "MIT", 1490 | "dependencies": { 1491 | "@typescript-eslint/types": "8.32.1", 1492 | "@typescript-eslint/visitor-keys": "8.32.1" 1493 | }, 1494 | "engines": { 1495 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1496 | }, 1497 | "funding": { 1498 | "type": "opencollective", 1499 | "url": "https://opencollective.com/typescript-eslint" 1500 | } 1501 | }, 1502 | "node_modules/@typescript-eslint/type-utils": { 1503 | "version": "8.32.1", 1504 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", 1505 | "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", 1506 | "dev": true, 1507 | "license": "MIT", 1508 | "dependencies": { 1509 | "@typescript-eslint/typescript-estree": "8.32.1", 1510 | "@typescript-eslint/utils": "8.32.1", 1511 | "debug": "^4.3.4", 1512 | "ts-api-utils": "^2.1.0" 1513 | }, 1514 | "engines": { 1515 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1516 | }, 1517 | "funding": { 1518 | "type": "opencollective", 1519 | "url": "https://opencollective.com/typescript-eslint" 1520 | }, 1521 | "peerDependencies": { 1522 | "eslint": "^8.57.0 || ^9.0.0", 1523 | "typescript": ">=4.8.4 <5.9.0" 1524 | } 1525 | }, 1526 | "node_modules/@typescript-eslint/types": { 1527 | "version": "8.32.1", 1528 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.32.1.tgz", 1529 | "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", 1530 | "dev": true, 1531 | "license": "MIT", 1532 | "engines": { 1533 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1534 | }, 1535 | "funding": { 1536 | "type": "opencollective", 1537 | "url": "https://opencollective.com/typescript-eslint" 1538 | } 1539 | }, 1540 | "node_modules/@typescript-eslint/typescript-estree": { 1541 | "version": "8.32.1", 1542 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", 1543 | "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", 1544 | "dev": true, 1545 | "license": "MIT", 1546 | "dependencies": { 1547 | "@typescript-eslint/types": "8.32.1", 1548 | "@typescript-eslint/visitor-keys": "8.32.1", 1549 | "debug": "^4.3.4", 1550 | "fast-glob": "^3.3.2", 1551 | "is-glob": "^4.0.3", 1552 | "minimatch": "^9.0.4", 1553 | "semver": "^7.6.0", 1554 | "ts-api-utils": "^2.1.0" 1555 | }, 1556 | "engines": { 1557 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1558 | }, 1559 | "funding": { 1560 | "type": "opencollective", 1561 | "url": "https://opencollective.com/typescript-eslint" 1562 | }, 1563 | "peerDependencies": { 1564 | "typescript": ">=4.8.4 <5.9.0" 1565 | } 1566 | }, 1567 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1568 | "version": "2.0.1", 1569 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", 1570 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1571 | "dev": true, 1572 | "license": "MIT", 1573 | "dependencies": { 1574 | "balanced-match": "^1.0.0" 1575 | } 1576 | }, 1577 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1578 | "version": "9.0.5", 1579 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", 1580 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1581 | "dev": true, 1582 | "license": "ISC", 1583 | "dependencies": { 1584 | "brace-expansion": "^2.0.1" 1585 | }, 1586 | "engines": { 1587 | "node": ">=16 || 14 >=14.17" 1588 | }, 1589 | "funding": { 1590 | "url": "https://github.com/sponsors/isaacs" 1591 | } 1592 | }, 1593 | "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 1594 | "version": "7.7.2", 1595 | "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", 1596 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1597 | "dev": true, 1598 | "license": "ISC", 1599 | "bin": { 1600 | "semver": "bin/semver.js" 1601 | }, 1602 | "engines": { 1603 | "node": ">=10" 1604 | } 1605 | }, 1606 | "node_modules/@typescript-eslint/utils": { 1607 | "version": "8.32.1", 1608 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.32.1.tgz", 1609 | "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", 1610 | "dev": true, 1611 | "license": "MIT", 1612 | "dependencies": { 1613 | "@eslint-community/eslint-utils": "^4.7.0", 1614 | "@typescript-eslint/scope-manager": "8.32.1", 1615 | "@typescript-eslint/types": "8.32.1", 1616 | "@typescript-eslint/typescript-estree": "8.32.1" 1617 | }, 1618 | "engines": { 1619 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1620 | }, 1621 | "funding": { 1622 | "type": "opencollective", 1623 | "url": "https://opencollective.com/typescript-eslint" 1624 | }, 1625 | "peerDependencies": { 1626 | "eslint": "^8.57.0 || ^9.0.0", 1627 | "typescript": ">=4.8.4 <5.9.0" 1628 | } 1629 | }, 1630 | "node_modules/@typescript-eslint/visitor-keys": { 1631 | "version": "8.32.1", 1632 | "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", 1633 | "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", 1634 | "dev": true, 1635 | "license": "MIT", 1636 | "dependencies": { 1637 | "@typescript-eslint/types": "8.32.1", 1638 | "eslint-visitor-keys": "^4.2.0" 1639 | }, 1640 | "engines": { 1641 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1642 | }, 1643 | "funding": { 1644 | "type": "opencollective", 1645 | "url": "https://opencollective.com/typescript-eslint" 1646 | } 1647 | }, 1648 | "node_modules/@vitejs/plugin-react": { 1649 | "version": "4.4.1", 1650 | "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", 1651 | "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", 1652 | "dev": true, 1653 | "license": "MIT", 1654 | "dependencies": { 1655 | "@babel/core": "^7.26.10", 1656 | "@babel/plugin-transform-react-jsx-self": "^7.25.9", 1657 | "@babel/plugin-transform-react-jsx-source": "^7.25.9", 1658 | "@types/babel__core": "^7.20.5", 1659 | "react-refresh": "^0.17.0" 1660 | }, 1661 | "engines": { 1662 | "node": "^14.18.0 || >=16.0.0" 1663 | }, 1664 | "peerDependencies": { 1665 | "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" 1666 | } 1667 | }, 1668 | "node_modules/acorn": { 1669 | "version": "8.14.1", 1670 | "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", 1671 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 1672 | "dev": true, 1673 | "license": "MIT", 1674 | "bin": { 1675 | "acorn": "bin/acorn" 1676 | }, 1677 | "engines": { 1678 | "node": ">=0.4.0" 1679 | } 1680 | }, 1681 | "node_modules/acorn-jsx": { 1682 | "version": "5.3.2", 1683 | "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1684 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1685 | "dev": true, 1686 | "license": "MIT", 1687 | "peerDependencies": { 1688 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1689 | } 1690 | }, 1691 | "node_modules/ajv": { 1692 | "version": "6.12.6", 1693 | "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", 1694 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1695 | "dev": true, 1696 | "license": "MIT", 1697 | "dependencies": { 1698 | "fast-deep-equal": "^3.1.1", 1699 | "fast-json-stable-stringify": "^2.0.0", 1700 | "json-schema-traverse": "^0.4.1", 1701 | "uri-js": "^4.2.2" 1702 | }, 1703 | "funding": { 1704 | "type": "github", 1705 | "url": "https://github.com/sponsors/epoberezkin" 1706 | } 1707 | }, 1708 | "node_modules/ansi-styles": { 1709 | "version": "4.3.0", 1710 | "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", 1711 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1712 | "dev": true, 1713 | "license": "MIT", 1714 | "dependencies": { 1715 | "color-convert": "^2.0.1" 1716 | }, 1717 | "engines": { 1718 | "node": ">=8" 1719 | }, 1720 | "funding": { 1721 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1722 | } 1723 | }, 1724 | "node_modules/argparse": { 1725 | "version": "2.0.1", 1726 | "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", 1727 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1728 | "dev": true, 1729 | "license": "Python-2.0" 1730 | }, 1731 | "node_modules/balanced-match": { 1732 | "version": "1.0.2", 1733 | "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", 1734 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1735 | "dev": true, 1736 | "license": "MIT" 1737 | }, 1738 | "node_modules/brace-expansion": { 1739 | "version": "1.1.11", 1740 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", 1741 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1742 | "dev": true, 1743 | "license": "MIT", 1744 | "dependencies": { 1745 | "balanced-match": "^1.0.0", 1746 | "concat-map": "0.0.1" 1747 | } 1748 | }, 1749 | "node_modules/braces": { 1750 | "version": "3.0.3", 1751 | "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", 1752 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1753 | "dev": true, 1754 | "license": "MIT", 1755 | "dependencies": { 1756 | "fill-range": "^7.1.1" 1757 | }, 1758 | "engines": { 1759 | "node": ">=8" 1760 | } 1761 | }, 1762 | "node_modules/browserslist": { 1763 | "version": "4.24.5", 1764 | "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.5.tgz", 1765 | "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", 1766 | "dev": true, 1767 | "funding": [ 1768 | { 1769 | "type": "opencollective", 1770 | "url": "https://opencollective.com/browserslist" 1771 | }, 1772 | { 1773 | "type": "tidelift", 1774 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1775 | }, 1776 | { 1777 | "type": "github", 1778 | "url": "https://github.com/sponsors/ai" 1779 | } 1780 | ], 1781 | "license": "MIT", 1782 | "dependencies": { 1783 | "caniuse-lite": "^1.0.30001716", 1784 | "electron-to-chromium": "^1.5.149", 1785 | "node-releases": "^2.0.19", 1786 | "update-browserslist-db": "^1.1.3" 1787 | }, 1788 | "bin": { 1789 | "browserslist": "cli.js" 1790 | }, 1791 | "engines": { 1792 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1793 | } 1794 | }, 1795 | "node_modules/callsites": { 1796 | "version": "3.1.0", 1797 | "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", 1798 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1799 | "dev": true, 1800 | "license": "MIT", 1801 | "engines": { 1802 | "node": ">=6" 1803 | } 1804 | }, 1805 | "node_modules/caniuse-lite": { 1806 | "version": "1.0.30001718", 1807 | "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", 1808 | "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", 1809 | "dev": true, 1810 | "funding": [ 1811 | { 1812 | "type": "opencollective", 1813 | "url": "https://opencollective.com/browserslist" 1814 | }, 1815 | { 1816 | "type": "tidelift", 1817 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1818 | }, 1819 | { 1820 | "type": "github", 1821 | "url": "https://github.com/sponsors/ai" 1822 | } 1823 | ], 1824 | "license": "CC-BY-4.0" 1825 | }, 1826 | "node_modules/chalk": { 1827 | "version": "4.1.2", 1828 | "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", 1829 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1830 | "dev": true, 1831 | "license": "MIT", 1832 | "dependencies": { 1833 | "ansi-styles": "^4.1.0", 1834 | "supports-color": "^7.1.0" 1835 | }, 1836 | "engines": { 1837 | "node": ">=10" 1838 | }, 1839 | "funding": { 1840 | "url": "https://github.com/chalk/chalk?sponsor=1" 1841 | } 1842 | }, 1843 | "node_modules/color-convert": { 1844 | "version": "2.0.1", 1845 | "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", 1846 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1847 | "dev": true, 1848 | "license": "MIT", 1849 | "dependencies": { 1850 | "color-name": "~1.1.4" 1851 | }, 1852 | "engines": { 1853 | "node": ">=7.0.0" 1854 | } 1855 | }, 1856 | "node_modules/color-name": { 1857 | "version": "1.1.4", 1858 | "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", 1859 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1860 | "dev": true, 1861 | "license": "MIT" 1862 | }, 1863 | "node_modules/concat-map": { 1864 | "version": "0.0.1", 1865 | "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", 1866 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1867 | "dev": true, 1868 | "license": "MIT" 1869 | }, 1870 | "node_modules/convert-source-map": { 1871 | "version": "2.0.0", 1872 | "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", 1873 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1874 | "dev": true, 1875 | "license": "MIT" 1876 | }, 1877 | "node_modules/cross-spawn": { 1878 | "version": "7.0.6", 1879 | "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", 1880 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1881 | "dev": true, 1882 | "license": "MIT", 1883 | "dependencies": { 1884 | "path-key": "^3.1.0", 1885 | "shebang-command": "^2.0.0", 1886 | "which": "^2.0.1" 1887 | }, 1888 | "engines": { 1889 | "node": ">= 8" 1890 | } 1891 | }, 1892 | "node_modules/csstype": { 1893 | "version": "3.1.3", 1894 | "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", 1895 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1896 | "dev": true, 1897 | "license": "MIT" 1898 | }, 1899 | "node_modules/debug": { 1900 | "version": "4.4.1", 1901 | "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", 1902 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 1903 | "dev": true, 1904 | "license": "MIT", 1905 | "dependencies": { 1906 | "ms": "^2.1.3" 1907 | }, 1908 | "engines": { 1909 | "node": ">=6.0" 1910 | }, 1911 | "peerDependenciesMeta": { 1912 | "supports-color": { 1913 | "optional": true 1914 | } 1915 | } 1916 | }, 1917 | "node_modules/deep-is": { 1918 | "version": "0.1.4", 1919 | "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", 1920 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1921 | "dev": true, 1922 | "license": "MIT" 1923 | }, 1924 | "node_modules/electron-to-chromium": { 1925 | "version": "1.5.155", 1926 | "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", 1927 | "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", 1928 | "dev": true, 1929 | "license": "ISC" 1930 | }, 1931 | "node_modules/esbuild": { 1932 | "version": "0.25.4", 1933 | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.4.tgz", 1934 | "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", 1935 | "dev": true, 1936 | "hasInstallScript": true, 1937 | "license": "MIT", 1938 | "bin": { 1939 | "esbuild": "bin/esbuild" 1940 | }, 1941 | "engines": { 1942 | "node": ">=18" 1943 | }, 1944 | "optionalDependencies": { 1945 | "@esbuild/aix-ppc64": "0.25.4", 1946 | "@esbuild/android-arm": "0.25.4", 1947 | "@esbuild/android-arm64": "0.25.4", 1948 | "@esbuild/android-x64": "0.25.4", 1949 | "@esbuild/darwin-arm64": "0.25.4", 1950 | "@esbuild/darwin-x64": "0.25.4", 1951 | "@esbuild/freebsd-arm64": "0.25.4", 1952 | "@esbuild/freebsd-x64": "0.25.4", 1953 | "@esbuild/linux-arm": "0.25.4", 1954 | "@esbuild/linux-arm64": "0.25.4", 1955 | "@esbuild/linux-ia32": "0.25.4", 1956 | "@esbuild/linux-loong64": "0.25.4", 1957 | "@esbuild/linux-mips64el": "0.25.4", 1958 | "@esbuild/linux-ppc64": "0.25.4", 1959 | "@esbuild/linux-riscv64": "0.25.4", 1960 | "@esbuild/linux-s390x": "0.25.4", 1961 | "@esbuild/linux-x64": "0.25.4", 1962 | "@esbuild/netbsd-arm64": "0.25.4", 1963 | "@esbuild/netbsd-x64": "0.25.4", 1964 | "@esbuild/openbsd-arm64": "0.25.4", 1965 | "@esbuild/openbsd-x64": "0.25.4", 1966 | "@esbuild/sunos-x64": "0.25.4", 1967 | "@esbuild/win32-arm64": "0.25.4", 1968 | "@esbuild/win32-ia32": "0.25.4", 1969 | "@esbuild/win32-x64": "0.25.4" 1970 | } 1971 | }, 1972 | "node_modules/escalade": { 1973 | "version": "3.2.0", 1974 | "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", 1975 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1976 | "dev": true, 1977 | "license": "MIT", 1978 | "engines": { 1979 | "node": ">=6" 1980 | } 1981 | }, 1982 | "node_modules/escape-string-regexp": { 1983 | "version": "4.0.0", 1984 | "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1985 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1986 | "dev": true, 1987 | "license": "MIT", 1988 | "engines": { 1989 | "node": ">=10" 1990 | }, 1991 | "funding": { 1992 | "url": "https://github.com/sponsors/sindresorhus" 1993 | } 1994 | }, 1995 | "node_modules/eslint": { 1996 | "version": "9.27.0", 1997 | "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.27.0.tgz", 1998 | "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", 1999 | "dev": true, 2000 | "license": "MIT", 2001 | "dependencies": { 2002 | "@eslint-community/eslint-utils": "^4.2.0", 2003 | "@eslint-community/regexpp": "^4.12.1", 2004 | "@eslint/config-array": "^0.20.0", 2005 | "@eslint/config-helpers": "^0.2.1", 2006 | "@eslint/core": "^0.14.0", 2007 | "@eslint/eslintrc": "^3.3.1", 2008 | "@eslint/js": "9.27.0", 2009 | "@eslint/plugin-kit": "^0.3.1", 2010 | "@humanfs/node": "^0.16.6", 2011 | "@humanwhocodes/module-importer": "^1.0.1", 2012 | "@humanwhocodes/retry": "^0.4.2", 2013 | "@types/estree": "^1.0.6", 2014 | "@types/json-schema": "^7.0.15", 2015 | "ajv": "^6.12.4", 2016 | "chalk": "^4.0.0", 2017 | "cross-spawn": "^7.0.6", 2018 | "debug": "^4.3.2", 2019 | "escape-string-regexp": "^4.0.0", 2020 | "eslint-scope": "^8.3.0", 2021 | "eslint-visitor-keys": "^4.2.0", 2022 | "espree": "^10.3.0", 2023 | "esquery": "^1.5.0", 2024 | "esutils": "^2.0.2", 2025 | "fast-deep-equal": "^3.1.3", 2026 | "file-entry-cache": "^8.0.0", 2027 | "find-up": "^5.0.0", 2028 | "glob-parent": "^6.0.2", 2029 | "ignore": "^5.2.0", 2030 | "imurmurhash": "^0.1.4", 2031 | "is-glob": "^4.0.0", 2032 | "json-stable-stringify-without-jsonify": "^1.0.1", 2033 | "lodash.merge": "^4.6.2", 2034 | "minimatch": "^3.1.2", 2035 | "natural-compare": "^1.4.0", 2036 | "optionator": "^0.9.3" 2037 | }, 2038 | "bin": { 2039 | "eslint": "bin/eslint.js" 2040 | }, 2041 | "engines": { 2042 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2043 | }, 2044 | "funding": { 2045 | "url": "https://eslint.org/donate" 2046 | }, 2047 | "peerDependencies": { 2048 | "jiti": "*" 2049 | }, 2050 | "peerDependenciesMeta": { 2051 | "jiti": { 2052 | "optional": true 2053 | } 2054 | } 2055 | }, 2056 | "node_modules/eslint-plugin-react-hooks": { 2057 | "version": "5.2.0", 2058 | "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", 2059 | "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", 2060 | "dev": true, 2061 | "license": "MIT", 2062 | "engines": { 2063 | "node": ">=10" 2064 | }, 2065 | "peerDependencies": { 2066 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 2067 | } 2068 | }, 2069 | "node_modules/eslint-plugin-react-refresh": { 2070 | "version": "0.4.20", 2071 | "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", 2072 | "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", 2073 | "dev": true, 2074 | "license": "MIT", 2075 | "peerDependencies": { 2076 | "eslint": ">=8.40" 2077 | } 2078 | }, 2079 | "node_modules/eslint-scope": { 2080 | "version": "8.3.0", 2081 | "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.3.0.tgz", 2082 | "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", 2083 | "dev": true, 2084 | "license": "BSD-2-Clause", 2085 | "dependencies": { 2086 | "esrecurse": "^4.3.0", 2087 | "estraverse": "^5.2.0" 2088 | }, 2089 | "engines": { 2090 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2091 | }, 2092 | "funding": { 2093 | "url": "https://opencollective.com/eslint" 2094 | } 2095 | }, 2096 | "node_modules/eslint-visitor-keys": { 2097 | "version": "4.2.0", 2098 | "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 2099 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 2100 | "dev": true, 2101 | "license": "Apache-2.0", 2102 | "engines": { 2103 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2104 | }, 2105 | "funding": { 2106 | "url": "https://opencollective.com/eslint" 2107 | } 2108 | }, 2109 | "node_modules/espree": { 2110 | "version": "10.3.0", 2111 | "resolved": "https://registry.npmmirror.com/espree/-/espree-10.3.0.tgz", 2112 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 2113 | "dev": true, 2114 | "license": "BSD-2-Clause", 2115 | "dependencies": { 2116 | "acorn": "^8.14.0", 2117 | "acorn-jsx": "^5.3.2", 2118 | "eslint-visitor-keys": "^4.2.0" 2119 | }, 2120 | "engines": { 2121 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2122 | }, 2123 | "funding": { 2124 | "url": "https://opencollective.com/eslint" 2125 | } 2126 | }, 2127 | "node_modules/esquery": { 2128 | "version": "1.6.0", 2129 | "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", 2130 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 2131 | "dev": true, 2132 | "license": "BSD-3-Clause", 2133 | "dependencies": { 2134 | "estraverse": "^5.1.0" 2135 | }, 2136 | "engines": { 2137 | "node": ">=0.10" 2138 | } 2139 | }, 2140 | "node_modules/esrecurse": { 2141 | "version": "4.3.0", 2142 | "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", 2143 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2144 | "dev": true, 2145 | "license": "BSD-2-Clause", 2146 | "dependencies": { 2147 | "estraverse": "^5.2.0" 2148 | }, 2149 | "engines": { 2150 | "node": ">=4.0" 2151 | } 2152 | }, 2153 | "node_modules/estraverse": { 2154 | "version": "5.3.0", 2155 | "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", 2156 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2157 | "dev": true, 2158 | "license": "BSD-2-Clause", 2159 | "engines": { 2160 | "node": ">=4.0" 2161 | } 2162 | }, 2163 | "node_modules/esutils": { 2164 | "version": "2.0.3", 2165 | "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", 2166 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2167 | "dev": true, 2168 | "license": "BSD-2-Clause", 2169 | "engines": { 2170 | "node": ">=0.10.0" 2171 | } 2172 | }, 2173 | "node_modules/fast-deep-equal": { 2174 | "version": "3.1.3", 2175 | "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2176 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2177 | "dev": true, 2178 | "license": "MIT" 2179 | }, 2180 | "node_modules/fast-glob": { 2181 | "version": "3.3.3", 2182 | "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", 2183 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 2184 | "dev": true, 2185 | "license": "MIT", 2186 | "dependencies": { 2187 | "@nodelib/fs.stat": "^2.0.2", 2188 | "@nodelib/fs.walk": "^1.2.3", 2189 | "glob-parent": "^5.1.2", 2190 | "merge2": "^1.3.0", 2191 | "micromatch": "^4.0.8" 2192 | }, 2193 | "engines": { 2194 | "node": ">=8.6.0" 2195 | } 2196 | }, 2197 | "node_modules/fast-glob/node_modules/glob-parent": { 2198 | "version": "5.1.2", 2199 | "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", 2200 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2201 | "dev": true, 2202 | "license": "ISC", 2203 | "dependencies": { 2204 | "is-glob": "^4.0.1" 2205 | }, 2206 | "engines": { 2207 | "node": ">= 6" 2208 | } 2209 | }, 2210 | "node_modules/fast-json-stable-stringify": { 2211 | "version": "2.1.0", 2212 | "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2213 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2214 | "dev": true, 2215 | "license": "MIT" 2216 | }, 2217 | "node_modules/fast-levenshtein": { 2218 | "version": "2.0.6", 2219 | "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2220 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2221 | "dev": true, 2222 | "license": "MIT" 2223 | }, 2224 | "node_modules/fastq": { 2225 | "version": "1.19.1", 2226 | "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", 2227 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 2228 | "dev": true, 2229 | "license": "ISC", 2230 | "dependencies": { 2231 | "reusify": "^1.0.4" 2232 | } 2233 | }, 2234 | "node_modules/file-entry-cache": { 2235 | "version": "8.0.0", 2236 | "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2237 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2238 | "dev": true, 2239 | "license": "MIT", 2240 | "dependencies": { 2241 | "flat-cache": "^4.0.0" 2242 | }, 2243 | "engines": { 2244 | "node": ">=16.0.0" 2245 | } 2246 | }, 2247 | "node_modules/fill-range": { 2248 | "version": "7.1.1", 2249 | "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", 2250 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2251 | "dev": true, 2252 | "license": "MIT", 2253 | "dependencies": { 2254 | "to-regex-range": "^5.0.1" 2255 | }, 2256 | "engines": { 2257 | "node": ">=8" 2258 | } 2259 | }, 2260 | "node_modules/find-up": { 2261 | "version": "5.0.0", 2262 | "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", 2263 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2264 | "dev": true, 2265 | "license": "MIT", 2266 | "dependencies": { 2267 | "locate-path": "^6.0.0", 2268 | "path-exists": "^4.0.0" 2269 | }, 2270 | "engines": { 2271 | "node": ">=10" 2272 | }, 2273 | "funding": { 2274 | "url": "https://github.com/sponsors/sindresorhus" 2275 | } 2276 | }, 2277 | "node_modules/flat-cache": { 2278 | "version": "4.0.1", 2279 | "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", 2280 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2281 | "dev": true, 2282 | "license": "MIT", 2283 | "dependencies": { 2284 | "flatted": "^3.2.9", 2285 | "keyv": "^4.5.4" 2286 | }, 2287 | "engines": { 2288 | "node": ">=16" 2289 | } 2290 | }, 2291 | "node_modules/flatted": { 2292 | "version": "3.3.3", 2293 | "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", 2294 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2295 | "dev": true, 2296 | "license": "ISC" 2297 | }, 2298 | "node_modules/fsevents": { 2299 | "version": "2.3.3", 2300 | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", 2301 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2302 | "dev": true, 2303 | "hasInstallScript": true, 2304 | "license": "MIT", 2305 | "optional": true, 2306 | "os": [ 2307 | "darwin" 2308 | ], 2309 | "engines": { 2310 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2311 | } 2312 | }, 2313 | "node_modules/gensync": { 2314 | "version": "1.0.0-beta.2", 2315 | "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", 2316 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2317 | "dev": true, 2318 | "license": "MIT", 2319 | "engines": { 2320 | "node": ">=6.9.0" 2321 | } 2322 | }, 2323 | "node_modules/glob-parent": { 2324 | "version": "6.0.2", 2325 | "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", 2326 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2327 | "dev": true, 2328 | "license": "ISC", 2329 | "dependencies": { 2330 | "is-glob": "^4.0.3" 2331 | }, 2332 | "engines": { 2333 | "node": ">=10.13.0" 2334 | } 2335 | }, 2336 | "node_modules/globals": { 2337 | "version": "16.1.0", 2338 | "resolved": "https://registry.npmmirror.com/globals/-/globals-16.1.0.tgz", 2339 | "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", 2340 | "dev": true, 2341 | "license": "MIT", 2342 | "engines": { 2343 | "node": ">=18" 2344 | }, 2345 | "funding": { 2346 | "url": "https://github.com/sponsors/sindresorhus" 2347 | } 2348 | }, 2349 | "node_modules/graphemer": { 2350 | "version": "1.4.0", 2351 | "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", 2352 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 2353 | "dev": true, 2354 | "license": "MIT" 2355 | }, 2356 | "node_modules/has-flag": { 2357 | "version": "4.0.0", 2358 | "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", 2359 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2360 | "dev": true, 2361 | "license": "MIT", 2362 | "engines": { 2363 | "node": ">=8" 2364 | } 2365 | }, 2366 | "node_modules/ignore": { 2367 | "version": "5.3.2", 2368 | "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", 2369 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 2370 | "dev": true, 2371 | "license": "MIT", 2372 | "engines": { 2373 | "node": ">= 4" 2374 | } 2375 | }, 2376 | "node_modules/import-fresh": { 2377 | "version": "3.3.1", 2378 | "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", 2379 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 2380 | "dev": true, 2381 | "license": "MIT", 2382 | "dependencies": { 2383 | "parent-module": "^1.0.0", 2384 | "resolve-from": "^4.0.0" 2385 | }, 2386 | "engines": { 2387 | "node": ">=6" 2388 | }, 2389 | "funding": { 2390 | "url": "https://github.com/sponsors/sindresorhus" 2391 | } 2392 | }, 2393 | "node_modules/imurmurhash": { 2394 | "version": "0.1.4", 2395 | "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", 2396 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2397 | "dev": true, 2398 | "license": "MIT", 2399 | "engines": { 2400 | "node": ">=0.8.19" 2401 | } 2402 | }, 2403 | "node_modules/is-extglob": { 2404 | "version": "2.1.1", 2405 | "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", 2406 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2407 | "dev": true, 2408 | "license": "MIT", 2409 | "engines": { 2410 | "node": ">=0.10.0" 2411 | } 2412 | }, 2413 | "node_modules/is-glob": { 2414 | "version": "4.0.3", 2415 | "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", 2416 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2417 | "dev": true, 2418 | "license": "MIT", 2419 | "dependencies": { 2420 | "is-extglob": "^2.1.1" 2421 | }, 2422 | "engines": { 2423 | "node": ">=0.10.0" 2424 | } 2425 | }, 2426 | "node_modules/is-number": { 2427 | "version": "7.0.0", 2428 | "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", 2429 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2430 | "dev": true, 2431 | "license": "MIT", 2432 | "engines": { 2433 | "node": ">=0.12.0" 2434 | } 2435 | }, 2436 | "node_modules/isexe": { 2437 | "version": "2.0.0", 2438 | "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", 2439 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2440 | "dev": true, 2441 | "license": "ISC" 2442 | }, 2443 | "node_modules/js-tokens": { 2444 | "version": "4.0.0", 2445 | "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", 2446 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2447 | "dev": true, 2448 | "license": "MIT" 2449 | }, 2450 | "node_modules/js-yaml": { 2451 | "version": "4.1.0", 2452 | "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", 2453 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2454 | "dev": true, 2455 | "license": "MIT", 2456 | "dependencies": { 2457 | "argparse": "^2.0.1" 2458 | }, 2459 | "bin": { 2460 | "js-yaml": "bin/js-yaml.js" 2461 | } 2462 | }, 2463 | "node_modules/jsesc": { 2464 | "version": "3.1.0", 2465 | "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", 2466 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2467 | "dev": true, 2468 | "license": "MIT", 2469 | "bin": { 2470 | "jsesc": "bin/jsesc" 2471 | }, 2472 | "engines": { 2473 | "node": ">=6" 2474 | } 2475 | }, 2476 | "node_modules/json-buffer": { 2477 | "version": "3.0.1", 2478 | "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", 2479 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 2480 | "dev": true, 2481 | "license": "MIT" 2482 | }, 2483 | "node_modules/json-schema-traverse": { 2484 | "version": "0.4.1", 2485 | "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2486 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2487 | "dev": true, 2488 | "license": "MIT" 2489 | }, 2490 | "node_modules/json-stable-stringify-without-jsonify": { 2491 | "version": "1.0.1", 2492 | "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2493 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2494 | "dev": true, 2495 | "license": "MIT" 2496 | }, 2497 | "node_modules/json5": { 2498 | "version": "2.2.3", 2499 | "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", 2500 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2501 | "dev": true, 2502 | "license": "MIT", 2503 | "bin": { 2504 | "json5": "lib/cli.js" 2505 | }, 2506 | "engines": { 2507 | "node": ">=6" 2508 | } 2509 | }, 2510 | "node_modules/keyv": { 2511 | "version": "4.5.4", 2512 | "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", 2513 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 2514 | "dev": true, 2515 | "license": "MIT", 2516 | "dependencies": { 2517 | "json-buffer": "3.0.1" 2518 | } 2519 | }, 2520 | "node_modules/levn": { 2521 | "version": "0.4.1", 2522 | "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", 2523 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2524 | "dev": true, 2525 | "license": "MIT", 2526 | "dependencies": { 2527 | "prelude-ls": "^1.2.1", 2528 | "type-check": "~0.4.0" 2529 | }, 2530 | "engines": { 2531 | "node": ">= 0.8.0" 2532 | } 2533 | }, 2534 | "node_modules/locate-path": { 2535 | "version": "6.0.0", 2536 | "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", 2537 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2538 | "dev": true, 2539 | "license": "MIT", 2540 | "dependencies": { 2541 | "p-locate": "^5.0.0" 2542 | }, 2543 | "engines": { 2544 | "node": ">=10" 2545 | }, 2546 | "funding": { 2547 | "url": "https://github.com/sponsors/sindresorhus" 2548 | } 2549 | }, 2550 | "node_modules/lodash.merge": { 2551 | "version": "4.6.2", 2552 | "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", 2553 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2554 | "dev": true, 2555 | "license": "MIT" 2556 | }, 2557 | "node_modules/lru-cache": { 2558 | "version": "5.1.1", 2559 | "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", 2560 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2561 | "dev": true, 2562 | "license": "ISC", 2563 | "dependencies": { 2564 | "yallist": "^3.0.2" 2565 | } 2566 | }, 2567 | "node_modules/merge2": { 2568 | "version": "1.4.1", 2569 | "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", 2570 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2571 | "dev": true, 2572 | "license": "MIT", 2573 | "engines": { 2574 | "node": ">= 8" 2575 | } 2576 | }, 2577 | "node_modules/micromatch": { 2578 | "version": "4.0.8", 2579 | "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", 2580 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2581 | "dev": true, 2582 | "license": "MIT", 2583 | "dependencies": { 2584 | "braces": "^3.0.3", 2585 | "picomatch": "^2.3.1" 2586 | }, 2587 | "engines": { 2588 | "node": ">=8.6" 2589 | } 2590 | }, 2591 | "node_modules/minimatch": { 2592 | "version": "3.1.2", 2593 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", 2594 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2595 | "dev": true, 2596 | "license": "ISC", 2597 | "dependencies": { 2598 | "brace-expansion": "^1.1.7" 2599 | }, 2600 | "engines": { 2601 | "node": "*" 2602 | } 2603 | }, 2604 | "node_modules/ms": { 2605 | "version": "2.1.3", 2606 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", 2607 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2608 | "dev": true, 2609 | "license": "MIT" 2610 | }, 2611 | "node_modules/nanoid": { 2612 | "version": "3.3.11", 2613 | "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", 2614 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 2615 | "dev": true, 2616 | "funding": [ 2617 | { 2618 | "type": "github", 2619 | "url": "https://github.com/sponsors/ai" 2620 | } 2621 | ], 2622 | "license": "MIT", 2623 | "bin": { 2624 | "nanoid": "bin/nanoid.cjs" 2625 | }, 2626 | "engines": { 2627 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2628 | } 2629 | }, 2630 | "node_modules/natural-compare": { 2631 | "version": "1.4.0", 2632 | "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", 2633 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2634 | "dev": true, 2635 | "license": "MIT" 2636 | }, 2637 | "node_modules/node-releases": { 2638 | "version": "2.0.19", 2639 | "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", 2640 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2641 | "dev": true, 2642 | "license": "MIT" 2643 | }, 2644 | "node_modules/optionator": { 2645 | "version": "0.9.4", 2646 | "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", 2647 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 2648 | "dev": true, 2649 | "license": "MIT", 2650 | "dependencies": { 2651 | "deep-is": "^0.1.3", 2652 | "fast-levenshtein": "^2.0.6", 2653 | "levn": "^0.4.1", 2654 | "prelude-ls": "^1.2.1", 2655 | "type-check": "^0.4.0", 2656 | "word-wrap": "^1.2.5" 2657 | }, 2658 | "engines": { 2659 | "node": ">= 0.8.0" 2660 | } 2661 | }, 2662 | "node_modules/p-limit": { 2663 | "version": "3.1.0", 2664 | "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", 2665 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2666 | "dev": true, 2667 | "license": "MIT", 2668 | "dependencies": { 2669 | "yocto-queue": "^0.1.0" 2670 | }, 2671 | "engines": { 2672 | "node": ">=10" 2673 | }, 2674 | "funding": { 2675 | "url": "https://github.com/sponsors/sindresorhus" 2676 | } 2677 | }, 2678 | "node_modules/p-locate": { 2679 | "version": "5.0.0", 2680 | "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", 2681 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2682 | "dev": true, 2683 | "license": "MIT", 2684 | "dependencies": { 2685 | "p-limit": "^3.0.2" 2686 | }, 2687 | "engines": { 2688 | "node": ">=10" 2689 | }, 2690 | "funding": { 2691 | "url": "https://github.com/sponsors/sindresorhus" 2692 | } 2693 | }, 2694 | "node_modules/parent-module": { 2695 | "version": "1.0.1", 2696 | "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", 2697 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2698 | "dev": true, 2699 | "license": "MIT", 2700 | "dependencies": { 2701 | "callsites": "^3.0.0" 2702 | }, 2703 | "engines": { 2704 | "node": ">=6" 2705 | } 2706 | }, 2707 | "node_modules/path-exists": { 2708 | "version": "4.0.0", 2709 | "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", 2710 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2711 | "dev": true, 2712 | "license": "MIT", 2713 | "engines": { 2714 | "node": ">=8" 2715 | } 2716 | }, 2717 | "node_modules/path-key": { 2718 | "version": "3.1.1", 2719 | "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", 2720 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2721 | "dev": true, 2722 | "license": "MIT", 2723 | "engines": { 2724 | "node": ">=8" 2725 | } 2726 | }, 2727 | "node_modules/picocolors": { 2728 | "version": "1.1.1", 2729 | "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", 2730 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2731 | "dev": true, 2732 | "license": "ISC" 2733 | }, 2734 | "node_modules/picomatch": { 2735 | "version": "2.3.1", 2736 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", 2737 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2738 | "dev": true, 2739 | "license": "MIT", 2740 | "engines": { 2741 | "node": ">=8.6" 2742 | }, 2743 | "funding": { 2744 | "url": "https://github.com/sponsors/jonschlinkert" 2745 | } 2746 | }, 2747 | "node_modules/postcss": { 2748 | "version": "8.5.3", 2749 | "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz", 2750 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 2751 | "dev": true, 2752 | "funding": [ 2753 | { 2754 | "type": "opencollective", 2755 | "url": "https://opencollective.com/postcss/" 2756 | }, 2757 | { 2758 | "type": "tidelift", 2759 | "url": "https://tidelift.com/funding/github/npm/postcss" 2760 | }, 2761 | { 2762 | "type": "github", 2763 | "url": "https://github.com/sponsors/ai" 2764 | } 2765 | ], 2766 | "license": "MIT", 2767 | "dependencies": { 2768 | "nanoid": "^3.3.8", 2769 | "picocolors": "^1.1.1", 2770 | "source-map-js": "^1.2.1" 2771 | }, 2772 | "engines": { 2773 | "node": "^10 || ^12 || >=14" 2774 | } 2775 | }, 2776 | "node_modules/prelude-ls": { 2777 | "version": "1.2.1", 2778 | "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", 2779 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2780 | "dev": true, 2781 | "license": "MIT", 2782 | "engines": { 2783 | "node": ">= 0.8.0" 2784 | } 2785 | }, 2786 | "node_modules/punycode": { 2787 | "version": "2.3.1", 2788 | "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", 2789 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2790 | "dev": true, 2791 | "license": "MIT", 2792 | "engines": { 2793 | "node": ">=6" 2794 | } 2795 | }, 2796 | "node_modules/queue-microtask": { 2797 | "version": "1.2.3", 2798 | "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", 2799 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2800 | "dev": true, 2801 | "funding": [ 2802 | { 2803 | "type": "github", 2804 | "url": "https://github.com/sponsors/feross" 2805 | }, 2806 | { 2807 | "type": "patreon", 2808 | "url": "https://www.patreon.com/feross" 2809 | }, 2810 | { 2811 | "type": "consulting", 2812 | "url": "https://feross.org/support" 2813 | } 2814 | ], 2815 | "license": "MIT" 2816 | }, 2817 | "node_modules/react": { 2818 | "version": "19.1.0", 2819 | "resolved": "https://registry.npmmirror.com/react/-/react-19.1.0.tgz", 2820 | "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", 2821 | "license": "MIT", 2822 | "engines": { 2823 | "node": ">=0.10.0" 2824 | } 2825 | }, 2826 | "node_modules/react-dom": { 2827 | "version": "19.1.0", 2828 | "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.1.0.tgz", 2829 | "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", 2830 | "license": "MIT", 2831 | "dependencies": { 2832 | "scheduler": "^0.26.0" 2833 | }, 2834 | "peerDependencies": { 2835 | "react": "^19.1.0" 2836 | } 2837 | }, 2838 | "node_modules/react-refresh": { 2839 | "version": "0.17.0", 2840 | "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", 2841 | "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", 2842 | "dev": true, 2843 | "license": "MIT", 2844 | "engines": { 2845 | "node": ">=0.10.0" 2846 | } 2847 | }, 2848 | "node_modules/resolve-from": { 2849 | "version": "4.0.0", 2850 | "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", 2851 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2852 | "dev": true, 2853 | "license": "MIT", 2854 | "engines": { 2855 | "node": ">=4" 2856 | } 2857 | }, 2858 | "node_modules/reusify": { 2859 | "version": "1.1.0", 2860 | "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", 2861 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 2862 | "dev": true, 2863 | "license": "MIT", 2864 | "engines": { 2865 | "iojs": ">=1.0.0", 2866 | "node": ">=0.10.0" 2867 | } 2868 | }, 2869 | "node_modules/rollup": { 2870 | "version": "4.41.0", 2871 | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.41.0.tgz", 2872 | "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", 2873 | "dev": true, 2874 | "license": "MIT", 2875 | "dependencies": { 2876 | "@types/estree": "1.0.7" 2877 | }, 2878 | "bin": { 2879 | "rollup": "dist/bin/rollup" 2880 | }, 2881 | "engines": { 2882 | "node": ">=18.0.0", 2883 | "npm": ">=8.0.0" 2884 | }, 2885 | "optionalDependencies": { 2886 | "@rollup/rollup-android-arm-eabi": "4.41.0", 2887 | "@rollup/rollup-android-arm64": "4.41.0", 2888 | "@rollup/rollup-darwin-arm64": "4.41.0", 2889 | "@rollup/rollup-darwin-x64": "4.41.0", 2890 | "@rollup/rollup-freebsd-arm64": "4.41.0", 2891 | "@rollup/rollup-freebsd-x64": "4.41.0", 2892 | "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", 2893 | "@rollup/rollup-linux-arm-musleabihf": "4.41.0", 2894 | "@rollup/rollup-linux-arm64-gnu": "4.41.0", 2895 | "@rollup/rollup-linux-arm64-musl": "4.41.0", 2896 | "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", 2897 | "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", 2898 | "@rollup/rollup-linux-riscv64-gnu": "4.41.0", 2899 | "@rollup/rollup-linux-riscv64-musl": "4.41.0", 2900 | "@rollup/rollup-linux-s390x-gnu": "4.41.0", 2901 | "@rollup/rollup-linux-x64-gnu": "4.41.0", 2902 | "@rollup/rollup-linux-x64-musl": "4.41.0", 2903 | "@rollup/rollup-win32-arm64-msvc": "4.41.0", 2904 | "@rollup/rollup-win32-ia32-msvc": "4.41.0", 2905 | "@rollup/rollup-win32-x64-msvc": "4.41.0", 2906 | "fsevents": "~2.3.2" 2907 | } 2908 | }, 2909 | "node_modules/run-parallel": { 2910 | "version": "1.2.0", 2911 | "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", 2912 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2913 | "dev": true, 2914 | "funding": [ 2915 | { 2916 | "type": "github", 2917 | "url": "https://github.com/sponsors/feross" 2918 | }, 2919 | { 2920 | "type": "patreon", 2921 | "url": "https://www.patreon.com/feross" 2922 | }, 2923 | { 2924 | "type": "consulting", 2925 | "url": "https://feross.org/support" 2926 | } 2927 | ], 2928 | "license": "MIT", 2929 | "dependencies": { 2930 | "queue-microtask": "^1.2.2" 2931 | } 2932 | }, 2933 | "node_modules/scheduler": { 2934 | "version": "0.26.0", 2935 | "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.26.0.tgz", 2936 | "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", 2937 | "license": "MIT" 2938 | }, 2939 | "node_modules/semver": { 2940 | "version": "6.3.1", 2941 | "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", 2942 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2943 | "dev": true, 2944 | "license": "ISC", 2945 | "bin": { 2946 | "semver": "bin/semver.js" 2947 | } 2948 | }, 2949 | "node_modules/shebang-command": { 2950 | "version": "2.0.0", 2951 | "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", 2952 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2953 | "dev": true, 2954 | "license": "MIT", 2955 | "dependencies": { 2956 | "shebang-regex": "^3.0.0" 2957 | }, 2958 | "engines": { 2959 | "node": ">=8" 2960 | } 2961 | }, 2962 | "node_modules/shebang-regex": { 2963 | "version": "3.0.0", 2964 | "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", 2965 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2966 | "dev": true, 2967 | "license": "MIT", 2968 | "engines": { 2969 | "node": ">=8" 2970 | } 2971 | }, 2972 | "node_modules/source-map-js": { 2973 | "version": "1.2.1", 2974 | "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", 2975 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2976 | "dev": true, 2977 | "license": "BSD-3-Clause", 2978 | "engines": { 2979 | "node": ">=0.10.0" 2980 | } 2981 | }, 2982 | "node_modules/strip-json-comments": { 2983 | "version": "3.1.1", 2984 | "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2985 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2986 | "dev": true, 2987 | "license": "MIT", 2988 | "engines": { 2989 | "node": ">=8" 2990 | }, 2991 | "funding": { 2992 | "url": "https://github.com/sponsors/sindresorhus" 2993 | } 2994 | }, 2995 | "node_modules/supports-color": { 2996 | "version": "7.2.0", 2997 | "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", 2998 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2999 | "dev": true, 3000 | "license": "MIT", 3001 | "dependencies": { 3002 | "has-flag": "^4.0.0" 3003 | }, 3004 | "engines": { 3005 | "node": ">=8" 3006 | } 3007 | }, 3008 | "node_modules/tinyglobby": { 3009 | "version": "0.2.13", 3010 | "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.13.tgz", 3011 | "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", 3012 | "dev": true, 3013 | "license": "MIT", 3014 | "dependencies": { 3015 | "fdir": "^6.4.4", 3016 | "picomatch": "^4.0.2" 3017 | }, 3018 | "engines": { 3019 | "node": ">=12.0.0" 3020 | }, 3021 | "funding": { 3022 | "url": "https://github.com/sponsors/SuperchupuDev" 3023 | } 3024 | }, 3025 | "node_modules/tinyglobby/node_modules/fdir": { 3026 | "version": "6.4.4", 3027 | "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz", 3028 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 3029 | "dev": true, 3030 | "license": "MIT", 3031 | "peerDependencies": { 3032 | "picomatch": "^3 || ^4" 3033 | }, 3034 | "peerDependenciesMeta": { 3035 | "picomatch": { 3036 | "optional": true 3037 | } 3038 | } 3039 | }, 3040 | "node_modules/tinyglobby/node_modules/picomatch": { 3041 | "version": "4.0.2", 3042 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", 3043 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 3044 | "dev": true, 3045 | "license": "MIT", 3046 | "engines": { 3047 | "node": ">=12" 3048 | }, 3049 | "funding": { 3050 | "url": "https://github.com/sponsors/jonschlinkert" 3051 | } 3052 | }, 3053 | "node_modules/to-regex-range": { 3054 | "version": "5.0.1", 3055 | "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", 3056 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3057 | "dev": true, 3058 | "license": "MIT", 3059 | "dependencies": { 3060 | "is-number": "^7.0.0" 3061 | }, 3062 | "engines": { 3063 | "node": ">=8.0" 3064 | } 3065 | }, 3066 | "node_modules/ts-api-utils": { 3067 | "version": "2.1.0", 3068 | "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", 3069 | "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", 3070 | "dev": true, 3071 | "license": "MIT", 3072 | "engines": { 3073 | "node": ">=18.12" 3074 | }, 3075 | "peerDependencies": { 3076 | "typescript": ">=4.8.4" 3077 | } 3078 | }, 3079 | "node_modules/type-check": { 3080 | "version": "0.4.0", 3081 | "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", 3082 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 3083 | "dev": true, 3084 | "license": "MIT", 3085 | "dependencies": { 3086 | "prelude-ls": "^1.2.1" 3087 | }, 3088 | "engines": { 3089 | "node": ">= 0.8.0" 3090 | } 3091 | }, 3092 | "node_modules/typescript": { 3093 | "version": "5.8.3", 3094 | "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", 3095 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 3096 | "dev": true, 3097 | "license": "Apache-2.0", 3098 | "bin": { 3099 | "tsc": "bin/tsc", 3100 | "tsserver": "bin/tsserver" 3101 | }, 3102 | "engines": { 3103 | "node": ">=14.17" 3104 | } 3105 | }, 3106 | "node_modules/typescript-eslint": { 3107 | "version": "8.32.1", 3108 | "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.32.1.tgz", 3109 | "integrity": "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==", 3110 | "dev": true, 3111 | "license": "MIT", 3112 | "dependencies": { 3113 | "@typescript-eslint/eslint-plugin": "8.32.1", 3114 | "@typescript-eslint/parser": "8.32.1", 3115 | "@typescript-eslint/utils": "8.32.1" 3116 | }, 3117 | "engines": { 3118 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 3119 | }, 3120 | "funding": { 3121 | "type": "opencollective", 3122 | "url": "https://opencollective.com/typescript-eslint" 3123 | }, 3124 | "peerDependencies": { 3125 | "eslint": "^8.57.0 || ^9.0.0", 3126 | "typescript": ">=4.8.4 <5.9.0" 3127 | } 3128 | }, 3129 | "node_modules/update-browserslist-db": { 3130 | "version": "1.1.3", 3131 | "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 3132 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 3133 | "dev": true, 3134 | "funding": [ 3135 | { 3136 | "type": "opencollective", 3137 | "url": "https://opencollective.com/browserslist" 3138 | }, 3139 | { 3140 | "type": "tidelift", 3141 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3142 | }, 3143 | { 3144 | "type": "github", 3145 | "url": "https://github.com/sponsors/ai" 3146 | } 3147 | ], 3148 | "license": "MIT", 3149 | "dependencies": { 3150 | "escalade": "^3.2.0", 3151 | "picocolors": "^1.1.1" 3152 | }, 3153 | "bin": { 3154 | "update-browserslist-db": "cli.js" 3155 | }, 3156 | "peerDependencies": { 3157 | "browserslist": ">= 4.21.0" 3158 | } 3159 | }, 3160 | "node_modules/uri-js": { 3161 | "version": "4.4.1", 3162 | "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", 3163 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3164 | "dev": true, 3165 | "license": "BSD-2-Clause", 3166 | "dependencies": { 3167 | "punycode": "^2.1.0" 3168 | } 3169 | }, 3170 | "node_modules/vite": { 3171 | "version": "6.3.5", 3172 | "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz", 3173 | "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 3174 | "dev": true, 3175 | "license": "MIT", 3176 | "dependencies": { 3177 | "esbuild": "^0.25.0", 3178 | "fdir": "^6.4.4", 3179 | "picomatch": "^4.0.2", 3180 | "postcss": "^8.5.3", 3181 | "rollup": "^4.34.9", 3182 | "tinyglobby": "^0.2.13" 3183 | }, 3184 | "bin": { 3185 | "vite": "bin/vite.js" 3186 | }, 3187 | "engines": { 3188 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3189 | }, 3190 | "funding": { 3191 | "url": "https://github.com/vitejs/vite?sponsor=1" 3192 | }, 3193 | "optionalDependencies": { 3194 | "fsevents": "~2.3.3" 3195 | }, 3196 | "peerDependencies": { 3197 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3198 | "jiti": ">=1.21.0", 3199 | "less": "*", 3200 | "lightningcss": "^1.21.0", 3201 | "sass": "*", 3202 | "sass-embedded": "*", 3203 | "stylus": "*", 3204 | "sugarss": "*", 3205 | "terser": "^5.16.0", 3206 | "tsx": "^4.8.1", 3207 | "yaml": "^2.4.2" 3208 | }, 3209 | "peerDependenciesMeta": { 3210 | "@types/node": { 3211 | "optional": true 3212 | }, 3213 | "jiti": { 3214 | "optional": true 3215 | }, 3216 | "less": { 3217 | "optional": true 3218 | }, 3219 | "lightningcss": { 3220 | "optional": true 3221 | }, 3222 | "sass": { 3223 | "optional": true 3224 | }, 3225 | "sass-embedded": { 3226 | "optional": true 3227 | }, 3228 | "stylus": { 3229 | "optional": true 3230 | }, 3231 | "sugarss": { 3232 | "optional": true 3233 | }, 3234 | "terser": { 3235 | "optional": true 3236 | }, 3237 | "tsx": { 3238 | "optional": true 3239 | }, 3240 | "yaml": { 3241 | "optional": true 3242 | } 3243 | } 3244 | }, 3245 | "node_modules/vite/node_modules/fdir": { 3246 | "version": "6.4.4", 3247 | "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz", 3248 | "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", 3249 | "dev": true, 3250 | "license": "MIT", 3251 | "peerDependencies": { 3252 | "picomatch": "^3 || ^4" 3253 | }, 3254 | "peerDependenciesMeta": { 3255 | "picomatch": { 3256 | "optional": true 3257 | } 3258 | } 3259 | }, 3260 | "node_modules/vite/node_modules/picomatch": { 3261 | "version": "4.0.2", 3262 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", 3263 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 3264 | "dev": true, 3265 | "license": "MIT", 3266 | "engines": { 3267 | "node": ">=12" 3268 | }, 3269 | "funding": { 3270 | "url": "https://github.com/sponsors/jonschlinkert" 3271 | } 3272 | }, 3273 | "node_modules/which": { 3274 | "version": "2.0.2", 3275 | "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", 3276 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3277 | "dev": true, 3278 | "license": "ISC", 3279 | "dependencies": { 3280 | "isexe": "^2.0.0" 3281 | }, 3282 | "bin": { 3283 | "node-which": "bin/node-which" 3284 | }, 3285 | "engines": { 3286 | "node": ">= 8" 3287 | } 3288 | }, 3289 | "node_modules/word-wrap": { 3290 | "version": "1.2.5", 3291 | "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", 3292 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 3293 | "dev": true, 3294 | "license": "MIT", 3295 | "engines": { 3296 | "node": ">=0.10.0" 3297 | } 3298 | }, 3299 | "node_modules/yallist": { 3300 | "version": "3.1.1", 3301 | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", 3302 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3303 | "dev": true, 3304 | "license": "ISC" 3305 | }, 3306 | "node_modules/yocto-queue": { 3307 | "version": "0.1.0", 3308 | "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", 3309 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3310 | "dev": true, 3311 | "license": "MIT", 3312 | "engines": { 3313 | "node": ">=10" 3314 | }, 3315 | "funding": { 3316 | "url": "https://github.com/sponsors/sindresorhus" 3317 | } 3318 | } 3319 | } 3320 | } 3321 | -------------------------------------------------------------------------------- /decktap-web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "decktap-web", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "rm -rf dist && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^19.1.0", 14 | "react-dom": "^19.1.0" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.25.0", 18 | "@types/react": "^19.1.2", 19 | "@types/react-dom": "^19.1.2", 20 | "@vitejs/plugin-react": "^4.4.1", 21 | "eslint": "^9.25.0", 22 | "eslint-plugin-react-hooks": "^5.2.0", 23 | "eslint-plugin-react-refresh": "^0.4.19", 24 | "globals": "^16.0.0", 25 | "typescript": "~5.8.3", 26 | "typescript-eslint": "^8.30.1", 27 | "vite": "^6.3.5" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /decktap-web/public/decktap-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 49 | 56 | 61 | 67 | 72 | 77 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /decktap-web/src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.react:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | @keyframes logo-spin { 22 | from { 23 | transform: rotate(0deg); 24 | } 25 | to { 26 | transform: rotate(360deg); 27 | } 28 | } 29 | 30 | @media (prefers-reduced-motion: no-preference) { 31 | a:nth-of-type(2) .logo { 32 | animation: logo-spin infinite 20s linear; 33 | } 34 | } 35 | 36 | .card { 37 | padding: 2em; 38 | } 39 | 40 | .read-the-docs { 41 | color: #888; 42 | } 43 | -------------------------------------------------------------------------------- /decktap-web/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Controller } from './components/Controller'; 2 | import './styles/controller.css'; 3 | 4 | function App() { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | } 11 | 12 | export default App; -------------------------------------------------------------------------------- /decktap-web/src/components/ConnectionStatus.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | 3 | // 定义 props 类型 4 | interface ConnectionStatusProps { 5 | status: { 6 | text: string; 7 | color: string; 8 | }; 9 | } 10 | 11 | export const ConnectionStatus: FC = ({ status }) => { 12 | return ( 13 |
17 | {status.text} 18 |
19 | ); 20 | }; -------------------------------------------------------------------------------- /decktap-web/src/components/Controller.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import { Timer } from './Timer'; 3 | import '../styles/controller.css'; 4 | import { useWebSocket, WebSocketCommand } from '../hooks/useWebSocket'; 5 | import { ConnectionStatus } from './ConnectionStatus'; 6 | 7 | export function Controller() { 8 | const [isRightHanded, setIsRightHanded] = useState(true); 9 | const { connectionStatus, sendCommand } = useWebSocket(); 10 | const toggleHand = () => { 11 | setIsRightHanded(!isRightHanded); 12 | }; 13 | 14 | return ( 15 |
16 |

DeckTap Controller

17 | 18 |
19 | 25 | 26 | 32 | 33 | 41 |
42 | 43 | 44 | 45 | 46 |
47 | ); 48 | } 49 | 50 | -------------------------------------------------------------------------------- /decktap-web/src/components/Timer.tsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | import '../styles/timer.css'; 3 | 4 | export function Timer() { 5 | const [time, setTime] = useState(0); 6 | const [isRunning, setIsRunning] = useState(false); 7 | 8 | useEffect(() => { 9 | let interval: NodeJS.Timeout; 10 | 11 | if (isRunning) { 12 | interval = setInterval(() => { 13 | setTime((prevTime) => prevTime + 1); 14 | }, 1000); 15 | } 16 | 17 | return () => clearInterval(interval); 18 | }, [isRunning]); 19 | 20 | const formatTime = (seconds: number) => { 21 | const hours = Math.floor(seconds / 3600); 22 | const minutes = Math.floor((seconds % 3600) / 60); 23 | const secs = seconds % 60; 24 | return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; 25 | }; 26 | 27 | return ( 28 |
29 |
{formatTime(time)}
30 |
31 | 38 | 45 | 55 |
56 |
57 | ); 58 | } -------------------------------------------------------------------------------- /decktap-web/src/hooks/useWebSocket.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect, useCallback, useRef } from 'react'; 2 | 3 | // 定义连接状态的类型 4 | interface ConnectionStatus { 5 | text: string; 6 | color: string; 7 | } 8 | 9 | export enum WebSocketCommand { 10 | PREV = 'prev', 11 | NEXT = 'next' 12 | } 13 | 14 | export function useWebSocket() { 15 | const [ws, setWs] = useState(null); 16 | const isConnecting = useRef(false); 17 | 18 | // 连接状态 19 | const [connectionStatus, setConnectionStatus] = useState({ 20 | text: 'Disconnected', 21 | color: '#dc3545' // 红色 22 | }); 23 | 24 | // 连接函数 25 | const connect = useCallback(() => { 26 | if (isConnecting.current) return; 27 | 28 | isConnecting.current = true; 29 | // 根据当前协议确定 WebSocket 协议 30 | const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; 31 | const wsUrl = `${protocol}//${window.location.hostname}:9999`; 32 | console.log('🔗 正在连接到:', wsUrl); 33 | 34 | const socket = new WebSocket(wsUrl); 35 | 36 | // 连接成功 37 | socket.onopen = () => { 38 | console.log('✅ WebSocket 连接已建立'); 39 | setConnectionStatus({ 40 | text: 'Connected', 41 | color: '#28a745' // 绿色 42 | }); 43 | isConnecting.current = false; 44 | }; 45 | 46 | // 连接关闭 47 | socket.onclose = () => { 48 | console.log('❌ WebSocket 连接已关闭'); 49 | setConnectionStatus({ 50 | text: '连接已断开,正在重试...', 51 | color: '#dc3545' // 红色 52 | }); 53 | isConnecting.current = false; 54 | // 1秒后重试连接 55 | setTimeout(connect, 1000); 56 | }; 57 | 58 | // 连接错误 59 | socket.onerror = (error) => { 60 | console.error('❌ WebSocket 错误:', error); 61 | setConnectionStatus({ 62 | text: 'Connection Error', 63 | color: '#dc3545' // 红色 64 | }); 65 | isConnecting.current = false; 66 | }; 67 | 68 | setWs(socket); 69 | }, []); 70 | 71 | // 发送命令函数 72 | const sendCommand = useCallback((command: WebSocketCommand) => { 73 | console.log('🔍 发送命令:', command); 74 | if (ws && ws.readyState === WebSocket.OPEN) { 75 | ws.send(command); 76 | } else { 77 | console.log('❌ WebSocket 未连接'); 78 | } 79 | }, [ws]); 80 | 81 | // 组件挂载时连接,卸载时断开 82 | useEffect(() => { 83 | connect(); 84 | return () => { 85 | if (ws) { 86 | ws.close(); 87 | } 88 | }; 89 | }, [connect]); 90 | 91 | return { connectionStatus, sendCommand }; 92 | } -------------------------------------------------------------------------------- /decktap-web/src/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | html, body { 8 | height: 100%; 9 | overflow: hidden; 10 | touch-action: none; 11 | } 12 | 13 | body { 14 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 15 | background-color: #f5f5f5; 16 | height: 100vh; 17 | width: 100vw; 18 | position: fixed; 19 | overflow: hidden; 20 | } -------------------------------------------------------------------------------- /decktap-web/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import './index.css' 4 | import App from './App.tsx' 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /decktap-web/src/styles/controller.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | html, body { 8 | height: 100%; 9 | overflow: hidden; 10 | touch-action: none; 11 | } 12 | 13 | body { 14 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 15 | background-color: #f5f5f5; 16 | height: 100vh; 17 | width: 100vw; 18 | position: fixed; 19 | overflow: hidden; 20 | } 21 | 22 | .container { 23 | max-width: 100%; 24 | padding: 1rem; 25 | text-align: center; 26 | } 27 | 28 | h1 { 29 | color: #333; 30 | margin-bottom: 1rem; 31 | font-size: 1.5rem; 32 | } 33 | 34 | .controls { 35 | position: fixed; 36 | left: 0; 37 | bottom: 20%; 38 | background-color: white; 39 | padding: 1rem; 40 | display: flex; 41 | flex-direction: column; 42 | gap: 1rem; 43 | box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); 44 | z-index: 1000; 45 | border-radius: 0 1rem 1rem 0; 46 | transition: left 0.3s ease; 47 | } 48 | 49 | .controls.right-handed { 50 | left: auto; 51 | right: 0; 52 | border-radius: 1rem 0 0 1rem; 53 | } 54 | 55 | .control-btn { 56 | padding: 2rem 2.5rem; 57 | font-size: 1.4rem; 58 | border: none; 59 | border-radius: 0.8rem; 60 | background-color: #007AFF; 61 | color: white; 62 | cursor: pointer; 63 | transition: all 0.2s; 64 | width: 100%; 65 | max-width: 160px; 66 | text-align: center; 67 | } 68 | 69 | .hand-toggle-btn { 70 | position: absolute; 71 | bottom: 30%; 72 | right: -30px; 73 | width: 30px; 74 | height: 60px; 75 | background-color: #007AFF; 76 | border: none; 77 | border-radius: 0 0.5rem 0.5rem 0; 78 | cursor: pointer; 79 | display: flex; 80 | align-items: center; 81 | justify-content: center; 82 | color: white; 83 | transition: all 0.3s ease; 84 | } 85 | 86 | .right-handed .hand-toggle-btn { 87 | right: auto; 88 | left: -30px; 89 | border-radius: 0.5rem 0 0 0.5rem; 90 | } 91 | 92 | .hand-icon { 93 | font-size: 1.2rem; 94 | } 95 | 96 | .control-btn:active { 97 | transform: scale(0.95); 98 | background-color: #0056b3; 99 | } 100 | 101 | .status { 102 | color: #666; 103 | font-size: 0.9rem; 104 | margin-top: 1rem; 105 | padding: 0.5rem; 106 | background-color: white; 107 | border-radius: 0.5rem; 108 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 109 | } -------------------------------------------------------------------------------- /decktap-web/src/styles/timer.css: -------------------------------------------------------------------------------- 1 | 2 | .timer-container { 3 | margin: 1rem 0; 4 | padding: 1rem; 5 | background-color: white; 6 | border-radius: 0.5rem; 7 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 8 | } 9 | 10 | .timer-display { 11 | font-size: 2em; 12 | font-family: monospace; 13 | margin-bottom: 1rem; 14 | color: #333; 15 | } 16 | 17 | .timer-controls { 18 | display: flex; 19 | justify-content: center; 20 | gap: 0.5rem; 21 | } 22 | 23 | .timer-btn { 24 | padding: 0.8rem 1.2rem; 25 | font-size: 1rem; 26 | border: none; 27 | border-radius: 0.5rem; 28 | cursor: pointer; 29 | background-color: #4CAF50; 30 | color: white; 31 | transition: background-color 0.3s; 32 | } 33 | 34 | .timer-btn:hover { 35 | background-color: #45a049; 36 | } 37 | 38 | #pauseTimer { 39 | background-color: #f39c12; 40 | } 41 | 42 | #pauseTimer:hover { 43 | background-color: #e67e22; 44 | } 45 | 46 | #resetTimer { 47 | background-color: #e74c3c; 48 | } 49 | 50 | #resetTimer:hover { 51 | background-color: #c0392b; 52 | } 53 | -------------------------------------------------------------------------------- /decktap-web/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /decktap-web/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2020", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "verbatimModuleSyntax": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "noFallthroughCasesInSwitch": true, 23 | "noUncheckedSideEffectImports": true 24 | }, 25 | "include": ["src"] 26 | } 27 | -------------------------------------------------------------------------------- /decktap-web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /decktap-web/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "verbatimModuleSyntax": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /decktap-web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | export default defineConfig({ 5 | plugins: [react()], 6 | }) 7 | -------------------------------------------------------------------------------- /images/computer-client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rico00121/decktap/febfb3a9c16e2306cc0bb53d35af06271b5ea9e1/images/computer-client.png -------------------------------------------------------------------------------- /images/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rico00121/decktap/febfb3a9c16e2306cc0bb53d35af06271b5ea9e1/images/hero.png -------------------------------------------------------------------------------- /images/phone-controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Rico00121/decktap/febfb3a9c16e2306cc0bb53d35af06271b5ea9e1/images/phone-controller.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "decktap", 3 | "version": "1.0.0", 4 | "description": "📡 DeckTap is a lightweight local-network remote for controlling presentations. Use your phone to wirelessly control PowerPoint, Keynote, PDF slideshows — no app installation needed.", 5 | "homepage": "https://github.com/Rico00121/decktap#readme", 6 | "bugs": { 7 | "url": "https://github.com/Rico00121/decktap/issues" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/Rico00121/decktap.git" 12 | }, 13 | "author": "Rico", 14 | "type": "commonjs", 15 | "main": "client/lan.js", 16 | "scripts": { 17 | "start": "node client/lan.js", 18 | "test": "echo \"Error: no test specified\" && exit 1" 19 | }, 20 | "dependencies": { 21 | "@aws-sdk/client-apigatewaymanagementapi": "^3.812.0", 22 | "@aws-sdk/client-dynamodb": "^3.812.0", 23 | "@aws-sdk/lib-dynamodb": "^3.812.0", 24 | "@nut-tree/nut-js": "^3.1.2", 25 | "express": "^5.1.0", 26 | "http-proxy-middleware": "^3.0.5", 27 | "qrcode-terminal": "^0.12.0", 28 | "ws": "^8.18.1" 29 | }, 30 | "devDependencies": { 31 | "pkg": "^5.8.1", 32 | "serverless-finch": "^4.0.4" 33 | }, 34 | "pkg": { 35 | "assets": [ 36 | "controller/public/**/*" 37 | ], 38 | "targets": [ 39 | "node18-macos-x64", 40 | "node18-win-x64", 41 | "node18-linux-x64" 42 | ], 43 | "outputPath": "dist" 44 | }, 45 | "bin": "client/lan.js" 46 | } 47 | --------------------------------------------------------------------------------