diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..3755f39 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,69 @@ +# Muzika Gromche — AI Agent Guide + +## Overview + +- **Purpose**: This repository builds a BepInEx plugin (C#) that adds synchronized party music + light effects to Lethal Company, plus a small frontend playground for track metadata and browsing. +- **Two main parts**: the core plugin in `MuzikaGromche/` (targets `netstandard2.1`) and the frontend in `Frontend/` (Vite 3 + Vue + Vitest). +- **Tools and helpers**: there are some helpful Python scripts in the `playground` directory. + +## What to edit / hotspots + +- `MuzikaGromche/Plugin.cs`: plugin entry and initial configuration registration. +- `MuzikaGromche/*.cs` (e.g. `PoweredLights.cs`, `DiscoBallManager.cs`, `SpawnRateManager.cs`, `ScreenFiltersManager.cs`): main game integration and effect logic. +- `UnityAssets/` and `MuzikaGromche/bin/...`: Unity assets and compiled outputs used for packaging. +- Frontend audio/metadata: `Frontend/src/audio/AudioEngine.ts` and `Frontend/public/*` (track lists and audio bundles). +- Sources of audio tracks are edited and mixed outside of this repo, and only final deliveries are checked in here. + +## Build & run (developer workflow) + +- Primary helper: `Justfile` (root) and `MuzikaGromche.just.user` (root, not checked into the repo, so some commands may be unavailable). Common recipes: + - `just build` — runs both `build-debug` and `build-release` (calls `dotnet build`). + - `just build-release` — `dotnet build --configuration Release`. + - `just build-debug` — `dotnet build --configuration Debug`. + - `just build-debug run` — build & run the game for testing, most commonly used combination. + - `just install-imperium` — installs `dist/MuzikaGromche-Debug.zip` into an r2modman/Imperium profile path (see `Justfile` for `plugin_dir`). Not needed, as it is a post-build step anyway. + - `just ogg ` and `just ogg1 ` — custom msbuild targets that convert wav→ogg via `dotnet msbuild /t:wav2ogg` (used when adding tracks from outside of this repo). + - `just loud ` — runs a Python script that measures loudness of an audio track in LUFS, useful to calculate volume adjustments for normalization to a consistent desirable level. + - `just oggloud1 ` and `just oggloud ` — convert and measure loudness in one command invocation (single track, and intro+loop pair of tracks respectively). + +- Frontend: in `Frontend/`: + - Use `pnpm` (lockfile `pnpm-lock.yaml` present). Run `pnpm install`. + - Dev: `pnpm run dev` (Vite). Build: `pnpm run build`. + - Test: `pnpm run test:browser` or `pnpm run coverage`. Uses Vitest with unified config in `vite.config.ts`. + +- Python scripts in `playground`: + - Use `uv` tool to run Python code, or corresponding `just` targets if available. + +## Packaging and outputs + +- Plugin target: `netstandard2.1` — compiled DLLs appear under `MuzikaGromche/bin//netstandard2.1/`. +- The repo expects a `dist/` zip for quick install (see `Justfile` `install-imperium` target). Look for `dist/MuzikaGromche-Debug.zip` when installing into a profile. + +## Conventions & patterns + +- BepInEx plugin pattern: follow `Plugin.cs` for how features are registered and how configuration entries are declared. +- Prefer small localized changes: keep public APIs stable and avoid broad refactors across many `*.cs` files without tests. The game integration is timing-sensitive. +- Manual testing is done by running the game (see `Justfile` `run` target). +- Track assets: audio tracks and timings are curated; if you add tracks, use the `just ogg` or `dotnet msbuild` tasks to convert. Run the game once, so that it dumps a new JSON metadata under the frontend `public/` directory to ensure that data stays in sync. + +## Integration points & external dependencies + +- Game modding: integrates with Lethal Company via BepInEx. The repo assumes you understand how to drop plugin DLLs into r2modman profiles (see `Justfile` `plugin_dir`). +- External tools: `dotnet` (SDK for building and custom msbuild targets), `just` (task runner) — commands are invoked from repository root; `pnpm`/`node` (frontend) — commands are invoked from `Frontend` directory. + +## Examples to reference + +- Change visual effects: edit `MuzikaGromche/PoweredLights.cs` or `MuzikaGromche/ScreenFiltersManager.cs` and test by running `just build-debug run`. +- Add frontend metadata: update `Frontend/public/MuzikaGromcheTracks.json` and run `pnpm run build`. + +## What NOT to assume + +- There are no automated unit tests in the C# mod; it is unreasonably hard to run mod's code outside of Unity runtime, so don't bother with it. Validate changes with local builds and by installing into an r2modman profile. +- Packaging and profile paths are user-specific — `Justfile` contains a template `plugin_dir` that uses `$HOME` and `imperium_profile` fields; do not hardcode absolute paths in commits. + +## Where to look next (quick links) + +- `Justfile` and `MuzikaGromche.just.user` — primary developer recipes and packaging helpers. +- `MuzikaGromche/` — all plugin source code. +- `UnityAssets/` — art/animator resources, treat them as opaque binary blobs. +- `Frontend/` — frontend app, `src/audio/AudioEngine.ts` for audio logic. diff --git a/Frontend/.gitignore b/Frontend/.gitignore new file mode 100644 index 0000000..fea76e2 --- /dev/null +++ b/Frontend/.gitignore @@ -0,0 +1,49 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.env +.cache +dist +.idea +.vite-node +ltex* +.DS_Store +.zed + +# tests & coverage +coverage +.vitest-reports +*.tsbuildinfo + +# exclude static html reporter folder +test/browser/html/ +test/core/html/ +.vitest-attachments +explainFiles.txt +.vitest-dump + +# Project assets +/public/MuzikaGromcheAudio/* +!/public/MuzikaGromcheAudio/.gitkeep diff --git a/Frontend/.vscode/extensions.json b/Frontend/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/Frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/Frontend/README.md b/Frontend/README.md new file mode 100644 index 0000000..52cfe01 --- /dev/null +++ b/Frontend/README.md @@ -0,0 +1,44 @@ +# Muzika Gromche — Web Player & Editor + +Play your favorite tracks on repeat right in your browser. + +## Project structure + +The look & feel is inspired by a certain popular NLE (Non-Linear video Editor) which incorporates DAW (Digital Audio Workstation) functionality in it. + +- Library page lists all available audio tracks with some basic information presented in cards. There is a search / filter field on top. +- Player page features in-depth information about selected audio track, a dedicated timeline widget lets you play, seek, scrub, zoom into timeline tracks & clips, and manupulate them. Each timeline track represents either a segment of the song (intro, loop), or a specific kind of visual effects (such as flickering, fading out & color palette for powered lights, lyrics, drunkness & condensation). + +## Development + +### Adding new tracks + +1. Add track declaration to Plugin.cs and fill in its properties. +2. Launch the game once, so that it generates a new JSON dump (in the Lethal Company save files directory) of all tracks. +3. Replace `public/MuzikaGromcheTracks.json` with the new JSON dump. +4. Run the following script to generate bare codenames file: + ```sh + cat ./MuzikaGromcheTracks.json | jq '[.tracks[].Name | {(.): { "Artist": "", "Song": "" }}] | add' > MuzikaGromcheCodenamesBare.json + ``` +5. Add new codenames from the generated file above to `public/MuzikaGromcheCodenames.json` file. + + +### Run & test + +First time setup: +- copy audio files from the `/Assets/` directory located at repository's root to `Frontend/public/MuzikaGromcheAudio/` directory. + +Muzika Gromche Web Player & Editor is built with Vue 3 + TypeScript + Vite. + +```sh +pnpm run dev +pnpm run test +``` + +### Deploy + +```sh +pnpm run build +``` + +Use scp, rsync or any other tool to upload content of `dist/` to root@ratijas.me `/var/www/html/muzika-gromche/`. diff --git a/Frontend/index.html b/Frontend/index.html new file mode 100644 index 0000000..67baf81 --- /dev/null +++ b/Frontend/index.html @@ -0,0 +1,15 @@ + + + + + + + + + Muzika Gromche — The ultimate Jester party music mod + + +
+ + + diff --git a/Frontend/package.json b/Frontend/package.json new file mode 100644 index 0000000..54c94e5 --- /dev/null +++ b/Frontend/package.json @@ -0,0 +1,52 @@ +{ + "name": "muzika-gromche-frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "prebuild": "node scripts/generate-icons.js", + "build": "npm run prebuild && vue-tsc -b && vite build", + "preview": "vite preview", + "test": "vitest", + "coverage": "vitest run --coverage", + "test:browser": "vitest" + }, + "dependencies": { + "@material-design-icons/svg": "^0.14.15", + "@tailwindcss/vite": "^4.1.17", + "@vueuse/core": "^14.1.0", + "mitt": "^3.0.1", + "pinia": "^3.0.4", + "tailwindcss": "^4.1.17", + "vue": "^3.5.25", + "vue-router": "^4.6.3" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.2", + "@vitest/browser-playwright": "^4.0.15", + "@vitest/coverage-v8": "4.0.14", + "@vue/tsconfig": "^0.8.1", + "eslint": "~9.39.1", + "eslint-plugin-vue": "~10.5.1", + "sharp": "^0.33.5", + "png-to-ico": "^3.0.1", + "typescript": "~5.9.3", + "vite": "npm:rolldown-vite@7.1.14", + "vite-plugin-vue-devtools": "^8.0.5", + "vite-svg-loader": "^5.1.0", + "vitest": "^4.0.15", + "vitest-browser-vue": "^2.0.1", + "vue-tsc": "^3.1.5" + }, + "pnpm": { + "overrides": { + "vite": "npm:rolldown-vite@7.1.14" + }, + "onlyBuiltDependencies": [ + "core-js", + "sharp" + ] + } +} diff --git a/Frontend/pnpm-lock.yaml b/Frontend/pnpm-lock.yaml new file mode 100644 index 0000000..69d7a1a --- /dev/null +++ b/Frontend/pnpm-lock.yaml @@ -0,0 +1,3856 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + vite: npm:rolldown-vite@7.1.14 + +importers: + + .: + dependencies: + '@material-design-icons/svg': + specifier: ^0.14.15 + version: 0.14.15 + '@tailwindcss/vite': + specifier: ^4.1.17 + version: 4.1.17(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + '@vueuse/core': + specifier: ^14.1.0 + version: 14.1.0(vue@3.5.25(typescript@5.9.3)) + mitt: + specifier: ^3.0.1 + version: 3.0.1 + pinia: + specifier: ^3.0.4 + version: 3.0.4(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) + tailwindcss: + specifier: ^4.1.17 + version: 4.1.17 + vue: + specifier: ^3.5.25 + version: 3.5.25(typescript@5.9.3) + vue-router: + specifier: ^4.6.3 + version: 4.6.3(vue@3.5.25(typescript@5.9.3)) + devDependencies: + '@types/node': + specifier: ^24.10.1 + version: 24.10.1 + '@vitejs/plugin-vue': + specifier: ^6.0.2 + version: 6.0.2(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3)) + '@vitest/browser-playwright': + specifier: ^4.0.15 + version: 4.0.15(playwright@1.56.1)(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15) + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(@vitest/browser@4.0.14(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15))(vitest@4.0.15) + '@vue/tsconfig': + specifier: ^0.8.1 + version: 0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) + eslint: + specifier: ~9.39.1 + version: 9.39.1(jiti@2.6.1) + eslint-plugin-vue: + specifier: ~10.5.1 + version: 10.5.1(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))) + png-to-ico: + specifier: ^3.0.1 + version: 3.0.1 + sharp: + specifier: ^0.33.5 + version: 0.33.5 + typescript: + specifier: ~5.9.3 + version: 5.9.3 + vite: + specifier: npm:rolldown-vite@7.1.14 + version: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + vite-plugin-vue-devtools: + specifier: ^8.0.5 + version: 8.0.5(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3)) + vite-svg-loader: + specifier: ^5.1.0 + version: 5.1.0(vue@3.5.25(typescript@5.9.3)) + vitest: + specifier: ^4.0.15 + version: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1) + vitest-browser-vue: + specifier: ^2.0.1 + version: 2.0.1(vitest@4.0.15)(vue@3.5.25(typescript@5.9.3)) + vue-tsc: + specifier: ^3.1.5 + version: 3.1.5(typescript@5.9.3) + +packages: + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.28.0': + resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@material-design-icons/svg@0.14.15': + resolution: {integrity: sha512-6nbjwGwyJnphwQUscJAYqw1Tk6+W8KvsgOAeyVgzIFXVsHfgX5XyplTUcZ29wbcTUysMMyCUi1LYpmFKA/e61g==} + + '@napi-rs/wasm-runtime@1.1.0': + resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@oxc-project/runtime@0.92.0': + resolution: {integrity: sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.93.0': + resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rolldown/binding-android-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.41': + resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.41': + resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} + + '@rolldown/pluginutils@1.0.0-beta.50': + resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@tailwindcss/node@4.1.17': + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} + + '@tailwindcss/oxide-android-arm64@4.1.17': + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.17': + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.17': + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.17': + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.17': + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.17': + resolution: {integrity: sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@22.19.1': + resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@vitejs/plugin-vue@6.0.2': + resolution: {integrity: sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 + + '@vitest/browser-playwright@4.0.15': + resolution: {integrity: sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==} + peerDependencies: + playwright: '*' + vitest: 4.0.15 + + '@vitest/browser@4.0.14': + resolution: {integrity: sha512-vO0uqR8SnPTd8ykp14yaIuUyMZ9HEBYuoZrVdUp7RrEp76VEnkrX9fDkGnK0NyBdfWXB6cqp7BmqVekd8yKHFQ==} + peerDependencies: + vitest: 4.0.14 + + '@vitest/browser@4.0.15': + resolution: {integrity: sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==} + peerDependencies: + vitest: 4.0.15 + + '@vitest/coverage-v8@4.0.14': + resolution: {integrity: sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==} + peerDependencies: + '@vitest/browser': 4.0.14 + vitest: 4.0.14 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.0.15': + resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + + '@vitest/mocker@4.0.14': + resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/mocker@4.0.15': + resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.14': + resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} + + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} + + '@vitest/runner@4.0.15': + resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + + '@vitest/snapshot@4.0.15': + resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} + + '@vitest/spy@4.0.14': + resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} + + '@vitest/spy@4.0.15': + resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + + '@vitest/utils@4.0.14': + resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} + + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@volar/typescript@2.4.23': + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} + + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} + + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.25': + resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} + + '@vue/compiler-dom@3.5.25': + resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} + + '@vue/compiler-sfc@3.5.25': + resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} + + '@vue/compiler-ssr@3.5.25': + resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-core@8.0.5': + resolution: {integrity: sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ==} + peerDependencies: + vue: ^3.0.0 + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-kit@8.0.5': + resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/devtools-shared@8.0.5': + resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} + + '@vue/language-core@3.1.5': + resolution: {integrity: sha512-FMcqyzWN+sYBeqRMWPGT2QY0mUasZMVIuHvmb5NT3eeqPrbHBYtCP8JWEUCDCgM+Zr62uuWY/qoeBrPrzfa78w==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.25': + resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} + + '@vue/runtime-core@3.5.25': + resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} + + '@vue/runtime-dom@3.5.25': + resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} + + '@vue/server-renderer@3.5.25': + resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} + peerDependencies: + vue: 3.5.25 + + '@vue/shared@3.5.25': + resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} + + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + + '@vue/tsconfig@0.8.1': + resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} + peerDependencies: + typescript: 5.x + vue: ^3.4.0 + peerDependenciesMeta: + typescript: + optional: true + vue: + optional: true + + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + alien-signals@3.1.1: + resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.9.3: + resolution: {integrity: sha512-8QdH6czo+G7uBsNo0GiUfouPN1lRzKdJTGnKXwe12gkFbnnOUaUKGN55dMkfy+mnxmvjwl9zcI4VncczcVXDhA==} + hasBin: true + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.266: + resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-vue@10.5.1: + resolution: {integrity: sha512-SbR9ZBUFKgvWAbq3RrdCtWaW0IKm6wwUiApxf3BVTNfqUIo4IQQmreMg2iHFJJ6C/0wss3LXURBJ1OwS/MhFcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + + playwright-core@1.56.1: + resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.56.1: + resolution: {integrity: sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==} + engines: {node: '>=18'} + hasBin: true + + png-to-ico@3.0.1: + resolution: {integrity: sha512-S8BOAoaGd9gT5uaemQ62arIY3Jzco7Uc7LwUTqRyqJDTsKqOAiyfyN4dSdT0D+Zf8XvgztgpRbM5wnQd7EgYwg==} + engines: {node: '>=20'} + hasBin: true + + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown-vite@7.1.14: + resolution: {integrity: sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + esbuild: ^0.25.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + rolldown@1.0.0-beta.41: + resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + tailwindcss@4.1.17: + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + update-browserslist-db@1.2.2: + resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 + + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': '*' + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + vite-plugin-vue-devtools@8.0.5: + resolution: {integrity: sha512-p619BlKFOqQXJ6uDWS1vUPQzuJOD6xJTfftj57JXBGoBD/yeQCowR7pnWcr/FEX4/HVkFbreI6w2uuGBmQOh6A==} + engines: {node: '>=v14.21.3'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0-0 + + vite-plugin-vue-inspector@5.3.2: + resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-svg-loader@5.1.0: + resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==} + peerDependencies: + vue: '>=3.2.13' + + vitest-browser-vue@2.0.1: + resolution: {integrity: sha512-IfTJY3Olr27AXCVAhOqx4g5iUgzdWLmYr40svg7rOrunjsqc9trrzi/eI3i11+UYddbKXu3HJl2bo8o8lqKm4A==} + peerDependencies: + vitest: ^4.0.0-0 + vue: ^3.0.0 + + vitest@4.0.15: + resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.15 + '@vitest/browser-preview': 4.0.15 + '@vitest/browser-webdriverio': 4.0.15 + '@vitest/ui': 4.0.15 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} + + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + vue-router@4.6.3: + resolution: {integrity: sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==} + peerDependencies: + vue: ^3.5.0 + + vue-tsc@3.1.5: + resolution: {integrity: sha512-L/G9IUjOWhBU0yun89rv8fKqmKC+T0HfhrFjlIml71WpfBv9eb4E9Bev8FMbyueBIU9vxQqbd+oOsVcDa5amGw==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.25: + resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@1.0.2': {} + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': + dependencies: + eslint: 9.39.1(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.1': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@material-design-icons/svg@0.14.15': {} + + '@napi-rs/wasm-runtime@1.1.0': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@one-ini/wasm@0.1.1': {} + + '@oxc-project/runtime@0.92.0': {} + + '@oxc-project/types@0.93.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.29': {} + + '@rolldown/binding-android-arm64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + dependencies: + '@napi-rs/wasm-runtime': 1.1.0 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.41': {} + + '@rolldown/pluginutils@1.0.0-beta.50': {} + + '@standard-schema/spec@1.0.0': {} + + '@tailwindcss/node@4.1.17': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.17 + + '@tailwindcss/oxide-android-arm64@4.1.17': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.17': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.17': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide@4.1.17': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-x64': 4.1.17 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 + + '@tailwindcss/vite@4.1.17(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))': + dependencies: + '@tailwindcss/node': 4.1.17 + '@tailwindcss/oxide': 4.1.17 + tailwindcss: 4.1.17 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + + '@trysound/sax@0.2.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@22.19.1': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.10.1': + dependencies: + undici-types: 7.16.0 + + '@types/web-bluetooth@0.0.21': {} + + '@vitejs/plugin-vue@6.0.2(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.50 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + vue: 3.5.25(typescript@5.9.3) + + '@vitest/browser-playwright@4.0.15(playwright@1.56.1)(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15)': + dependencies: + '@vitest/browser': 4.0.15(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15) + '@vitest/mocker': 4.0.15(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + playwright: 1.56.1 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.0.14(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15)': + dependencies: + '@vitest/mocker': 4.0.14(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + '@vitest/utils': 4.0.14 + magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1) + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + optional: true + + '@vitest/browser@4.0.15(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15)': + dependencies: + '@vitest/mocker': 4.0.15(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + '@vitest/utils': 4.0.15 + magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1) + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/coverage-v8@4.0.14(@vitest/browser@4.0.14(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15))(vitest@4.0.15)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.14 + ast-v8-to-istanbul: 0.3.8 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1) + optionalDependencies: + '@vitest/browser': 4.0.14(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@4.0.15': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + chai: 6.2.1 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.14(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))': + dependencies: + '@vitest/spy': 4.0.14 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + optional: true + + '@vitest/mocker@4.0.15(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))': + dependencies: + '@vitest/spy': 4.0.15 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + + '@vitest/pretty-format@4.0.14': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/pretty-format@4.0.15': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.15': + dependencies: + '@vitest/utils': 4.0.15 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.15': + dependencies: + '@vitest/pretty-format': 4.0.15 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.14': + optional: true + + '@vitest/spy@4.0.15': {} + + '@vitest/utils@4.0.14': + dependencies: + '@vitest/pretty-format': 4.0.14 + tinyrainbow: 3.0.3 + + '@vitest/utils@4.0.15': + dependencies: + '@vitest/pretty-format': 4.0.15 + tinyrainbow: 3.0.3 + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/source-map@2.4.23': {} + + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue/babel-helper-vue-transform-on@1.5.0': {} + + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.5) + '@vue/shared': 3.5.25 + optionalDependencies: + '@babel/core': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.5)': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.5 + '@vue/compiler-sfc': 3.5.25 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.25 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.25': + dependencies: + '@vue/compiler-core': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/compiler-sfc@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.25 + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.25': + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-core@8.0.5(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue/devtools-kit': 8.0.5 + '@vue/devtools-shared': 8.0.5 + mitt: 3.0.1 + nanoid: 5.1.6 + pathe: 2.0.3 + vite-hot-client: 2.1.0(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + vue: 3.5.25(typescript@5.9.3) + transitivePeerDependencies: + - vite + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-kit@8.0.5': + dependencies: + '@vue/devtools-shared': 8.0.5 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/devtools-shared@8.0.5': + dependencies: + rfdc: 1.4.1 + + '@vue/language-core@3.1.5(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 + alien-signals: 3.1.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.3 + optionalDependencies: + typescript: 5.9.3 + + '@vue/reactivity@3.5.25': + dependencies: + '@vue/shared': 3.5.25 + + '@vue/runtime-core@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/runtime-dom@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/runtime-core': 3.5.25 + '@vue/shared': 3.5.25 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + vue: 3.5.25(typescript@5.9.3) + + '@vue/shared@3.5.25': {} + + '@vue/test-utils@2.4.6': + dependencies: + js-beautify: 1.15.4 + vue-component-type-helpers: 2.2.12 + + '@vue/tsconfig@0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3))': + optionalDependencies: + typescript: 5.9.3 + vue: 3.5.25(typescript@5.9.3) + + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + + '@vueuse/metadata@14.1.0': {} + + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + vue: 3.5.25(typescript@5.9.3) + + abbrev@2.0.0: {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + alien-signals@3.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@0.3.8: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.9.3: {} + + birpc@2.9.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.3 + caniuse-lite: 1.0.30001759 + electron-to-chromium: 1.5.266 + node-releases: 2.0.27 + update-browserslist-db: 1.2.2(browserslist@4.28.1) + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001759: {} + + chai@6.2.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + commander@10.0.1: {} + + commander@7.2.0: {} + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + convert-source-map@2.0.0: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + default-browser-id@5.0.1: {} + + default-browser@5.4.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + detect-libc@2.1.2: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + eastasianwidth@0.2.0: {} + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.3 + + electron-to-chromium@1.5.266: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + error-stack-parser-es@1.0.5: {} + + es-module-lexer@1.7.0: {} + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-vue@10.5.1(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + eslint: 9.39.1(jiti@2.6.1) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@9.39.1(jiti@2.6.1)) + xml-name-validator: 4.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.1(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.1 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.2.2: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@14.0.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hookable@5.5.3: {} + + html-escaper@2.0.2: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + ini@1.3.8: {} + + is-arrayish@0.3.4: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-what@5.5.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.6.1: {} + + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.5.0 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kolorist@1.8.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.1: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mitt@3.0.1: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.27: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + obug@2.1.1: {} + + ohash@2.0.11: {} + + open@10.2.0: + dependencies: + default-browser: 5.4.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pinia@3.0.4(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.5.25(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + + playwright-core@1.56.1: {} + + playwright@1.56.1: + dependencies: + playwright-core: 1.56.1 + optionalDependencies: + fsevents: 2.3.2 + + png-to-ico@3.0.1: + dependencies: + '@types/node': 22.19.1 + minimist: 1.2.8 + pngjs: 7.0.0 + + pngjs@7.0.0: {} + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + proto-list@1.2.4: {} + + punycode@2.3.1: {} + + resolve-from@4.0.0: {} + + rfdc@1.4.1: {} + + rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1): + dependencies: + '@oxc-project/runtime': 0.92.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.30.2 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-beta.41 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.1 + fsevents: 2.3.3 + jiti: 2.6.1 + + rolldown@1.0.0-beta.41: + dependencies: + '@oxc-project/types': 0.93.0 + '@rolldown/pluginutils': 1.0.0-beta.41 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.41 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.41 + '@rolldown/binding-darwin-x64': 1.0.0-beta.41 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.41 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.41 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.41 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.41 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 + + run-applescript@7.1.0: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + speakingurl@14.0.1: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + + tailwindcss@4.1.17: {} + + tapable@2.3.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + totalist@3.0.1: {} + + tslib@2.8.1: + optional: true + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + undici-types@7.16.0: {} + + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + update-browserslist-db@1.2.2(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite-dev-rpc@1.1.0(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)): + dependencies: + birpc: 2.9.0 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + vite-hot-client: 2.1.0(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + + vite-hot-client@2.1.0(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)): + dependencies: + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + + vite-plugin-inspect@11.3.3(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)): + dependencies: + ansis: 4.2.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + vite-dev-rpc: 1.1.0(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + vite-plugin-vue-devtools@8.0.5(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3)): + dependencies: + '@vue/devtools-core': 8.0.5(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-kit': 8.0.5 + '@vue/devtools-shared': 8.0.5 + sirv: 3.0.2 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + vite-plugin-inspect: 11.3.3(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + vite-plugin-vue-inspector: 5.3.2(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + + vite-plugin-vue-inspector@5.3.2(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)): + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) + '@vue/compiler-dom': 3.5.25 + kolorist: 1.8.0 + magic-string: 0.30.21 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + transitivePeerDependencies: + - supports-color + + vite-svg-loader@5.1.0(vue@3.5.25(typescript@5.9.3)): + dependencies: + svgo: 3.3.2 + vue: 3.5.25(typescript@5.9.3) + + vitest-browser-vue@2.0.1(vitest@4.0.15)(vue@3.5.25(typescript@5.9.3)): + dependencies: + '@vue/test-utils': 2.4.6 + vitest: 4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1) + vue: 3.5.25(typescript@5.9.3) + + vitest@4.0.15(@types/node@24.10.1)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1): + dependencies: + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1)) + '@vitest/pretty-format': 4.0.15 + '@vitest/runner': 4.0.15 + '@vitest/snapshot': 4.0.15 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.1 + '@vitest/browser-playwright': 4.0.15(playwright@1.56.1)(rolldown-vite@7.1.14(@types/node@24.10.1)(jiti@2.6.1))(vitest@4.0.15) + transitivePeerDependencies: + - esbuild + - jiti + - less + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vscode-uri@3.1.0: {} + + vue-component-type-helpers@2.2.12: {} + + vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1)): + dependencies: + debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + vue-router@4.6.3(vue@3.5.25(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.25(typescript@5.9.3) + + vue-tsc@3.1.5(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.23 + '@vue/language-core': 3.1.5(typescript@5.9.3) + typescript: 5.9.3 + + vue@3.5.25(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-sfc': 3.5.25 + '@vue/runtime-dom': 3.5.25 + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) + '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.9.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + ws@8.18.3: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + xml-name-validator@4.0.0: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/Frontend/public/MuzikaGromcheAudio/.gitkeep b/Frontend/public/MuzikaGromcheAudio/.gitkeep new file mode 100644 index 0000000..69228eb --- /dev/null +++ b/Frontend/public/MuzikaGromcheAudio/.gitkeep @@ -0,0 +1 @@ +Copy /Assets/ to this directory. diff --git a/Frontend/public/MuzikaGromcheCodenames.json b/Frontend/public/MuzikaGromcheCodenames.json new file mode 100644 index 0000000..69e3dbf --- /dev/null +++ b/Frontend/public/MuzikaGromcheCodenames.json @@ -0,0 +1,110 @@ +{ + "AttentionPls1": { + "Artist": "Отпетые Мошенники", + "Song": "Обратите внимание" + }, + "AttentionPls2": { + "Artist": "Отпетые Мошенники", + "Song": "Обратите внимание" + }, + "BbIXODaHET": { + "Artist": "Сплин", + "Song": "Выхода нет" + }, + "BeefLiver1": { + "Artist": "Imagine Dragons", + "Song": "Believer" + }, + "BeefLiver3": { + "Artist": "Imagine Dragons", + "Song": "Believer" + }, + "BeefLiver4": { + "Artist": "Imagine Dragons", + "Song": "Believer" + }, + "Beha1": { + "Artist": "Жу-Жу", + "Song": "Ленинград ft. Глюк'oZа ft. ST" + }, + "Beha2": { + "Artist": "Жу-Жу", + "Song": "Ленинград ft. Глюк'oZа ft. ST" + }, + "Beha3": { + "Artist": "Жу-Жу", + "Song": "Ленинград ft. Глюк'oZа ft. ST" + }, + "Chereshnya": { + "Artist": "Дискотека Авария", + "Song": "Малинки" + }, + "DeployDestroy": { + "Artist": "Noize MC", + "Song": "Устрой дестрой" + }, + "Durochka": { + "Artist": "Би-2", + "Song": "Дурочка" + }, + "GodMode": { + "Artist": "Fall Out Boy", + "Song": "Immortals" + }, + "Gorgorod": { + "Artist": "Город под подошвой", + "Song": "Oxxxymiron" + }, + "Kach": { + "Artist": "Black Eyed Peas", + "Song": "Pump It" + }, + "MoyaZhittya": { + "Artist": "Bon Jovi", + "Song": "It's My Life" + }, + "MuzikaGromche": { + "Artist": "Пошлая Молли", + "Song": "Нон стоп" + }, + "OnePartiyaUdar": { + "Artist": "One-Punch Man", + "Song": "Opening" + }, + "Peretasovka": { + "Artist": "LMFAO", + "Song": "Party Rock Anthem" + }, + "PWNED": { + "Artist": "CYBEЯIA", + "Song": "Russian Hackers" + }, + "ReelGoon": { + "Artist": "John Shanks and Sheryl Crow", + "Song": "Real Gone" + }, + "RiseAndShine": { + "Artist": "Fall Out Boy", + "Song": "The Phoenix" + }, + "Song2": { + "Artist": "Витас", + "Song": "Опера #2" + }, + "VseVZale": { + "Artist": "Дискотека Авария", + "Song": " Х.Х.Х.И.Р.Н.Р." + }, + "Whistle": { + "Artist": "Flo Rida", + "Song": "Whistle" + }, + "Yalgaar": { + "Artist": "Ajey Nagar and Wily Frenzy", + "Song": "Yalgaar" + }, + "ZmeiGorynich": { + "Artist": "aespa", + "Song": "Black Mamba" + } +} diff --git a/Frontend/public/MuzikaGromcheTracks.json b/Frontend/public/MuzikaGromcheTracks.json new file mode 100644 index 0000000..2ae9352 --- /dev/null +++ b/Frontend/public/MuzikaGromcheTracks.json @@ -0,0 +1,2419 @@ +{ + "version": "1337.9001.2", + "tracks": [ + { + "Name": "AttentionPls1", + "IsExplicit": true, + "Language": "Russian", + "WindUpTimer": 39.19, + "Bpm": 97.8244247, + "Beats": 32, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 49.061, + "FileDurationLoop": 19.627, + "FileNameIntro": "AttentionPls1Intro.ogg", + "FileNameLoop": "AttentionPlsLoop.ogg", + "BeatsOffset": 0.3, + "FadeOutBeat": -6.0, + "FadeOutDuration": 5.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -8.0, + 31.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [ + [ + 7.0, + 0.0 + ], + [ + 12.0, + 0.9 + ], + [ + 15.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [ + [ + 23.0, + 0.0 + ], + [ + 28.0, + 0.4 + ], + [ + 31.0, + 0.0 + ] + ], + "Palette": [ + "#FCEB3C", + "#FC3C9D", + "#65C7FA", + "#89FC8F", + "#FEE9E9", + "#FCEB3C", + "#89FC8F", + "#FC3C9D" + ], + "GameOverText": null + }, + { + "Name": "AttentionPls2", + "IsExplicit": true, + "Language": "Russian", + "WindUpTimer": 39.19, + "Bpm": 97.8244247, + "Beats": 32, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 49.061, + "FileDurationLoop": 19.627, + "FileNameIntro": "AttentionPls2Intro.ogg", + "FileNameLoop": "AttentionPlsLoop.ogg", + "BeatsOffset": 0.3, + "FadeOutBeat": -6.0, + "FadeOutDuration": 5.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -8.0, + 31.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [ + [ + 7.0, + 0.0 + ], + [ + 12.0, + 0.9 + ], + [ + 15.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [ + [ + 23.0, + 0.0 + ], + [ + 28.0, + 0.4 + ], + [ + 31.0, + 0.0 + ] + ], + "Palette": [ + "#FCEB3C", + "#FC3C9D", + "#65C7FA", + "#89FC8F", + "#FEE9E9", + "#FCEB3C", + "#89FC8F", + "#FC3C9D" + ], + "GameOverText": null + }, + { + "Name": "BbIXODaHET", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 40.85, + "Bpm": 84.82064, + "Beats": 32, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 53.368, + "FileDurationLoop": 22.636, + "FileNameIntro": "BbIXODaHETIntro.ogg", + "FileNameLoop": "BbIXODaHETLoop.ogg", + "BeatsOffset": 0.3, + "FadeOutBeat": -6.0, + "FadeOutDuration": 6.0, + "ColorTransitionIn": 0.7, + "ColorTransitionOut": 0.3, + "ColorTransitionEasing": "InOutCubic", + "FlickerLightsTimeSeries": [ + -32.5, + -16.5, + 30.5 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [ + [ + -1.0, + 0.0 + ], + [ + 2.0, + 0.4 + ], + [ + 7.0, + 0.0 + ], + [ + 31.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#E6D58F", + "#612F7E", + "#D9783F", + "#C3411C", + "#D3B742", + "#549BDE" + ], + "GameOverText": null + }, + { + "Name": "BeefLiver1", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 39.35, + "Bpm": 124.999992, + "Beats": 48, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 43.166, + "FileDurationLoop": 23.04, + "FileNameIntro": "BeefLiver1Intro.ogg", + "FileNameLoop": "BeefLiverLoop.ogg", + "BeatsOffset": 0.2, + "FadeOutBeat": -3.0, + "FadeOutDuration": 3.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -48.0, + -40.0, + -4.5, + 44.0 + ], + "Lyrics": [ + [ + -66.0, + "First things first" + ], + [ + -62.0, + "First things first,\nI'ma say all the words\ninside my head" + ], + [ + -57.0, + "I'm fired up and tired of" + ], + [ + -52.0, + "the way that things have been,\noh-ooh" + ], + [ + -44.0, + "(x2)\nThe way that things have been,\noh-ooooh" + ], + [ + -34.0, + "I was broken from a young age, taking my sulkin' to the masses" + ], + [ + -27.0, + "Writing my poems for the few" + ], + [ + -23.0, + "that look at me, took to me,\nshook at me, feelin' me" + ], + [ + -19.0, + "Singing from heartache from the pain" + ], + [ + -15.0, + "Singing from heartache from the pain,\ntaking my message from the veins" + ], + [ + -11.0, + "Speaking my lesson from the brain" + ], + [ + -8.0, + "Speaking my lesson from the brain,\nseeing the beauty through the" + ], + [ + -0.1, + "PAIN!" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -0.5, + 0.0 + ], + [ + 0.5, + 0.6 + ], + [ + 8.0, + 0.0 + ], + [ + 15.0, + 0.0 + ], + [ + 16.0, + 0.4 + ], + [ + 24.0, + 0.0 + ], + [ + 29.0, + 0.0 + ], + [ + 30.0, + 0.3 + ], + [ + 36.0, + 0.0 + ], + [ + 37.0, + 0.0 + ], + [ + 38.0, + 0.3 + ], + [ + 44.0, + 0.0 + ], + [ + 47.5, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FFEBEB", + "#FFEBEB", + "#445782", + "#EBA602", + "#5EEBB9", + "#8EE3DC", + "#A23045", + "#262222" + ], + "GameOverText": null + }, + { + "Name": "BeefLiver3", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 39.35, + "Bpm": 124.999992, + "Beats": 48, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 43.166, + "FileDurationLoop": 23.04, + "FileNameIntro": "BeefLiver3Intro.ogg", + "FileNameLoop": "BeefLiverLoop.ogg", + "BeatsOffset": 0.2, + "FadeOutBeat": -3.0, + "FadeOutDuration": 3.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -48.0, + -40.0, + -4.5, + 44.0 + ], + "Lyrics": [ + [ + -66.0, + "Third things third" + ], + [ + -62.0, + "Third things third,\nsend a prayer to the ones up above" + ], + [ + -57.0, + "All the hate that you've heard has turned" + ], + [ + -52.0, + "your spirit to a dove,\noh-ooh" + ], + [ + -44.0, + "(x2)\nYour spirit up above,\noh-ooooh" + ], + [ + -34.0, + "I was chokin' in the crowd, building my rain up in the cloud" + ], + [ + -27.0, + "Falling like ashes to the ground" + ], + [ + -23.0, + "hoping my feelings, they would drown" + ], + [ + -19.0, + "But they never did, ever lived, ebbin' and flowin'" + ], + [ + -15.0, + "Inhibited, limited 'til it broke open" + ], + [ + -11.0, + "Inhibited, limited 'til it broke open and rained down" + ], + [ + -8.0, + "It rained down like" + ], + [ + -0.1, + "PAIN!" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -0.5, + 0.0 + ], + [ + 0.5, + 0.6 + ], + [ + 8.0, + 0.0 + ], + [ + 15.0, + 0.0 + ], + [ + 16.0, + 0.4 + ], + [ + 24.0, + 0.0 + ], + [ + 29.0, + 0.0 + ], + [ + 30.0, + 0.3 + ], + [ + 36.0, + 0.0 + ], + [ + 37.0, + 0.0 + ], + [ + 38.0, + 0.3 + ], + [ + 44.0, + 0.0 + ], + [ + 47.5, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FFEBEB", + "#FFEBEB", + "#445782", + "#EBA602", + "#5EEBB9", + "#8EE3DC", + "#A23045", + "#262222" + ], + "GameOverText": null + }, + { + "Name": "BeefLiver4", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 31.68, + "Bpm": 124.999992, + "Beats": 48, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 35.487, + "FileDurationLoop": 23.04, + "FileNameIntro": "BeefLiver4Intro.ogg", + "FileNameLoop": "BeefLiver4Loop.ogg", + "BeatsOffset": 0.2, + "FadeOutBeat": -3.0, + "FadeOutDuration": 3.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -32.0, + -24.0, + -4.5, + 44.0 + ], + "Lyrics": [ + [ + -50.0, + "Last things last" + ], + [ + -46.0, + "Last things last,\nby the grace\nof the fire and the flames" + ], + [ + -41.0, + "You're the face of the future" + ], + [ + -36.0, + "the blood in my veins, oh-ooh" + ], + [ + -28.0, + "(x2)\nThe blood in my veins, oh-ooooh" + ], + [ + -19.0, + "But they never did, ever lived, ebbin' and flowin'" + ], + [ + -15.0, + "Inhibited, limited 'til it broke open" + ], + [ + -11.0, + "Inhibited, limited 'til it broke open and rained down" + ], + [ + -8.0, + "It rained down like" + ], + [ + -0.1, + "PAIN!" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -0.5, + 0.0 + ], + [ + 0.5, + 0.6 + ], + [ + 8.0, + 0.0 + ], + [ + 15.0, + 0.0 + ], + [ + 16.0, + 0.4 + ], + [ + 24.0, + 0.0 + ], + [ + 29.0, + 0.0 + ], + [ + 30.0, + 0.3 + ], + [ + 36.0, + 0.0 + ], + [ + 37.0, + 0.0 + ], + [ + 38.0, + 0.3 + ], + [ + 44.0, + 0.0 + ], + [ + 47.5, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FFEBEB", + "#FFEBEB", + "#445782", + "#EBA602", + "#5EEBB9", + "#8EE3DC", + "#A23045", + "#262222" + ], + "GameOverText": null + }, + { + "Name": "Beha1", + "IsExplicit": true, + "Language": "Russian", + "WindUpTimer": 35.23, + "Bpm": 81.99027, + "Beats": 34, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 47.15, + "FileDurationLoop": 24.881, + "FileNameIntro": "Beha1Intro.ogg", + "FileNameLoop": "BehaLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -4.0, + "FadeOutDuration": 3.9, + "ColorTransitionIn": 0.1, + "ColorTransitionOut": 0.6, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -6.0, + 16.5 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#9554F9", + "#3769FD", + "#E43B65", + "#59CFEA", + "#7F3FEE", + "#C831FE" + ], + "GameOverText": null + }, + { + "Name": "Beha2", + "IsExplicit": true, + "Language": "Russian", + "WindUpTimer": 38.16, + "Bpm": 81.99027, + "Beats": 34, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 50.064, + "FileDurationLoop": 24.881, + "FileNameIntro": "Beha2Intro.ogg", + "FileNameLoop": "BehaLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -4.0, + "FadeOutDuration": 3.9, + "ColorTransitionIn": 0.1, + "ColorTransitionOut": 0.6, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -6.0, + 16.5 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#9554F9", + "#3769FD", + "#E43B65", + "#59CFEA", + "#7F3FEE", + "#C831FE" + ], + "GameOverText": null + }, + { + "Name": "Beha3", + "IsExplicit": true, + "Language": "Russian", + "WindUpTimer": 35.21, + "Bpm": 81.99027, + "Beats": 34, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 47.111, + "FileDurationLoop": 24.881, + "FileNameIntro": "Beha3Intro.ogg", + "FileNameLoop": "BehaLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -4.0, + "FadeOutDuration": 3.9, + "ColorTransitionIn": 0.1, + "ColorTransitionOut": 0.6, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -6.0, + 16.5 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#9554F9", + "#3769FD", + "#E43B65", + "#59CFEA", + "#7F3FEE", + "#C831FE" + ], + "GameOverText": null + }, + { + "Name": "Chereshnya", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 45.48, + "Bpm": 131.958755, + "Beats": 64, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 46.15, + "FileDurationLoop": 29.1, + "FileNameIntro": "ChereshnyaIntro.ogg", + "FileNameLoop": "ChereshnyaLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -4.0, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.3, + "ColorTransitionOut": 0.35, + "ColorTransitionEasing": "InOutCubic", + "FlickerLightsTimeSeries": [ + -5.0, + 27.0, + 29.0, + 59.0, + 61.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#A01471", + "#CB2243", + "#4CAF50", + "#F01D7A", + "#AF005A", + "#EF355F", + "#FFD85D", + "#FF66B2", + "#A01471", + "#4CAF50", + "#CB2243", + "#F01D7A", + "#AF005A", + "#FFD85D", + "#EF355F", + "#FF66B2" + ], + "GameOverText": null + }, + { + "Name": "DeployDestroy", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 40.68, + "Bpm": 129.878922, + "Beats": 32, + "LoopOffset": 32, + "Ext": "ogg", + "FileDurationIntro": 57.283, + "FileDurationLoop": 14.783, + "FileNameIntro": "DeployDestroyIntro.ogg", + "FileNameLoop": "DeployDestroyLoop.ogg", + "BeatsOffset": 0.2, + "FadeOutBeat": -38.0, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.25, + "ColorTransitionOut": 0.25, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -101.0, + -93.0, + -77.0, + -61.0, + -37.0, + -5.0, + 27.0 + ], + "Lyrics": [ + [ + -111.0, + "Deploy Destroy, porjadok eto otstoj" + ], + [ + -103.0, + "Krushi, lomaj, trjasi bashkoju pustoj" + ], + [ + -95.0, + "Dopej, razbej i novuju otkryvaj" + ], + [ + -87.0, + "Davaj-davaj!" + ], + [ + -79.0, + "Chestnoe slovo ja nevinoven" + ], + [ + -75.0, + "Ja ne pomnju, otkuda stol'ko krovi" + ], + [ + -71.0, + "Na moih ladonjah\nyi moej odezhde" + ], + [ + -67.0, + "Ja nikogda nikogo\nne bil prezhde" + ], + [ + -63.0, + "Ja nikogda nichego\nne pil prezhde" + ], + [ + -59.0, + "Byl tih, spokoen,\nso vsemi vezhliv" + ], + [ + -55.0, + "Vsegda tol'ko v urnu\nbrosal musor" + ], + [ + -51.0, + "Obhodil storonoj shumnye tusy" + ], + [ + -47.0, + "Zapreshhjonnyh veshhestv nikakih ne juzal" + ], + [ + -43.0, + "Byl polozhitel'nej samogo pljusa" + ], + [ + -39.0, + "A potom kak-to raz\njetu pesnju uslyshal" + ], + [ + -35.0, + "I vsjo proshhaj, moja krysha" + ], + [ + -31.0, + "Deploy Destroy, porjadok eto otstoj" + ], + [ + -23.0, + "Krushi, lomaj, trjasi bashkoju pustoj" + ], + [ + -15.0, + "Dopej, razbej i novuju otkryvaj" + ], + [ + -7.0, + "Davaj-davaj!" + ], + [ + 1.0, + "Deploy Destroy, porjadok eto otstoj" + ], + [ + 9.0, + "Krushi, lomaj, trjasi bashkoju pustoj" + ], + [ + 17.0, + "Dopej, razbej i novuju otkryvaj" + ], + [ + 25.0, + "Davaj-davaj!" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -48.0, + 0.0 + ], + [ + -46.0, + 0.7 + ], + [ + -42.0, + 0.0 + ], + [ + 16.0, + 0.0 + ], + [ + 19.0, + 0.3 + ], + [ + 23.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#217F87", + "#BAFF00", + "#73BE25", + "#78AB4E", + "#FFFF00" + ], + "GameOverText": null + }, + { + "Name": "Durochka", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 37.0, + "Bpm": 129.9686, + "Beats": 40, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 38.833, + "FileDurationLoop": 18.466, + "FileNameIntro": "DurochkaIntro.ogg", + "FileNameLoop": "DurochkaLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -7.0, + "FadeOutDuration": 7.0, + "ColorTransitionIn": 0.25, + "ColorTransitionOut": 0.3, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -9.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#5986FE", + "#FEFEDC", + "#FF4FDF", + "#FEFEDC", + "#FFAA23", + "#FEFEDC", + "#F95A5A", + "#FEFEDC" + ], + "GameOverText": null + }, + { + "Name": "GodMode", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 40.38, + "Bpm": 108.016876, + "Beats": 64, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 42.6, + "FileDurationLoop": 35.55, + "FileNameIntro": "GodModeIntro.ogg", + "FileNameLoop": "GodModeLoop.ogg", + "BeatsOffset": 0.1, + "FadeOutBeat": -4.0, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.5, + "ColorTransitionOut": 0.5, + "ColorTransitionEasing": "OutCubic", + "FlickerLightsTimeSeries": [ + -5.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [ + [ + -0.5, + 0.0 + ], + [ + 0.0, + 0.7 + ], + [ + 8.0, + 0.0 + ], + [ + 63.5, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FBDBDB", + "#4B81FF", + "#564242", + "#C90AE2", + "#FBDBDB", + "#61CBE3", + "#564242", + "#ED3131" + ], + "GameOverText": "[COULD'VE BEEN: IMMORTAL]" + }, + { + "Name": "Gorgorod", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 43.2, + "Bpm": 90.0, + "Beats": 24, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 47.866, + "FileDurationLoop": 16.0, + "FileNameIntro": "GorgorodIntro.ogg", + "FileNameLoop": "GorgorodLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -2.0, + "FadeOutDuration": 2.0, + "ColorTransitionIn": 0.25, + "ColorTransitionOut": 0.25, + "ColorTransitionEasing": "InExpo", + "FlickerLightsTimeSeries": [ + 20.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#42367E", + "#FF9400", + "#932A04", + "#FF9400", + "#932A04", + "#42367E", + "#FF9400", + "#932A04" + ], + "GameOverText": null + }, + { + "Name": "Kach", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 47.3, + "Bpm": 153.6, + "Beats": 48, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 48.866, + "FileDurationLoop": 18.75, + "FileNameIntro": "KachIntro.ogg", + "FileNameLoop": "KachLoop.ogg", + "BeatsOffset": 0.4, + "FadeOutBeat": -6.0, + "FadeOutDuration": 6.0, + "ColorTransitionIn": 0.8, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -120.5, + -105.0, + -89.0, + -8.0, + 44.0, + 45.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#7774DE", + "#1EA59A", + "#3BC457", + "#3BC457", + "#CA6935", + "#A82615", + "#A7AA43", + "#A7AA43", + "#4C2B81", + "#2E802B", + "#C952E7", + "#C952E7" + ], + "GameOverText": "[DIDN'T PUMP IT: LOUDER]" + }, + { + "Name": "MoyaZhittya", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 34.53, + "Bpm": 120.0, + "Beats": 32, + "LoopOffset": 32, + "Ext": "ogg", + "FileDurationIntro": 43.533, + "FileDurationLoop": 16.0, + "FileNameIntro": "MoyaZhittyaIntro.ogg", + "FileNameLoop": "MoyaZhittyaLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -35.0, + "FadeOutDuration": 3.3, + "ColorTransitionIn": 0.25, + "ColorTransitionOut": 0.5, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -100.5, + -99.5, + -92.5, + -91.5, + -76.5, + -75.5, + -60.5, + -59.5, + -37.0, + -36.0, + -4.5, + -3.5, + 27.5, + 28.5 + ], + "Lyrics": [ + [ + -84.0, + "This ain't a song for the broken-hearted" + ], + [ + -68.0, + "No silent prayer for the faith-departed" + ], + [ + -52.0, + "I ain't gonna be" + ], + [ + -48.0, + "I ain't gonna be\njust a face in the crowd" + ], + [ + -45.0, + "YOU'RE" + ], + [ + -44.0, + "you're GONNA" + ], + [ + -43.5, + "you're gonna HEAR" + ], + [ + -43.0, + "you're gonna hear\nMY" + ], + [ + -42.0, + "you're gonna hear\nmy VOICE" + ], + [ + -41.0, + "WHEN I" + ], + [ + -40.0, + "When I SHOUT IT" + ], + [ + -39.0, + "When I shout it\nOUT LOUD" + ], + [ + -34.0, + "IT'S MY" + ], + [ + -32.0, + "IT'S MY\nLIIIIIFE" + ], + [ + -28.0, + "And it's now or never" + ], + [ + -22.0, + "I ain't gonna" + ], + [ + -20.0, + "I ain't gonna\nlive forever" + ], + [ + -14.0, + "I just want to live" + ], + [ + -10.0, + "I just want to live\nwhile I'm alive" + ], + [ + -2.0, + "IT'S MY" + ], + [ + 0.0, + "IT'S MY\nLIIIIIFE" + ], + [ + 2.0, + "My heart is like" + ], + [ + 4.0, + "My heart is like\nan open highway" + ], + [ + 10.0, + "Like Frankie said," + ], + [ + 12.0, + "Like Frankie said,\n\"I did it my way\"" + ], + [ + 18.0, + "I just want to live" + ], + [ + 22.0, + "I just want to live\nwhile I'm alive" + ], + [ + 30.0, + "IT'S MY" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -33.0, + 0.0 + ], + [ + -31.0, + 0.7 + ], + [ + -1.0, + 0.0 + ], + [ + 1.0, + 0.7 + ], + [ + 8.0, + 0.0 + ], + [ + 24.0, + 0.0 + ], + [ + 31.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#A8C480", + "#3ABBBE", + "#6E9855", + "#4C6846", + "#748084", + "#058099" + ], + "GameOverText": "[LIFE IS: NOW OR NEVER]" + }, + { + "Name": "MuzikaGromche", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 46.3, + "Bpm": 129.729721, + "Beats": 64, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 50.283, + "FileDurationLoop": 29.6, + "FileNameIntro": "MuzikaGromcheIntro.ogg", + "FileNameLoop": "MuzikaGromcheLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -3.0, + "FadeOutDuration": 3.0, + "ColorTransitionIn": 0.25, + "ColorTransitionOut": 0.25, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -5.0, + 29.0, + 61.0 + ], + "Lyrics": [ + [ + -68.0, + "Devchata pljashut pod spidami" + ], + [ + -60.0, + "A ty stoish', kak vkopannyj" + ], + [ + -52.0, + "Krossovkami lomajut pol" + ], + [ + -44.0, + "A ty stoish', kak vkopannyj" + ], + [ + -36.0, + "Ja-ja-ja znaju, chto ty hochesh'," + ], + [ + -32.0, + "Ja-ja-ja znaju, chto ty hochesh',\nTy hochesh' tancevat'" + ], + [ + -28.0, + "Nu-nu zhe, nu davaj zhe," + ], + [ + -24.0, + "Nu-nu zhe, nu davaj zhe,\nNu-nu zhe, nu davaj zhe" + ], + [ + -20.0, + "Ja znaju, chto ty znaesh'\nJetot trek, gotov'sja podpevat'" + ], + [ + -12.0, + "1) RAZ" + ], + [ + -10.0, + "raz, DVA" + ], + [ + -8.0, + "raz, 2wo,\nTRI" + ], + [ + -6.0, + "ras, dva,\n7ri, 4ETYRE" + ], + [ + -1.0, + "Muzyka Gromche\nGlaza zakryty >_<" + ], + [ + 6.0, + "This is NON-STOP,\nNoch'ju otkrytij" + ], + [ + 12.0, + "Delaj chto hochesh', ja zabyvajus'" + ], + [ + 22.0, + "This is NON-STOP,\nne prekrashhajas'" + ], + [ + 31.0, + "Muzyka Gromche\nGlaza zakryty -.-" + ], + [ + 38.0, + "This is NON-STOP,\nNoch'ju otkrytij" + ], + [ + 46.0, + "Budu s toboju,\nsamoj primernoju" + ], + [ + 54.0, + "Utro v okne\nyi my budem pervye" + ], + [ + 63.0, + "Muzyka Gromche\nGlaza zakryty >_<" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -2.0, + 0.0 + ], + [ + 0.0, + 0.4 + ], + [ + 1.0, + 0.6 + ], + [ + 3.0, + 0.0 + ], + [ + 30.0, + 0.0 + ], + [ + 32.0, + 0.5 + ], + [ + 33.0, + 0.7 + ], + [ + 35.0, + 0.0 + ], + [ + 62.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#B300FF", + "#FFF100", + "#00FF51", + "#474747", + "#FF00B3", + "#0070FF" + ], + "GameOverText": null + }, + { + "Name": "OnePartiyaUdar", + "IsExplicit": false, + "Language": "Japanese", + "WindUpTimer": 41.27, + "Bpm": 130.06955, + "Beats": 48, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 44.983, + "FileDurationLoop": 22.142, + "FileNameIntro": "OnePartiyaUdarIntro.ogg", + "FileNameLoop": "OnePartiyaUdarLoop.ogg", + "BeatsOffset": 0.3, + "FadeOutBeat": -8.0, + "FadeOutDuration": 6.0, + "ColorTransitionIn": 0.6, + "ColorTransitionOut": 0.15, + "ColorTransitionEasing": "InOutExpo", + "FlickerLightsTimeSeries": [ + -68.5, + -16.5, + 30.5 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#9C3C37", + "#E9BF5C", + "#B5E3EA", + "#662422", + "#EBC3A8", + "#AA8238" + ], + "GameOverText": null + }, + { + "Name": "Peretasovka", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 39.68, + "Bpm": 130.612244, + "Beats": 32, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 40.6, + "FileDurationLoop": 14.7, + "FileNameIntro": "PeretasovkaIntro.ogg", + "FileNameLoop": "PeretasovkaLoop.ogg", + "BeatsOffset": 0.3, + "FadeOutBeat": -6.0, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -8.0, + 31.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#65C7FA", + "#FCEB3C", + "#89FC8F", + "#FEE9E9", + "#FC3C9D", + "#FCEB3C", + "#89FC8F", + "#FC3C9D" + ], + "GameOverText": null + }, + { + "Name": "PWNED", + "IsExplicit": true, + "Language": "English", + "WindUpTimer": 39.73, + "Bpm": 289.8113, + "Beats": 128, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 59.633, + "FileDurationLoop": 26.5, + "FileNameIntro": "PWNEDIntro.ogg", + "FileNameLoop": "PWNEDLoop.ogg", + "BeatsOffset": -0.2, + "FadeOutBeat": -8.0, + "FadeOutDuration": 6.0, + "ColorTransitionIn": 0.5, + "ColorTransitionOut": 0.3, + "ColorTransitionEasing": "InExpo", + "FlickerLightsTimeSeries": [ + -136.0, + -72.0, + -12.0, + 88.0 + ], + "Lyrics": [ + [ + -190.0, + "These Russian hackers have been" + ], + [ + -184.0, + "in these US governments\nsince March" + ], + [ + -172.0, + "and it is an extraordinary invasion of our cyberspace" + ], + [ + -152.0, + "Russian hackers got access to sensitive" + ], + [ + -142.0, + "parts of the White House email system..." + ], + [ + -134.0, + "[They began to recognize...]" + ], + [ + -126.0, + "" + ], + [ + -118.0, + "\n X__X" + ], + [ + -110.0, + "Gonna crack your" + ], + [ + -102.0, + "Gonna crack your\nStrongest pa$$words%123" + ], + [ + -94.0, + "You popped online" + ], + [ + -86.0, + "You popped online\nTo look for sneakers" + ], + [ + -78.0, + "My hand just popped" + ], + [ + -70.0, + "My hand just popped\nRight in your knickers >_< " + ], + [ + -62.0, + "Keystrokes like Uzi" + ], + [ + -54.0, + "Keystrokes like Uzi\nWill make you go all goosey" + ], + [ + -46.0, + "Kicking down your backdoor" + ], + [ + -38.0, + "Kicking down your backdoor\nCount down before you lose it" + ], + [ + -30.0, + "Keystrokes like Uzi" + ], + [ + -22.0, + "Keystrokes like Uzi\nWill make you go all goosey" + ], + [ + -14.0, + "Kicking down your backdoor" + ], + [ + -6.0, + "Kicking down your backdoor\nCount down before you lose it" + ], + [ + 0.0, + "C:\\> $Ru55ian hack3rs" + ], + [ + 4.0, + "C:\\> $Ru55ian hack3rs\n O__o" + ], + [ + 8.0, + "Infamous White House attackers" + ], + [ + 16.0, + "Stealing your cookies\nto this beat" + ], + [ + 24.0, + "Counting crypto to\nembarrass Wall Street" + ], + [ + 32.0, + "Russi?n ^hackers\tЯushan h@ckers###" + ], + [ + 34.0, + "\tЯushan h@ckers###\n X_X" + ], + [ + 36.0, + "Russi?n ^hackers\n--.--\tЯushan h@ckers###\n X___X" + ], + [ + 38.0, + "\tЯushan h@ckers###\n X_____X" + ], + [ + 40.0, + "Infamous White House attackers" + ], + [ + 48.0, + "Stealing your cookies\nto this beat" + ], + [ + 56.0, + "Counting crypto to\nembarrass Wall Street" + ], + [ + 80.0, + "Instling min3r.exe\t\t\tresolving ur private IP\n/" + ], + [ + 82.0, + "Instling min3r.exe\n00% [8=D ]\tHenllo ${username = \"user\"}\t\tresolving ur private IP\n-" + ], + [ + 84.0, + "Instling min3r.exe\n33% [8====D ]\t\t\tresolving ur private IP\n\\" + ], + [ + 86.0, + "Instling min3r.exe\n66% [8=========D ]\t\t\tresolving ur private IP\n|" + ], + [ + 88.0, + "Instling min3r.exe\n95% [8============D ]\t\tWhere did you download\nthis < mod / dll > from?\tresolving ur private IP\n/" + ], + [ + 90.0, + "Instling min3r.exe\n99% [8=============D]\t\t\tresolving ur private IP\n-" + ], + [ + 92.0, + "Encrpt1ng f!les.. \n99% [8=============D]\t\t\tresolving ur private IP\n\\ Trying... 127.0.0.1" + ], + [ + 94.0, + "Encrpt1ng f!les...\n100% enj0y \\o/\t\t\tresolving ur private IP\n| Trying... 127.0.0.1" + ], + [ + 96.0, + "\t\t\tresolving ur private IP\n/ Trying... 127.0.0.1" + ], + [ + 98.0, + "\t\t\tresolving ur private IP\nP_WNED" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -128.0, + 0.0 + ], + [ + -127.0, + 0.7 + ], + [ + -116.0, + 0.0 + ], + [ + 68.0, + 0.0 + ], + [ + 72.0, + 0.3 + ], + [ + 88.0, + 0.5 + ], + [ + 98.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FFFFFF", + "#0032A0", + "#DA291C", + "#000000", + "#9E9E9E", + "#9E9E9E", + "#383838", + "#383838", + "#5E5E5E", + "#5E5E5E", + "#2E2E2E", + "#2E2E2E", + "#666666", + "#666666", + "#4B4B4B", + "#4B4B4B", + "#8E8E8E", + "#8E8E8E", + "#1D1D1D", + "#1D1D1D", + "#9E9E9E", + "#9E9E9E", + "#383838", + "#383838", + "#5E5E5E", + "#5E5E5E", + "#2E2E2E", + "#2E2E2E", + "#666666", + "#666666", + "#4B4B4B", + "#4B4B4B", + "#FFFFFF", + "#0032A0", + "#DA291C", + "#000000", + "#9E9E9E", + "#9E9E9E", + "#383838", + "#383838", + "#5E5E5E", + "#5E5E5E", + "#2E2E2E", + "#2E2E2E", + "#666666", + "#666666", + "#4B4B4B", + "#4B4B4B", + "#8E8E8E", + "#8E8E8E", + "#1D1D1D", + "#1D1D1D", + "#9E9E9E", + "#9E9E9E", + "#383838", + "#383838", + "#5E5E5E", + "#5E5E5E", + "#2E2E2E", + "#2E2E2E", + "#666666", + "#666666", + "#4B4B4B", + "#4B4B4B", + "#9E9E9E", + "#9E9E9E", + "#9E9E9E", + "#9E9E9E", + "#383838", + "#383838", + "#383838", + "#383838", + "#5E5E5E", + "#5E5E5E", + "#5E5E5E", + "#5E5E5E", + "#2E2E2E", + "#2E2E2E", + "#2E2E2E", + "#2E2E2E", + "#666666", + "#666666", + "#666666", + "#666666", + "#4B4B4B", + "#4B4B4B", + "#4B4B4B", + "#4B4B4B", + "#8E8E8E", + "#8E8E8E", + "#8E8E8E", + "#8E8E8E", + "#1D1D1D", + "#1D1D1D", + "#1D1D1D", + "#1D1D1D", + "#9E9E9E", + "#9E9E9E", + "#9E9E9E", + "#9E9E9E", + "#383838", + "#383838", + "#383838", + "#383838", + "#5E5E5E", + "#5E5E5E", + "#5E5E5E", + "#5E5E5E", + "#2E2E2E", + "#2E2E2E", + "#2E2E2E", + "#2E2E2E", + "#666666", + "#666666", + "#666666", + "#666666", + "#4B4B4B", + "#4B4B4B", + "#4B4B4B", + "#4B4B4B", + "#8E8E8E", + "#8E8E8E", + "#8E8E8E", + "#8E8E8E", + "#1D1D1D", + "#1D1D1D", + "#1D1D1D", + "#1D1D1D" + ], + "GameOverText": "[HACK3D BY: RUSSI4NS]" + }, + { + "Name": "ReelGoon", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 45.15, + "Bpm": 117.997726, + "Beats": 64, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 47.45, + "FileDurationLoop": 32.543, + "FileNameIntro": "ReelGoonIntro.ogg", + "FileNameLoop": "ReelGoonLoop.ogg", + "BeatsOffset": -0.35, + "FadeOutBeat": -2.0, + "FadeOutDuration": 2.0, + "ColorTransitionIn": 0.1, + "ColorTransitionOut": 0.35, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -41.0, + 61.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [ + [ + -0.5, + 0.0 + ], + [ + -0.05, + 0.5 + ], + [ + 6.0, + 0.0 + ], + [ + 60.0, + 0.0 + ], + [ + 61.0, + 0.5 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#DE1C31", + "#F7E26B", + "#3D3D3D", + "#FBB040", + "#ED4E4A", + "#F0BD37", + "#E41E2E", + "#2E2D2B" + ], + "GameOverText": "[LIFE SUPPORT: REAL GONE]" + }, + { + "Name": "RiseAndShine", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 59.87, + "Bpm": 137.8815, + "Beats": 64, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 61.616, + "FileDurationLoop": 27.85, + "FileNameIntro": "RiseAndShineIntro.ogg", + "FileNameLoop": "RiseAndShineLoop.ogg", + "BeatsOffset": 0.1, + "FadeOutBeat": -4.5, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.5, + "ColorTransitionOut": 0.5, + "ColorTransitionEasing": "OutCubic", + "FlickerLightsTimeSeries": [ + -5.5, + 31.0, + 63.9 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [ + [ + -0.5, + 0.0 + ], + [ + 0.0, + 0.7 + ], + [ + 8.0, + 0.0 + ], + [ + 63.5, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FC6F3C", + "#3CB0FC", + "#FCD489", + "#564242", + "#FC6F3C", + "#3CB0FC", + "#63E98C", + "#866868" + ], + "GameOverText": "[ HEY, YOUNG BLOOD ]" + }, + { + "Name": "Song2", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 38.63, + "Bpm": 50.0, + "Beats": 34, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 43.433, + "FileDurationLoop": 40.8, + "FileNameIntro": "Song2Intro.ogg", + "FileNameLoop": "Song2Loop.ogg", + "BeatsOffset": 0.1, + "FadeOutBeat": -2.0, + "FadeOutDuration": 2.0, + "ColorTransitionIn": 0.3, + "ColorTransitionOut": 0.3, + "ColorTransitionEasing": "InCubic", + "FlickerLightsTimeSeries": [ + 2.5 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FFD3E3", + "#78A0FF", + "#FFD3E3", + "#74A392", + "#FFD3E3", + "#E4B082", + "#FFD3E3", + "#E277AA" + ], + "GameOverText": null + }, + { + "Name": "VseVZale", + "IsExplicit": false, + "Language": "Russian", + "WindUpTimer": 38.28, + "Bpm": 137.965729, + "Beats": 64, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 40.016, + "FileDurationLoop": 27.833, + "FileNameIntro": "VseVZaleIntro.ogg", + "FileNameLoop": "VseVZaleLoop.ogg", + "BeatsOffset": 0.25, + "FadeOutBeat": -3.0, + "FadeOutDuration": 2.5, + "ColorTransitionIn": 0.25, + "ColorTransitionOut": 0.25, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -5.0, + 29.0, + 59.0 + ], + "Lyrics": [ + [ + -30.0, + "VSE V ZALE\nDvigajtes' s nami" + ], + [ + -24.0, + "Chtob sotrjasalis'\nSami my, steny i pol!" + ], + [ + -14.0, + "Vse znaem - jeto examen na dom nam zadan" + ], + [ + -4.0, + "HIP-HOP, HOUSE & ROCK-N-ROLL" + ], + [ + 2.0, + "VSE V ZALE\nDvigajtes' s nami" + ], + [ + 8.0, + "Chtob sotrjasalis'\nSami my, steny i pol!" + ], + [ + 18.0, + "Vse znaem - jeto examen na dom nam zadan" + ], + [ + 28.0, + "HIP-HOP, HOUSE & ROCK-N-ROLL" + ], + [ + 32.0, + "O-o-o-o! Zdes' startuet hip-hop party" + ], + [ + 44.0, + "Tolstyj paren', nam igraj!" + ], + [ + 48.0, + "O-o-o-o! Pesen i devchonok hvatit!" + ], + [ + 60.0, + "Everybody shake your body" + ] + ], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#FF7F00", + "#FFB600", + "#FFED00", + "#00D1FF", + "#6696FB", + "#704DF8", + "#FF7F00", + "#FFB600", + "#FFED00", + "#00D1FF", + "#6696FB", + "#704DF8", + "#FF7F00", + "#FFB600", + "#FFED00", + "#00D1FF", + "#6696FB", + "#704DF8", + "#FF7F00", + "#FFB600", + "#FFED00", + "#00D1FF", + "#6696FB", + "#704DF8", + "#FF7F00", + "#FFB600", + "#FFED00", + "#00D1FF", + "#6696FB", + "#704DF8", + "#FF7F00", + "#FFB600", + "#FFED00", + "#FFED00", + "#00D1FF", + "#00D1FF", + "#6696FB", + "#6696FB", + "#704DF8", + "#704DF8", + "#FF7F00", + "#FF7F00", + "#FFB600", + "#FFB600", + "#FFED00", + "#FFED00", + "#00D1FF", + "#00D1FF", + "#6696FB", + "#6696FB", + "#704DF8", + "#704DF8", + "#FF7F00", + "#FF7F00", + "#FFB600", + "#FFB600", + "#FFED00", + "#FFED00", + "#00D1FF", + "#00D1FF", + "#6696FB", + "#6696FB", + "#704DF8", + "#704DF8" + ], + "GameOverText": null + }, + { + "Name": "Whistle", + "IsExplicit": false, + "Language": "English", + "WindUpTimer": 41.27, + "Bpm": 104.016182, + "Beats": 48, + "LoopOffset": 16, + "Ext": "ogg", + "FileDurationIntro": 52.433, + "FileDurationLoop": 27.688, + "FileNameIntro": "WhistleIntro.ogg", + "FileNameLoop": "WhistleLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -22.0, + "FadeOutDuration": 6.0, + "ColorTransitionIn": 0.5, + "ColorTransitionOut": 0.2, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -20.0, + 12.0 + ], + "Lyrics": [ + [ + -40.0, + "Can you blow my whistle, baby, whistle, baby?" + ], + [ + -36.0, + "Can you blow my whistle, baby, whistle, baby? Let me know" + ], + [ + -33.5, + "Girl, I'm gonna show you how to\ndo it" + ], + [ + -30.5, + "Girl, I'm gonna show you how to\ndo it and we start real slow" + ], + [ + -27.0, + "You just put your lips together" + ], + [ + -24.0, + "You just put your lips together and you come real close" + ], + [ + -21.0, + "Can you blow my whistle, baby, whistle, baby?" + ], + [ + -17.0, + "HERE WE GO" + ], + [ + 10.0, + "Yeah, baby, make that whistle" + ], + [ + 12.0, + "Yeah, baby, make that whistle\nblow oh oh oh" + ], + [ + 15.0, + "Can you blow my whistle, baby, whistle, baby?" + ], + [ + 20.0, + "Can you blow my whistle, baby, whistle, baby? Let me know" + ], + [ + 23.0, + "Girl, I'm gonna show you how to\ndo it" + ], + [ + 28.0, + "Girl, I'm gonna show you how to\ndo it and we start real slow" + ], + [ + 32.0, + "You just put your lips together" + ], + [ + 36.0, + "You just put your lips together and you come real close" + ], + [ + 39.0, + "Can you blow my whistle, baby, whistle, baby?" + ], + [ + 46.0, + "HERE" + ], + [ + 47.0, + "Here WE" + ], + [ + 48.0, + "Here we GO" + ] + ], + "DrunknessLoopOffsetTimeSeries": [ + [ + -16.0, + 0.0 + ], + [ + -15.25, + 0.7 + ], + [ + -12.0, + 0.0 + ], + [ + 9.0, + 0.0 + ], + [ + 15.0, + 0.4 + ], + [ + 16.0, + 0.7 + ], + [ + 18.0, + 0.4 + ], + [ + 21.0, + 0.0 + ] + ], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#8DDEDD", + "#98DE28", + "#E8DB4B", + "#F060A8", + "#EEC263", + "#725DEB" + ], + "GameOverText": null + }, + { + "Name": "Yalgaar", + "IsExplicit": false, + "Language": "Hindi", + "WindUpTimer": 52.17, + "Bpm": 92.0157242, + "Beats": 32, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 53.466, + "FileDurationLoop": 20.866, + "FileNameIntro": "YalgaarIntro.ogg", + "FileNameLoop": "YalgaarLoop.ogg", + "BeatsOffset": 0.0, + "FadeOutBeat": -4.0, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.1, + "ColorTransitionOut": 0.35, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -5.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#C0402D", + "#906F0B", + "#DC8044", + "#70190A", + "#929FAF", + "#4248A2", + "#AE2727", + "#2D2D42" + ], + "GameOverText": null + }, + { + "Name": "ZmeiGorynich", + "IsExplicit": false, + "Language": "Korean", + "WindUpTimer": 46.13, + "Bpm": 90.0014, + "Beats": 32, + "LoopOffset": 0, + "Ext": "ogg", + "FileDurationIntro": 48.8, + "FileDurationLoop": 21.333, + "FileNameIntro": "ZmeiGorynichIntro.ogg", + "FileNameLoop": "ZmeiGorynichLoop.ogg", + "BeatsOffset": 0.1, + "FadeOutBeat": -4.0, + "FadeOutDuration": 4.0, + "ColorTransitionIn": 0.4, + "ColorTransitionOut": 0.4, + "ColorTransitionEasing": "OutExpo", + "FlickerLightsTimeSeries": [ + -5.0, + 31.0 + ], + "Lyrics": [], + "DrunknessLoopOffsetTimeSeries": [], + "CondensationLoopOffsetTimeSeries": [], + "Palette": [ + "#4C8AC5", + "#AF326A", + "#0B1666", + "#AFD2FC", + "#C55297", + "#540070" + ], + "GameOverText": "[MUZIKA: K-POP GROMCHE]" + } + ] +} \ No newline at end of file diff --git a/Frontend/public/apple-touch-icon.png b/Frontend/public/apple-touch-icon.png new file mode 100644 index 0000000..178c965 Binary files /dev/null and b/Frontend/public/apple-touch-icon.png differ diff --git a/Frontend/public/favicon.ico b/Frontend/public/favicon.ico new file mode 100644 index 0000000..6da5c49 Binary files /dev/null and b/Frontend/public/favicon.ico differ diff --git a/Frontend/public/icon-192.png b/Frontend/public/icon-192.png new file mode 100644 index 0000000..62b417b Binary files /dev/null and b/Frontend/public/icon-192.png differ diff --git a/Frontend/public/icon-256.png b/Frontend/public/icon-256.png new file mode 100644 index 0000000..8e68308 Binary files /dev/null and b/Frontend/public/icon-256.png differ diff --git a/Frontend/public/icon-32.png b/Frontend/public/icon-32.png new file mode 100644 index 0000000..5b4254d Binary files /dev/null and b/Frontend/public/icon-32.png differ diff --git a/Frontend/scripts/generate-icons.js b/Frontend/scripts/generate-icons.js new file mode 100644 index 0000000..461729a --- /dev/null +++ b/Frontend/scripts/generate-icons.js @@ -0,0 +1,50 @@ +import sharp from 'sharp'; +import toIco from 'png-to-ico'; +import { promises as fs } from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const sourceIcon = path.resolve(__dirname, '../../icon.png'); +const outputDir = path.resolve(__dirname, '../public'); + +async function generateIcons() { + await fs.mkdir(outputDir, { recursive: true }); + + // Generate PNGs + const sizes = [32, 192, 256]; + for (const size of sizes) { + const outputPath = path.join(outputDir, `icon-${size}.png`); + await sharp(sourceIcon) + .resize(size, size) + .toFile(outputPath); + console.log(`Generated ${outputPath}`); + } + + // Generate apple-touch-icon + const appleIconPath = path.join(outputDir, 'apple-touch-icon.png'); + await sharp(sourceIcon) + .resize(180, 180) + .toFile(appleIconPath); + console.log(`Generated ${appleIconPath}`); + + // Generate favicon.ico + const icoSizes = [16, 24, 32, 48]; + const buffers = await Promise.all(icoSizes.map(size => + sharp(sourceIcon) + .resize(size, size) + .png() + .toBuffer() + )); + const icoBuffer = await toIco(buffers); + const icoPath = path.join(outputDir, 'favicon.ico'); + await fs.writeFile(icoPath, icoBuffer); + console.log(`Generated ${icoPath}`); +} + +generateIcons().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/Frontend/src/App.vue b/Frontend/src/App.vue new file mode 100644 index 0000000..6970906 --- /dev/null +++ b/Frontend/src/App.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/Frontend/src/assets/fonts/3270-Regular.woff b/Frontend/src/assets/fonts/3270-Regular.woff new file mode 100644 index 0000000..d74887d Binary files /dev/null and b/Frontend/src/assets/fonts/3270-Regular.woff differ diff --git a/Frontend/src/assets/playhead-main.png b/Frontend/src/assets/playhead-main.png new file mode 100644 index 0000000..1e43c43 Binary files /dev/null and b/Frontend/src/assets/playhead-main.png differ diff --git a/Frontend/src/assets/playhead-top.png b/Frontend/src/assets/playhead-top.png new file mode 100644 index 0000000..15c38dd Binary files /dev/null and b/Frontend/src/assets/playhead-top.png differ diff --git a/Frontend/src/audio/AudioEngine.ts b/Frontend/src/audio/AudioEngine.ts new file mode 100644 index 0000000..891f9a3 --- /dev/null +++ b/Frontend/src/audio/AudioEngine.ts @@ -0,0 +1,533 @@ +/* + AudioEngine.ts + A small singleton wrapper around the WebAudio AudioContext that: + - lazily creates the AudioContext + - provides fetch/decode + simple caching + - schedules intro and loop buffers to play seamlessly + - exposes play/pause/stop and a volume control via a master GainNode + - provides a short fade-in/out GainNode to avoid clicks (few ms) + - exposes getPosition() to read current playback time relative to intro start +*/ + +import { type AudioTrack, useWrapTime, wrapTimeFn } from "@/lib/AudioTrack"; +import type { Seconds } from "@/lib/units"; +import { + type ConfigurableWindow, + tryOnScopeDispose, + useRafFn, + useThrottleFn, + watchImmediate, +} from "@vueuse/core"; +import { + type MaybeRefOrGetter, + type Ref, + shallowRef, + toValue, + watch, +} from "vue"; + +export const VOLUME_MAX: number = 1.5; + +interface PlayerHandle { + /** + * The `stop()` method schedules a sound to cease playback at the specified time. + */ + stop: (when?: Seconds) => void; +} + +interface AudioTrackBuffersHandle extends PlayerHandle { + /** + * Time in AudioContext coordinate system of a moment which lines up with the start of the intro audio buffer. + * If the startPosition was greater than zero, this time is already in the past when the function returns. + */ + readonly introStartTime: Seconds; +} + +/** + * Start playing intro + loop buffers at given position. + * + * @returns Handle with introStartTime and stop() method. + */ +function playAudioTrackBuffers( + audioCtx: AudioContext, + destinationNode: AudioNode, + audioTrack: AudioTrack, + /** + * Position in seconds from the start of the intro + */ + startPosition: Seconds = 0, +): AudioTrackBuffersHandle { + const now = audioCtx.currentTime; + + const introBuffer = audioTrack.loadedIntro!; + const loopBuffer = audioTrack.loadedLoop!; + + const introDuration = introBuffer.duration; + const loopDuration = loopBuffer.duration; + + const wrapper = wrapTimeFn(audioTrack); + startPosition = wrapper(startPosition); + + let currentIntro: AudioBufferSourceNode | null; + let currentLoop: AudioBufferSourceNode | null; + let introStartTime: Seconds; + + // figure out where to start + if (startPosition < introDuration) { + // start intro with offset, schedule loop after remaining intro time + const introOffset = startPosition; + const timeUntilLoop = introDuration - introOffset; + + const introNode = audioCtx.createBufferSource(); + introNode.buffer = introBuffer; + introNode.connect(destinationNode); + introNode.start(now, introOffset); + + const loopNode = audioCtx.createBufferSource(); + loopNode.buffer = loopBuffer; + loopNode.loop = true; + loopNode.connect(destinationNode); + loopNode.start(now + timeUntilLoop, 0); + + currentIntro = introNode; + currentLoop = loopNode; + introStartTime = now - startPosition; + } else { + // start directly in loop with proper offset into loop + const loopOffset = (startPosition - introDuration) % loopDuration; + const loopNode = audioCtx.createBufferSource(); + loopNode.buffer = loopBuffer; + loopNode.loop = true; + loopNode.connect(destinationNode); + loopNode.start(now, loopOffset); + + currentIntro = null; + currentLoop = loopNode; + // Note: using wrapping loop breaks logical position when starting playback from the second loop repetition onward. + // introStartTime = now - introDuration - loopOffset; + introStartTime = now - startPosition; + } + + function stop(when?: Seconds) { + try { + currentIntro?.stop(when); + } catch (e) { + /* ignore */ + } + try { + currentLoop?.stop(when); + } catch (e) { + /* ignore */ + } + currentIntro = null; + currentLoop = null; + } + + return { introStartTime, stop }; +} + +interface PlayWithFadeInOut extends PlayerHandle { + playerResult: Omit; +} + +/** + * 25 ms for fade-in/fade-out + */ +const DEFAULT_FADE_DURATION = 0.025; + +/** + * Wrap the given player function with a Gain node. Applies fade in effect on start and fade out on stop. + * + * @returns Handle with introStartTime and stop() method. + */ +function playWithFadeInOut( + audioCtx: AudioContext, + destinationNode: AudioNode, + player: (destinationNode: AudioNode) => T, + /** + * Duration of fade in/out in seconds. Fade out extends past the stop() call. + */ + fadeDuration: Seconds = DEFAULT_FADE_DURATION, +): PlayWithFadeInOut { + const GAIN_MIN = 0.0001; + const GAIN_MAX = 1.0; + + const fadeGain = audioCtx.createGain(); + fadeGain.connect(destinationNode); + fadeGain.gain.value = GAIN_MIN; + + const playerHandle = player(fadeGain); + + // fade in + const now = audioCtx.currentTime; + const fadeEnd = now + fadeDuration; + fadeGain.gain.setValueAtTime(GAIN_MIN, now); + fadeGain.gain.linearRampToValueAtTime(GAIN_MAX, fadeEnd); + + // TODO: setTimeout to actually stop after `when`? + function stop(_when?: Seconds) { + // fade out + const now = audioCtx.currentTime; + const fadeEnd = now + fadeDuration; + fadeGain.gain.cancelScheduledValues(now); + fadeGain.gain.setValueAtTime(GAIN_MAX, now); + fadeGain.gain.linearRampToValueAtTime(GAIN_MIN, fadeEnd); + + playerHandle.stop(fadeEnd); + } + + return { playerResult: playerHandle, stop }; +} + +/** + * Properties relates to the state of playback. + */ +export interface PlaybackState { + /** + * Readonly reference to whether audio is currently playing. + */ + readonly isPlaying: Readonly>; + /** + * Readonly reference to the last remembered start-of-playback position. + * + * Will only update if stop(rememberPosition=true) or seek() is called. + */ + readonly startPosition: Readonly>; + /** + * Returns current playback position in seconds based on AudioContext time. + * + * Hook it up to requestAnimationFrame while isPlaying is true for live updates. + */ + getCurrentPosition(): Seconds; +} + +export interface StopOptions { + /** + * If true, update remembered playback position to current position, otherwise revert to last remembered one. + * + * Defaults to false. + */ + rememberPosition?: boolean; +} + +export interface SeekOptions { + /** + * If scrub is requested, plays a short sample at that position. + * + * Defaults to false. + */ + scrub?: boolean; + // TODO: optionally keep playing after seeking? +} + +/** + * Player controls and properties relates to the state of playback. + */ +export interface PlayerControls { + /** + * Start playing audio buffers from the last remembered position. + */ + play: () => void; + /** + * Stop playing audio buffers. + * + * If rememberPosition is true, update remembered playback position, otherwise revert to the last remembered one. + */ + stop: (options?: StopOptions) => void; + /** + * Seek to given position in seconds. + * + * - Stop the playback. + * - If scrub is requested, plays a short sample at that position. + */ + seek: (position: Seconds, options?: SeekOptions) => void; + /** + * Properties relates to the state of playback. + */ + readonly playback: PlaybackState; +} + +interface ReusableAudioBuffersTrackPlayer extends PlayerControls { +} + +function reusableAudioBuffersTrackPlayer( + audioCtx: AudioContext, + destinationNode: AudioNode, + audioTrack: AudioTrack, +): ReusableAudioBuffersTrackPlayer { + let currentHandle: PlayWithFadeInOut | null = null; + const isPlaying = shallowRef(false); + const wrapper = wrapTimeFn(audioTrack); + const startPosition = useWrapTime(audioTrack, 0); + + function play() { + if (currentHandle) { + return; + } + currentHandle = playWithFadeInOut( + audioCtx, + destinationNode, + (destinationNode) => + playAudioTrackBuffers( + audioCtx, + destinationNode, + audioTrack, + startPosition.value, + ), + ); + isPlaying.value = true; + } + + function stop(options?: { rememberPosition?: boolean }) { + const { + rememberPosition = false, + } = options ?? {}; + + if (currentHandle) { + isPlaying.value = false; + + if (rememberPosition) { + startPosition.value = getCurrentPosition(); + } + + // stop and discard current handle + currentHandle.stop(); + currentHandle = null; + } + } + + function seek(seekPosition: Seconds, options?: SeekOptions) { + const { + scrub = false, + } = options ?? {}; + + stop({ rememberPosition: false }); + + startPosition.value = seekPosition; + + if (scrub) { + doThrottledScrub(); + } + } + + // Scrub is subject to debouncing/throttling, so it doesn't start + // playing samples too often before previous ones could stop. + const doThrottledScrub = useThrottleFn(() => { + // play a short sample at the seeked position + const scrubHandle = playWithFadeInOut( + audioCtx, + destinationNode, + (destinationNode) => + playAudioTrackBuffers( + audioCtx, + destinationNode, + audioTrack, + startPosition.value, + ), + 0.01, // short fade of 10 ms + ); + setTimeout(() => { + scrubHandle.stop(0.01); + }, 80); // stop after N ms + }, 80); + + function getCurrentPosition(): Seconds { + if (!currentHandle) { + return startPosition.value; + } + + const elapsed = audioCtx.currentTime - + currentHandle.playerResult.introStartTime; + + return wrapper(elapsed); + } + + return { + play, + stop, + seek, + playback: { + isPlaying, + startPosition, + getCurrentPosition, + }, + }; +} + +interface LivePlaybackPositionOptions extends ConfigurableWindow { +} + +interface LivePlaybackPositionReturn { + stop: () => void; + position: Readonly>; +} + +export function useLivePlaybackPosition( + playback: MaybeRefOrGetter, + options?: LivePlaybackPositionOptions, +): LivePlaybackPositionReturn { + const cleanups: Function[] = []; + const cleanup = () => { + cleanups.forEach((fn) => fn()); + cleanups.length = 0; + }; + + const getPosition = () => { + return toValue(playback)?.getCurrentPosition() ?? 0; + }; + + const position = shallowRef(getPosition()); + + const updatePosition = () => { + position.value = getPosition(); + }; + + const raf = useRafFn(() => { + updatePosition(); + }, { + ...options, + immediate: false, + once: false, + }); + + const stopWatch = watchImmediate(() => [ + toValue(playback), + ], ([playback]) => { + cleanup(); + + updatePosition(); + + if (!playback) return; + + cleanups.push(watch(playback.isPlaying, (isPlaying) => { + if (isPlaying) { + raf.resume(); + } else { + raf.pause(); + updatePosition(); + } + })); + + cleanups.push(watch(playback.startPosition, () => { + raf.pause(); + updatePosition(); + if (playback.isPlaying.value) { + raf.resume(); + } + })); + + cleanups.push(() => raf.pause()); + }); + + const stop = () => { + stopWatch(); + cleanup(); + }; + + tryOnScopeDispose(cleanup); + + return { stop, position }; +} + +export function togglePlayStop( + player: PlayerControls | null, + options?: StopOptions, +) { + if (!player) return; + if (player.playback.isPlaying.value) { + player.stop(options); + } else { + player.play(); + } +} + +class AudioEngine { + audioCtx: AudioContext | null = null; + masterGain: GainNode | null = null; // controlled by UI volume slider + // fadeGain: GainNode | null = null; // tiny fade to avoid clicks + + // cache of decoded buffers by URL + bufferCache = new Map(); + + private _player: Ref = shallowRef(null); + // readonly player: Readonly> = this._player; + + // settings + fadeDuration = 0.025; // 25 ms for fade-in/fade-out + + init() { + if (this.audioCtx) return; + this.audioCtx = + new (window.AudioContext || (window as any).webkitAudioContext)(); + + this.masterGain = this.audioCtx.createGain(); + + // routing: sources -> fadeGain -> masterGain -> destination + this.masterGain.connect(this.audioCtx.destination); + // default full volume + this.masterGain.gain.value = 1; + } + + shutdown() { + this.stopPlayer(); + this.audioCtx?.close(); + this.audioCtx = null; + this.masterGain = null; + } + + async fetchAudioBuffer( + url: string, + signal?: AbortSignal, + ): Promise { + this.init(); + if (this.bufferCache.has(url)) return this.bufferCache.get(url)!; + const res = await fetch(url, { signal }); + if (!res.ok) { + throw new Error(`Network error ${res.status} when fetching ${url}`); + } + const arrayBuffer = await res.arrayBuffer(); + const audioBuffer = await this.audioCtx!.decodeAudioData(arrayBuffer); + this.bufferCache.set(url, audioBuffer); + return audioBuffer; + } + + // set UI volume 0..VOLUME_MAX + setVolume(value: number) { + this.init(); + if (!this.masterGain || !this.audioCtx) return; + const now = this.audioCtx.currentTime; + // small linear ramp to avoid jumps + this.masterGain.gain.cancelScheduledValues(now); + this.masterGain.gain.setValueAtTime(this.masterGain.gain.value, now); + this.masterGain.gain.linearRampToValueAtTime(value, now + 0.05); + } + + initPlayer( + audioTrack: AudioTrack, + ): PlayerControls | null { + this.init(); + if (!this.audioCtx || !this.masterGain) return null; + + this.stopPlayer(); + + if (!audioTrack.loadedIntro || !audioTrack.loadedLoop) return null; + + const player = reusableAudioBuffersTrackPlayer( + this.audioCtx, + this.masterGain, + audioTrack, + ); + this._player.value = player; + return player; + } + + private stopPlayer() { + if (this._player.value) { + this._player.value.stop(); + this._player.value = null; + } + } +} + +const audioEngine = new AudioEngine(); +export default audioEngine; diff --git a/Frontend/src/audio/AudioWaveform.ts b/Frontend/src/audio/AudioWaveform.ts new file mode 100644 index 0000000..0ef0a3e --- /dev/null +++ b/Frontend/src/audio/AudioWaveform.ts @@ -0,0 +1,191 @@ +import type { Px } from "@/lib/units"; +import { useWeakCache } from "@/lib/useWeakCache"; +import { type Fn, tryOnScopeDispose, watchImmediate } from "@vueuse/core"; +import type { MaybeRefOrGetter, Ref } from "vue"; +import { computed, shallowRef, toValue, triggerRef } from "vue"; + +// Result of async computation +interface UseWaveform { + readonly isDone: Readonly>; + readonly peaks: Readonly>; + stop: () => void; +} + +interface WaveformComputation { + readonly isDone: Readonly>; + readonly peaks: Readonly>; + /** Start or continue asynchronous computation. */ + run: () => void; + /** Stops any ongoing asynchronous computation. */ + stop: () => void; +} + +const waveformsCache = useWeakCache>( + () => new Map(), +); + +const WAVEFORM_MIN_WIDTH = 10; + +const emptyComputation: WaveformComputation = { + isDone: shallowRef(false), + peaks: shallowRef(new Float32Array(0)), + run() {}, + stop() {}, +}; + +export function useWaveform( + buffer: MaybeRefOrGetter, + width: MaybeRefOrGetter, +): UseWaveform { + const cleanups: Fn[] = []; + const cleanup = () => { + cleanups.forEach((fn) => fn()); + cleanups.length = 0; + }; + + const compRef: Ref = shallowRef(emptyComputation); + + const stopWatch = watchImmediate( + () => + [ + toValue(buffer), + toValue(width), + ] as const, + ([b, w]) => { + cleanup(); + + const map = waveformsCache.getOrNew(b); + + if (w < WAVEFORM_MIN_WIDTH) { + compRef.value = emptyComputation; + return; + } + + let comp = map.get(w); + if (!comp) { + comp = useWaveformComputation(b, w); + map.set(w, comp); + } + compRef.value = comp; + comp.run(); + cleanups.push(() => { + compRef.value = emptyComputation; + comp.stop(); + }); + }, + ); + + const stop = () => { + stopWatch(); + cleanup(); + }; + + tryOnScopeDispose(stop); + + return { + isDone: computed(() => compRef.value.isDone.value), + peaks: computed(() => compRef.value.peaks.value), + stop, + }; +} + +const useWaveformComputation = ( + buffer: AudioBuffer, + width: Px, +): WaveformComputation => { + // How many times run() has been called without stop(). + // This whole computation should not stop until there is at least one user out there. + let users = 0; + + // How many pixels of `width` have been processed so far + let progress = 0; + + // Waveform data, length shall be equal to the requested width + const waveform = new Float32Array(width); + + const isDone = shallowRef(false); + const peaks = shallowRef(waveform); + + const nChannels = buffer.numberOfChannels; + + const samplesPerPx = buffer.length / width; + const blocksPerChannel: Float32Array[] = []; + for (let channel = 0; channel < nChannels; channel++) { + blocksPerChannel[channel] = new Float32Array(Math.ceil(samplesPerPx)); + } + + const areWeDoneYet = () => progress >= width; + + function stepBlock() { + const blockStart = Math.floor(progress * samplesPerPx); + const blockEnd = Math.floor((progress + 1) * samplesPerPx); + const blockSize = blockEnd - blockStart; + + for (let channel = 0; channel < nChannels; channel++) { + buffer.copyFromChannel(blocksPerChannel[channel]!, channel, blockStart); + } + + waveform[progress] = compressBlock(blocksPerChannel, blockSize); + progress += 1; + } + + function stepBatchOfBlocks() { + // run blocks for up to ~10ms to keep UI responsive + const start = performance.now(); + const progressStart = progress; + while (!areWeDoneYet()) { + stepBlock(); + if (performance.now() - start >= 10 || progress - progressStart > 100) { + break; + } + } + + triggerRef(peaks); + // triggerRef may as well not trigger refs + // https://github.com/vuejs/core/issues/9579 + // Combined with a throttled drawing function, + // this is a slightly better-than-worse workaround. + peaks.value = new Float32Array(0); + peaks.value = waveform; + + if (areWeDoneYet()) { + isDone.value = true; + timeoutID = NaN; + } else { + timeoutID = setTimeout(stepBatchOfBlocks, 1); + } + } + + let timeoutID: number = NaN; + + return { + isDone, + peaks, + run() { + users += 1; + + if (Number.isNaN(timeoutID) && users === 1) { + timeoutID = setTimeout(stepBatchOfBlocks, 0); + } + }, + stop() { + users -= 1; + + if (!Number.isNaN(timeoutID) && users === 0) { + window.clearTimeout(timeoutID); + timeoutID = NaN; + } + }, + }; +}; + +function compressBlock(channels: Float32Array[], blockSize: number): number { + let peak = 0.0; + + for (let i = 0; i < blockSize; i++) { + for (let channel = 0; channel < channels.length; channel++) { + peak = Math.max(peak, Math.abs(channels[channel]![i]!)); + } + } + return peak; +} diff --git a/Frontend/src/components/ErrorScreen.vue b/Frontend/src/components/ErrorScreen.vue new file mode 100644 index 0000000..b0a306d --- /dev/null +++ b/Frontend/src/components/ErrorScreen.vue @@ -0,0 +1,20 @@ + + + diff --git a/Frontend/src/components/Footer.vue b/Frontend/src/components/Footer.vue new file mode 100644 index 0000000..cee5da7 --- /dev/null +++ b/Frontend/src/components/Footer.vue @@ -0,0 +1,52 @@ + + + diff --git a/Frontend/src/components/GlobalHeader.vue b/Frontend/src/components/GlobalHeader.vue new file mode 100644 index 0000000..49da20c --- /dev/null +++ b/Frontend/src/components/GlobalHeader.vue @@ -0,0 +1,43 @@ + + + + diff --git a/Frontend/src/components/LoadingScreen.vue b/Frontend/src/components/LoadingScreen.vue new file mode 100644 index 0000000..efce166 --- /dev/null +++ b/Frontend/src/components/LoadingScreen.vue @@ -0,0 +1,92 @@ + + + + diff --git a/Frontend/src/components/ScreenTransition.vue b/Frontend/src/components/ScreenTransition.vue new file mode 100644 index 0000000..5dd8665 --- /dev/null +++ b/Frontend/src/components/ScreenTransition.vue @@ -0,0 +1,39 @@ + + + diff --git a/Frontend/src/components/SearchField.vue b/Frontend/src/components/SearchField.vue new file mode 100644 index 0000000..8981ea8 --- /dev/null +++ b/Frontend/src/components/SearchField.vue @@ -0,0 +1,42 @@ + + + diff --git a/Frontend/src/components/editor/PreviewScnene.vue b/Frontend/src/components/editor/PreviewScnene.vue new file mode 100644 index 0000000..87a9bb2 --- /dev/null +++ b/Frontend/src/components/editor/PreviewScnene.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/Frontend/src/components/editor/TrackInfo.vue b/Frontend/src/components/editor/TrackInfo.vue new file mode 100644 index 0000000..aaefbd6 --- /dev/null +++ b/Frontend/src/components/editor/TrackInfo.vue @@ -0,0 +1,82 @@ + + + + diff --git a/Frontend/src/components/inspector/InspectorPanel.vue b/Frontend/src/components/inspector/InspectorPanel.vue new file mode 100644 index 0000000..4f0214b --- /dev/null +++ b/Frontend/src/components/inspector/InspectorPanel.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/Control.vue b/Frontend/src/components/inspector/controls/Control.vue new file mode 100644 index 0000000..53783a1 --- /dev/null +++ b/Frontend/src/components/inspector/controls/Control.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/ControlsView.vue b/Frontend/src/components/inspector/controls/ControlsView.vue new file mode 100644 index 0000000..e4c90ce --- /dev/null +++ b/Frontend/src/components/inspector/controls/ControlsView.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/BaseNamedControlView.vue b/Frontend/src/components/inspector/controls/impl/BaseNamedControlView.vue new file mode 100644 index 0000000..27c1330 --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/BaseNamedControlView.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/ButtonControlView.vue b/Frontend/src/components/inspector/controls/impl/ButtonControlView.vue new file mode 100644 index 0000000..e3d464a --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/ButtonControlView.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/CheckboxControlView.vue b/Frontend/src/components/inspector/controls/impl/CheckboxControlView.vue new file mode 100644 index 0000000..07f0530 --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/CheckboxControlView.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/DropDownControlView.vue b/Frontend/src/components/inspector/controls/impl/DropDownControlView.vue new file mode 100644 index 0000000..bfc6bb2 --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/DropDownControlView.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/HrControlView.vue b/Frontend/src/components/inspector/controls/impl/HrControlView.vue new file mode 100644 index 0000000..ae49a52 --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/HrControlView.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/NotImplementedControlView.vue b/Frontend/src/components/inspector/controls/impl/NotImplementedControlView.vue new file mode 100644 index 0000000..183dccb --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/NotImplementedControlView.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/NumberControlView.vue b/Frontend/src/components/inspector/controls/impl/NumberControlView.vue new file mode 100644 index 0000000..f879b72 --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/NumberControlView.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/RangeControlView.vue b/Frontend/src/components/inspector/controls/impl/RangeControlView.vue new file mode 100644 index 0000000..92fe8fc --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/RangeControlView.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/Frontend/src/components/inspector/controls/impl/TextAreaControlView.vue b/Frontend/src/components/inspector/controls/impl/TextAreaControlView.vue new file mode 100644 index 0000000..973a23c --- /dev/null +++ b/Frontend/src/components/inspector/controls/impl/TextAreaControlView.vue @@ -0,0 +1,23 @@ + + +