From 369429b52f2db12b9da875c57cabbcfe3e41cc48 Mon Sep 17 00:00:00 2001 From: Kasper Date: Sun, 15 Sep 2024 18:38:06 +0200 Subject: [PATCH] Use tabs --- CHANGELOG.md | 8 +- README.md | 8 +- build.rs | 2 +- eslint.config.mjs | 110 +- ferrum-addon/main.d.ts | 28 +- index.html | 18 +- package-lock.json | 16410 +++++++++++------------ package.json | 209 +- rustfmt.toml | 2 +- src-native/artists.rs | 26 +- src-native/data.rs | 236 +- src-native/data_js.rs | 38 +- src-native/filter.rs | 1380 +- src-native/itunes_import.rs | 1264 +- src-native/js.rs | 14 +- src-native/lib.rs | 94 +- src-native/library.rs | 182 +- src-native/library_types.rs | 530 +- src-native/page.rs | 308 +- src-native/playlists.rs | 662 +- src-native/sidebar_view.rs | 68 +- src-native/sort.rs | 334 +- src-native/tracks/import.rs | 836 +- src-native/tracks/md.rs | 370 +- src-native/tracks/mod.rs | 340 +- src-native/tracks/tag.rs | 1207 +- src/App.svelte | 600 +- src/app.css | 36 +- src/assets/fonts.css | 4 +- src/components/ArtistList.svelte | 28 +- src/components/Button.svelte | 118 +- src/components/DragGhost.svelte | 34 +- src/components/Filter.svelte | 74 +- src/components/ItunesImport.svelte | 256 +- src/components/Modal.svelte | 174 +- src/components/Player.svelte | 668 +- src/components/PlaylistInfo.svelte | 120 +- src/components/Queue.svelte | 744 +- src/components/QueueItem.svelte | 144 +- src/components/QuickNav.svelte | 328 +- src/components/Sidebar.svelte | 366 +- src/components/SidebarItems.svelte | 722 +- src/components/Slider.svelte | 200 +- src/components/TrackInfo.svelte | 1154 +- src/components/TrackList.svelte | 920 +- src/components/VirtualListBlock.svelte | 198 +- src/electron/ipc.ts | 212 +- src/electron/is.ts | 6 +- src/electron/main.ts | 214 +- src/electron/menubar.ts | 598 +- src/electron/preload.ts | 4 +- src/electron/shortcuts.ts | 128 +- src/electron/typed_ipc.ts | 272 +- src/lib/data.ts | 544 +- src/lib/drag-drop.ts | 16 +- src/lib/helpers.ts | 162 +- src/lib/menus.ts | 50 +- src/lib/page.ts | 28 +- src/lib/player.ts | 376 +- src/lib/queue.ts | 426 +- src/lib/quit.ts | 28 +- src/lib/selection.ts | 650 +- src/lib/window.ts | 24 +- src/main.ts | 2 +- svelte.config.mjs | 6 +- tsconfig.json | 42 +- vite.config.mjs | 72 +- 67 files changed, 17726 insertions(+), 17706 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b249d7..916f891 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,10 +41,10 @@ - Add `Ctrl+K` quick playlist search (macOS: `Cmd+K`) - Add playlist reordering - Sidebar selection improvements: - - Add left arrow key shortcut for going to the parent playlist folder - - Add alt+up/down shortcut - - Fix up arrow selecting siblings only - - Fix inability to move playlists into deeper levels + - Add left arrow key shortcut for going to the parent playlist folder + - Add alt+up/down shortcut + - Fix up arrow selecting siblings only + - Fix inability to move playlists into deeper levels ## 0.16.12 - 2023 Jun 14 - Improve filtering by perofrming unicode normalization diff --git a/README.md b/README.md index 56e45d2..e1d9fb7 100755 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@
- +

Ferrum

- Music library and player -
- Download for Mac, Windows or Linux + Music library and player +
+ Download for Mac, Windows or Linux


diff --git a/build.rs b/build.rs index 1f866b6..f8bfd67 100644 --- a/build.rs +++ b/build.rs @@ -1,5 +1,5 @@ extern crate napi_build; fn main() { - napi_build::setup(); + napi_build::setup(); } diff --git a/eslint.config.mjs b/eslint.config.mjs index 6ec608a..1ddfd0e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -6,59 +6,59 @@ import globals from 'globals' /** @type {import('eslint').Linter.FlatConfig[]} */ export default [ - js.configs.recommended, - ...ts.configs.recommended, - ...svelte.configs['flat/recommended'], - prettier, - ...svelte.configs['flat/prettier'], - { - languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - }, - }, - }, - { - files: ['**/*.svelte'], - languageOptions: { - parserOptions: { - parser: ts.parser, - }, - }, - }, - { - ignores: ['build/', '.svelte-kit/', 'dist/'], - }, - { - rules: { - // '@typescript-eslint/naming-convention': [ - // 'error', - // { - // selector: 'variableLike', - // format: ['snake_case', 'UPPER_CASE'], - // leadingUnderscore: 'allow', - // }, - // { - // selector: 'parameter', - // modifiers: ['destructured'], - // format: null, - // }, - // { - // selector: 'variable', - // modifiers: ['destructured'], - // format: null, - // }, - // ], - '@typescript-eslint/no-unused-expressions': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - caughtErrorsIgnorePattern: '^_', - argsIgnorePattern: '^_', - varsIgnorePattern: '^_', - }, - ], - }, - }, + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs['flat/recommended'], + prettier, + ...svelte.configs['flat/prettier'], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + }, + { + files: ['**/*.svelte'], + languageOptions: { + parserOptions: { + parser: ts.parser, + }, + }, + }, + { + ignores: ['build/', '.svelte-kit/', 'dist/'], + }, + { + rules: { + // '@typescript-eslint/naming-convention': [ + // 'error', + // { + // selector: 'variableLike', + // format: ['snake_case', 'UPPER_CASE'], + // leadingUnderscore: 'allow', + // }, + // { + // selector: 'parameter', + // modifiers: ['destructured'], + // format: null, + // }, + // { + // selector: 'variable', + // modifiers: ['destructured'], + // format: null, + // }, + // ], + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + caughtErrorsIgnorePattern: '^_', + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + }, + }, ] diff --git a/ferrum-addon/main.d.ts b/ferrum-addon/main.d.ts index 63dd33b..f65b97c 100644 --- a/ferrum-addon/main.d.ts +++ b/ferrum-addon/main.d.ts @@ -4,20 +4,20 @@ export * from './addon.d' declare module 'ferrum-addon/addon' { - export type TrackID = string - export type TrackListID = string - export type PercentInteger = number - export type MsSinceUnixEpoch = number + export type TrackID = string + export type TrackListID = string + export type PercentInteger = number + export type MsSinceUnixEpoch = number - export interface Playlist { - type: 'playlist' - } - export interface Folder { - type: 'folder' - } - export interface Special { - type: 'special' - } + export interface Playlist { + type: 'playlist' + } + export interface Folder { + type: 'folder' + } + export interface Special { + type: 'special' + } - export type TrackList = Playlist | Folder | Special + export type TrackList = Playlist | Folder | Special } diff --git a/index.html b/index.html index dd4bb38..b013b36 100755 --- a/index.html +++ b/index.html @@ -1,12 +1,12 @@ - + - - - + + + - - - - - + + + + + diff --git a/package-lock.json b/package-lock.json index 4f8cdba..252b705 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8207 +1,8207 @@ { - "name": "ferrum", - "version": "0.18.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ferrum", - "version": "0.18.0", - "devDependencies": { - "@napi-rs/cli": "^2.18.4", - "@sveltejs/vite-plugin-svelte": "^3.1.2", - "@tailwindcss/vite": "4.0.0-alpha.23", - "@tsconfig/svelte": "^5.0.4", - "concurrently": "^8.2.2", - "electron": "^28.3.3", - "electron-builder": "^25.0.5", - "eslint": "^9.10.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.43.0", - "fuzzysort": "^3.0.2", - "prettier": "^3.3.3", - "prettier-plugin-svelte": "^3.2.6", - "prettier-plugin-tailwindcss": "^0.6.6", - "sass": "^1.78.0", - "svelte": "^4.2.19", - "svelte-check": "^4.0.1", - "svelte-preprocess": "^6.0.2", - "tailwindcss": "4.0.0-alpha.23", - "typescript": "~5.5.4", - "typescript-eslint": "^8.4.0", - "vite": "^5.4.3", - "vite-plugin-electron": "^0.28.7" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", - "dev": true, - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@electron/asar/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", - "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", - "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", - "dev": true, - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/rebuild": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", - "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/rebuild/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/universal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", - "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", - "dev": true, - "dependencies": { - "@electron/asar": "^3.2.7", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", - "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", - "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", - "dev": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@napi-rs/cli": { - "version": "2.18.4", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz", - "integrity": "sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==", - "dev": true, - "bin": { - "napi": "scripts/index.js" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", - "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", - "dev": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", - "debug": "^4.3.4", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.10", - "svelte-hmr": "^0.16.0", - "vitefu": "^0.2.5" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", - "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.0.0 || >=20" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.0-alpha.23.tgz", - "integrity": "sha512-cijBaDwohFIHQ9miyzhONgvxMkTe7mRhH4QnPmszfD6dcqo3E/Vkm+RA1elKlWrAiSZo7LcwUSQALvMr0ENS9Q==", - "dev": true, - "dependencies": { - "jiti": "^2.0.0-beta.3" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.0-alpha.23.tgz", - "integrity": "sha512-MC1WuACDTUDxQPblqDNA3x67mmbADYhWbBFA0EgFd30MD2YT6MP9+VhvN9ZkBL2owu9CIcqjAED7/Wa4XtcOLg==", - "dev": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.0-alpha.23", - "@tailwindcss/oxide-darwin-arm64": "4.0.0-alpha.23", - "@tailwindcss/oxide-darwin-x64": "4.0.0-alpha.23", - "@tailwindcss/oxide-freebsd-x64": "4.0.0-alpha.23", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.0-alpha.23", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.0-alpha.23", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.0-alpha.23", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.0-alpha.23", - "@tailwindcss/oxide-linux-x64-musl": "4.0.0-alpha.23", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.0-alpha.23" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.0-alpha.23.tgz", - "integrity": "sha512-NVpSsdw9u9zg52b7U+3JNSKsYuDnr0zWja4EaWOeyVFKAuNCIj0hkqe8PRxhaqH292a23CKgpqnpOa0y0r22kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.0-alpha.23.tgz", - "integrity": "sha512-4DvJqUhRfEYS61/LvmCvekszE+JX6tzsUKGTcd+AFKRpWlgVv3+U4GaSg7tT9Qw1lCcnvBMlfX6+uoy1PngGpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.0-alpha.23.tgz", - "integrity": "sha512-sieWEozY+Ezk93ZocojMwIdTyI6C8F65UGNBJw2IXpYo6eA4/iJkCTNbSZRE36HJCfnaGxv0Ck2c8fLZjz6NXQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.0-alpha.23.tgz", - "integrity": "sha512-qYNSPJ5v1lfCE2nfiuYw71WOz7Ni/sVgIDc11jOs1W0MoQfChIQ9ylO0rSH72PrhJVdvwmPGHTUUAP07+CwAOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.0-alpha.23.tgz", - "integrity": "sha512-7zXukEjz8i1fiR8cyA4Tta1IqjoLlc7TQWqkdE05C2ZYqrE+JTmTgE47JdcErU8XA16FBWmajIIyTv1FN78ZrQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.0-alpha.23.tgz", - "integrity": "sha512-UQ5vKDxYE4+8QwTEifXkjGJOS1tckomzfiQC++6hiH89dtg199thWLVWBsqbU8meleFaO3VGr/sPUKILbwX8IA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.0-alpha.23.tgz", - "integrity": "sha512-60cHuT660aeoHZ5Wpefxc3SRAdVdBVN1geypeKHzvnbdVDPzYj1XKQusrQ9tbNoknjn4182frqwd8a1RZaoeEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.0-alpha.23.tgz", - "integrity": "sha512-1IhD1/kVZZIrpI/Z+i8KsirrEo0aO6WN/NRprYzNvMhj0d2+Aqy4RRqlj++vtvPFpesT8CqsZP1wLexM/6cK2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.0-alpha.23.tgz", - "integrity": "sha512-Bqbr17np6qE41gbnVMkpRSYJhwGv1PGz7cU+8upuQWx6b8uNptwcCJLOLLt3dQFqfieK/2NEs2QZZevxLsq5ng==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.0-alpha.23.tgz", - "integrity": "sha512-N31hPSK1Uxo17dWwn6fQEMWqvFBxMUZWRoHOZG7qbHe6NTTC69wFMDzdxCY1nbRnvx5ObAiWzRFuZoNES7AzSg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.0-alpha.23.tgz", - "integrity": "sha512-JEllYp6YKOl3mMpKZ4UGf9E32HBCxf/tZ1jrFORB+Sj7ng69rDHOkYyQREezPIHguHj2yeREeShIivAcLnu5tQ==", - "dev": true, - "dependencies": { - "@tailwindcss/node": "4.0.0-alpha.23", - "@tailwindcss/oxide": "4.0.0-alpha.23", - "lightningcss": "^1.26.0", - "postcss": "^8.4.41", - "postcss-import": "^16.1.0", - "tailwindcss": "4.0.0-alpha.23" - }, - "peerDependencies": { - "vite": "^5.2.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/svelte": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", - "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", - "dev": true - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.19.50", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", - "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/verror": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", - "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", - "dev": true, - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz", - "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.4.0", - "@typescript-eslint/type-utils": "8.4.0", - "@typescript-eslint/utils": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz", - "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.4.0", - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/typescript-estree": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz", - "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz", - "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.4.0", - "@typescript-eslint/utils": "8.4.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz", - "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz", - "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz", - "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.4.0", - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/typescript-estree": "8.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz", - "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.4.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-builder-bin": { - "version": "5.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.7.tgz", - "integrity": "sha512-ww2mK4ITUvqisnqOuUWAeHzokpPidyZ7a0ZkwW+V7sF5/Pdi2OldkRjAWqEzn6Xtmj3SLVT84as4wB59A6jJ4g==", - "dev": true - }, - "node_modules/app-builder-lib": { - "version": "25.0.5", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.0.5.tgz", - "integrity": "sha512-rxgxMx1f7I4ZAP0jA5+5iB7X6x6MJvGF7GauRzQBnIVihwXX2HOiAE7yenyY9Ry5YAiH47MnCxdq413Wq6XOcQ==", - "dev": true, - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.3.2", - "@electron/osx-sign": "1.3.1", - "@electron/rebuild": "3.6.0", - "@electron/universal": "2.0.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "25.0.3", - "builder-util-runtime": "9.2.5", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "electron-publish": "25.0.3", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^10.0.0", - "read-config-file": "6.4.0", - "resedit": "^1.7.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "dmg-builder": "25.0.5", - "electron-builder-squirrel-windows": "25.0.5" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "peer": true, - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "optional": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builder-util": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.0.3.tgz", - "integrity": "sha512-eH5c1ukdY2xjtFQWQ6jlzEuXuqcuAVc3UQ6V6fdYu9Kg3CkDbCR82Mox42uaJDmee9WXSbP/88cOworFdOHPhw==", - "dev": true, - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.7", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.5", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.5", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz", - "integrity": "sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/config-file-ts": { - "version": "0.2.8-rc1", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", - "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", - "dev": true, - "dependencies": { - "glob": "^10.3.12", - "typescript": "^5.4.3" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "node_modules/dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dmg-builder": { - "version": "25.0.5", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.0.5.tgz", - "integrity": "sha512-ocnZV44ZqInoSFaY54fF7BlCtw+WtbrjyPrkBhaB+Ztn7GPKjmFgRbIKytifJ8h9Cib8jdFRMgjCUtkU45Y6DA==", - "dev": true, - "dependencies": { - "app-builder-lib": "25.0.5", - "builder-util": "25.0.3", - "builder-util-runtime": "9.2.5", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", - "dev": true, - "dependencies": { - "dotenv": "^16.4.4" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "28.3.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-28.3.3.tgz", - "integrity": "sha512-ObKMLSPNhomtCOBAxFS8P2DW/4umkh72ouZUlUKzXGtYuPzgr1SYhskhFWgzAsPtUzhL2CzyV2sfbHcEW4CXqw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "25.0.5", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.0.5.tgz", - "integrity": "sha512-Uj5LFRbUqNiVajsgqcwlKe+CHtwubK3hcoJsW5C2YiWodej2mmxM+LrTqga0rrWWHVMNmrcmGcS/WHpKwy6KEw==", - "dev": true, - "dependencies": { - "app-builder-lib": "25.0.5", - "builder-util": "25.0.3", - "builder-util-runtime": "9.2.5", - "chalk": "^4.1.2", - "dmg-builder": "25.0.5", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.4.0", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder-squirrel-windows": { - "version": "25.0.5", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.0.5.tgz", - "integrity": "sha512-N2U7LGSdt4hmEhjEeIV2XJbjj2YIrTL6enfsGKfOhGTpL6GEejUmT3gjdKUqKBS5+NBx0GWhnEwD3MpO2P6Nfg==", - "dev": true, - "peer": true, - "dependencies": { - "app-builder-lib": "25.0.5", - "archiver": "^5.3.1", - "builder-util": "25.0.3", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-publish": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.0.3.tgz", - "integrity": "sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "25.0.3", - "builder-util-runtime": "9.2.5", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "optional": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", - "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.10.0", - "@eslint/plugin-kit": "^0.1.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.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.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", - "dev": true, - "dependencies": { - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "2.43.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.43.0.tgz", - "integrity": "sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@jridgewell/sourcemap-codec": "^1.4.15", - "eslint-compat-utils": "^0.5.1", - "esutils": "^2.0.3", - "known-css-properties": "^0.34.0", - "postcss": "^8.4.38", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.1.0", - "semver": "^7.6.2", - "svelte-eslint-parser": "^0.41.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-svelte/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "peer": true - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuzzysort": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.0.2.tgz", - "integrity": "sha512-ZyahVgxvckB1Qosn7YGWLDJJp2XlyaQ2WmZeI+d0AzW0AMqVYnz5N89G6KAKa6m/LOtv+kzJn4lhDF/yVg11Cg==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "optional": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "optional": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "node_modules/isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", - "dev": true, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jiti": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.0.0-beta.3.tgz", - "integrity": "sha512-pmfRbVRs/7khFrSAYnSiJ8C0D5GvzkE4Ey2pAvUcJsw1ly/p+7ut27jbJrjY79BpAJQJ4gXYFtK6d1Aub+9baQ==", - "dev": true, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.26.0.tgz", - "integrity": "sha512-a/XZ5hdgifrofQJUArr5AiJjx26SwMam3SJUSMjgebZbESZ96i+6Qsl8tLi0kaUsdMzBWXh9sN1Oe6hp2/dkQw==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.26.0", - "lightningcss-darwin-x64": "1.26.0", - "lightningcss-freebsd-x64": "1.26.0", - "lightningcss-linux-arm-gnueabihf": "1.26.0", - "lightningcss-linux-arm64-gnu": "1.26.0", - "lightningcss-linux-arm64-musl": "1.26.0", - "lightningcss-linux-x64-gnu": "1.26.0", - "lightningcss-linux-x64-musl": "1.26.0", - "lightningcss-win32-arm64-msvc": "1.26.0", - "lightningcss-win32-x64-msvc": "1.26.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.26.0.tgz", - "integrity": "sha512-n4TIvHO1NY1ondKFYpL2ZX0bcC2y6yjXMD6JfyizgR8BCFNEeArINDzEaeqlfX9bXz73Bpz/Ow0nu+1qiDrBKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.26.0.tgz", - "integrity": "sha512-Rf9HuHIDi1R6/zgBkJh25SiJHF+dm9axUZW/0UoYCW1/8HV0gMI0blARhH4z+REmWiU1yYT/KyNF3h7tHyRXUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.26.0.tgz", - "integrity": "sha512-C/io7POAxp6sZxFSVGezjajMlCKQ8KSwISLLGRq8xLQpQMokYrUoqYEwmIX8mLmF6C/CZPk0gFmRSzd8biWM0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.26.0.tgz", - "integrity": "sha512-Aag9kqXqkyPSW+dXMgyWk66C984Nay2pY8Nws+67gHlDzV3cWh7TvFlzuaTaVFMVqdDTzN484LSK3u39zFBnzg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.26.0.tgz", - "integrity": "sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.26.0.tgz", - "integrity": "sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.26.0.tgz", - "integrity": "sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.26.0.tgz", - "integrity": "sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.26.0.tgz", - "integrity": "sha512-X/597/cFnCogy9VItj/+7Tgu5VLbAtDF7KZDPdSw0MaL6FL940th1y3HiOzFIlziVvAtbo0RB3NAae1Oofr+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.26.0.tgz", - "integrity": "sha512-pYS3EyGP3JRhfqEFYmfFDiZ9/pVNfy8jVIYtrx9TVNusVyDK3gpW1w/rbvroQ4bDJi7grdUtyrYU6V2xkY/bBw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "peer": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.67.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", - "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node_modules/node-api-version": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", - "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-api-version/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/pe-library": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", - "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", - "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.6.tgz", - "integrity": "sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==", - "dev": true, - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz", - "integrity": "sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==", - "dev": true, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig-melody": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-multiline-arrays": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig-melody": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-multiline-arrays": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-config-file": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.4.0.tgz", - "integrity": "sha512-uB5QOBeF84PT61GlV11OTV4jUGHAO3iDEOP6v9ygxhG6Bs9PLg7WsjNT6mtIX2G+x8lJTr4ZWNeG6LDTKkNf2Q==", - "dev": true, - "dependencies": { - "config-file-ts": "0.2.8-rc1", - "dotenv": "^16.4.5", - "dotenv-expand": "^11.0.6", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "lazy-val": "^1.0.5" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resedit": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.1.tgz", - "integrity": "sha512-/FJ6/gKAXbcHtivannhecWsa43kGVFK3aHHv9Jm3x0eFiM31MoGihkAOWbm3UsvjYLRVw0zTkfARy2dI96JL1Q==", - "dev": true, - "dependencies": { - "pe-library": "^0.4.1" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rollup": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sass": { - "version": "1.78.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", - "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", - "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte-check": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.0.1.tgz", - "integrity": "sha512-AuWnCZdREoOzMhoptHPUUPYUxLNdXSkoZnPnlv19SZJJimRzLmjjZLKsOiRB4AnhgX+56/WSEdvkWXI/q2BSsA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^3.4.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/svelte-check/node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/svelte-check/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.41.0.tgz", - "integrity": "sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==", - "dev": true, - "dependencies": { - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "postcss": "^8.4.39", - "postcss-scss": "^4.0.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-hmr": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", - "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.2.tgz", - "integrity": "sha512-OvDTLfaOkkhjprbDKO0SOCkjNYuHy16dbD4SpqbIi6QiabOMHxRT4km5/dzbFFkmW1L0E2INF3MFltG2pgOyKQ==", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": ">=3", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": ">=0.55", - "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0", - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/tailwindcss": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0-alpha.23.tgz", - "integrity": "sha512-5dy4L1icQUYkG2Fa427QG3fKGkNqMi6V4bJE0DoxBZkR4e550w7uxYJ7vBXINWrRmDd4LHmQInkgsHza3lwONg==", - "dev": true - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.4.0.tgz", - "integrity": "sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.4.0", - "@typescript-eslint/parser": "8.4.0", - "@typescript-eslint/utils": "8.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/vite": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", - "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-electron": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-0.28.7.tgz", - "integrity": "sha512-wsiFUY9AN/HBwn6Jc+i7ehNQISAzUzy6p7NvgJJB1jKCNvZ7PyYlZloH0m3LWFkC+/dFDRGwW89kyAafRRPsLA==", - "dev": true, - "peerDependencies": { - "vite-plugin-electron-renderer": "*" - }, - "peerDependenciesMeta": { - "vite-plugin-electron-renderer": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", - "dev": true, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "peer": true, - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - } + "name": "ferrum", + "version": "0.18.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ferrum", + "version": "0.18.0", + "devDependencies": { + "@napi-rs/cli": "^2.18.4", + "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@tailwindcss/vite": "4.0.0-alpha.23", + "@tsconfig/svelte": "^5.0.4", + "concurrently": "^8.2.2", + "electron": "^28.3.3", + "electron-builder": "^25.0.5", + "eslint": "^9.10.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.43.0", + "fuzzysort": "^3.0.2", + "prettier": "^3.3.3", + "prettier-plugin-svelte": "^3.2.6", + "prettier-plugin-tailwindcss": "^0.6.6", + "sass": "^1.78.0", + "svelte": "^4.2.19", + "svelte-check": "^4.0.1", + "svelte-preprocess": "^6.0.2", + "tailwindcss": "4.0.0-alpha.23", + "typescript": "~5.5.4", + "typescript-eslint": "^8.4.0", + "vite": "^5.4.3", + "vite-plugin-electron": "^0.28.7" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", + "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", + "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/rebuild/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/rebuild/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@napi-rs/cli": { + "version": "2.18.4", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz", + "integrity": "sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==", + "dev": true, + "bin": { + "napi": "scripts/index.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", + "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.10", + "svelte-hmr": "^0.16.0", + "vitefu": "^0.2.5" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", + "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.0-alpha.23.tgz", + "integrity": "sha512-cijBaDwohFIHQ9miyzhONgvxMkTe7mRhH4QnPmszfD6dcqo3E/Vkm+RA1elKlWrAiSZo7LcwUSQALvMr0ENS9Q==", + "dev": true, + "dependencies": { + "jiti": "^2.0.0-beta.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.0-alpha.23.tgz", + "integrity": "sha512-MC1WuACDTUDxQPblqDNA3x67mmbADYhWbBFA0EgFd30MD2YT6MP9+VhvN9ZkBL2owu9CIcqjAED7/Wa4XtcOLg==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.0.0-alpha.23", + "@tailwindcss/oxide-darwin-arm64": "4.0.0-alpha.23", + "@tailwindcss/oxide-darwin-x64": "4.0.0-alpha.23", + "@tailwindcss/oxide-freebsd-x64": "4.0.0-alpha.23", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.0-alpha.23", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.0-alpha.23", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.0-alpha.23", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.0-alpha.23", + "@tailwindcss/oxide-linux-x64-musl": "4.0.0-alpha.23", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.0-alpha.23" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.0-alpha.23.tgz", + "integrity": "sha512-NVpSsdw9u9zg52b7U+3JNSKsYuDnr0zWja4EaWOeyVFKAuNCIj0hkqe8PRxhaqH292a23CKgpqnpOa0y0r22kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.0-alpha.23.tgz", + "integrity": "sha512-4DvJqUhRfEYS61/LvmCvekszE+JX6tzsUKGTcd+AFKRpWlgVv3+U4GaSg7tT9Qw1lCcnvBMlfX6+uoy1PngGpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.0-alpha.23.tgz", + "integrity": "sha512-sieWEozY+Ezk93ZocojMwIdTyI6C8F65UGNBJw2IXpYo6eA4/iJkCTNbSZRE36HJCfnaGxv0Ck2c8fLZjz6NXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.0-alpha.23.tgz", + "integrity": "sha512-qYNSPJ5v1lfCE2nfiuYw71WOz7Ni/sVgIDc11jOs1W0MoQfChIQ9ylO0rSH72PrhJVdvwmPGHTUUAP07+CwAOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.0-alpha.23.tgz", + "integrity": "sha512-7zXukEjz8i1fiR8cyA4Tta1IqjoLlc7TQWqkdE05C2ZYqrE+JTmTgE47JdcErU8XA16FBWmajIIyTv1FN78ZrQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.0-alpha.23.tgz", + "integrity": "sha512-UQ5vKDxYE4+8QwTEifXkjGJOS1tckomzfiQC++6hiH89dtg199thWLVWBsqbU8meleFaO3VGr/sPUKILbwX8IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.0-alpha.23.tgz", + "integrity": "sha512-60cHuT660aeoHZ5Wpefxc3SRAdVdBVN1geypeKHzvnbdVDPzYj1XKQusrQ9tbNoknjn4182frqwd8a1RZaoeEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.0-alpha.23.tgz", + "integrity": "sha512-1IhD1/kVZZIrpI/Z+i8KsirrEo0aO6WN/NRprYzNvMhj0d2+Aqy4RRqlj++vtvPFpesT8CqsZP1wLexM/6cK2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.0-alpha.23.tgz", + "integrity": "sha512-Bqbr17np6qE41gbnVMkpRSYJhwGv1PGz7cU+8upuQWx6b8uNptwcCJLOLLt3dQFqfieK/2NEs2QZZevxLsq5ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.0-alpha.23.tgz", + "integrity": "sha512-N31hPSK1Uxo17dWwn6fQEMWqvFBxMUZWRoHOZG7qbHe6NTTC69wFMDzdxCY1nbRnvx5ObAiWzRFuZoNES7AzSg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.0-alpha.23.tgz", + "integrity": "sha512-JEllYp6YKOl3mMpKZ4UGf9E32HBCxf/tZ1jrFORB+Sj7ng69rDHOkYyQREezPIHguHj2yeREeShIivAcLnu5tQ==", + "dev": true, + "dependencies": { + "@tailwindcss/node": "4.0.0-alpha.23", + "@tailwindcss/oxide": "4.0.0-alpha.23", + "lightningcss": "^1.26.0", + "postcss": "^8.4.41", + "postcss-import": "^16.1.0", + "tailwindcss": "4.0.0-alpha.23" + }, + "peerDependencies": { + "vite": "^5.2.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", + "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", + "dev": true + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", + "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz", + "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/type-utils": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz", + "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz", + "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz", + "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz", + "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz", + "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz", + "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz", + "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-builder-bin": { + "version": "5.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.7.tgz", + "integrity": "sha512-ww2mK4ITUvqisnqOuUWAeHzokpPidyZ7a0ZkwW+V7sF5/Pdi2OldkRjAWqEzn6Xtmj3SLVT84as4wB59A6jJ4g==", + "dev": true + }, + "node_modules/app-builder-lib": { + "version": "25.0.5", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-25.0.5.tgz", + "integrity": "sha512-rxgxMx1f7I4ZAP0jA5+5iB7X6x6MJvGF7GauRzQBnIVihwXX2HOiAE7yenyY9Ry5YAiH47MnCxdq413Wq6XOcQ==", + "dev": true, + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.3.2", + "@electron/osx-sign": "1.3.1", + "@electron/rebuild": "3.6.0", + "@electron/universal": "2.0.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "25.0.3", + "builder-util-runtime": "9.2.5", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "25.0.3", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.0", + "read-config-file": "6.4.0", + "resedit": "^1.7.0", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "25.0.5", + "electron-builder-squirrel-windows": "25.0.5" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builder-util": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-25.0.3.tgz", + "integrity": "sha512-eH5c1ukdY2xjtFQWQ6jlzEuXuqcuAVc3UQ6V6fdYu9Kg3CkDbCR82Mox42uaJDmee9WXSbP/88cOworFdOHPhw==", + "dev": true, + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.7", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.5", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz", + "integrity": "sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/config-file-ts": { + "version": "0.2.8-rc1", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", + "integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==", + "dev": true, + "dependencies": { + "glob": "^10.3.12", + "typescript": "^5.4.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "25.0.5", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-25.0.5.tgz", + "integrity": "sha512-ocnZV44ZqInoSFaY54fF7BlCtw+WtbrjyPrkBhaB+Ztn7GPKjmFgRbIKytifJ8h9Cib8jdFRMgjCUtkU45Y6DA==", + "dev": true, + "dependencies": { + "app-builder-lib": "25.0.5", + "builder-util": "25.0.3", + "builder-util-runtime": "9.2.5", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "dev": true, + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "28.3.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-28.3.3.tgz", + "integrity": "sha512-ObKMLSPNhomtCOBAxFS8P2DW/4umkh72ouZUlUKzXGtYuPzgr1SYhskhFWgzAsPtUzhL2CzyV2sfbHcEW4CXqw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "25.0.5", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-25.0.5.tgz", + "integrity": "sha512-Uj5LFRbUqNiVajsgqcwlKe+CHtwubK3hcoJsW5C2YiWodej2mmxM+LrTqga0rrWWHVMNmrcmGcS/WHpKwy6KEw==", + "dev": true, + "dependencies": { + "app-builder-lib": "25.0.5", + "builder-util": "25.0.3", + "builder-util-runtime": "9.2.5", + "chalk": "^4.1.2", + "dmg-builder": "25.0.5", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.4.0", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "25.0.5", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-25.0.5.tgz", + "integrity": "sha512-N2U7LGSdt4hmEhjEeIV2XJbjj2YIrTL6enfsGKfOhGTpL6GEejUmT3gjdKUqKBS5+NBx0GWhnEwD3MpO2P6Nfg==", + "dev": true, + "peer": true, + "dependencies": { + "app-builder-lib": "25.0.5", + "archiver": "^5.3.1", + "builder-util": "25.0.3", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.0.3.tgz", + "integrity": "sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "25.0.3", + "builder-util-runtime": "9.2.5", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "optional": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.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.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.43.0.tgz", + "integrity": "sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@jridgewell/sourcemap-codec": "^1.4.15", + "eslint-compat-utils": "^0.5.1", + "esutils": "^2.0.3", + "known-css-properties": "^0.34.0", + "postcss": "^8.4.38", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.1.0", + "semver": "^7.6.2", + "svelte-eslint-parser": "^0.41.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "peer": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzysort": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.0.2.tgz", + "integrity": "sha512-ZyahVgxvckB1Qosn7YGWLDJJp2XlyaQ2WmZeI+d0AzW0AMqVYnz5N89G6KAKa6m/LOtv+kzJn4lhDF/yVg11Cg==", + "dev": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "optional": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "optional": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "dev": true, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jiti": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.0.0-beta.3.tgz", + "integrity": "sha512-pmfRbVRs/7khFrSAYnSiJ8C0D5GvzkE4Ey2pAvUcJsw1ly/p+7ut27jbJrjY79BpAJQJ4gXYFtK6d1Aub+9baQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", + "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", + "dev": true + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.26.0.tgz", + "integrity": "sha512-a/XZ5hdgifrofQJUArr5AiJjx26SwMam3SJUSMjgebZbESZ96i+6Qsl8tLi0kaUsdMzBWXh9sN1Oe6hp2/dkQw==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.26.0", + "lightningcss-darwin-x64": "1.26.0", + "lightningcss-freebsd-x64": "1.26.0", + "lightningcss-linux-arm-gnueabihf": "1.26.0", + "lightningcss-linux-arm64-gnu": "1.26.0", + "lightningcss-linux-arm64-musl": "1.26.0", + "lightningcss-linux-x64-gnu": "1.26.0", + "lightningcss-linux-x64-musl": "1.26.0", + "lightningcss-win32-arm64-msvc": "1.26.0", + "lightningcss-win32-x64-msvc": "1.26.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.26.0.tgz", + "integrity": "sha512-n4TIvHO1NY1ondKFYpL2ZX0bcC2y6yjXMD6JfyizgR8BCFNEeArINDzEaeqlfX9bXz73Bpz/Ow0nu+1qiDrBKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.26.0.tgz", + "integrity": "sha512-Rf9HuHIDi1R6/zgBkJh25SiJHF+dm9axUZW/0UoYCW1/8HV0gMI0blARhH4z+REmWiU1yYT/KyNF3h7tHyRXUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.26.0.tgz", + "integrity": "sha512-C/io7POAxp6sZxFSVGezjajMlCKQ8KSwISLLGRq8xLQpQMokYrUoqYEwmIX8mLmF6C/CZPk0gFmRSzd8biWM0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.26.0.tgz", + "integrity": "sha512-Aag9kqXqkyPSW+dXMgyWk66C984Nay2pY8Nws+67gHlDzV3cWh7TvFlzuaTaVFMVqdDTzN484LSK3u39zFBnzg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.26.0.tgz", + "integrity": "sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.26.0.tgz", + "integrity": "sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.26.0.tgz", + "integrity": "sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.26.0.tgz", + "integrity": "sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.26.0.tgz", + "integrity": "sha512-X/597/cFnCogy9VItj/+7Tgu5VLbAtDF7KZDPdSw0MaL6FL940th1y3HiOzFIlziVvAtbo0RB3NAae1Oofr+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.26.0.tgz", + "integrity": "sha512-pYS3EyGP3JRhfqEFYmfFDiZ9/pVNfy8jVIYtrx9TVNusVyDK3gpW1w/rbvroQ4bDJi7grdUtyrYU6V2xkY/bBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", + "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.6.tgz", + "integrity": "sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz", + "integrity": "sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-config-file": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.4.0.tgz", + "integrity": "sha512-uB5QOBeF84PT61GlV11OTV4jUGHAO3iDEOP6v9ygxhG6Bs9PLg7WsjNT6mtIX2G+x8lJTr4ZWNeG6LDTKkNf2Q==", + "dev": true, + "dependencies": { + "config-file-ts": "0.2.8-rc1", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.1.tgz", + "integrity": "sha512-/FJ6/gKAXbcHtivannhecWsa43kGVFK3aHHv9Jm3x0eFiM31MoGihkAOWbm3UsvjYLRVw0zTkfARy2dI96JL1Q==", + "dev": true, + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sass": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "4.2.19", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", + "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-check": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.0.1.tgz", + "integrity": "sha512-AuWnCZdREoOzMhoptHPUUPYUxLNdXSkoZnPnlv19SZJJimRzLmjjZLKsOiRB4AnhgX+56/WSEdvkWXI/q2BSsA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^3.4.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-check/node_modules/fdir": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", + "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/svelte-check/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.41.0.tgz", + "integrity": "sha512-L6f4hOL+AbgfBIB52Z310pg1d2QjRqm7wy3kI1W6hhdhX5bvu7+f0R6w4ykp5HoDdzq+vGhIJmsisaiJDGmVfA==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "postcss": "^8.4.39", + "postcss-scss": "^4.0.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/svelte-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/svelte-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/svelte-hmr": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", + "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.2.tgz", + "integrity": "sha512-OvDTLfaOkkhjprbDKO0SOCkjNYuHy16dbD4SpqbIi6QiabOMHxRT4km5/dzbFFkmW1L0E2INF3MFltG2pgOyKQ==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": ">=3", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": ">=0.55", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.0-alpha.23.tgz", + "integrity": "sha512-5dy4L1icQUYkG2Fa427QG3fKGkNqMi6V4bJE0DoxBZkR4e550w7uxYJ7vBXINWrRmDd4LHmQInkgsHza3lwONg==", + "dev": true + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.4.0.tgz", + "integrity": "sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.4.0", + "@typescript-eslint/parser": "8.4.0", + "@typescript-eslint/utils": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/vite": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-electron": { + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-0.28.7.tgz", + "integrity": "sha512-wsiFUY9AN/HBwn6Jc+i7ehNQISAzUzy6p7NvgJJB1jKCNvZ7PyYlZloH0m3LWFkC+/dFDRGwW89kyAafRRPsLA==", + "dev": true, + "peerDependencies": { + "vite-plugin-electron-renderer": "*" + }, + "peerDependenciesMeta": { + "vite-plugin-electron-renderer": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } } diff --git a/package.json b/package.json index dbce4c7..bbde566 100644 --- a/package.json +++ b/package.json @@ -1,106 +1,107 @@ { - "name": "ferrum", - "private": true, - "productName": "Ferrum", - "author": "kasper.space", - "description": "Music library app", - "version": "0.18.0", - "repository": "https://github.com/probablykasper/ferrum", - "scripts": { - "dev": "npm run napi:dev && vite", - "dev-release": "npm run napi && vite", - "napi": "napi build ferrum-addon --dts addon.d.ts --release", - "napi:dev": "napi build ferrum-addon --dts addon.d.ts", - "build": "npm run napi && npm run build:web && electron-builder", - "build:web": "vite build", - "electron-builder": "electron-builder", - "lint": "svelte-check --tsconfig ./tsconfig.json && eslint src && prettier --check src", - "format": "eslint --fix src && prettier --write src", - "check": "npm run lint && cargo check" - }, - "build": { - "appId": "space.kasper.ferrum", - "productName": "Ferrum", - "artifactName": "${productName}-v${version}-${os}-${arch}.${ext}", - "mac": { - "category": "public.app-category.music", - "icon": "assets/icon.icns", - "target": [ - "dmg" - ], - "darkModeSupport": true, - "identity": null, - "electronLanguages": null - }, - "linux": { - "category": "Audio", - "icon": "assets/icon.icns", - "maintainer": "kasper.space ", - "target": [ - "deb", - "rpm" - ] - }, - "win": { - "icon": "assets/icon.ico", - "target": [ - "nsis" - ] - }, - "files": [ - "build/web", - "build/electron", - "ferrum-addon/addon.node" - ], - "directories": { - "buildResources": "build_resources", - "output": "build/app" - } - }, - "main": "build/electron/main.js", - "napi": { - "name": "addon" - }, - "devDependencies": { - "@napi-rs/cli": "^2.18.4", - "@sveltejs/vite-plugin-svelte": "^3.1.2", - "@tailwindcss/vite": "4.0.0-alpha.23", - "@tsconfig/svelte": "^5.0.4", - "concurrently": "^8.2.2", - "electron": "^28.3.3", - "electron-builder": "^25.0.5", - "eslint": "^9.10.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.43.0", - "fuzzysort": "^3.0.2", - "prettier": "^3.3.3", - "prettier-plugin-svelte": "^3.2.6", - "prettier-plugin-tailwindcss": "^0.6.6", - "sass": "^1.78.0", - "svelte": "^4.2.19", - "svelte-check": "^4.0.1", - "svelte-preprocess": "^6.0.2", - "tailwindcss": "4.0.0-alpha.23", - "typescript": "~5.5.4", - "typescript-eslint": "^8.4.0", - "vite": "^5.4.3", - "vite-plugin-electron": "^0.28.7" - }, - "prettier": { - "printWidth": 100, - "semi": false, - "singleQuote": true, - "plugins": [ - "prettier-plugin-svelte", - "prettier-plugin-tailwindcss" - ], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] - } + "name": "ferrum", + "private": true, + "productName": "Ferrum", + "author": "kasper.space", + "description": "Music library app", + "version": "0.18.0", + "repository": "https://github.com/probablykasper/ferrum", + "scripts": { + "dev": "npm run napi:dev && vite", + "dev-release": "npm run napi && vite", + "napi": "napi build ferrum-addon --dts addon.d.ts --release", + "napi:dev": "napi build ferrum-addon --dts addon.d.ts", + "build": "npm run napi && npm run build:web && electron-builder", + "build:web": "vite build", + "electron-builder": "electron-builder", + "lint": "svelte-check --tsconfig ./tsconfig.json && eslint src && prettier --check src", + "format": "eslint --fix src && prettier --write src", + "check": "npm run lint && cargo check" + }, + "build": { + "appId": "space.kasper.ferrum", + "productName": "Ferrum", + "artifactName": "${productName}-v${version}-${os}-${arch}.${ext}", + "mac": { + "category": "public.app-category.music", + "icon": "assets/icon.icns", + "target": [ + "dmg" + ], + "darkModeSupport": true, + "identity": null, + "electronLanguages": null + }, + "linux": { + "category": "Audio", + "icon": "assets/icon.icns", + "maintainer": "kasper.space ", + "target": [ + "deb", + "rpm" + ] + }, + "win": { + "icon": "assets/icon.ico", + "target": [ + "nsis" + ] + }, + "files": [ + "build/web", + "build/electron", + "ferrum-addon/addon.node" + ], + "directories": { + "buildResources": "build_resources", + "output": "build/app" + } + }, + "main": "build/electron/main.js", + "napi": { + "name": "addon" + }, + "devDependencies": { + "@napi-rs/cli": "^2.18.4", + "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@tailwindcss/vite": "4.0.0-alpha.23", + "@tsconfig/svelte": "^5.0.4", + "concurrently": "^8.2.2", + "electron": "^28.3.3", + "electron-builder": "^25.0.5", + "eslint": "^9.10.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.43.0", + "fuzzysort": "^3.0.2", + "prettier": "^3.3.3", + "prettier-plugin-svelte": "^3.2.6", + "prettier-plugin-tailwindcss": "^0.6.6", + "sass": "^1.78.0", + "svelte": "^4.2.19", + "svelte-check": "^4.0.1", + "svelte-preprocess": "^6.0.2", + "tailwindcss": "4.0.0-alpha.23", + "typescript": "~5.5.4", + "typescript-eslint": "^8.4.0", + "vite": "^5.4.3", + "vite-plugin-electron": "^0.28.7" + }, + "prettier": { + "useTabs": true, + "printWidth": 100, + "semi": false, + "singleQuote": true, + "plugins": [ + "prettier-plugin-svelte", + "prettier-plugin-tailwindcss" + ], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] + } } diff --git a/rustfmt.toml b/rustfmt.toml index 28781c7..218e203 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1 +1 @@ -tab_spaces=2 +hard_tabs = true diff --git a/src-native/artists.rs b/src-native/artists.rs index df908cc..442c234 100644 --- a/src-native/artists.rs +++ b/src-native/artists.rs @@ -6,22 +6,22 @@ use std::collections::HashSet; use std::time::Instant; pub fn load_artists(library: &Library) -> HashSet { - let now = Instant::now(); - let mut artists = HashSet::new(); - for (_, track) in &library.tracks { - if !artists.contains(&track.artist) { - artists.insert(track.artist.clone()); - } - } - println!("Get artists: {}ms", now.elapsed().as_millis()); - return artists; + let now = Instant::now(); + let mut artists = HashSet::new(); + for (_, track) in &library.tracks { + if !artists.contains(&track.artist) { + artists.insert(track.artist.clone()); + } + } + println!("Get artists: {}ms", now.elapsed().as_millis()); + return artists; } #[napi(js_name = "get_artists")] #[allow(dead_code)] pub fn get_artists(env: Env) -> Result> { - let data: &mut Data = get_data(&env)?; - let mut artists: Vec = data.artists.clone().into_iter().collect(); - artists.sort(); - Ok(artists) + let data: &mut Data = get_data(&env)?; + let mut artists: Vec = data.artists.clone().into_iter().collect(); + artists.sort(); + Ok(artists) } diff --git a/src-native/data.rs b/src-native/data.rs index 1b6b785..86a563b 100644 --- a/src-native/data.rs +++ b/src-native/data.rs @@ -16,129 +16,129 @@ use std::path::PathBuf; use std::time::Instant; pub struct Data { - pub paths: Paths, - pub is_dev: bool, - pub library: Library, - pub view_cache: SidebarView, - /// All tracks on the current page, even if they are filtered out - pub open_playlist_track_ids: Vec, - /// The visible tracks on the current page - pub page_track_ids: Option>, - pub open_playlist_id: TrackListID, - pub view_as: ViewAs, - pub filter: String, - pub sort_key: String, - pub sort_desc: bool, - pub group_album_tracks: bool, - /// Current tag being edited - pub current_tag: Option, - pub artists: HashSet, + pub paths: Paths, + pub is_dev: bool, + pub library: Library, + pub view_cache: SidebarView, + /// All tracks on the current page, even if they are filtered out + pub open_playlist_track_ids: Vec, + /// The visible tracks on the current page + pub page_track_ids: Option>, + pub open_playlist_id: TrackListID, + pub view_as: ViewAs, + pub filter: String, + pub sort_key: String, + pub sort_desc: bool, + pub group_album_tracks: bool, + /// Current tag being edited + pub current_tag: Option, + pub artists: HashSet, } impl Data { - pub fn save(&mut self) -> Result<()> { - let mut now = Instant::now(); - let formatter = serde_json::ser::PrettyFormatter::with_indent(b" "); // tab + pub fn save(&mut self) -> Result<()> { + let mut now = Instant::now(); + let formatter = serde_json::ser::PrettyFormatter::with_indent(b" "); // tab - let mut json = Vec::new(); - let mut ser = serde_json::Serializer::with_formatter(&mut json, formatter); - self.library.versioned().serialize(&mut ser)?; - println!("Stringify: {}ms", now.elapsed().as_millis()); + let mut json = Vec::new(); + let mut ser = serde_json::Serializer::with_formatter(&mut json, formatter); + self.library.versioned().serialize(&mut ser)?; + println!("Stringify: {}ms", now.elapsed().as_millis()); - now = Instant::now(); - let file_path = &self.paths.library_json; - let af = AtomicFile::new(file_path, AllowOverwrite); - let result = af.write(|f| f.write_all(&json)); - match result { - Ok(_) => {} - Err(err) => throw!("Error saving: {err}"), - } - println!("Write: {}ms", now.elapsed().as_millis()); - Ok(()) - } - pub fn get_page_tracks(&self) -> &Vec { - match &self.page_track_ids { - Some(ids) => ids, - None => &self.open_playlist_track_ids, - } - } - pub fn load(is_dev: bool, library_path: Option) -> UniResult { - if is_dev { - println!("Starting in dev mode"); - } - let paths = if is_dev { - let library_dir = match library_path { - Some(path) => PathBuf::from(path), - None => env::current_dir() - .unwrap() - .join("src-native") - .join("appdata") - .join("Library"), - }; - Paths { - library_dir: library_dir.clone(), - tracks_dir: library_dir.join("Tracks"), - library_json: library_dir.join("Library.json"), - local_data_dir: dirs::data_local_dir() - .ok_or("Local data folder not found")? - .join("space.kasper.ferrum.dev"), - } - } else { - let library_dir = match library_path { - Some(path) => PathBuf::from(path), - None => { - let music_dir = dirs::audio_dir().ok_or("Music folder not found")?; - music_dir.join("Ferrum") - } - }; - Paths { - library_dir: library_dir.clone(), - tracks_dir: library_dir.join("Tracks"), - library_json: library_dir.join("Library.json"), - local_data_dir: dirs::data_local_dir() - .ok_or("Local data folder not found")? - .join("space.kasper.ferrum"), - } - }; + now = Instant::now(); + let file_path = &self.paths.library_json; + let af = AtomicFile::new(file_path, AllowOverwrite); + let result = af.write(|f| f.write_all(&json)); + match result { + Ok(_) => {} + Err(err) => throw!("Error saving: {err}"), + } + println!("Write: {}ms", now.elapsed().as_millis()); + Ok(()) + } + pub fn get_page_tracks(&self) -> &Vec { + match &self.page_track_ids { + Some(ids) => ids, + None => &self.open_playlist_track_ids, + } + } + pub fn load(is_dev: bool, library_path: Option) -> UniResult { + if is_dev { + println!("Starting in dev mode"); + } + let paths = if is_dev { + let library_dir = match library_path { + Some(path) => PathBuf::from(path), + None => env::current_dir() + .unwrap() + .join("src-native") + .join("appdata") + .join("Library"), + }; + Paths { + library_dir: library_dir.clone(), + tracks_dir: library_dir.join("Tracks"), + library_json: library_dir.join("Library.json"), + local_data_dir: dirs::data_local_dir() + .ok_or("Local data folder not found")? + .join("space.kasper.ferrum.dev"), + } + } else { + let library_dir = match library_path { + Some(path) => PathBuf::from(path), + None => { + let music_dir = dirs::audio_dir().ok_or("Music folder not found")?; + music_dir.join("Ferrum") + } + }; + Paths { + library_dir: library_dir.clone(), + tracks_dir: library_dir.join("Tracks"), + library_json: library_dir.join("Library.json"), + local_data_dir: dirs::data_local_dir() + .ok_or("Local data folder not found")? + .join("space.kasper.ferrum"), + } + }; - let loaded_library = load_library(&paths)?; - let loaded_cache = SidebarView::load(&paths); - let artists = load_artists(&loaded_library); + let loaded_library = load_library(&paths)?; + let loaded_cache = SidebarView::load(&paths); + let artists = load_artists(&loaded_library); - let mut data = Data { - is_dev, - paths, - library: loaded_library, - artists, - view_cache: loaded_cache, - open_playlist_id: "root".to_string(), - open_playlist_track_ids: vec![], - view_as: ViewAs::Songs, - page_track_ids: None, - filter: "".to_string(), - sort_key: "index".to_string(), - sort_desc: true, - group_album_tracks: true, - current_tag: None, - }; - data.open_playlist_track_ids = page::get_track_ids(&data)?; - sort(&mut data, "dateAdded", true)?; - return Ok(data); - } - pub fn open_playlist(&mut self, playlist_id: TrackID, view_as: Option) -> Result<()> { - self.open_playlist_id = playlist_id; - self.view_as = view_as.unwrap_or_default(); - self.open_playlist_track_ids = get_track_ids(self)?; - self.page_track_ids = None; - match self.library.get_tracklist(&self.open_playlist_id)? { - TrackList::Special(_) => { - sort(self, "dateAdded", true)?; - } - _ => { - self.sort_key = "index".to_string(); - self.sort_desc = true; - } - }; - Ok(()) - } + let mut data = Data { + is_dev, + paths, + library: loaded_library, + artists, + view_cache: loaded_cache, + open_playlist_id: "root".to_string(), + open_playlist_track_ids: vec![], + view_as: ViewAs::Songs, + page_track_ids: None, + filter: "".to_string(), + sort_key: "index".to_string(), + sort_desc: true, + group_album_tracks: true, + current_tag: None, + }; + data.open_playlist_track_ids = page::get_track_ids(&data)?; + sort(&mut data, "dateAdded", true)?; + return Ok(data); + } + pub fn open_playlist(&mut self, playlist_id: TrackID, view_as: Option) -> Result<()> { + self.open_playlist_id = playlist_id; + self.view_as = view_as.unwrap_or_default(); + self.open_playlist_track_ids = get_track_ids(self)?; + self.page_track_ids = None; + match self.library.get_tracklist(&self.open_playlist_id)? { + TrackList::Special(_) => { + sort(self, "dateAdded", true)?; + } + _ => { + self.sort_key = "index".to_string(); + self.sort_desc = true; + } + }; + Ok(()) + } } diff --git a/src-native/data_js.rs b/src-native/data_js.rs index 3acaa3b..3f178af 100644 --- a/src-native/data_js.rs +++ b/src-native/data_js.rs @@ -2,42 +2,42 @@ use crate::data::Data; use napi::{Env, JsUndefined, Result}; pub fn get_data(env: &Env) -> Result<&mut Data> { - let data = env.get_instance_data::()?.ok_or(nerr!("No data"))?; - return Ok(data); + let data = env.get_instance_data::()?.ok_or(nerr!("No data"))?; + return Ok(data); } #[napi(js_name = "load_data")] #[allow(dead_code)] pub fn load_data(is_dev: bool, library_path: Option, env: Env) -> Result<()> { - let data = Data::load(is_dev, library_path)?; - env.set_instance_data(data, 0, |_ctx| {})?; - return Ok(()); + let data = Data::load(is_dev, library_path)?; + env.set_instance_data(data, 0, |_ctx| {})?; + return Ok(()); } #[napi(object)] pub struct PathsJs { - pub library_dir: String, - pub tracks_dir: String, - pub library_json: String, - pub local_data_dir: String, + pub library_dir: String, + pub tracks_dir: String, + pub library_json: String, + pub local_data_dir: String, } #[napi(js_name = "get_paths")] #[allow(dead_code)] pub fn get_paths(env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - Ok(PathsJs { - library_dir: data.paths.library_dir.to_string_lossy().into(), - tracks_dir: data.paths.tracks_dir.to_string_lossy().into(), - library_json: data.paths.library_json.to_string_lossy().into(), - local_data_dir: data.paths.local_data_dir.to_string_lossy().into(), - }) + let data: &mut Data = get_data(&env)?; + Ok(PathsJs { + library_dir: data.paths.library_dir.to_string_lossy().into(), + tracks_dir: data.paths.tracks_dir.to_string_lossy().into(), + library_json: data.paths.library_json.to_string_lossy().into(), + local_data_dir: data.paths.local_data_dir.to_string_lossy().into(), + }) } #[napi(js_name = "save")] #[allow(dead_code)] pub fn save(env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - data.save()?; - return env.get_undefined(); + let data: &mut Data = get_data(&env)?; + data.save()?; + return env.get_undefined(); } diff --git a/src-native/filter.rs b/src-native/filter.rs index 27f6e10..48a5fb4 100644 --- a/src-native/filter.rs +++ b/src-native/filter.rs @@ -10,705 +10,723 @@ use unicode_normalization::{Recompositions, UnicodeNormalization}; #[napi(js_name = "filter_open_playlist")] #[allow(dead_code)] pub fn filter_js(query: String, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - filter(data, query); - return Ok(()); + let data: &mut Data = get_data(&env)?; + filter(data, query); + return Ok(()); } fn match_at_start(mut text: Recompositions, keyword: Chars) -> bool { - for keyword_char in keyword { - let text_char = match text.next() { - Some(x) => x, - None => return false, - }; - match check(keyword_char, text_char) { - Eq::True => {} - Eq::False => return false, - Eq::Skip => { - // skip only once. would it be useful to skip multiple times? - let new_text_char = match text.next() { - Some(x) => x, - None => return false, - }; - match check(keyword_char, new_text_char) { - Eq::True => {} - Eq::False => return false, - Eq::Skip => return false, - } - } - } - } - return true; + for keyword_char in keyword { + let text_char = match text.next() { + Some(x) => x, + None => return false, + }; + match check(keyword_char, text_char) { + Eq::True => {} + Eq::False => return false, + Eq::Skip => { + // skip only once. would it be useful to skip multiple times? + let new_text_char = match text.next() { + Some(x) => x, + None => return false, + }; + match check(keyword_char, new_text_char) { + Eq::True => {} + Eq::False => return false, + Eq::Skip => return false, + } + } + } + } + return true; } fn find_match(text: &str, keyword: &str) -> bool { - let mut keyword_chars = keyword.chars(); - let first_keyword_char = match keyword_chars.next() { - Some(x) => x, - None => return true, // match if keyword is empty string - }; - let mut text_chars = text.nfc(); - while let Some(text_char) = text_chars.next() { - match check(first_keyword_char, text_char) { - Eq::True => { - if match_at_start(text_chars.clone(), keyword_chars.clone()) { - return true; - } - } - _ => {} - } - } - return false; + let mut keyword_chars = keyword.chars(); + let first_keyword_char = match keyword_chars.next() { + Some(x) => x, + None => return true, // match if keyword is empty string + }; + let mut text_chars = text.nfc(); + while let Some(text_char) = text_chars.next() { + match check(first_keyword_char, text_char) { + Eq::True => { + if match_at_start(text_chars.clone(), keyword_chars.clone()) { + return true; + } + } + _ => {} + } + } + return false; } fn find_match_opt(text: &Option, keyword: &str) -> bool { - match text { - Some(text) => find_match(text, keyword), - None => return false, - } + match text { + Some(text) => find_match(text, keyword), + None => return false, + } } fn filter_keyword(data: &Data, ids: &Vec, keyword: &str) -> Vec { - let tracks = &data.library.tracks; - let filtered_tracks: Vec<_> = ids - .into_par_iter() - .with_min_len(2000) - .filter(|id| { - let track = tracks.get(*id).expect("Track ID not found"); - let is_match = find_match(&track.name, keyword) - || find_match(&track.artist, keyword) - || find_match_opt(&track.albumName, keyword) - || find_match_opt(&track.comments, keyword) - || find_match_opt(&track.genre, keyword); - is_match - }) - .map(|id| id.clone()) - .collect(); - filtered_tracks + let tracks = &data.library.tracks; + let filtered_tracks: Vec<_> = ids + .into_par_iter() + .with_min_len(2000) + .filter(|id| { + let track = tracks.get(*id).expect("Track ID not found"); + let is_match = find_match(&track.name, keyword) + || find_match(&track.artist, keyword) + || find_match_opt(&track.albumName, keyword) + || find_match_opt(&track.comments, keyword) + || find_match_opt(&track.genre, keyword); + is_match + }) + .map(|id| id.clone()) + .collect(); + filtered_tracks } pub fn filter(data: &mut Data, query: String) { - let now = Instant::now(); - data.page_track_ids = if query == "" { - None - } else { - let query: String = query.nfc().collect(); - let mut keywords_iter = query.split(' '); - let mut filtered_tracks = match keywords_iter.next() { - Some(keyword) => filter_keyword(data, &data.open_playlist_track_ids, keyword), - None => return, - }; - for keyword in keywords_iter { - filtered_tracks = filter_keyword(data, &filtered_tracks, keyword); - } - Some(filtered_tracks) - }; - data.filter = query; - println!("Filter: {}ms", now.elapsed().as_millis()); + let now = Instant::now(); + data.page_track_ids = if query == "" { + None + } else { + let query: String = query.nfc().collect(); + let mut keywords_iter = query.split(' '); + let mut filtered_tracks = match keywords_iter.next() { + Some(keyword) => filter_keyword(data, &data.open_playlist_track_ids, keyword), + None => return, + }; + for keyword in keywords_iter { + filtered_tracks = filter_keyword(data, &filtered_tracks, keyword); + } + Some(filtered_tracks) + }; + data.filter = query; + println!("Filter: {}ms", now.elapsed().as_millis()); } enum Eq { - True, - False, - Skip, + True, + False, + Skip, } fn check(user_char: char, data_char: char) -> Eq { - if user_char == data_char { - return Eq::True; - } - // unicode list: https://en.wikipedia.org/wiki/List_of_Unicode_characters - // double char matches todo: æ ae, ß ss, œ oe - let is_skip = match data_char { - // ascii symbols, \u{0021} to \u{002F} - '!' | '"' | '#' | '$' | '%' | '&' | '\'' | '(' | ')' => true, - '*' | '+' | ',' | '-' | '.' | '/' => true, - // ascii symbols, \u{003A} to \u{0040} - ':' | ';' | '<' | '=' | '>' | '?' | '@' => true, - // ascii symbols, \u{005B} to \u{0060} - '[' | '\\' | ']' | '^' | '_' | '`' => true, - // ascii symbols, \u{007B} to \u{007E} - '{' | '|' | '}' | '~' => true, - - // latin-1 puncutation/symbols, \u{00A1} to \u{00BF} - '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' => true, - '\u{00AD}' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' => true, - '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' => true, - - // math, \u{00D7} and \u{00F7} - '×' | '÷' => true, - - // unicode symbols \u{2012} to \u{204A} - '–' | '—' | '―' | '‗' | '‘' | '’' | '‚' | '‛' | '“' | '”' | '„' | '†' | '‡' | '•' | '…' - | '‰' | '′' | '″' | '‹' | '›' | '‼' | '‾' | '⁄' | '⁊' => true, - - // fullwidth ascii symbols, \u{FF01} to \u{FF0F} - '!' | '"' | '#' | '$' | '%' | '&' | ''' => true, - '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' => true, - // fullwidth ascii symbols, \u{FF1A} to \u{FF20} - ':' | ';' | '<' | '=' | '>' | '?' | '@' => true, - // fullwidth ascii symbols, \u{FF3B} to \u{FF40} - '[' | '\' | ']' | '^' | '_' | '`' => true, - // fullwidth ascii symbols, \u{FF5B} to \u{FF5E} - '{' | '|' | '}' | '~' => true, - // fullwidth double brackets, \u{FF5F} and \u{FF60} - '⦅' | '⦆' => true, - - // figure dash - '‒' => true, - - // other currencies - '֏' | '؋' | '৲' | '৳' | '৻' | '૱' | '௹' | '฿' | '៛' | '₠' | '₡' | '₢' | '₣' | '₤' | '₥' - | '₦' | '₧' | '₨' | '₩' | '₪' | '₫' | '€' | '₭' | '₮' | '₯' | '₰' | '₱' | '₲' | '₳' | '₴' - | '₵' | '₶' | '₷' | '₸' | '₹' | '₺' | '₻' | '₼' | '₽' | '₾' | '₿' | '﹩' | '¢' | '£' - | '¥' | '₩' => true, - - _ => false, - }; - if is_skip { - return Eq::Skip; - } - fn one_of(c: &char, a: char, b: char) -> bool { - return c == &a || c == &b; - } - let is_match = match user_char { - // dash - '–' | '—' | '―' => match data_char { - '–' | '—' | '―' | '-' => true, - _ => false, - }, - // Basic Latin, Latin-1 Supplement, Latin Extended-A - 'A' | 'a' => match data_char { - 'A' | 'a' | 'A' | 'a' | 'À' | 'à' | 'Á' | 'á' | 'Â' | 'â' | 'Ã' | 'ã' => true, - 'Ä' | 'ä' | 'Å' | 'å' | 'Ā' | 'ā' | 'Ă' | 'ă' | 'Ą' | 'ą' => true, - _ => false, - }, - 'A' | 'a' => one_of(&data_char, 'A', 'a'), - 'À' | 'à' => one_of(&data_char, 'À', 'à'), - 'Á' | 'á' => one_of(&data_char, 'Á', 'á'), - 'Â' | 'â' => one_of(&data_char, 'Â', 'â'), - 'Ã' | 'ã' => one_of(&data_char, 'Ã', 'ã'), - 'Ä' | 'ä' => one_of(&data_char, 'Ä', 'ä'), - 'Å' | 'å' => one_of(&data_char, 'Å', 'å'), - 'Ā' | 'ā' => one_of(&data_char, 'Ā', 'ā'), - 'Ă' | 'ă' => one_of(&data_char, 'Ă', 'ă'), - 'Ą' | 'ą' => one_of(&data_char, 'Ą', 'ą'), - - 'B' | 'b' => match data_char { - 'B' | 'b' | 'B' | 'b' => true, - _ => false, - }, - 'B' | 'b' => one_of(&data_char, 'B', 'b'), - - 'C' | 'c' => match data_char { - 'C' | 'c' | 'C' | 'c' | 'Ç' | 'ç' | 'Ć' | 'ć' | 'Ĉ' | 'ĉ' | 'Ċ' | 'ċ' | 'Č' | 'č' => { - true - } - _ => false, - }, - 'C' | 'c' => one_of(&data_char, 'C', 'c'), - 'Ç' | 'ç' => one_of(&data_char, 'Ç', 'ç'), - 'Ć' | 'ć' => one_of(&data_char, 'Ć', 'ć'), - 'Ĉ' | 'ĉ' => one_of(&data_char, 'Ĉ', 'ĉ'), - 'Ċ' | 'ċ' => one_of(&data_char, 'Ċ', 'ċ'), - 'Č' | 'č' => one_of(&data_char, 'Č', 'č'), - - 'D' | 'd' => match data_char { - 'D' | 'd' | 'D' | 'd' | 'Ð' | 'ð' | 'Ď' | 'ď' | 'Đ' | 'đ' => true, - _ => false, - }, - 'D' | 'd' => one_of(&data_char, 'D', 'd'), - 'Ð' | 'ð' => one_of(&data_char, 'Ð', 'ð'), - 'Ď' | 'ď' => one_of(&data_char, 'Ď', 'ď'), - 'Đ' | 'đ' => one_of(&data_char, 'Đ', 'đ'), - - 'E' | 'e' => match data_char { - 'E' | 'e' | 'E' | 'e' | 'È' | 'è' | 'É' | 'é' | 'Ê' | 'ê' | 'Ë' | 'ë' => true, - 'Ē' | 'ē' | 'Ĕ' | 'ĕ' | 'Ė' | 'ė' | 'Ę' | 'ę' | 'Ě' | 'ě' => true, - _ => false, - }, - 'E' | 'e' => one_of(&data_char, 'E', 'e'), - 'È' | 'è' => one_of(&data_char, 'È', 'è'), - 'É' | 'é' => one_of(&data_char, 'É', 'é'), - 'Ê' | 'ê' => one_of(&data_char, 'Ê', 'ê'), - 'Ë' | 'ë' => one_of(&data_char, 'Ë', 'ë'), - 'Ē' | 'ē' => one_of(&data_char, 'Ē', 'ē'), - 'Ĕ' | 'ĕ' => one_of(&data_char, 'Ĕ', 'ĕ'), - 'Ė' | 'ė' => one_of(&data_char, 'Ė', 'ė'), - 'Ę' | 'ę' => one_of(&data_char, 'Ę', 'ę'), - 'Ě' | 'ě' => one_of(&data_char, 'Ě', 'ě'), - - 'F' | 'f' => match data_char { - 'F' | 'f' | 'F' | 'f' => true, - _ => false, - }, - 'F' | 'f' => one_of(&data_char, 'F', 'f'), - - 'G' | 'g' => match data_char { - 'G' | 'g' | 'G' | 'g' | 'Ĝ' | 'ĝ' | 'Ğ' | 'ğ' | 'Ġ' | 'ġ' | 'Ģ' | 'ģ' => true, - _ => false, - }, - 'G' | 'g' => one_of(&data_char, 'G', 'g'), - 'Ĝ' | 'ĝ' => one_of(&data_char, 'Ĝ', 'ĝ'), - 'Ğ' | 'ğ' => one_of(&data_char, 'Ğ', 'ğ'), - 'Ġ' | 'ġ' => one_of(&data_char, 'Ġ', 'ġ'), - 'Ģ' | 'ģ' => one_of(&data_char, 'Ģ', 'ģ'), - - 'H' | 'h' => match data_char { - 'H' | 'h' | 'H' | 'h' | 'Ĥ' | 'ĥ' | 'Ħ' | 'ħ' => true, - _ => false, - }, - 'H' | 'h' => one_of(&data_char, 'H', 'h'), - 'Ĥ' | 'ĥ' => one_of(&data_char, 'Ĥ', 'ĥ'), - 'Ħ' | 'ħ' => one_of(&data_char, 'Ħ', 'ħ'), - - 'I' | 'i' => match data_char { - 'I' | 'i' | 'I' | 'i' | 'Ì' | 'ì' | 'Í' | 'í' | 'Î' | 'î' | 'Ï' | 'ï' => true, - 'Ĩ' | 'ĩ' | 'Ī' | 'ī' | 'Ĭ' | 'ĭ' | 'Į' | 'į' => true, - 'İ' | 'ı' => true, // dotted I and dotless i - _ => false, - }, - 'I' | 'i' => one_of(&data_char, 'I', 'i'), - 'Ĩ' | 'ĩ' => one_of(&data_char, 'Ĩ', 'ĩ'), - 'Ī' | 'ī' => one_of(&data_char, 'Ī', 'ī'), - 'Ĭ' | 'ĭ' => one_of(&data_char, 'Ĭ', 'ĭ'), - 'Į' | 'į' => one_of(&data_char, 'Į', 'į'), - - 'J' | 'j' => match data_char { - 'J' | 'j' | 'J' | 'j' | 'Ĵ' | 'ĵ' => true, - _ => false, - }, - 'J' | 'j' => one_of(&data_char, 'J', 'j'), - 'Ĵ' | 'ĵ' => one_of(&data_char, 'Ĵ', 'ĵ'), - - 'K' | 'k' => match data_char { - 'K' | 'k' | 'K' | 'k' | 'Ķ' | 'ķ' => true, - 'ĸ' => true, // only lowercase - _ => false, - }, - 'K' | 'k' => one_of(&data_char, 'K', 'k'), - 'Ķ' | 'ķ' => one_of(&data_char, 'Ķ', 'ķ'), - - 'L' | 'l' => match data_char { - 'L' | 'l' | 'L' | 'l' | 'Ĺ' | 'ĺ' => true, - 'Ļ' | 'ļ' | 'Ľ' | 'ľ' | 'Ŀ' | 'ŀ' | 'Ł' | 'ł' => true, - _ => false, - }, - 'L' | 'l' => one_of(&data_char, 'L', 'l'), - 'Ĺ' | 'ĺ' => one_of(&data_char, 'Ĺ', 'ĺ'), - 'Ļ' | 'ļ' => one_of(&data_char, 'Ļ', 'ļ'), - 'Ľ' | 'ľ' => one_of(&data_char, 'Ľ', 'ľ'), - 'Ŀ' | 'ŀ' => one_of(&data_char, 'Ŀ', 'ŀ'), - 'Ł' | 'ł' => one_of(&data_char, 'Ł', 'ł'), - - 'M' | 'm' => match data_char { - 'M' | 'm' | 'M' | 'm' => true, - _ => false, - }, - 'M' | 'm' => one_of(&data_char, 'M', 'm'), - - 'N' | 'n' => match data_char { - 'N' | 'n' | 'N' | 'n' | 'Ñ' | 'ñ' | 'Ń' | 'ń' | 'Ņ' | 'ņ' | 'Ň' | 'ň' => true, - 'ʼn' => true, // only lowercase, deprecated - _ => false, - }, - 'N' | 'n' => one_of(&data_char, 'N', 'n'), - 'Ñ' | 'ñ' => one_of(&data_char, 'Ñ', 'ñ'), - 'Ń' | 'ń' => one_of(&data_char, 'Ń', 'ń'), - 'Ņ' | 'ņ' => one_of(&data_char, 'Ņ', 'ņ'), - 'Ň' | 'ň' => one_of(&data_char, 'Ň', 'ň'), - - 'O' | 'o' => match data_char { - 'O' | 'o' | 'O' | 'o' | 'Ò' | 'ò' | 'Ó' | 'ó' | 'Ô' | 'ô' | 'Õ' | 'õ' => true, - 'Ö' | 'ö' | 'Ø' | 'ø' | 'Ō' | 'ō' | 'Ŏ' | 'ŏ' | 'Ő' | 'ő' => true, - _ => false, - }, - 'O' | 'o' => one_of(&data_char, 'O', 'o'), - 'Ò' | 'ò' => one_of(&data_char, 'Ò', 'ò'), - 'Ó' | 'ó' => one_of(&data_char, 'Ó', 'ó'), - 'Ô' | 'ô' => one_of(&data_char, 'Ô', 'ô'), - 'Õ' | 'õ' => one_of(&data_char, 'Õ', 'õ'), - 'Ö' | 'ö' => one_of(&data_char, 'Ö', 'ö'), - 'Ø' | 'ø' => one_of(&data_char, 'Ø', 'ø'), - 'Ō' | 'ō' => one_of(&data_char, 'Ō', 'ō'), - 'Ŏ' | 'ŏ' => one_of(&data_char, 'Ŏ', 'ŏ'), - 'Ő' | 'ő' => one_of(&data_char, 'Ő', 'ő'), - - 'P' | 'p' => match data_char { - 'P' | 'p' | 'P' | 'p' => true, - _ => false, - }, - 'P' | 'p' => one_of(&data_char, 'P', 'p'), - - 'Q' | 'q' => match data_char { - 'Q' | 'q' | 'Q' | 'q' => true, - _ => false, - }, - 'Q' | 'q' => one_of(&data_char, 'Q', 'q'), - - 'R' | 'r' => match data_char { - 'R' | 'r' | 'R' | 'r' | 'Ŕ' | 'ŕ' | 'Ŗ' | 'ŗ' | 'Ř' | 'ř' => true, - _ => false, - }, - 'R' | 'r' => one_of(&data_char, 'R', 'r'), - 'Ŕ' | 'ŕ' => one_of(&data_char, 'Ŕ', 'ŕ'), - 'Ŗ' | 'ŗ' => one_of(&data_char, 'Ŗ', 'ŗ'), - 'Ř' | 'ř' => one_of(&data_char, 'Ř', 'ř'), - - 'S' | 's' => match data_char { - 'S' | 's' | 'S' | 's' | 'Ś' | 'ś' | 'Ŝ' | 'ŝ' | 'Ş' | 'ş' | 'Š' | 'š' => true, - 'ſ' => true, // only lowercase - _ => false, - }, - 'S' | 's' => one_of(&data_char, 'S', 's'), - 'Ś' | 'ś' => one_of(&data_char, 'Ś', 'ś'), - 'Ŝ' | 'ŝ' => one_of(&data_char, 'Ŝ', 'ŝ'), - 'Ş' | 'ş' => one_of(&data_char, 'Ş', 'ş'), - 'Š' | 'š' => one_of(&data_char, 'Š', 'š'), - - 'T' | 't' => match data_char { - 'T' | 't' | 'T' | 't' | 'Ţ' | 'ţ' | 'Ť' | 'ť' | 'Ŧ' | 'ŧ' => true, - _ => false, - }, - 'T' | 't' => one_of(&data_char, 'T', 't'), - 'Ţ' | 'ţ' => one_of(&data_char, 'Ţ', 'ţ'), - 'Ť' | 'ť' => one_of(&data_char, 'Ť', 'ť'), - 'Ŧ' | 'ŧ' => one_of(&data_char, 'Ŧ', 'ŧ'), - - 'U' | 'u' => match data_char { - 'U' | 'u' | 'U' | 'u' | 'Ù' | 'ù' | 'Ú' | 'ú' | 'Û' | 'û' | 'Ü' | 'ü' => true, - 'Ũ' | 'ũ' | 'Ū' | 'ū' | 'Ŭ' | 'ŭ' | 'Ů' | 'ů' | 'Ű' | 'ű' | 'Ų' | 'ų' => true, - _ => false, - }, - 'U' | 'u' => one_of(&data_char, 'U', 'u'), - 'Ù' | 'ù' => one_of(&data_char, 'Ù', 'ù'), - 'Ú' | 'ú' => one_of(&data_char, 'Ú', 'ú'), - 'Û' | 'û' => one_of(&data_char, 'Û', 'û'), - 'Ü' | 'ü' => one_of(&data_char, 'Ü', 'ü'), - 'Ũ' | 'ũ' => one_of(&data_char, 'Ũ', 'ũ'), - 'Ū' | 'ū' => one_of(&data_char, 'Ū', 'ū'), - 'Ŭ' | 'ŭ' => one_of(&data_char, 'Ŭ', 'ŭ'), - 'Ů' | 'ů' => one_of(&data_char, 'Ů', 'ů'), - 'Ű' | 'ű' => one_of(&data_char, 'Ű', 'ű'), - 'Ų' | 'ų' => one_of(&data_char, 'Ų', 'ų'), - - 'V' | 'v' => match data_char { - 'V' | 'v' | 'V' | 'v' => true, - _ => false, - }, - 'V' | 'v' => one_of(&data_char, 'V', 'v'), - - 'W' | 'w' => match data_char { - 'W' | 'w' | 'W' | 'w' | 'Ŵ' | 'ŵ' => true, - _ => false, - }, - 'W' | 'w' => one_of(&data_char, 'W', 'w'), - 'Ŵ' | 'ŵ' => one_of(&data_char, 'Ŵ', 'ŵ'), - - 'X' | 'x' => match data_char { - 'X' | 'x' | 'X' | 'x' => true, - _ => false, - }, - 'X' | 'x' => one_of(&data_char, 'X', 'x'), - 'Y' | 'y' => match data_char { - 'Y' | 'y' | 'Y' | 'y' | 'Ý' | 'ý' | 'Ÿ' | 'ÿ' | 'Ŷ' | 'ŷ' => true, - _ => false, - }, - 'Y' | 'y' => one_of(&data_char, 'Y', 'y'), - 'Ý' | 'ý' => one_of(&data_char, 'Ý', 'ý'), - 'Ÿ' | 'ÿ' => one_of(&data_char, 'Ÿ', 'ÿ'), - 'Ŷ' | 'ŷ' => one_of(&data_char, 'Ŷ', 'ŷ'), - - 'Z' | 'z' => match data_char { - 'Z' | 'z' | 'Z' | 'z' | 'Ź' | 'ź' | 'Ż' | 'ż' | 'Ž' | 'ž' => true, - _ => false, - }, - 'Z' | 'z' => one_of(&data_char, 'Z', 'z'), - 'Ź' | 'ź' => one_of(&data_char, 'Ź', 'ź'), - 'Ż' | 'ż' => one_of(&data_char, 'Ż', 'ż'), - 'Ž' | 'ž' => one_of(&data_char, 'Ž', 'ž'), - - 'Æ' | 'æ' => one_of(&data_char, 'Æ', 'æ'), - 'Þ' | 'þ' => one_of(&data_char, 'Þ', 'þ'), - 'ẞ' | 'ß' => one_of(&data_char, 'ẞ', 'ß'), - 'IJ' | 'ij' => one_of(&data_char, 'IJ', 'ij'), - 'Ŋ' | 'ŋ' => one_of(&data_char, 'Ŋ', 'ŋ'), - 'Œ' | 'œ' => one_of(&data_char, 'Œ', 'œ'), - - // fullwidth characters, \u{FF01} to \u{FF20} - '!' => data_char == '!', - '"' => data_char == '"', - '#' => data_char == '#', - '$' => data_char == '$', - '%' => data_char == '%', - '&' => data_char == '&', - '\'' => data_char == ''', - '(' => data_char == '(', - ')' => data_char == ')', - '*' => data_char == '*', - '+' => data_char == '+', - ',' => data_char == ',', - '-' => data_char == '-', - '.' => data_char == '.', - '/' => data_char == '/', - '0' => data_char == '0', - '1' => data_char == '1', - '2' => data_char == '2', - '3' => data_char == '3', - '4' => data_char == '4', - '5' => data_char == '5', - '6' => data_char == '6', - '7' => data_char == '7', - '8' => data_char == '8', - '9' => data_char == '9', - ':' => data_char == ':', - ';' => data_char == ';', - '<' => data_char == '<', - '=' => data_char == '=', - '>' => data_char == '>', - '?' => data_char == '?', - '@' => data_char == '@', - - // cyrillic - // - only case-insensitive matching (é won't match e) - 'Ѐ' | 'ѐ' => one_of(&data_char, 'Ѐ', 'ѐ'), - 'Ё' | 'ё' => one_of(&data_char, 'Ё', 'ё'), - 'Ђ' | 'ђ' => one_of(&data_char, 'Ђ', 'ђ'), - 'Ѓ' | 'ѓ' => one_of(&data_char, 'Ѓ', 'ѓ'), - 'Є' | 'є' => one_of(&data_char, 'Є', 'є'), - 'Ѕ' | 'ѕ' => one_of(&data_char, 'Ѕ', 'ѕ'), - 'І' | 'і' => one_of(&data_char, 'І', 'і'), - 'Ї' | 'ї' => one_of(&data_char, 'Ї', 'ї'), - 'Ј' | 'ј' => one_of(&data_char, 'Ј', 'ј'), - 'Љ' | 'љ' => one_of(&data_char, 'Љ', 'љ'), - 'Њ' | 'њ' => one_of(&data_char, 'Њ', 'њ'), - 'Ћ' | 'ћ' => one_of(&data_char, 'Ћ', 'ћ'), - 'Ќ' | 'ќ' => one_of(&data_char, 'Ќ', 'ќ'), - 'Ѝ' | 'ѝ' => one_of(&data_char, 'Ѝ', 'ѝ'), - 'Ў' | 'ў' => one_of(&data_char, 'Ў', 'ў'), - 'Џ' | 'џ' => one_of(&data_char, 'Џ', 'џ'), - 'А' | 'а' => one_of(&data_char, 'А', 'а'), - 'Б' | 'б' => one_of(&data_char, 'Б', 'б'), - 'В' | 'в' => one_of(&data_char, 'В', 'в'), - 'Г' | 'г' => one_of(&data_char, 'Г', 'г'), - 'Д' | 'д' => one_of(&data_char, 'Д', 'д'), - 'Е' | 'е' => one_of(&data_char, 'Е', 'е'), - 'Ж' | 'ж' => one_of(&data_char, 'Ж', 'ж'), - 'З' | 'з' => one_of(&data_char, 'З', 'з'), - 'И' | 'и' => one_of(&data_char, 'И', 'и'), - 'Й' | 'й' => one_of(&data_char, 'Й', 'й'), - 'К' | 'к' => one_of(&data_char, 'К', 'к'), - 'Л' | 'л' => one_of(&data_char, 'Л', 'л'), - 'М' | 'м' => one_of(&data_char, 'М', 'м'), - 'Н' | 'н' => one_of(&data_char, 'Н', 'н'), - 'О' | 'о' => one_of(&data_char, 'О', 'о'), - 'П' | 'п' => one_of(&data_char, 'П', 'п'), - 'Р' | 'р' => one_of(&data_char, 'Р', 'р'), - 'С' | 'с' => one_of(&data_char, 'С', 'с'), - 'Т' | 'т' => one_of(&data_char, 'Т', 'т'), - 'У' | 'у' => one_of(&data_char, 'У', 'у'), - 'Ф' | 'ф' => one_of(&data_char, 'Ф', 'ф'), - 'Х' | 'х' => one_of(&data_char, 'Х', 'х'), - 'Ц' | 'ц' => one_of(&data_char, 'Ц', 'ц'), - 'Ч' | 'ч' => one_of(&data_char, 'Ч', 'ч'), - 'Ш' | 'ш' => one_of(&data_char, 'Ш', 'ш'), - 'Щ' | 'щ' => one_of(&data_char, 'Щ', 'щ'), - 'Ъ' | 'ъ' => one_of(&data_char, 'Ъ', 'ъ'), - 'Ы' | 'ы' => one_of(&data_char, 'Ы', 'ы'), - 'Ь' | 'ь' => one_of(&data_char, 'Ь', 'ь'), - 'Э' | 'э' => one_of(&data_char, 'Э', 'э'), - 'Ю' | 'ю' => one_of(&data_char, 'Ю', 'ю'), - 'Я' | 'я' => one_of(&data_char, 'Я', 'я'), - 'Ѡ' | 'ѡ' => one_of(&data_char, 'Ѡ', 'ѡ'), - 'Ѣ' | 'ѣ' => one_of(&data_char, 'Ѣ', 'ѣ'), - 'Ѥ' | 'ѥ' => one_of(&data_char, 'Ѥ', 'ѥ'), - 'Ѧ' | 'ѧ' => one_of(&data_char, 'Ѧ', 'ѧ'), - 'Ѩ' | 'ѩ' => one_of(&data_char, 'Ѩ', 'ѩ'), - 'Ѫ' | 'ѫ' => one_of(&data_char, 'Ѫ', 'ѫ'), - 'Ѭ' | 'ѭ' => one_of(&data_char, 'Ѭ', 'ѭ'), - 'Ѯ' | 'ѯ' => one_of(&data_char, 'Ѯ', 'ѯ'), - 'Ѱ' | 'ѱ' => one_of(&data_char, 'Ѱ', 'ѱ'), - 'Ѳ' | 'ѳ' => one_of(&data_char, 'Ѳ', 'ѳ'), - 'Ѵ' | 'ѵ' => one_of(&data_char, 'Ѵ', 'ѵ'), - 'Ѷ' | 'ѷ' => one_of(&data_char, 'Ѷ', 'ѷ'), - 'Ѹ' | 'ѹ' => one_of(&data_char, 'Ѹ', 'ѹ'), - 'Ѻ' | 'ѻ' => one_of(&data_char, 'Ѻ', 'ѻ'), - 'Ѽ' | 'ѽ' => one_of(&data_char, 'Ѽ', 'ѽ'), - 'Ѿ' | 'ѿ' => one_of(&data_char, 'Ѿ', 'ѿ'), - 'Ҁ' | 'ҁ' => one_of(&data_char, 'Ҁ', 'ҁ'), - 'Ҋ' | 'ҋ' => one_of(&data_char, 'Ҋ', 'ҋ'), - 'Ҍ' | 'ҍ' => one_of(&data_char, 'Ҍ', 'ҍ'), - 'Ҏ' | 'ҏ' => one_of(&data_char, 'Ҏ', 'ҏ'), - 'Ґ' | 'ґ' => one_of(&data_char, 'Ґ', 'ґ'), - 'Ғ' | 'ғ' => one_of(&data_char, 'Ғ', 'ғ'), - 'Ҕ' | 'ҕ' => one_of(&data_char, 'Ҕ', 'ҕ'), - 'Җ' | 'җ' => one_of(&data_char, 'Җ', 'җ'), - 'Ҙ' | 'ҙ' => one_of(&data_char, 'Ҙ', 'ҙ'), - 'Қ' | 'қ' => one_of(&data_char, 'Қ', 'қ'), - 'Ҝ' | 'ҝ' => one_of(&data_char, 'Ҝ', 'ҝ'), - 'Ҟ' | 'ҟ' => one_of(&data_char, 'Ҟ', 'ҟ'), - 'Ҡ' | 'ҡ' => one_of(&data_char, 'Ҡ', 'ҡ'), - 'Ң' | 'ң' => one_of(&data_char, 'Ң', 'ң'), - 'Ҥ' | 'ҥ' => one_of(&data_char, 'Ҥ', 'ҥ'), - 'Ҧ' | 'ҧ' => one_of(&data_char, 'Ҧ', 'ҧ'), - 'Ҩ' | 'ҩ' => one_of(&data_char, 'Ҩ', 'ҩ'), - 'Ҫ' | 'ҫ' => one_of(&data_char, 'Ҫ', 'ҫ'), - 'Ҭ' | 'ҭ' => one_of(&data_char, 'Ҭ', 'ҭ'), - 'Ү' | 'ү' => one_of(&data_char, 'Ү', 'ү'), - 'Ұ' | 'ұ' => one_of(&data_char, 'Ұ', 'ұ'), - 'Ҳ' | 'ҳ' => one_of(&data_char, 'Ҳ', 'ҳ'), - 'Ҵ' | 'ҵ' => one_of(&data_char, 'Ҵ', 'ҵ'), - 'Ҷ' | 'ҷ' => one_of(&data_char, 'Ҷ', 'ҷ'), - 'Ҹ' | 'ҹ' => one_of(&data_char, 'Ҹ', 'ҹ'), - 'Һ' | 'һ' => one_of(&data_char, 'Һ', 'һ'), - 'Ҽ' | 'ҽ' => one_of(&data_char, 'Ҽ', 'ҽ'), - 'Ҿ' | 'ҿ' => one_of(&data_char, 'Ҿ', 'ҿ'), - 'Ӏ' | 'Ӂ' => one_of(&data_char, 'Ӏ', 'Ӂ'), - 'ӂ' | 'Ӄ' => one_of(&data_char, 'ӂ', 'Ӄ'), - 'ӄ' | 'Ӆ' => one_of(&data_char, 'ӄ', 'Ӆ'), - 'ӆ' | 'Ӈ' => one_of(&data_char, 'ӆ', 'Ӈ'), - 'ӈ' | 'Ӊ' => one_of(&data_char, 'ӈ', 'Ӊ'), - 'ӊ' | 'Ӌ' => one_of(&data_char, 'ӊ', 'Ӌ'), - 'ӌ' | 'Ӎ' => one_of(&data_char, 'ӌ', 'Ӎ'), - 'ӎ' | 'ӏ' => one_of(&data_char, 'ӎ', 'ӏ'), - 'Ӑ' | 'ӑ' => one_of(&data_char, 'Ӑ', 'ӑ'), - 'Ӓ' | 'ӓ' => one_of(&data_char, 'Ӓ', 'ӓ'), - 'Ӕ' | 'ӕ' => one_of(&data_char, 'Ӕ', 'ӕ'), - 'Ӗ' | 'ӗ' => one_of(&data_char, 'Ӗ', 'ӗ'), - 'Ә' | 'ә' => one_of(&data_char, 'Ә', 'ә'), - 'Ӛ' | 'ӛ' => one_of(&data_char, 'Ӛ', 'ӛ'), - 'Ӝ' | 'ӝ' => one_of(&data_char, 'Ӝ', 'ӝ'), - 'Ӟ' | 'ӟ' => one_of(&data_char, 'Ӟ', 'ӟ'), - 'Ӡ' | 'ӡ' => one_of(&data_char, 'Ӡ', 'ӡ'), - 'Ӣ' | 'ӣ' => one_of(&data_char, 'Ӣ', 'ӣ'), - 'Ӥ' | 'ӥ' => one_of(&data_char, 'Ӥ', 'ӥ'), - 'Ӧ' | 'ӧ' => one_of(&data_char, 'Ӧ', 'ӧ'), - 'Ө' | 'ө' => one_of(&data_char, 'Ө', 'ө'), - 'Ӫ' | 'ӫ' => one_of(&data_char, 'Ӫ', 'ӫ'), - 'Ӭ' | 'ӭ' => one_of(&data_char, 'Ӭ', 'ӭ'), - 'Ӯ' | 'ӯ' => one_of(&data_char, 'Ӯ', 'ӯ'), - 'Ӱ' | 'ӱ' => one_of(&data_char, 'Ӱ', 'ӱ'), - 'Ӳ' | 'ӳ' => one_of(&data_char, 'Ӳ', 'ӳ'), - 'Ӵ' | 'ӵ' => one_of(&data_char, 'Ӵ', 'ӵ'), - 'Ӷ' | 'ӷ' => one_of(&data_char, 'Ӷ', 'ӷ'), - 'Ӹ' | 'ӹ' => one_of(&data_char, 'Ӹ', 'ӹ'), - 'Ӻ' | 'ӻ' => one_of(&data_char, 'Ӻ', 'ӻ'), - 'Ӽ' | 'ӽ' => one_of(&data_char, 'Ӽ', 'ӽ'), - 'Ӿ' | 'ӿ' => one_of(&data_char, 'Ӿ', 'ӿ'), - - // greek letters/symbols - // - only case-insensitive matching (é won't match e) - // - incomplete - 'Α' | 'α' => one_of(&data_char, 'Α', 'α'), - 'Β' | 'β' => one_of(&data_char, 'Β', 'β'), - 'Γ' | 'γ' => one_of(&data_char, 'Γ', 'γ'), - 'Δ' | 'δ' => one_of(&data_char, 'Δ', 'δ'), - 'Ε' | 'ε' => one_of(&data_char, 'Ε', 'ε'), - 'Ζ' | 'ζ' => one_of(&data_char, 'Ζ', 'ζ'), - 'Η' | 'η' => one_of(&data_char, 'Η', 'η'), - 'Θ' | 'θ' => one_of(&data_char, 'Θ', 'θ'), - 'Ι' | 'ι' => one_of(&data_char, 'Ι', 'ι'), - 'Κ' | 'κ' => one_of(&data_char, 'Κ', 'κ'), - 'Λ' | 'λ' => one_of(&data_char, 'Λ', 'λ'), - 'Μ' | 'μ' => one_of(&data_char, 'Μ', 'μ'), - 'Ν' | 'ν' => one_of(&data_char, 'Ν', 'ν'), - 'Ξ' | 'ξ' => one_of(&data_char, 'Ξ', 'ξ'), - 'Ο' | 'ο' => one_of(&data_char, 'Ο', 'ο'), - 'Π' | 'π' => one_of(&data_char, 'Π', 'π'), - 'Ρ' | 'ρ' => one_of(&data_char, 'Ρ', 'ρ'), - 'Σ' | 'σ' => one_of(&data_char, 'Σ', 'σ'), - 'Τ' | 'τ' => one_of(&data_char, 'Τ', 'τ'), - 'Υ' | 'υ' => one_of(&data_char, 'Υ', 'υ'), - 'Φ' | 'φ' => one_of(&data_char, 'Φ', 'φ'), - 'Χ' | 'χ' => one_of(&data_char, 'Χ', 'χ'), - 'Ψ' | 'ψ' => one_of(&data_char, 'Ψ', 'ψ'), - 'Ω' | 'ω' => one_of(&data_char, 'Ω', 'ω'), - 'Ϊ' | 'ϊ' => one_of(&data_char, 'Ϊ', 'ϊ'), - 'Ϋ' | 'ϋ' => one_of(&data_char, 'Ϋ', 'ϋ'), - 'Ͱ' | 'ͱ' => one_of(&data_char, 'Ͱ', 'ͱ'), - 'Ͳ' | 'ͳ' => one_of(&data_char, 'Ͳ', 'ͳ'), - 'Ͷ' | 'ͷ' => one_of(&data_char, 'Ͷ', 'ͷ'), - 'Ϳ' | 'ϳ' => one_of(&data_char, 'Ϳ', 'ϳ'), - 'Ϙ' | 'ϙ' => one_of(&data_char, 'Ϙ', 'ϙ'), - 'Ϛ' | 'ϛ' => one_of(&data_char, 'Ϛ', 'ϛ'), - 'Ϝ' | 'ϝ' => one_of(&data_char, 'Ϝ', 'ϝ'), - 'Ϟ' | 'ϟ' => one_of(&data_char, 'Ϟ', 'ϟ'), - 'Ϡ' | 'ϡ' => one_of(&data_char, 'Ϡ', 'ϡ'), - 'Ά' | 'ά' => one_of(&data_char, 'Ά', 'ά'), - 'Έ' | 'έ' => one_of(&data_char, 'Έ', 'έ'), - 'Ή' | 'ή' => one_of(&data_char, 'Ή', 'ή'), - 'Ί' | 'ί' => one_of(&data_char, 'Ί', 'ί'), - 'Ό' | 'ό' => one_of(&data_char, 'Ό', 'ό'), - 'Ύ' | 'ύ' => one_of(&data_char, 'Ύ', 'ύ'), - 'Ώ' | 'ώ' => one_of(&data_char, 'Ώ', 'ώ'), - 'Ϸ' | 'ϸ' => one_of(&data_char, 'Ϸ', 'ϸ'), - 'Ϻ' | 'ϻ' => one_of(&data_char, 'Ϻ', 'ϻ'), - 'Ͻ' | 'ͻ' => one_of(&data_char, 'Ͻ', 'ͻ'), - 'Ͼ' | 'ͼ' => one_of(&data_char, 'Ͼ', 'ͼ'), - 'Ͽ' | 'ͽ' => one_of(&data_char, 'Ͽ', 'ͽ'), - 'Ϗ' | 'ϗ' => one_of(&data_char, 'Ϗ', 'ϗ'), - 'ϴ' | 'ϑ' => one_of(&data_char, 'ϴ', 'ϑ'), - 'Ϲ' | 'ϲ' => one_of(&data_char, 'Ϲ', 'ϲ'), - - // coptic - 'Ϣ' | 'ϣ' => one_of(&data_char, 'Ϣ', 'ϣ'), - 'Ϥ' | 'ϥ' => one_of(&data_char, 'Ϥ', 'ϥ'), - 'Ϧ' | 'ϧ' => one_of(&data_char, 'Ϧ', 'ϧ'), - 'Ϩ' | 'ϩ' => one_of(&data_char, 'Ϩ', 'ϩ'), - 'Ϫ' | 'ϫ' => one_of(&data_char, 'Ϫ', 'ϫ'), - 'Ϭ' | 'ϭ' => one_of(&data_char, 'Ϭ', 'ϭ'), - 'Ϯ' | 'ϯ' => one_of(&data_char, 'Ϯ', 'ϯ'), - - // armenian - 'Ա' | 'ա' => one_of(&data_char, 'Ա', 'ա'), - 'Բ' | 'բ' => one_of(&data_char, 'Բ', 'բ'), - 'Գ' | 'գ' => one_of(&data_char, 'Գ', 'գ'), - 'Դ' | 'դ' => one_of(&data_char, 'Դ', 'դ'), - 'Ե' | 'ե' => one_of(&data_char, 'Ե', 'ե'), - 'Զ' | 'զ' => one_of(&data_char, 'Զ', 'զ'), - 'Է' | 'է' => one_of(&data_char, 'Է', 'է'), - 'Ը' | 'ը' => one_of(&data_char, 'Ը', 'ը'), - 'Թ' | 'թ' => one_of(&data_char, 'Թ', 'թ'), - 'Ժ' | 'ժ' => one_of(&data_char, 'Ժ', 'ժ'), - 'Ի' | 'ի' => one_of(&data_char, 'Ի', 'ի'), - 'Լ' | 'լ' => one_of(&data_char, 'Լ', 'լ'), - 'Խ' | 'խ' => one_of(&data_char, 'Խ', 'խ'), - 'Ծ' | 'ծ' => one_of(&data_char, 'Ծ', 'ծ'), - 'Կ' | 'կ' => one_of(&data_char, 'Կ', 'կ'), - 'Հ' | 'հ' => one_of(&data_char, 'Հ', 'հ'), - 'Ձ' | 'ձ' => one_of(&data_char, 'Ձ', 'ձ'), - 'Ղ' | 'ղ' => one_of(&data_char, 'Ղ', 'ղ'), - 'Ճ' | 'ճ' => one_of(&data_char, 'Ճ', 'ճ'), - 'Մ' | 'մ' => one_of(&data_char, 'Մ', 'մ'), - 'Յ' | 'յ' => one_of(&data_char, 'Յ', 'յ'), - 'Ն' | 'ն' => one_of(&data_char, 'Ն', 'ն'), - 'Շ' | 'շ' => one_of(&data_char, 'Շ', 'շ'), - 'Ո' | 'ո' => one_of(&data_char, 'Ո', 'ո'), - 'Չ' | 'չ' => one_of(&data_char, 'Չ', 'չ'), - 'Պ' | 'պ' => one_of(&data_char, 'Պ', 'պ'), - 'Ջ' | 'ջ' => one_of(&data_char, 'Ջ', 'ջ'), - 'Ռ' | 'ռ' => one_of(&data_char, 'Ռ', 'ռ'), - 'Ս' | 'ս' => one_of(&data_char, 'Ս', 'ս'), - 'Վ' | 'վ' => one_of(&data_char, 'Վ', 'վ'), - 'Տ' | 'տ' => one_of(&data_char, 'Տ', 'տ'), - 'Ր' | 'ր' => one_of(&data_char, 'Ր', 'ր'), - 'Ց' | 'ց' => one_of(&data_char, 'Ց', 'ց'), - 'Ւ' | 'ւ' => one_of(&data_char, 'Ւ', 'ւ'), - 'Փ' | 'փ' => one_of(&data_char, 'Փ', 'փ'), - 'Ք' | 'ք' => one_of(&data_char, 'Ք', 'ք'), - 'Օ' | 'օ' => one_of(&data_char, 'Օ', 'օ'), - 'Ֆ' | 'ֆ' => one_of(&data_char, 'Ֆ', 'ֆ'), - - // cherokee - 'Ᏸ' | 'ᏸ' => one_of(&data_char, 'Ᏸ', 'ᏸ'), - 'Ᏹ' | 'ᏹ' => one_of(&data_char, 'Ᏹ', 'ᏹ'), - 'Ᏺ' | 'ᏺ' => one_of(&data_char, 'Ᏺ', 'ᏺ'), - 'Ᏻ' | 'ᏻ' => one_of(&data_char, 'Ᏻ', 'ᏻ'), - 'Ᏼ' | 'ᏼ' => one_of(&data_char, 'Ᏼ', 'ᏼ'), - - _ => false, - }; - return match is_match { - true => Eq::True, - false => Eq::False, - }; + if user_char == data_char { + return Eq::True; + } + // unicode list: https://en.wikipedia.org/wiki/List_of_Unicode_characters + // double char matches todo: æ ae, ß ss, œ oe + let is_skip = match data_char { + // ascii symbols, \u{0021} to \u{002F} + '!' | '"' | '#' | '$' | '%' | '&' | '\'' | '(' | ')' => true, + '*' | '+' | ',' | '-' | '.' | '/' => true, + // ascii symbols, \u{003A} to \u{0040} + ':' | ';' | '<' | '=' | '>' | '?' | '@' => true, + // ascii symbols, \u{005B} to \u{0060} + '[' | '\\' | ']' | '^' | '_' | '`' => true, + // ascii symbols, \u{007B} to \u{007E} + '{' | '|' | '}' | '~' => true, + + // latin-1 puncutation/symbols, \u{00A1} to \u{00BF} + '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' => true, + '\u{00AD}' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' => true, + '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' => true, + + // math, \u{00D7} and \u{00F7} + '×' | '÷' => true, + + // unicode symbols \u{2012} to \u{204A} + '–' | '—' | '―' | '‗' | '‘' | '’' | '‚' | '‛' | '“' | '”' | '„' | '†' | '‡' | '•' | '…' + | '‰' | '′' | '″' | '‹' | '›' | '‼' | '‾' | '⁄' | '⁊' => true, + + // fullwidth ascii symbols, \u{FF01} to \u{FF0F} + '!' | '"' | '#' | '$' | '%' | '&' | ''' => true, + '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' => true, + // fullwidth ascii symbols, \u{FF1A} to \u{FF20} + ':' | ';' | '<' | '=' | '>' | '?' | '@' => true, + // fullwidth ascii symbols, \u{FF3B} to \u{FF40} + '[' | '\' | ']' | '^' | '_' | '`' => true, + // fullwidth ascii symbols, \u{FF5B} to \u{FF5E} + '{' | '|' | '}' | '~' => true, + // fullwidth double brackets, \u{FF5F} and \u{FF60} + '⦅' | '⦆' => true, + + // figure dash + '‒' => true, + + // other currencies + '֏' | '؋' | '৲' | '৳' | '৻' | '૱' | '௹' | '฿' | '៛' | '₠' | '₡' | '₢' | '₣' | '₤' | '₥' + | '₦' | '₧' | '₨' | '₩' | '₪' | '₫' | '€' | '₭' | '₮' | '₯' | '₰' | '₱' | '₲' | '₳' + | '₴' | '₵' | '₶' | '₷' | '₸' | '₹' | '₺' | '₻' | '₼' | '₽' | '₾' | '₿' | '﹩' | '¢' + | '£' | '¥' | '₩' => true, + + _ => false, + }; + if is_skip { + return Eq::Skip; + } + fn one_of(c: &char, a: char, b: char) -> bool { + return c == &a || c == &b; + } + let is_match = match user_char { + // dash + '–' | '—' | '―' => match data_char { + '–' | '—' | '―' | '-' => true, + _ => false, + }, + // Basic Latin, Latin-1 Supplement, Latin Extended-A + 'A' | 'a' => match data_char { + 'A' | 'a' | 'A' | 'a' | 'À' | 'à' | 'Á' | 'á' | 'Â' | 'â' | 'Ã' | 'ã' => { + true + } + 'Ä' | 'ä' | 'Å' | 'å' | 'Ā' | 'ā' | 'Ă' | 'ă' | 'Ą' | 'ą' => true, + _ => false, + }, + 'A' | 'a' => one_of(&data_char, 'A', 'a'), + 'À' | 'à' => one_of(&data_char, 'À', 'à'), + 'Á' | 'á' => one_of(&data_char, 'Á', 'á'), + 'Â' | 'â' => one_of(&data_char, 'Â', 'â'), + 'Ã' | 'ã' => one_of(&data_char, 'Ã', 'ã'), + 'Ä' | 'ä' => one_of(&data_char, 'Ä', 'ä'), + 'Å' | 'å' => one_of(&data_char, 'Å', 'å'), + 'Ā' | 'ā' => one_of(&data_char, 'Ā', 'ā'), + 'Ă' | 'ă' => one_of(&data_char, 'Ă', 'ă'), + 'Ą' | 'ą' => one_of(&data_char, 'Ą', 'ą'), + + 'B' | 'b' => match data_char { + 'B' | 'b' | 'B' | 'b' => true, + _ => false, + }, + 'B' | 'b' => one_of(&data_char, 'B', 'b'), + + 'C' | 'c' => match data_char { + 'C' | 'c' | 'C' | 'c' | 'Ç' | 'ç' | 'Ć' | 'ć' | 'Ĉ' | 'ĉ' | 'Ċ' | 'ċ' | 'Č' | 'č' => { + true + } + _ => false, + }, + 'C' | 'c' => one_of(&data_char, 'C', 'c'), + 'Ç' | 'ç' => one_of(&data_char, 'Ç', 'ç'), + 'Ć' | 'ć' => one_of(&data_char, 'Ć', 'ć'), + 'Ĉ' | 'ĉ' => one_of(&data_char, 'Ĉ', 'ĉ'), + 'Ċ' | 'ċ' => one_of(&data_char, 'Ċ', 'ċ'), + 'Č' | 'č' => one_of(&data_char, 'Č', 'č'), + + 'D' | 'd' => match data_char { + 'D' | 'd' | 'D' | 'd' | 'Ð' | 'ð' | 'Ď' | 'ď' | 'Đ' | 'đ' => true, + _ => false, + }, + 'D' | 'd' => one_of(&data_char, 'D', 'd'), + 'Ð' | 'ð' => one_of(&data_char, 'Ð', 'ð'), + 'Ď' | 'ď' => one_of(&data_char, 'Ď', 'ď'), + 'Đ' | 'đ' => one_of(&data_char, 'Đ', 'đ'), + + 'E' | 'e' => match data_char { + 'E' | 'e' | 'E' | 'e' | 'È' | 'è' | 'É' | 'é' | 'Ê' | 'ê' | 'Ë' | 'ë' => { + true + } + 'Ē' | 'ē' | 'Ĕ' | 'ĕ' | 'Ė' | 'ė' | 'Ę' | 'ę' | 'Ě' | 'ě' => true, + _ => false, + }, + 'E' | 'e' => one_of(&data_char, 'E', 'e'), + 'È' | 'è' => one_of(&data_char, 'È', 'è'), + 'É' | 'é' => one_of(&data_char, 'É', 'é'), + 'Ê' | 'ê' => one_of(&data_char, 'Ê', 'ê'), + 'Ë' | 'ë' => one_of(&data_char, 'Ë', 'ë'), + 'Ē' | 'ē' => one_of(&data_char, 'Ē', 'ē'), + 'Ĕ' | 'ĕ' => one_of(&data_char, 'Ĕ', 'ĕ'), + 'Ė' | 'ė' => one_of(&data_char, 'Ė', 'ė'), + 'Ę' | 'ę' => one_of(&data_char, 'Ę', 'ę'), + 'Ě' | 'ě' => one_of(&data_char, 'Ě', 'ě'), + + 'F' | 'f' => match data_char { + 'F' | 'f' | 'F' | 'f' => true, + _ => false, + }, + 'F' | 'f' => one_of(&data_char, 'F', 'f'), + + 'G' | 'g' => match data_char { + 'G' | 'g' | 'G' | 'g' | 'Ĝ' | 'ĝ' | 'Ğ' | 'ğ' | 'Ġ' | 'ġ' | 'Ģ' | 'ģ' => { + true + } + _ => false, + }, + 'G' | 'g' => one_of(&data_char, 'G', 'g'), + 'Ĝ' | 'ĝ' => one_of(&data_char, 'Ĝ', 'ĝ'), + 'Ğ' | 'ğ' => one_of(&data_char, 'Ğ', 'ğ'), + 'Ġ' | 'ġ' => one_of(&data_char, 'Ġ', 'ġ'), + 'Ģ' | 'ģ' => one_of(&data_char, 'Ģ', 'ģ'), + + 'H' | 'h' => match data_char { + 'H' | 'h' | 'H' | 'h' | 'Ĥ' | 'ĥ' | 'Ħ' | 'ħ' => true, + _ => false, + }, + 'H' | 'h' => one_of(&data_char, 'H', 'h'), + 'Ĥ' | 'ĥ' => one_of(&data_char, 'Ĥ', 'ĥ'), + 'Ħ' | 'ħ' => one_of(&data_char, 'Ħ', 'ħ'), + + 'I' | 'i' => match data_char { + 'I' | 'i' | 'I' | 'i' | 'Ì' | 'ì' | 'Í' | 'í' | 'Î' | 'î' | 'Ï' | 'ï' => { + true + } + 'Ĩ' | 'ĩ' | 'Ī' | 'ī' | 'Ĭ' | 'ĭ' | 'Į' | 'į' => true, + 'İ' | 'ı' => true, // dotted I and dotless i + _ => false, + }, + 'I' | 'i' => one_of(&data_char, 'I', 'i'), + 'Ĩ' | 'ĩ' => one_of(&data_char, 'Ĩ', 'ĩ'), + 'Ī' | 'ī' => one_of(&data_char, 'Ī', 'ī'), + 'Ĭ' | 'ĭ' => one_of(&data_char, 'Ĭ', 'ĭ'), + 'Į' | 'į' => one_of(&data_char, 'Į', 'į'), + + 'J' | 'j' => match data_char { + 'J' | 'j' | 'J' | 'j' | 'Ĵ' | 'ĵ' => true, + _ => false, + }, + 'J' | 'j' => one_of(&data_char, 'J', 'j'), + 'Ĵ' | 'ĵ' => one_of(&data_char, 'Ĵ', 'ĵ'), + + 'K' | 'k' => match data_char { + 'K' | 'k' | 'K' | 'k' | 'Ķ' | 'ķ' => true, + 'ĸ' => true, // only lowercase + _ => false, + }, + 'K' | 'k' => one_of(&data_char, 'K', 'k'), + 'Ķ' | 'ķ' => one_of(&data_char, 'Ķ', 'ķ'), + + 'L' | 'l' => match data_char { + 'L' | 'l' | 'L' | 'l' | 'Ĺ' | 'ĺ' => true, + 'Ļ' | 'ļ' | 'Ľ' | 'ľ' | 'Ŀ' | 'ŀ' | 'Ł' | 'ł' => true, + _ => false, + }, + 'L' | 'l' => one_of(&data_char, 'L', 'l'), + 'Ĺ' | 'ĺ' => one_of(&data_char, 'Ĺ', 'ĺ'), + 'Ļ' | 'ļ' => one_of(&data_char, 'Ļ', 'ļ'), + 'Ľ' | 'ľ' => one_of(&data_char, 'Ľ', 'ľ'), + 'Ŀ' | 'ŀ' => one_of(&data_char, 'Ŀ', 'ŀ'), + 'Ł' | 'ł' => one_of(&data_char, 'Ł', 'ł'), + + 'M' | 'm' => match data_char { + 'M' | 'm' | 'M' | 'm' => true, + _ => false, + }, + 'M' | 'm' => one_of(&data_char, 'M', 'm'), + + 'N' | 'n' => match data_char { + 'N' | 'n' | 'N' | 'n' | 'Ñ' | 'ñ' | 'Ń' | 'ń' | 'Ņ' | 'ņ' | 'Ň' | 'ň' => { + true + } + 'ʼn' => true, // only lowercase, deprecated + _ => false, + }, + 'N' | 'n' => one_of(&data_char, 'N', 'n'), + 'Ñ' | 'ñ' => one_of(&data_char, 'Ñ', 'ñ'), + 'Ń' | 'ń' => one_of(&data_char, 'Ń', 'ń'), + 'Ņ' | 'ņ' => one_of(&data_char, 'Ņ', 'ņ'), + 'Ň' | 'ň' => one_of(&data_char, 'Ň', 'ň'), + + 'O' | 'o' => match data_char { + 'O' | 'o' | 'O' | 'o' | 'Ò' | 'ò' | 'Ó' | 'ó' | 'Ô' | 'ô' | 'Õ' | 'õ' => { + true + } + 'Ö' | 'ö' | 'Ø' | 'ø' | 'Ō' | 'ō' | 'Ŏ' | 'ŏ' | 'Ő' | 'ő' => true, + _ => false, + }, + 'O' | 'o' => one_of(&data_char, 'O', 'o'), + 'Ò' | 'ò' => one_of(&data_char, 'Ò', 'ò'), + 'Ó' | 'ó' => one_of(&data_char, 'Ó', 'ó'), + 'Ô' | 'ô' => one_of(&data_char, 'Ô', 'ô'), + 'Õ' | 'õ' => one_of(&data_char, 'Õ', 'õ'), + 'Ö' | 'ö' => one_of(&data_char, 'Ö', 'ö'), + 'Ø' | 'ø' => one_of(&data_char, 'Ø', 'ø'), + 'Ō' | 'ō' => one_of(&data_char, 'Ō', 'ō'), + 'Ŏ' | 'ŏ' => one_of(&data_char, 'Ŏ', 'ŏ'), + 'Ő' | 'ő' => one_of(&data_char, 'Ő', 'ő'), + + 'P' | 'p' => match data_char { + 'P' | 'p' | 'P' | 'p' => true, + _ => false, + }, + 'P' | 'p' => one_of(&data_char, 'P', 'p'), + + 'Q' | 'q' => match data_char { + 'Q' | 'q' | 'Q' | 'q' => true, + _ => false, + }, + 'Q' | 'q' => one_of(&data_char, 'Q', 'q'), + + 'R' | 'r' => match data_char { + 'R' | 'r' | 'R' | 'r' | 'Ŕ' | 'ŕ' | 'Ŗ' | 'ŗ' | 'Ř' | 'ř' => true, + _ => false, + }, + 'R' | 'r' => one_of(&data_char, 'R', 'r'), + 'Ŕ' | 'ŕ' => one_of(&data_char, 'Ŕ', 'ŕ'), + 'Ŗ' | 'ŗ' => one_of(&data_char, 'Ŗ', 'ŗ'), + 'Ř' | 'ř' => one_of(&data_char, 'Ř', 'ř'), + + 'S' | 's' => match data_char { + 'S' | 's' | 'S' | 's' | 'Ś' | 'ś' | 'Ŝ' | 'ŝ' | 'Ş' | 'ş' | 'Š' | 'š' => { + true + } + 'ſ' => true, // only lowercase + _ => false, + }, + 'S' | 's' => one_of(&data_char, 'S', 's'), + 'Ś' | 'ś' => one_of(&data_char, 'Ś', 'ś'), + 'Ŝ' | 'ŝ' => one_of(&data_char, 'Ŝ', 'ŝ'), + 'Ş' | 'ş' => one_of(&data_char, 'Ş', 'ş'), + 'Š' | 'š' => one_of(&data_char, 'Š', 'š'), + + 'T' | 't' => match data_char { + 'T' | 't' | 'T' | 't' | 'Ţ' | 'ţ' | 'Ť' | 'ť' | 'Ŧ' | 'ŧ' => true, + _ => false, + }, + 'T' | 't' => one_of(&data_char, 'T', 't'), + 'Ţ' | 'ţ' => one_of(&data_char, 'Ţ', 'ţ'), + 'Ť' | 'ť' => one_of(&data_char, 'Ť', 'ť'), + 'Ŧ' | 'ŧ' => one_of(&data_char, 'Ŧ', 'ŧ'), + + 'U' | 'u' => match data_char { + 'U' | 'u' | 'U' | 'u' | 'Ù' | 'ù' | 'Ú' | 'ú' | 'Û' | 'û' | 'Ü' | 'ü' => { + true + } + 'Ũ' | 'ũ' | 'Ū' | 'ū' | 'Ŭ' | 'ŭ' | 'Ů' | 'ů' | 'Ű' | 'ű' | 'Ų' | 'ų' => { + true + } + _ => false, + }, + 'U' | 'u' => one_of(&data_char, 'U', 'u'), + 'Ù' | 'ù' => one_of(&data_char, 'Ù', 'ù'), + 'Ú' | 'ú' => one_of(&data_char, 'Ú', 'ú'), + 'Û' | 'û' => one_of(&data_char, 'Û', 'û'), + 'Ü' | 'ü' => one_of(&data_char, 'Ü', 'ü'), + 'Ũ' | 'ũ' => one_of(&data_char, 'Ũ', 'ũ'), + 'Ū' | 'ū' => one_of(&data_char, 'Ū', 'ū'), + 'Ŭ' | 'ŭ' => one_of(&data_char, 'Ŭ', 'ŭ'), + 'Ů' | 'ů' => one_of(&data_char, 'Ů', 'ů'), + 'Ű' | 'ű' => one_of(&data_char, 'Ű', 'ű'), + 'Ų' | 'ų' => one_of(&data_char, 'Ų', 'ų'), + + 'V' | 'v' => match data_char { + 'V' | 'v' | 'V' | 'v' => true, + _ => false, + }, + 'V' | 'v' => one_of(&data_char, 'V', 'v'), + + 'W' | 'w' => match data_char { + 'W' | 'w' | 'W' | 'w' | 'Ŵ' | 'ŵ' => true, + _ => false, + }, + 'W' | 'w' => one_of(&data_char, 'W', 'w'), + 'Ŵ' | 'ŵ' => one_of(&data_char, 'Ŵ', 'ŵ'), + + 'X' | 'x' => match data_char { + 'X' | 'x' | 'X' | 'x' => true, + _ => false, + }, + 'X' | 'x' => one_of(&data_char, 'X', 'x'), + 'Y' | 'y' => match data_char { + 'Y' | 'y' | 'Y' | 'y' | 'Ý' | 'ý' | 'Ÿ' | 'ÿ' | 'Ŷ' | 'ŷ' => true, + _ => false, + }, + 'Y' | 'y' => one_of(&data_char, 'Y', 'y'), + 'Ý' | 'ý' => one_of(&data_char, 'Ý', 'ý'), + 'Ÿ' | 'ÿ' => one_of(&data_char, 'Ÿ', 'ÿ'), + 'Ŷ' | 'ŷ' => one_of(&data_char, 'Ŷ', 'ŷ'), + + 'Z' | 'z' => match data_char { + 'Z' | 'z' | 'Z' | 'z' | 'Ź' | 'ź' | 'Ż' | 'ż' | 'Ž' | 'ž' => true, + _ => false, + }, + 'Z' | 'z' => one_of(&data_char, 'Z', 'z'), + 'Ź' | 'ź' => one_of(&data_char, 'Ź', 'ź'), + 'Ż' | 'ż' => one_of(&data_char, 'Ż', 'ż'), + 'Ž' | 'ž' => one_of(&data_char, 'Ž', 'ž'), + + 'Æ' | 'æ' => one_of(&data_char, 'Æ', 'æ'), + 'Þ' | 'þ' => one_of(&data_char, 'Þ', 'þ'), + 'ẞ' | 'ß' => one_of(&data_char, 'ẞ', 'ß'), + 'IJ' | 'ij' => one_of(&data_char, 'IJ', 'ij'), + 'Ŋ' | 'ŋ' => one_of(&data_char, 'Ŋ', 'ŋ'), + 'Œ' | 'œ' => one_of(&data_char, 'Œ', 'œ'), + + // fullwidth characters, \u{FF01} to \u{FF20} + '!' => data_char == '!', + '"' => data_char == '"', + '#' => data_char == '#', + '$' => data_char == '$', + '%' => data_char == '%', + '&' => data_char == '&', + '\'' => data_char == ''', + '(' => data_char == '(', + ')' => data_char == ')', + '*' => data_char == '*', + '+' => data_char == '+', + ',' => data_char == ',', + '-' => data_char == '-', + '.' => data_char == '.', + '/' => data_char == '/', + '0' => data_char == '0', + '1' => data_char == '1', + '2' => data_char == '2', + '3' => data_char == '3', + '4' => data_char == '4', + '5' => data_char == '5', + '6' => data_char == '6', + '7' => data_char == '7', + '8' => data_char == '8', + '9' => data_char == '9', + ':' => data_char == ':', + ';' => data_char == ';', + '<' => data_char == '<', + '=' => data_char == '=', + '>' => data_char == '>', + '?' => data_char == '?', + '@' => data_char == '@', + + // cyrillic + // - only case-insensitive matching (é won't match e) + 'Ѐ' | 'ѐ' => one_of(&data_char, 'Ѐ', 'ѐ'), + 'Ё' | 'ё' => one_of(&data_char, 'Ё', 'ё'), + 'Ђ' | 'ђ' => one_of(&data_char, 'Ђ', 'ђ'), + 'Ѓ' | 'ѓ' => one_of(&data_char, 'Ѓ', 'ѓ'), + 'Є' | 'є' => one_of(&data_char, 'Є', 'є'), + 'Ѕ' | 'ѕ' => one_of(&data_char, 'Ѕ', 'ѕ'), + 'І' | 'і' => one_of(&data_char, 'І', 'і'), + 'Ї' | 'ї' => one_of(&data_char, 'Ї', 'ї'), + 'Ј' | 'ј' => one_of(&data_char, 'Ј', 'ј'), + 'Љ' | 'љ' => one_of(&data_char, 'Љ', 'љ'), + 'Њ' | 'њ' => one_of(&data_char, 'Њ', 'њ'), + 'Ћ' | 'ћ' => one_of(&data_char, 'Ћ', 'ћ'), + 'Ќ' | 'ќ' => one_of(&data_char, 'Ќ', 'ќ'), + 'Ѝ' | 'ѝ' => one_of(&data_char, 'Ѝ', 'ѝ'), + 'Ў' | 'ў' => one_of(&data_char, 'Ў', 'ў'), + 'Џ' | 'џ' => one_of(&data_char, 'Џ', 'џ'), + 'А' | 'а' => one_of(&data_char, 'А', 'а'), + 'Б' | 'б' => one_of(&data_char, 'Б', 'б'), + 'В' | 'в' => one_of(&data_char, 'В', 'в'), + 'Г' | 'г' => one_of(&data_char, 'Г', 'г'), + 'Д' | 'д' => one_of(&data_char, 'Д', 'д'), + 'Е' | 'е' => one_of(&data_char, 'Е', 'е'), + 'Ж' | 'ж' => one_of(&data_char, 'Ж', 'ж'), + 'З' | 'з' => one_of(&data_char, 'З', 'з'), + 'И' | 'и' => one_of(&data_char, 'И', 'и'), + 'Й' | 'й' => one_of(&data_char, 'Й', 'й'), + 'К' | 'к' => one_of(&data_char, 'К', 'к'), + 'Л' | 'л' => one_of(&data_char, 'Л', 'л'), + 'М' | 'м' => one_of(&data_char, 'М', 'м'), + 'Н' | 'н' => one_of(&data_char, 'Н', 'н'), + 'О' | 'о' => one_of(&data_char, 'О', 'о'), + 'П' | 'п' => one_of(&data_char, 'П', 'п'), + 'Р' | 'р' => one_of(&data_char, 'Р', 'р'), + 'С' | 'с' => one_of(&data_char, 'С', 'с'), + 'Т' | 'т' => one_of(&data_char, 'Т', 'т'), + 'У' | 'у' => one_of(&data_char, 'У', 'у'), + 'Ф' | 'ф' => one_of(&data_char, 'Ф', 'ф'), + 'Х' | 'х' => one_of(&data_char, 'Х', 'х'), + 'Ц' | 'ц' => one_of(&data_char, 'Ц', 'ц'), + 'Ч' | 'ч' => one_of(&data_char, 'Ч', 'ч'), + 'Ш' | 'ш' => one_of(&data_char, 'Ш', 'ш'), + 'Щ' | 'щ' => one_of(&data_char, 'Щ', 'щ'), + 'Ъ' | 'ъ' => one_of(&data_char, 'Ъ', 'ъ'), + 'Ы' | 'ы' => one_of(&data_char, 'Ы', 'ы'), + 'Ь' | 'ь' => one_of(&data_char, 'Ь', 'ь'), + 'Э' | 'э' => one_of(&data_char, 'Э', 'э'), + 'Ю' | 'ю' => one_of(&data_char, 'Ю', 'ю'), + 'Я' | 'я' => one_of(&data_char, 'Я', 'я'), + 'Ѡ' | 'ѡ' => one_of(&data_char, 'Ѡ', 'ѡ'), + 'Ѣ' | 'ѣ' => one_of(&data_char, 'Ѣ', 'ѣ'), + 'Ѥ' | 'ѥ' => one_of(&data_char, 'Ѥ', 'ѥ'), + 'Ѧ' | 'ѧ' => one_of(&data_char, 'Ѧ', 'ѧ'), + 'Ѩ' | 'ѩ' => one_of(&data_char, 'Ѩ', 'ѩ'), + 'Ѫ' | 'ѫ' => one_of(&data_char, 'Ѫ', 'ѫ'), + 'Ѭ' | 'ѭ' => one_of(&data_char, 'Ѭ', 'ѭ'), + 'Ѯ' | 'ѯ' => one_of(&data_char, 'Ѯ', 'ѯ'), + 'Ѱ' | 'ѱ' => one_of(&data_char, 'Ѱ', 'ѱ'), + 'Ѳ' | 'ѳ' => one_of(&data_char, 'Ѳ', 'ѳ'), + 'Ѵ' | 'ѵ' => one_of(&data_char, 'Ѵ', 'ѵ'), + 'Ѷ' | 'ѷ' => one_of(&data_char, 'Ѷ', 'ѷ'), + 'Ѹ' | 'ѹ' => one_of(&data_char, 'Ѹ', 'ѹ'), + 'Ѻ' | 'ѻ' => one_of(&data_char, 'Ѻ', 'ѻ'), + 'Ѽ' | 'ѽ' => one_of(&data_char, 'Ѽ', 'ѽ'), + 'Ѿ' | 'ѿ' => one_of(&data_char, 'Ѿ', 'ѿ'), + 'Ҁ' | 'ҁ' => one_of(&data_char, 'Ҁ', 'ҁ'), + 'Ҋ' | 'ҋ' => one_of(&data_char, 'Ҋ', 'ҋ'), + 'Ҍ' | 'ҍ' => one_of(&data_char, 'Ҍ', 'ҍ'), + 'Ҏ' | 'ҏ' => one_of(&data_char, 'Ҏ', 'ҏ'), + 'Ґ' | 'ґ' => one_of(&data_char, 'Ґ', 'ґ'), + 'Ғ' | 'ғ' => one_of(&data_char, 'Ғ', 'ғ'), + 'Ҕ' | 'ҕ' => one_of(&data_char, 'Ҕ', 'ҕ'), + 'Җ' | 'җ' => one_of(&data_char, 'Җ', 'җ'), + 'Ҙ' | 'ҙ' => one_of(&data_char, 'Ҙ', 'ҙ'), + 'Қ' | 'қ' => one_of(&data_char, 'Қ', 'қ'), + 'Ҝ' | 'ҝ' => one_of(&data_char, 'Ҝ', 'ҝ'), + 'Ҟ' | 'ҟ' => one_of(&data_char, 'Ҟ', 'ҟ'), + 'Ҡ' | 'ҡ' => one_of(&data_char, 'Ҡ', 'ҡ'), + 'Ң' | 'ң' => one_of(&data_char, 'Ң', 'ң'), + 'Ҥ' | 'ҥ' => one_of(&data_char, 'Ҥ', 'ҥ'), + 'Ҧ' | 'ҧ' => one_of(&data_char, 'Ҧ', 'ҧ'), + 'Ҩ' | 'ҩ' => one_of(&data_char, 'Ҩ', 'ҩ'), + 'Ҫ' | 'ҫ' => one_of(&data_char, 'Ҫ', 'ҫ'), + 'Ҭ' | 'ҭ' => one_of(&data_char, 'Ҭ', 'ҭ'), + 'Ү' | 'ү' => one_of(&data_char, 'Ү', 'ү'), + 'Ұ' | 'ұ' => one_of(&data_char, 'Ұ', 'ұ'), + 'Ҳ' | 'ҳ' => one_of(&data_char, 'Ҳ', 'ҳ'), + 'Ҵ' | 'ҵ' => one_of(&data_char, 'Ҵ', 'ҵ'), + 'Ҷ' | 'ҷ' => one_of(&data_char, 'Ҷ', 'ҷ'), + 'Ҹ' | 'ҹ' => one_of(&data_char, 'Ҹ', 'ҹ'), + 'Һ' | 'һ' => one_of(&data_char, 'Һ', 'һ'), + 'Ҽ' | 'ҽ' => one_of(&data_char, 'Ҽ', 'ҽ'), + 'Ҿ' | 'ҿ' => one_of(&data_char, 'Ҿ', 'ҿ'), + 'Ӏ' | 'Ӂ' => one_of(&data_char, 'Ӏ', 'Ӂ'), + 'ӂ' | 'Ӄ' => one_of(&data_char, 'ӂ', 'Ӄ'), + 'ӄ' | 'Ӆ' => one_of(&data_char, 'ӄ', 'Ӆ'), + 'ӆ' | 'Ӈ' => one_of(&data_char, 'ӆ', 'Ӈ'), + 'ӈ' | 'Ӊ' => one_of(&data_char, 'ӈ', 'Ӊ'), + 'ӊ' | 'Ӌ' => one_of(&data_char, 'ӊ', 'Ӌ'), + 'ӌ' | 'Ӎ' => one_of(&data_char, 'ӌ', 'Ӎ'), + 'ӎ' | 'ӏ' => one_of(&data_char, 'ӎ', 'ӏ'), + 'Ӑ' | 'ӑ' => one_of(&data_char, 'Ӑ', 'ӑ'), + 'Ӓ' | 'ӓ' => one_of(&data_char, 'Ӓ', 'ӓ'), + 'Ӕ' | 'ӕ' => one_of(&data_char, 'Ӕ', 'ӕ'), + 'Ӗ' | 'ӗ' => one_of(&data_char, 'Ӗ', 'ӗ'), + 'Ә' | 'ә' => one_of(&data_char, 'Ә', 'ә'), + 'Ӛ' | 'ӛ' => one_of(&data_char, 'Ӛ', 'ӛ'), + 'Ӝ' | 'ӝ' => one_of(&data_char, 'Ӝ', 'ӝ'), + 'Ӟ' | 'ӟ' => one_of(&data_char, 'Ӟ', 'ӟ'), + 'Ӡ' | 'ӡ' => one_of(&data_char, 'Ӡ', 'ӡ'), + 'Ӣ' | 'ӣ' => one_of(&data_char, 'Ӣ', 'ӣ'), + 'Ӥ' | 'ӥ' => one_of(&data_char, 'Ӥ', 'ӥ'), + 'Ӧ' | 'ӧ' => one_of(&data_char, 'Ӧ', 'ӧ'), + 'Ө' | 'ө' => one_of(&data_char, 'Ө', 'ө'), + 'Ӫ' | 'ӫ' => one_of(&data_char, 'Ӫ', 'ӫ'), + 'Ӭ' | 'ӭ' => one_of(&data_char, 'Ӭ', 'ӭ'), + 'Ӯ' | 'ӯ' => one_of(&data_char, 'Ӯ', 'ӯ'), + 'Ӱ' | 'ӱ' => one_of(&data_char, 'Ӱ', 'ӱ'), + 'Ӳ' | 'ӳ' => one_of(&data_char, 'Ӳ', 'ӳ'), + 'Ӵ' | 'ӵ' => one_of(&data_char, 'Ӵ', 'ӵ'), + 'Ӷ' | 'ӷ' => one_of(&data_char, 'Ӷ', 'ӷ'), + 'Ӹ' | 'ӹ' => one_of(&data_char, 'Ӹ', 'ӹ'), + 'Ӻ' | 'ӻ' => one_of(&data_char, 'Ӻ', 'ӻ'), + 'Ӽ' | 'ӽ' => one_of(&data_char, 'Ӽ', 'ӽ'), + 'Ӿ' | 'ӿ' => one_of(&data_char, 'Ӿ', 'ӿ'), + + // greek letters/symbols + // - only case-insensitive matching (é won't match e) + // - incomplete + 'Α' | 'α' => one_of(&data_char, 'Α', 'α'), + 'Β' | 'β' => one_of(&data_char, 'Β', 'β'), + 'Γ' | 'γ' => one_of(&data_char, 'Γ', 'γ'), + 'Δ' | 'δ' => one_of(&data_char, 'Δ', 'δ'), + 'Ε' | 'ε' => one_of(&data_char, 'Ε', 'ε'), + 'Ζ' | 'ζ' => one_of(&data_char, 'Ζ', 'ζ'), + 'Η' | 'η' => one_of(&data_char, 'Η', 'η'), + 'Θ' | 'θ' => one_of(&data_char, 'Θ', 'θ'), + 'Ι' | 'ι' => one_of(&data_char, 'Ι', 'ι'), + 'Κ' | 'κ' => one_of(&data_char, 'Κ', 'κ'), + 'Λ' | 'λ' => one_of(&data_char, 'Λ', 'λ'), + 'Μ' | 'μ' => one_of(&data_char, 'Μ', 'μ'), + 'Ν' | 'ν' => one_of(&data_char, 'Ν', 'ν'), + 'Ξ' | 'ξ' => one_of(&data_char, 'Ξ', 'ξ'), + 'Ο' | 'ο' => one_of(&data_char, 'Ο', 'ο'), + 'Π' | 'π' => one_of(&data_char, 'Π', 'π'), + 'Ρ' | 'ρ' => one_of(&data_char, 'Ρ', 'ρ'), + 'Σ' | 'σ' => one_of(&data_char, 'Σ', 'σ'), + 'Τ' | 'τ' => one_of(&data_char, 'Τ', 'τ'), + 'Υ' | 'υ' => one_of(&data_char, 'Υ', 'υ'), + 'Φ' | 'φ' => one_of(&data_char, 'Φ', 'φ'), + 'Χ' | 'χ' => one_of(&data_char, 'Χ', 'χ'), + 'Ψ' | 'ψ' => one_of(&data_char, 'Ψ', 'ψ'), + 'Ω' | 'ω' => one_of(&data_char, 'Ω', 'ω'), + 'Ϊ' | 'ϊ' => one_of(&data_char, 'Ϊ', 'ϊ'), + 'Ϋ' | 'ϋ' => one_of(&data_char, 'Ϋ', 'ϋ'), + 'Ͱ' | 'ͱ' => one_of(&data_char, 'Ͱ', 'ͱ'), + 'Ͳ' | 'ͳ' => one_of(&data_char, 'Ͳ', 'ͳ'), + 'Ͷ' | 'ͷ' => one_of(&data_char, 'Ͷ', 'ͷ'), + 'Ϳ' | 'ϳ' => one_of(&data_char, 'Ϳ', 'ϳ'), + 'Ϙ' | 'ϙ' => one_of(&data_char, 'Ϙ', 'ϙ'), + 'Ϛ' | 'ϛ' => one_of(&data_char, 'Ϛ', 'ϛ'), + 'Ϝ' | 'ϝ' => one_of(&data_char, 'Ϝ', 'ϝ'), + 'Ϟ' | 'ϟ' => one_of(&data_char, 'Ϟ', 'ϟ'), + 'Ϡ' | 'ϡ' => one_of(&data_char, 'Ϡ', 'ϡ'), + 'Ά' | 'ά' => one_of(&data_char, 'Ά', 'ά'), + 'Έ' | 'έ' => one_of(&data_char, 'Έ', 'έ'), + 'Ή' | 'ή' => one_of(&data_char, 'Ή', 'ή'), + 'Ί' | 'ί' => one_of(&data_char, 'Ί', 'ί'), + 'Ό' | 'ό' => one_of(&data_char, 'Ό', 'ό'), + 'Ύ' | 'ύ' => one_of(&data_char, 'Ύ', 'ύ'), + 'Ώ' | 'ώ' => one_of(&data_char, 'Ώ', 'ώ'), + 'Ϸ' | 'ϸ' => one_of(&data_char, 'Ϸ', 'ϸ'), + 'Ϻ' | 'ϻ' => one_of(&data_char, 'Ϻ', 'ϻ'), + 'Ͻ' | 'ͻ' => one_of(&data_char, 'Ͻ', 'ͻ'), + 'Ͼ' | 'ͼ' => one_of(&data_char, 'Ͼ', 'ͼ'), + 'Ͽ' | 'ͽ' => one_of(&data_char, 'Ͽ', 'ͽ'), + 'Ϗ' | 'ϗ' => one_of(&data_char, 'Ϗ', 'ϗ'), + 'ϴ' | 'ϑ' => one_of(&data_char, 'ϴ', 'ϑ'), + 'Ϲ' | 'ϲ' => one_of(&data_char, 'Ϲ', 'ϲ'), + + // coptic + 'Ϣ' | 'ϣ' => one_of(&data_char, 'Ϣ', 'ϣ'), + 'Ϥ' | 'ϥ' => one_of(&data_char, 'Ϥ', 'ϥ'), + 'Ϧ' | 'ϧ' => one_of(&data_char, 'Ϧ', 'ϧ'), + 'Ϩ' | 'ϩ' => one_of(&data_char, 'Ϩ', 'ϩ'), + 'Ϫ' | 'ϫ' => one_of(&data_char, 'Ϫ', 'ϫ'), + 'Ϭ' | 'ϭ' => one_of(&data_char, 'Ϭ', 'ϭ'), + 'Ϯ' | 'ϯ' => one_of(&data_char, 'Ϯ', 'ϯ'), + + // armenian + 'Ա' | 'ա' => one_of(&data_char, 'Ա', 'ա'), + 'Բ' | 'բ' => one_of(&data_char, 'Բ', 'բ'), + 'Գ' | 'գ' => one_of(&data_char, 'Գ', 'գ'), + 'Դ' | 'դ' => one_of(&data_char, 'Դ', 'դ'), + 'Ե' | 'ե' => one_of(&data_char, 'Ե', 'ե'), + 'Զ' | 'զ' => one_of(&data_char, 'Զ', 'զ'), + 'Է' | 'է' => one_of(&data_char, 'Է', 'է'), + 'Ը' | 'ը' => one_of(&data_char, 'Ը', 'ը'), + 'Թ' | 'թ' => one_of(&data_char, 'Թ', 'թ'), + 'Ժ' | 'ժ' => one_of(&data_char, 'Ժ', 'ժ'), + 'Ի' | 'ի' => one_of(&data_char, 'Ի', 'ի'), + 'Լ' | 'լ' => one_of(&data_char, 'Լ', 'լ'), + 'Խ' | 'խ' => one_of(&data_char, 'Խ', 'խ'), + 'Ծ' | 'ծ' => one_of(&data_char, 'Ծ', 'ծ'), + 'Կ' | 'կ' => one_of(&data_char, 'Կ', 'կ'), + 'Հ' | 'հ' => one_of(&data_char, 'Հ', 'հ'), + 'Ձ' | 'ձ' => one_of(&data_char, 'Ձ', 'ձ'), + 'Ղ' | 'ղ' => one_of(&data_char, 'Ղ', 'ղ'), + 'Ճ' | 'ճ' => one_of(&data_char, 'Ճ', 'ճ'), + 'Մ' | 'մ' => one_of(&data_char, 'Մ', 'մ'), + 'Յ' | 'յ' => one_of(&data_char, 'Յ', 'յ'), + 'Ն' | 'ն' => one_of(&data_char, 'Ն', 'ն'), + 'Շ' | 'շ' => one_of(&data_char, 'Շ', 'շ'), + 'Ո' | 'ո' => one_of(&data_char, 'Ո', 'ո'), + 'Չ' | 'չ' => one_of(&data_char, 'Չ', 'չ'), + 'Պ' | 'պ' => one_of(&data_char, 'Պ', 'պ'), + 'Ջ' | 'ջ' => one_of(&data_char, 'Ջ', 'ջ'), + 'Ռ' | 'ռ' => one_of(&data_char, 'Ռ', 'ռ'), + 'Ս' | 'ս' => one_of(&data_char, 'Ս', 'ս'), + 'Վ' | 'վ' => one_of(&data_char, 'Վ', 'վ'), + 'Տ' | 'տ' => one_of(&data_char, 'Տ', 'տ'), + 'Ր' | 'ր' => one_of(&data_char, 'Ր', 'ր'), + 'Ց' | 'ց' => one_of(&data_char, 'Ց', 'ց'), + 'Ւ' | 'ւ' => one_of(&data_char, 'Ւ', 'ւ'), + 'Փ' | 'փ' => one_of(&data_char, 'Փ', 'փ'), + 'Ք' | 'ք' => one_of(&data_char, 'Ք', 'ք'), + 'Օ' | 'օ' => one_of(&data_char, 'Օ', 'օ'), + 'Ֆ' | 'ֆ' => one_of(&data_char, 'Ֆ', 'ֆ'), + + // cherokee + 'Ᏸ' | 'ᏸ' => one_of(&data_char, 'Ᏸ', 'ᏸ'), + 'Ᏹ' | 'ᏹ' => one_of(&data_char, 'Ᏹ', 'ᏹ'), + 'Ᏺ' | 'ᏺ' => one_of(&data_char, 'Ᏺ', 'ᏺ'), + 'Ᏻ' | 'ᏻ' => one_of(&data_char, 'Ᏻ', 'ᏻ'), + 'Ᏼ' | 'ᏼ' => one_of(&data_char, 'Ᏼ', 'ᏼ'), + + _ => false, + }; + return match is_match { + true => Eq::True, + false => Eq::False, + }; } diff --git a/src-native/itunes_import.rs b/src-native/itunes_import.rs index 4f23deb..5443f80 100644 --- a/src-native/itunes_import.rs +++ b/src-native/itunes_import.rs @@ -16,764 +16,764 @@ use time::OffsetDateTime; #[derive(Serialize, Deserialize, Debug)] struct XmlLibrary { - #[serde(rename = "Major Version")] - major_version: u16, + #[serde(rename = "Major Version")] + major_version: u16, - #[serde(rename = "Minor Version")] - minor_version: u16, + #[serde(rename = "Minor Version")] + minor_version: u16, - #[serde(rename = "Date")] - date: String, // 2022-10-14T05:12:37Z + #[serde(rename = "Date")] + date: String, // 2022-10-14T05:12:37Z - #[serde(rename = "Application Version")] - application_version: String, + #[serde(rename = "Application Version")] + application_version: String, - #[serde(rename = "Features")] - features: u16, + #[serde(rename = "Features")] + features: u16, - #[serde(rename = "Show Content Ratings")] - show_content_ratings: bool, + #[serde(rename = "Show Content Ratings")] + show_content_ratings: bool, - #[serde(rename = "Music Folder")] - music_folder: String, + #[serde(rename = "Music Folder")] + music_folder: String, - #[serde(rename = "Library Persistent ID")] - library_persistent_id: String, + #[serde(rename = "Library Persistent ID")] + library_persistent_id: String, - #[serde(rename = "Tracks")] - tracks: HashMap, + #[serde(rename = "Tracks")] + tracks: HashMap, - #[serde(rename = "Playlists")] - playlists: Vec, + #[serde(rename = "Playlists")] + playlists: Vec, } impl XmlLibrary { - fn deserialize_props(self) -> Result { - let mut tracks = HashMap::new(); - for (key, value) in self.tracks { - let podcast = value - .as_dictionary() - .and_then(|d| d.get("Podcast")) - .and_then(|v| v.as_boolean()) - .unwrap_or(false); - if podcast { - continue; - } - - let track: XmlTrack = match plist::from_value(&value) { - Ok(track) => track, - Err(e) => throw!("Could not read track with id \"{key}\": {e}"), - }; - tracks.insert(key, track); - } - let mut playlists = Vec::new(); - for value in &self.playlists { - let name = value - .as_dictionary() - .and_then(|dict| dict.get("Name")) - .and_then(|v| v.as_string()) - .unwrap_or_default() - .to_string(); - let playlist: XmlPlaylist = match plist::from_value(value) { - Ok(playlist) => playlist, - Err(e) => throw!("Could not read playlist \"{name}\": {e}"), - }; - playlists.push(playlist); - } - Ok(XmlLibraryProps { tracks, playlists }) - } + fn deserialize_props(self) -> Result { + let mut tracks = HashMap::new(); + for (key, value) in self.tracks { + let podcast = value + .as_dictionary() + .and_then(|d| d.get("Podcast")) + .and_then(|v| v.as_boolean()) + .unwrap_or(false); + if podcast { + continue; + } + + let track: XmlTrack = match plist::from_value(&value) { + Ok(track) => track, + Err(e) => throw!("Could not read track with id \"{key}\": {e}"), + }; + tracks.insert(key, track); + } + let mut playlists = Vec::new(); + for value in &self.playlists { + let name = value + .as_dictionary() + .and_then(|dict| dict.get("Name")) + .and_then(|v| v.as_string()) + .unwrap_or_default() + .to_string(); + let playlist: XmlPlaylist = match plist::from_value(value) { + Ok(playlist) => playlist, + Err(e) => throw!("Could not read playlist \"{name}\": {e}"), + }; + playlists.push(playlist); + } + Ok(XmlLibraryProps { tracks, playlists }) + } } struct XmlLibraryProps { - tracks: HashMap, - playlists: Vec, + tracks: HashMap, + playlists: Vec, } impl XmlLibraryProps { - fn get_music_playlist(playlists: &Vec) -> Result<&XmlPlaylist> { - let mut xml_music_playlist = None; - for xml_playlist in playlists { - if xml_playlist.distinguished_kind == Some(4) { - if xml_music_playlist.is_some() { - throw!("Found two iTunes-generated Music playlists"); - } else { - xml_music_playlist = Some(xml_playlist); - } - } - } - xml_music_playlist.ok_or(nerr!("No Music playlist found")) - } - fn take_importable_playlists(&mut self) -> Vec { - let playlists = std::mem::take(&mut self.playlists); - let (importable, remaining) = playlists.into_iter().partition(|xml_playlist| { - return xml_playlist.is_importable_playlist(); - }); - self.playlists = remaining; - importable - } + fn get_music_playlist(playlists: &Vec) -> Result<&XmlPlaylist> { + let mut xml_music_playlist = None; + for xml_playlist in playlists { + if xml_playlist.distinguished_kind == Some(4) { + if xml_music_playlist.is_some() { + throw!("Found two iTunes-generated Music playlists"); + } else { + xml_music_playlist = Some(xml_playlist); + } + } + } + xml_music_playlist.ok_or(nerr!("No Music playlist found")) + } + fn take_importable_playlists(&mut self) -> Vec { + let playlists = std::mem::take(&mut self.playlists); + let (importable, remaining) = playlists.into_iter().partition(|xml_playlist| { + return xml_playlist.is_importable_playlist(); + }); + self.playlists = remaining; + importable + } } fn get_none() -> Option { - None + None } #[derive(Serialize, Deserialize, Debug)] struct XmlTrack { - // Artist - #[serde(rename = "Artist")] - artist: Option, + // Artist + #[serde(rename = "Artist")] + artist: Option, - // Name - #[serde(rename = "Name")] - name: Option, + // Name + #[serde(rename = "Name")] + name: Option, - // Composer - #[serde(rename = "Composer")] - composer: Option, + // Composer + #[serde(rename = "Composer")] + composer: Option, - // Sort Name - #[serde(rename = "Sort Name")] - sort_name: Option, + // Sort Name + #[serde(rename = "Sort Name")] + sort_name: Option, - // Sort Artist - #[serde(rename = "Sort Artist")] - sort_artist: Option, + // Sort Artist + #[serde(rename = "Sort Artist")] + sort_artist: Option, - // Sort Composer - #[serde(rename = "Sort Composer")] - sort_composer: Option, + // Sort Composer + #[serde(rename = "Sort Composer")] + sort_composer: Option, - // Genre - #[serde(rename = "Genre")] - genre: Option, + // Genre + #[serde(rename = "Genre")] + genre: Option, - // Size - #[serde(rename = "Size")] - size: Option, + // Size + #[serde(rename = "Size")] + size: Option, - // Rating - #[serde(rename = "Rating")] - rating: Option, + // Rating + #[serde(rename = "Rating")] + rating: Option, - // Year - #[serde(rename = "Year")] - year: Option, + // Year + #[serde(rename = "Year")] + year: Option, - // BPM - #[serde(rename = "BPM")] - bpm: Option, + // BPM + #[serde(rename = "BPM")] + bpm: Option, - // Date Modified - #[serde(with = "iso8601", rename = "Date Modified")] - date_modified: OffsetDateTime, + // Date Modified + #[serde(with = "iso8601", rename = "Date Modified")] + date_modified: OffsetDateTime, - // Date Added - #[serde(with = "iso8601", rename = "Date Added")] - date_added: OffsetDateTime, + // Date Added + #[serde(with = "iso8601", rename = "Date Added")] + date_added: OffsetDateTime, - // Comments - #[serde(rename = "Comments")] - comments: Option, + // Comments + #[serde(rename = "Comments")] + comments: Option, - // Grouping - #[serde(rename = "Grouping")] - grouping: Option, + // Grouping + #[serde(rename = "Grouping")] + grouping: Option, - // Play Date - #[serde(rename = "Play Date")] - play_date: Option, + // Play Date + #[serde(rename = "Play Date")] + play_date: Option, - // Play Date UTC - #[serde(with = "iso8601_opt", default = "get_none", rename = "Play Date UTC")] - play_date_utc: Option, + // Play Date UTC + #[serde(with = "iso8601_opt", default = "get_none", rename = "Play Date UTC")] + play_date_utc: Option, - // Play Count - #[serde(rename = "Play Count")] - play_count: Option, + // Play Count + #[serde(rename = "Play Count")] + play_count: Option, - // Skip Date - #[serde(with = "iso8601_opt", default = "get_none", rename = "Skip Date")] - skip_date: Option, + // Skip Date + #[serde(with = "iso8601_opt", default = "get_none", rename = "Skip Date")] + skip_date: Option, - // Skip Count - #[serde(rename = "Skip Count")] - skip_count: Option, + // Skip Count + #[serde(rename = "Skip Count")] + skip_count: Option, - // Volume Adjustment (-255 to 255) - #[serde(rename = "Volume Adjustment")] - volume_adjustment: Option, + // Volume Adjustment (-255 to 255) + #[serde(rename = "Volume Adjustment")] + volume_adjustment: Option, - // Loved - #[serde(rename = "Loved")] - loved: Option, + // Loved + #[serde(rename = "Loved")] + loved: Option, - // Disliked - #[serde(rename = "Disliked")] - disliked: Option, + // Disliked + #[serde(rename = "Disliked")] + disliked: Option, - // Disabled - #[serde(rename = "Disabled")] - disabled: Option, + // Disabled + #[serde(rename = "Disabled")] + disabled: Option, - // Compilation - #[serde(rename = "Compilation")] - compilation: Option, + // Compilation + #[serde(rename = "Compilation")] + compilation: Option, - // Album - #[serde(rename = "Album")] - album: Option, + // Album + #[serde(rename = "Album")] + album: Option, - // Album Artist - #[serde(rename = "Album Artist")] - album_artist: Option, + // Album Artist + #[serde(rename = "Album Artist")] + album_artist: Option, - // Sort Album - #[serde(rename = "Sort Album")] - sort_album: Option, + // Sort Album + #[serde(rename = "Sort Album")] + sort_album: Option, - // Sort Album Artist - #[serde(rename = "Sort Album Artist")] - sort_album_artist: Option, + // Sort Album Artist + #[serde(rename = "Sort Album Artist")] + sort_album_artist: Option, - // Track Number - #[serde(rename = "Track Number")] - track_number: Option, + // Track Number + #[serde(rename = "Track Number")] + track_number: Option, - // Track Count - #[serde(rename = "Track Count")] - track_count: Option, + // Track Count + #[serde(rename = "Track Count")] + track_count: Option, - // Disc Number - #[serde(rename = "Disc Number")] - disc_number: Option, + // Disc Number + #[serde(rename = "Disc Number")] + disc_number: Option, - // Disc Count - #[serde(rename = "Disc Count")] - disc_count: Option, + // Disc Count + #[serde(rename = "Disc Count")] + disc_count: Option, - // Persistent ID - #[serde(rename = "Persistent ID")] - persistent_id: String, + // Persistent ID + #[serde(rename = "Persistent ID")] + persistent_id: String, - // Track Type - #[serde(rename = "Track Type")] - track_type: Option, + // Track Type + #[serde(rename = "Track Type")] + track_type: Option, - // Location - #[serde(rename = "Location")] - location: Option, + // Location + #[serde(rename = "Location")] + location: Option, } impl XmlTrack { - fn artist_title(&self) -> String { - self.artist.as_deref().unwrap_or_default().to_string() - + self.name.as_deref().unwrap_or_default() - } + fn artist_title(&self) -> String { + self.artist.as_deref().unwrap_or_default().to_string() + + self.name.as_deref().unwrap_or_default() + } } fn datetime_to_timestamp_millis(datetime: OffsetDateTime) -> i64 { - datetime.unix_timestamp() * 1000 + datetime.millisecond() as i64 + datetime.unix_timestamp() * 1000 + datetime.millisecond() as i64 } fn keep_true(value: Option) -> Option { - value.filter(|v| *v) + value.filter(|v| *v) } fn keep_filled(value: Option) -> Option { - value.filter(|v| v != "") + value.filter(|v| v != "") } struct CountInfo { - count: Option, - imported: Option, - dates: Option>, + count: Option, + imported: Option, + dates: Option>, } impl CountInfo { - fn new(count: Option, date: Option) -> CountInfo { - let mut imported_count = count.unwrap_or(0); - if imported_count == 0 { - return CountInfo { - count, - imported: None, - dates: None, - }; - } - // If we have a date (like play_date), add a play for it - let dates = date.map(|date| { - imported_count -= 1; - vec![datetime_to_timestamp_millis(date)] - }); - CountInfo { - count, - imported: Some(imported_count), - dates, - } - } + fn new(count: Option, date: Option) -> CountInfo { + let mut imported_count = count.unwrap_or(0); + if imported_count == 0 { + return CountInfo { + count, + imported: None, + dates: None, + }; + } + // If we have a date (like play_date), add a play for it + let dates = date.map(|date| { + imported_count -= 1; + vec![datetime_to_timestamp_millis(date)] + }); + CountInfo { + count, + imported: Some(imported_count), + dates, + } + } } fn parse_file_url(value: &str) -> Result { - let file_url = match url::Url::parse(value) { - Ok(url) => url, - Err(e) => throw!("Invalid track location: {}", e), - }; - match file_url.scheme() { - "file" => {} - _ => throw!("Invalid track location scheme: {}", value), - } - match file_url.to_file_path() { - Ok(path) => Ok(path), - Err(()) => throw!("Invalid track location host: {}", value), - } + let file_url = match url::Url::parse(value) { + Ok(url) => url, + Err(e) => throw!("Invalid track location: {}", e), + }; + match file_url.scheme() { + "file" => {} + _ => throw!("Invalid track location scheme: {}", value), + } + match file_url.to_file_path() { + Ok(path) => Ok(path), + Err(()) => throw!("Invalid track location host: {}", value), + } } /// Parses track but does not move it to `tracks_dir` fn parse_track( - xml_track: XmlTrack, - start_time: i64, - tracks_dir: &Path, + xml_track: XmlTrack, + start_time: i64, + tracks_dir: &Path, ) -> Result<(PathBuf, Track)> { - let xml_location = match xml_track.location { - Some(ref location) => location, - None => throw!("Missing track location"), - }; - if xml_track.track_type != Some("File".to_string()) { - return Err(nerr!( - "Track with type {}, expected \"File\"", - xml_track.track_type.as_deref().unwrap_or("unknown"), - )); - } - - // Unlike "Skip Date" etc, "Play Date" is a non-UTC Mac HFS+ timestamp, but - // luckily "Play Date UTC" is a normal date. - let play = CountInfo::new(xml_track.play_count, xml_track.play_date_utc); - - let skip = CountInfo::new(xml_track.skip_count, xml_track.skip_date); - - let xml_track_path = parse_file_url(xml_location)?; - - // this will also checks if the file exists - let file_md = read_file_metadata(&xml_track_path)?; - - let tagged_file = match lofty::read_from_path(&xml_track_path) { - Ok(tagged_file) => tagged_file, - Err(e) => throw!("Failed to read file information: {}", e), - }; - let audio_properties = tagged_file.properties(); - - let file_type = FileType::from_path(&xml_track_path)?; - { - // check that file type matches file extension - let lofty_file_type = FileType::from_lofty_file_type(tagged_file.file_type())?; - if file_type != lofty_file_type { - println!("File type mismatch: {} vs {}", file_type, lofty_file_type); - } - } - - let name = xml_track.name.unwrap_or_default(); - let artist = xml_track.artist.unwrap_or_default(); - let filename = generate_filename(tracks_dir, &artist, &name, file_type.file_extension()); - - let track = Track { - size: file_md.len() as i64, - duration: audio_properties.duration().as_secs_f64(), - bitrate: audio_properties - .audio_bitrate() - .ok_or(nerr!("Unknown bitrate"))? - .into(), - sampleRate: audio_properties - .audio_bitrate() - .ok_or(nerr!("Unknown sample rate"))? - .into(), - file: filename, - dateModified: datetime_to_timestamp_millis(xml_track.date_modified), - dateAdded: datetime_to_timestamp_millis(xml_track.date_added), - name, - importedFrom: Some("itunes".to_string()), - originalId: Some(xml_track.persistent_id), - artist, - composer: keep_filled(xml_track.composer), - sortName: keep_filled(xml_track.sort_name), - sortArtist: keep_filled(xml_track.sort_artist), - sortComposer: keep_filled(xml_track.sort_composer), - genre: keep_filled(xml_track.genre), - rating: xml_track.rating, - year: xml_track.year, - bpm: xml_track.bpm.map(|bpm| bpm.into()), - comments: keep_filled(xml_track.comments), - grouping: keep_filled(xml_track.grouping), - liked: keep_true(xml_track.loved), - disliked: keep_true(xml_track.disliked), - disabled: keep_true(xml_track.disabled), - compilation: keep_true(xml_track.compilation), - albumName: keep_filled(xml_track.album), - albumArtist: keep_filled(xml_track.album_artist), - sortAlbumName: keep_filled(xml_track.sort_album), - sortAlbumArtist: keep_filled(xml_track.sort_album_artist), - trackNum: xml_track.track_number, - trackCount: xml_track.track_count, - discNum: xml_track.disc_number, - discCount: xml_track.disc_count, - dateImported: Some(start_time), - playCount: play.count, - plays: play.dates, - playsImported: play.imported.map(|count| { - vec![CountObject { - count: count.into(), - fromDate: datetime_to_timestamp_millis(xml_track.date_added), - toDate: start_time, - }] - }), - skipCount: skip.count, - skips: skip.dates, - skipsImported: skip.imported.map(|count| { - vec![CountObject { - count: count.into(), - fromDate: datetime_to_timestamp_millis(xml_track.date_added), - toDate: start_time, - }] - }), - volume: match xml_track.volume_adjustment { - Some(0) | None => None, - Some(volume_adjustment) => { - let float: f32 = volume_adjustment.into(); - let vol = (float / 2.55).round() as i8; - if vol < -100 || vol > 100 { - throw!("Invalid volume adjustment: {}", volume_adjustment); - } - Some(vol) - } - }, - }; - - Ok((xml_track_path, track)) + let xml_location = match xml_track.location { + Some(ref location) => location, + None => throw!("Missing track location"), + }; + if xml_track.track_type != Some("File".to_string()) { + return Err(nerr!( + "Track with type {}, expected \"File\"", + xml_track.track_type.as_deref().unwrap_or("unknown"), + )); + } + + // Unlike "Skip Date" etc, "Play Date" is a non-UTC Mac HFS+ timestamp, but + // luckily "Play Date UTC" is a normal date. + let play = CountInfo::new(xml_track.play_count, xml_track.play_date_utc); + + let skip = CountInfo::new(xml_track.skip_count, xml_track.skip_date); + + let xml_track_path = parse_file_url(xml_location)?; + + // this will also checks if the file exists + let file_md = read_file_metadata(&xml_track_path)?; + + let tagged_file = match lofty::read_from_path(&xml_track_path) { + Ok(tagged_file) => tagged_file, + Err(e) => throw!("Failed to read file information: {}", e), + }; + let audio_properties = tagged_file.properties(); + + let file_type = FileType::from_path(&xml_track_path)?; + { + // check that file type matches file extension + let lofty_file_type = FileType::from_lofty_file_type(tagged_file.file_type())?; + if file_type != lofty_file_type { + println!("File type mismatch: {} vs {}", file_type, lofty_file_type); + } + } + + let name = xml_track.name.unwrap_or_default(); + let artist = xml_track.artist.unwrap_or_default(); + let filename = generate_filename(tracks_dir, &artist, &name, file_type.file_extension()); + + let track = Track { + size: file_md.len() as i64, + duration: audio_properties.duration().as_secs_f64(), + bitrate: audio_properties + .audio_bitrate() + .ok_or(nerr!("Unknown bitrate"))? + .into(), + sampleRate: audio_properties + .audio_bitrate() + .ok_or(nerr!("Unknown sample rate"))? + .into(), + file: filename, + dateModified: datetime_to_timestamp_millis(xml_track.date_modified), + dateAdded: datetime_to_timestamp_millis(xml_track.date_added), + name, + importedFrom: Some("itunes".to_string()), + originalId: Some(xml_track.persistent_id), + artist, + composer: keep_filled(xml_track.composer), + sortName: keep_filled(xml_track.sort_name), + sortArtist: keep_filled(xml_track.sort_artist), + sortComposer: keep_filled(xml_track.sort_composer), + genre: keep_filled(xml_track.genre), + rating: xml_track.rating, + year: xml_track.year, + bpm: xml_track.bpm.map(|bpm| bpm.into()), + comments: keep_filled(xml_track.comments), + grouping: keep_filled(xml_track.grouping), + liked: keep_true(xml_track.loved), + disliked: keep_true(xml_track.disliked), + disabled: keep_true(xml_track.disabled), + compilation: keep_true(xml_track.compilation), + albumName: keep_filled(xml_track.album), + albumArtist: keep_filled(xml_track.album_artist), + sortAlbumName: keep_filled(xml_track.sort_album), + sortAlbumArtist: keep_filled(xml_track.sort_album_artist), + trackNum: xml_track.track_number, + trackCount: xml_track.track_count, + discNum: xml_track.disc_number, + discCount: xml_track.disc_count, + dateImported: Some(start_time), + playCount: play.count, + plays: play.dates, + playsImported: play.imported.map(|count| { + vec![CountObject { + count: count.into(), + fromDate: datetime_to_timestamp_millis(xml_track.date_added), + toDate: start_time, + }] + }), + skipCount: skip.count, + skips: skip.dates, + skipsImported: skip.imported.map(|count| { + vec![CountObject { + count: count.into(), + fromDate: datetime_to_timestamp_millis(xml_track.date_added), + toDate: start_time, + }] + }), + volume: match xml_track.volume_adjustment { + Some(0) | None => None, + Some(volume_adjustment) => { + let float: f32 = volume_adjustment.into(); + let vol = (float / 2.55).round() as i8; + if vol < -100 || vol > 100 { + throw!("Invalid volume adjustment: {}", volume_adjustment); + } + Some(vol) + } + }, + }; + + Ok((xml_track_path, track)) } #[derive(Serialize, Deserialize, Clone, Debug)] struct XmlPlaylist { - #[serde(rename = "Name")] - name: String, + #[serde(rename = "Name")] + name: String, - #[serde(rename = "Description")] - description: Option, + #[serde(rename = "Description")] + description: Option, - #[serde(rename = "Loved")] - loved: Option, + #[serde(rename = "Loved")] + loved: Option, - #[serde(rename = "Disliked")] - disliked: Option, + #[serde(rename = "Disliked")] + disliked: Option, - #[serde(rename = "Visible")] - visible: Option, + #[serde(rename = "Visible")] + visible: Option, - #[serde(rename = "Smart Info")] - smart_info: Option, + #[serde(rename = "Smart Info")] + smart_info: Option, - #[serde(rename = "Playlist Persistent ID")] - playlist_persistent_id: String, + #[serde(rename = "Playlist Persistent ID")] + playlist_persistent_id: String, - #[serde(rename = "Parent Persistent ID")] - parent_persistent_id: Option, + #[serde(rename = "Parent Persistent ID")] + parent_persistent_id: Option, - /// Matches the type from the docs, but is 1-indexed instead of 0-indexed - /// https://developer.apple.com/documentation/ituneslibrary/itlibdistinguishedplaylistkind - #[serde(rename = "Distinguished Kind")] - distinguished_kind: Option, + /// Matches the type from the docs, but is 1-indexed instead of 0-indexed + /// https://developer.apple.com/documentation/ituneslibrary/itlibdistinguishedplaylistkind + #[serde(rename = "Distinguished Kind")] + distinguished_kind: Option, - #[serde(rename = "Folder")] - folder: Option, + #[serde(rename = "Folder")] + folder: Option, - #[serde(rename = "Playlist Items")] - playlist_items: Option>, + #[serde(rename = "Playlist Items")] + playlist_items: Option>, } impl XmlPlaylist { - fn is_importable_playlist(&self) -> bool { - // invisible playlists (should just be the "Library" playlist) - if self.visible == Some(false) { - return false; - }; - // smart playlists - if self.smart_info.is_some() { - return false; - }; - match self.distinguished_kind { - None | Some(1) => return true, - Some(_) => return false, // ignore special iTunes playlists - } - } + fn is_importable_playlist(&self) -> bool { + // invisible playlists (should just be the "Library" playlist) + if self.visible == Some(false) { + return false; + }; + // smart playlists + if self.smart_info.is_some() { + return false; + }; + match self.distinguished_kind { + None | Some(1) => return true, + Some(_) => return false, // ignore special iTunes playlists + } + } } #[derive(Serialize, Deserialize, Clone, Debug)] struct XmlPlaylistItem { - #[serde(rename = "Track ID")] - track_id: u64, + #[serde(rename = "Track ID")] + track_id: u64, } struct XmlPlaylistInfo { - xml_playlist: XmlPlaylist, - child_indexes: Vec, + xml_playlist: XmlPlaylist, + child_indexes: Vec, } /// Returns id of the imported playlist fn import_playlist( - infos: &Vec, - i: usize, - library: &mut Library, - start_time: i64, - errors: &mut Vec, - xml_track_id_map: &HashMap, + infos: &Vec, + i: usize, + library: &mut Library, + start_time: i64, + errors: &mut Vec, + xml_track_id_map: &HashMap, ) -> String { - let tracklist; - let xml_playlist = &infos[i].xml_playlist; - let id = library.generate_id(); - - if xml_playlist.folder == Some(true) { - let folder = TrackList::Folder(Folder { - id: id.clone(), - name: xml_playlist.name.clone(), - description: xml_playlist.description.clone(), - liked: xml_playlist.loved.unwrap_or_default(), - disliked: xml_playlist.disliked.unwrap_or_default(), - importedFrom: Some("itunes".to_string()), - originalId: Some(xml_playlist.playlist_persistent_id.clone()), - dateImported: Some(start_time), - dateCreated: None, - children: infos[i] - .child_indexes - .iter() - .map(|child_i| { - return import_playlist( - &infos, - *child_i, - library, - start_time, - errors, - xml_track_id_map, - ); - }) - .collect(), - }); - // immediately insert into library so new generated ids are unique - library.trackLists.insert(id.clone(), folder); - } else { - let mut track_ids = Vec::new(); - for playlist_item in xml_playlist.playlist_items.as_ref().unwrap() { - let track_id = xml_track_id_map.get(&playlist_item.track_id.to_string()); - match track_id { - Some(track_id) => track_ids.push(track_id.clone()), - None => errors.push(format!( - "Track with id {} not found in playlist {}", - playlist_item.track_id, xml_playlist.name - )), - } - } - - tracklist = TrackList::Playlist(Playlist { - id: id.clone(), - name: xml_playlist.name.clone(), - description: xml_playlist.description.clone(), - liked: xml_playlist.loved.unwrap_or_default(), - disliked: xml_playlist.disliked.unwrap_or_default(), - importedFrom: Some("itunes".to_string()), - originalId: Some(xml_playlist.playlist_persistent_id.clone()), - dateImported: Some(start_time), - dateCreated: None, - tracks: track_ids, - }); - // immediately insert into library so new generated ids are unique - library.trackLists.insert(id.clone(), tracklist); - } - id + let tracklist; + let xml_playlist = &infos[i].xml_playlist; + let id = library.generate_id(); + + if xml_playlist.folder == Some(true) { + let folder = TrackList::Folder(Folder { + id: id.clone(), + name: xml_playlist.name.clone(), + description: xml_playlist.description.clone(), + liked: xml_playlist.loved.unwrap_or_default(), + disliked: xml_playlist.disliked.unwrap_or_default(), + importedFrom: Some("itunes".to_string()), + originalId: Some(xml_playlist.playlist_persistent_id.clone()), + dateImported: Some(start_time), + dateCreated: None, + children: infos[i] + .child_indexes + .iter() + .map(|child_i| { + return import_playlist( + &infos, + *child_i, + library, + start_time, + errors, + xml_track_id_map, + ); + }) + .collect(), + }); + // immediately insert into library so new generated ids are unique + library.trackLists.insert(id.clone(), folder); + } else { + let mut track_ids = Vec::new(); + for playlist_item in xml_playlist.playlist_items.as_ref().unwrap() { + let track_id = xml_track_id_map.get(&playlist_item.track_id.to_string()); + match track_id { + Some(track_id) => track_ids.push(track_id.clone()), + None => errors.push(format!( + "Track with id {} not found in playlist {}", + playlist_item.track_id, xml_playlist.name + )), + } + } + + tracklist = TrackList::Playlist(Playlist { + id: id.clone(), + name: xml_playlist.name.clone(), + description: xml_playlist.description.clone(), + liked: xml_playlist.loved.unwrap_or_default(), + disliked: xml_playlist.disliked.unwrap_or_default(), + importedFrom: Some("itunes".to_string()), + originalId: Some(xml_playlist.playlist_persistent_id.clone()), + dateImported: Some(start_time), + dateCreated: None, + tracks: track_ids, + }); + // immediately insert into library so new generated ids are unique + library.trackLists.insert(id.clone(), tracklist); + } + id } #[napi(object)] pub struct ImportStatus { - pub errors: Vec, - pub tracks_count: i64, - pub playlists_count: i64, + pub errors: Vec, + pub tracks_count: i64, + pub playlists_count: i64, } #[napi] pub struct ItunesImport { - new_library: Mutex>, - /// iTunes path -> Ferrum file - itunes_track_paths: Mutex>, + new_library: Mutex>, + /// iTunes path -> Ferrum file + itunes_track_paths: Mutex>, } #[napi] impl ItunesImport { - #[napi(factory)] - pub fn new(env: Env) -> Result { - let data = get_data(&env)?; - Ok(Self { - new_library: Some(data.library.clone()).into(), - itunes_track_paths: HashMap::new().into(), - }) - } - #[napi] - pub async fn start(&self, path: String, tracks_dir: String) -> Result { - import_itunes(self, path, tracks_dir).await - } - #[napi] - pub fn finish(&mut self, env: Env) -> Result<()> { - let data = get_data(&env)?; - let itunes_track_paths = &mut *self.itunes_track_paths.lock().unwrap(); - for (itunes_path, ferrum_file) in itunes_track_paths { - let new_path = data.paths.tracks_dir.join(ferrum_file); - fs::copy(itunes_path, new_path).or(Err(nerr!("Error copying file")))?; - } - let new_library = &mut self.new_library.lock().unwrap(); - data.library = new_library.take().ok_or(nerr!("Not initialized"))?; - Ok(()) - } + #[napi(factory)] + pub fn new(env: Env) -> Result { + let data = get_data(&env)?; + Ok(Self { + new_library: Some(data.library.clone()).into(), + itunes_track_paths: HashMap::new().into(), + }) + } + #[napi] + pub async fn start(&self, path: String, tracks_dir: String) -> Result { + import_itunes(self, path, tracks_dir).await + } + #[napi] + pub fn finish(&mut self, env: Env) -> Result<()> { + let data = get_data(&env)?; + let itunes_track_paths = &mut *self.itunes_track_paths.lock().unwrap(); + for (itunes_path, ferrum_file) in itunes_track_paths { + let new_path = data.paths.tracks_dir.join(ferrum_file); + fs::copy(itunes_path, new_path).or(Err(nerr!("Error copying file")))?; + } + let new_library = &mut self.new_library.lock().unwrap(); + data.library = new_library.take().ok_or(nerr!("Not initialized"))?; + Ok(()) + } } pub async fn import_itunes( - itunes_import: &ItunesImport, - path: String, - tracks_dir: String, + itunes_import: &ItunesImport, + path: String, + tracks_dir: String, ) -> Result { - let new_library_lock = &mut *itunes_import.new_library.lock().unwrap(); - let mut library = match new_library_lock { - Some(library) => library, - None => throw!("Not initialized"), - }; - let mut itunes_track_paths = itunes_import.itunes_track_paths.lock().unwrap(); - let original_tracks_count = library.tracks.len(); - let original_tracklists_count = library.trackLists.len(); - let xml_lib: XmlLibrary = match plist::from_file(path) { - Ok(book) => book, - Err(e) => throw!("Unable to parse: {e}"), - }; - let mut errors = Vec::new(); - let start_time = get_now_timestamp(); - - // Library.xml version check - let version = - xml_lib.major_version.to_string() + "." + xml_lib.minor_version.to_string().as_str(); - if (xml_lib.major_version, xml_lib.minor_version) != (1, 1) { - errors.push(format!("Unsupported Library.xml version {version}")); - } - - let mut xml = xml_lib.deserialize_props()?; - - // iTunes ID -> Ferrum ID - let mut xml_track_id_map = HashMap::::new(); - - // We import the tracks that are in the "Music" playlist since xml.tracks - // contains podcasts, etc. - let xml_music_playlist = XmlLibraryProps::get_music_playlist(&xml.playlists)?; - let playlist_items = &xml_music_playlist.playlist_items.as_ref().unwrap(); - let track_count = playlist_items.len(); - for (i, playlist_item) in playlist_items.iter().enumerate() { - let xml_id = playlist_item.track_id.to_string(); - println!("Parsing tracks {}/{}", i + 1, track_count); - let xml_track = xml - .tracks - .remove(&xml_id) - .ok_or(nerr!("Track with id {} not found", playlist_item.track_id))?; - let artist_title = xml_track.artist_title(); - - if matches!(xml_track.name.as_deref(), Some("") | None) { - errors.push(format!("Missing track name: {artist_title}")); - } - if matches!(xml_track.artist.as_deref(), Some("") | None) { - errors.push(format!("Missing track artist: {artist_title}")); - } - - match parse_track(xml_track, start_time, Path::new(&tracks_dir)) { - Ok((xml_track_path, track)) => { - let generated_id = library.generate_id(); - // immediately insert into library so new generated ids are unique - itunes_track_paths.insert(xml_track_path, track.file.clone()); - library.tracks.insert(generated_id.clone(), track); - if xml_track_id_map.contains_key(&xml_id) { - errors.push(format!("Duplicate track ids \"{}\": artist_title", xml_id)); - } - xml_track_id_map.insert(xml_id, generated_id); - } - Err(e) => { - errors.push(format!("[{artist_title}] Skipped track: {e}")); - } - }; - } - - let importable_xml_playlists = { - let mut list = xml.take_importable_playlists(); - for xml_playlist in &mut list { - if xml_playlist.playlist_items.is_none() { - errors.push(format!( - "No playlist items list in playlist {}", - xml_playlist.name - )); - xml_playlist.playlist_items = Some(Vec::new()); - } - } - list - }; - - let xml_playlist_id_map = { - let mut map = HashMap::::new(); - for (i, playlist) in importable_xml_playlists.iter().enumerate() { - map.insert(playlist.playlist_persistent_id.clone(), i); - } - map - }; - - let (xml_playlist_infos, root_child_indexes) = { - // create infos - let mut xml_playlist_infos: Vec<_> = importable_xml_playlists - .iter() - .map(|p| { - return XmlPlaylistInfo { - xml_playlist: p.clone(), - child_indexes: Vec::new(), - }; - }) - .collect(); - - let mut root_child_indexes = Vec::new(); - - // add children to infos - for (i, xml_playlist) in importable_xml_playlists.iter().enumerate() { - if let Some(parent_id) = &xml_playlist.parent_persistent_id { - let parent_index = match xml_playlist_id_map.get(parent_id) { - Some(index) => index, - None => { - errors.push(format!( - "Playlist \"{}\" has non-existent parent id {}", - xml_playlist.name, parent_id - )); - continue; - } - }; - let parent = &mut xml_playlist_infos[*parent_index]; - parent.child_indexes.push(i); - } else { - root_child_indexes.push(i); - } - } - - (xml_playlist_infos, root_child_indexes) - }; - - // recursively import playlists - for i in root_child_indexes { - let playlist_id = import_playlist( - &xml_playlist_infos, - i, - &mut library, - start_time, - &mut errors, - &xml_track_id_map, - ); - let root = library.get_root_tracklist_mut()?; - root.children.push(playlist_id); - } - - Ok(ImportStatus { - errors, - tracks_count: (library.tracks.len() - original_tracks_count) as i64, - playlists_count: (library.trackLists.len() - original_tracklists_count) as i64, - }) + let new_library_lock = &mut *itunes_import.new_library.lock().unwrap(); + let mut library = match new_library_lock { + Some(library) => library, + None => throw!("Not initialized"), + }; + let mut itunes_track_paths = itunes_import.itunes_track_paths.lock().unwrap(); + let original_tracks_count = library.tracks.len(); + let original_tracklists_count = library.trackLists.len(); + let xml_lib: XmlLibrary = match plist::from_file(path) { + Ok(book) => book, + Err(e) => throw!("Unable to parse: {e}"), + }; + let mut errors = Vec::new(); + let start_time = get_now_timestamp(); + + // Library.xml version check + let version = + xml_lib.major_version.to_string() + "." + xml_lib.minor_version.to_string().as_str(); + if (xml_lib.major_version, xml_lib.minor_version) != (1, 1) { + errors.push(format!("Unsupported Library.xml version {version}")); + } + + let mut xml = xml_lib.deserialize_props()?; + + // iTunes ID -> Ferrum ID + let mut xml_track_id_map = HashMap::::new(); + + // We import the tracks that are in the "Music" playlist since xml.tracks + // contains podcasts, etc. + let xml_music_playlist = XmlLibraryProps::get_music_playlist(&xml.playlists)?; + let playlist_items = &xml_music_playlist.playlist_items.as_ref().unwrap(); + let track_count = playlist_items.len(); + for (i, playlist_item) in playlist_items.iter().enumerate() { + let xml_id = playlist_item.track_id.to_string(); + println!("Parsing tracks {}/{}", i + 1, track_count); + let xml_track = xml + .tracks + .remove(&xml_id) + .ok_or(nerr!("Track with id {} not found", playlist_item.track_id))?; + let artist_title = xml_track.artist_title(); + + if matches!(xml_track.name.as_deref(), Some("") | None) { + errors.push(format!("Missing track name: {artist_title}")); + } + if matches!(xml_track.artist.as_deref(), Some("") | None) { + errors.push(format!("Missing track artist: {artist_title}")); + } + + match parse_track(xml_track, start_time, Path::new(&tracks_dir)) { + Ok((xml_track_path, track)) => { + let generated_id = library.generate_id(); + // immediately insert into library so new generated ids are unique + itunes_track_paths.insert(xml_track_path, track.file.clone()); + library.tracks.insert(generated_id.clone(), track); + if xml_track_id_map.contains_key(&xml_id) { + errors.push(format!("Duplicate track ids \"{}\": artist_title", xml_id)); + } + xml_track_id_map.insert(xml_id, generated_id); + } + Err(e) => { + errors.push(format!("[{artist_title}] Skipped track: {e}")); + } + }; + } + + let importable_xml_playlists = { + let mut list = xml.take_importable_playlists(); + for xml_playlist in &mut list { + if xml_playlist.playlist_items.is_none() { + errors.push(format!( + "No playlist items list in playlist {}", + xml_playlist.name + )); + xml_playlist.playlist_items = Some(Vec::new()); + } + } + list + }; + + let xml_playlist_id_map = { + let mut map = HashMap::::new(); + for (i, playlist) in importable_xml_playlists.iter().enumerate() { + map.insert(playlist.playlist_persistent_id.clone(), i); + } + map + }; + + let (xml_playlist_infos, root_child_indexes) = { + // create infos + let mut xml_playlist_infos: Vec<_> = importable_xml_playlists + .iter() + .map(|p| { + return XmlPlaylistInfo { + xml_playlist: p.clone(), + child_indexes: Vec::new(), + }; + }) + .collect(); + + let mut root_child_indexes = Vec::new(); + + // add children to infos + for (i, xml_playlist) in importable_xml_playlists.iter().enumerate() { + if let Some(parent_id) = &xml_playlist.parent_persistent_id { + let parent_index = match xml_playlist_id_map.get(parent_id) { + Some(index) => index, + None => { + errors.push(format!( + "Playlist \"{}\" has non-existent parent id {}", + xml_playlist.name, parent_id + )); + continue; + } + }; + let parent = &mut xml_playlist_infos[*parent_index]; + parent.child_indexes.push(i); + } else { + root_child_indexes.push(i); + } + } + + (xml_playlist_infos, root_child_indexes) + }; + + // recursively import playlists + for i in root_child_indexes { + let playlist_id = import_playlist( + &xml_playlist_infos, + i, + &mut library, + start_time, + &mut errors, + &xml_track_id_map, + ); + let root = library.get_root_tracklist_mut()?; + root.children.push(playlist_id); + } + + Ok(ImportStatus { + errors, + tracks_count: (library.tracks.len() - original_tracks_count) as i64, + playlists_count: (library.trackLists.len() - original_tracklists_count) as i64, + }) } #[tokio::test] async fn import_itunes_test() { - let library_xml_path = "src-native/tests/Library.xml".to_string(); - let _xml: XmlLibrary = plist::from_file(library_xml_path).unwrap(); + let library_xml_path = "src-native/tests/Library.xml".to_string(); + let _xml: XmlLibrary = plist::from_file(library_xml_path).unwrap(); } diff --git a/src-native/js.rs b/src-native/js.rs index 4cfd8c5..a487a29 100644 --- a/src-native/js.rs +++ b/src-native/js.rs @@ -5,21 +5,21 @@ use std::io::Write; // Create NapiError from string pub fn nerr(msg: &str) -> NapiError { - return NapiError::from_reason(msg.to_owned()); + return NapiError::from_reason(msg.to_owned()); } #[napi] #[allow(dead_code)] fn copy_file(from: String, to: String) -> napi::Result<()> { - match copy(from, to) { - Ok(_) => Ok(()), - Err(err) => Err(err.into()), - } + match copy(from, to) { + Ok(_) => Ok(()), + Err(err) => Err(err.into()), + } } #[napi] #[allow(dead_code)] fn atomic_file_save(file_path: String, content: String) { - let af = AtomicFile::new(file_path, AllowOverwrite); - af.write(|f| f.write_all(content.as_bytes())).unwrap(); + let af = AtomicFile::new(file_path, AllowOverwrite); + af.write(|f| f.write_all(content.as_bytes())).unwrap(); } diff --git a/src-native/lib.rs b/src-native/lib.rs index 7d8e681..f469119 100644 --- a/src-native/lib.rs +++ b/src-native/lib.rs @@ -6,15 +6,15 @@ use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; macro_rules! nerr { - ($($arg:tt)*) => { - napi::Error::from_reason(format!($($arg)*).to_owned()) - } + ($($arg:tt)*) => { + napi::Error::from_reason(format!($($arg)*).to_owned()) + } } macro_rules! throw { - ($($arg:tt)*) => { - return crate::UniResult::Err(format!($($arg)*).into()).map_err(|e| e.into()) - } + ($($arg:tt)*) => { + return crate::UniResult::Err(format!($($arg)*).into()).map_err(|e| e.into()) + } } #[macro_use] @@ -35,69 +35,69 @@ mod sort; mod tracks; fn get_now_timestamp() -> i64 { - let timestamp = match SystemTime::now().duration_since(UNIX_EPOCH) { - Ok(n) => n.as_millis() as i64, - Err(err) => err.duration().as_millis() as i64, - }; - return timestamp; + let timestamp = match SystemTime::now().duration_since(UNIX_EPOCH) { + Ok(n) => n.as_millis() as i64, + Err(err) => err.duration().as_millis() as i64, + }; + return timestamp; } fn sys_time_to_timestamp(sys_time: &SystemTime) -> i64 { - let timestamp = match sys_time.duration_since(UNIX_EPOCH) { - Ok(n) => n.as_millis() as i64, - Err(err) => err.duration().as_millis() as i64, - }; - return timestamp; + let timestamp = match sys_time.duration_since(UNIX_EPOCH) { + Ok(n) => n.as_millis() as i64, + Err(err) => err.duration().as_millis() as i64, + }; + return timestamp; } fn str_to_option(s: String) -> Option { - match s.as_str() { - "" => None, - _ => Some(s), - } + match s.as_str() { + "" => None, + _ => Some(s), + } } pub type UniResult = std::result::Result; pub struct UniError { - pub message: String, + pub message: String, } impl From for UniError { - fn from(message: String) -> Self { - Self { message } - } + fn from(message: String) -> Self { + Self { message } + } } impl From<&str> for UniError { - fn from(message: &str) -> Self { - Self { - message: message.to_string(), - } - } + fn from(message: &str) -> Self { + Self { + message: message.to_string(), + } + } } impl From for napi::Error { - fn from(ue: UniError) -> Self { - Self::from_reason(ue.message) - } + fn from(ue: UniError) -> Self { + Self::from_reason(ue.message) + } } impl From for UniError { - fn from(mut n_err: napi::Error) -> Self { - let message = mem::replace(&mut n_err.reason, "".to_string()); - UniError { message } - } + fn from(mut n_err: napi::Error) -> Self { + let message = mem::replace(&mut n_err.reason, "".to_string()); + UniError { message } + } } fn path_to_json(path: PathBuf) -> UniResult where - J: DeserializeOwned, + J: DeserializeOwned, { - let file = match File::open(path) { - Ok(f) => f, - Err(err) => throw!("Error opening file: {}", err), - }; - let reader = BufReader::new(file); - let json = match serde_json::from_reader(reader) { - Ok(json) => json, - Err(err) => throw!("Error parsing file: {:?}", err), - }; - Ok(json) + let file = match File::open(path) { + Ok(f) => f, + Err(err) => throw!("Error opening file: {}", err), + }; + let reader = BufReader::new(file); + let json = match serde_json::from_reader(reader) { + Ok(json) => json, + Err(err) => throw!("Error parsing file: {:?}", err), + }; + Ok(json) } diff --git a/src-native/library.rs b/src-native/library.rs index 5465c96..7b49a1a 100644 --- a/src-native/library.rs +++ b/src-native/library.rs @@ -8,111 +8,111 @@ use std::time::Instant; #[derive(Serialize, Deserialize)] pub struct Paths { - pub library_dir: PathBuf, - pub tracks_dir: PathBuf, - pub library_json: PathBuf, - pub local_data_dir: PathBuf, + pub library_dir: PathBuf, + pub tracks_dir: PathBuf, + pub library_json: PathBuf, + pub local_data_dir: PathBuf, } impl Paths { - fn ensure_dirs_exists(&self) -> Result<(), Error> { - create_dir_all(&self.library_dir)?; - create_dir_all(&self.tracks_dir)?; - create_dir_all(&self.local_data_dir)?; - return Ok(()); - } + fn ensure_dirs_exists(&self) -> Result<(), Error> { + create_dir_all(&self.library_dir)?; + create_dir_all(&self.tracks_dir)?; + create_dir_all(&self.local_data_dir)?; + return Ok(()); + } } pub fn load_library(paths: &Paths) -> UniResult { - let mut now = Instant::now(); + let mut now = Instant::now(); - match paths.ensure_dirs_exists() { - Ok(_) => {} - Err(err) => throw!("Error ensuring folder exists: {}", err), - }; - println!( - "Loading library at path: {}", - paths.library_dir.to_string_lossy() - ); + match paths.ensure_dirs_exists() { + Ok(_) => {} + Err(err) => throw!("Error ensuring folder exists: {}", err), + }; + println!( + "Loading library at path: {}", + paths.library_dir.to_string_lossy() + ); - let versioned_library = match File::open(&paths.library_json) { - Ok(mut file) => { - let mut json_str = String::new(); - match file.read_to_string(&mut json_str) { - Ok(_) => {} - Err(err) => throw!("Error reading library file: {}", err), - }; - println!("Read library: {}ms", now.elapsed().as_millis()); - now = Instant::now(); + let versioned_library = match File::open(&paths.library_json) { + Ok(mut file) => { + let mut json_str = String::new(); + match file.read_to_string(&mut json_str) { + Ok(_) => {} + Err(err) => throw!("Error reading library file: {}", err), + }; + println!("Read library: {}ms", now.elapsed().as_millis()); + now = Instant::now(); - let versioned_library: VersionedLibrary = match serde_json::from_str(&mut json_str) { - Ok(library) => library, - Err(err) => throw!("Error parsing library file: {:?}", err), - }; + let versioned_library: VersionedLibrary = match serde_json::from_str(&mut json_str) { + Ok(library) => library, + Err(err) => throw!("Error parsing library file: {:?}", err), + }; - println!("Parse library: {}ms", now.elapsed().as_millis()); - versioned_library - } - Err(err) => match err.kind() { - ErrorKind::NotFound => { - return Ok(Library::new()); - } - _err_kind => throw!("Error opening library file: {}", err), - }, - }; + println!("Parse library: {}ms", now.elapsed().as_millis()); + versioned_library + } + Err(err) => match err.kind() { + ErrorKind::NotFound => { + return Ok(Library::new()); + } + _err_kind => throw!("Error opening library file: {}", err), + }, + }; - Ok(versioned_library.upgrade()) + Ok(versioned_library.upgrade()) } pub enum TrackField { - String, - F64, - I64, - U32, - I8, - U8, - Bool, + String, + F64, + I64, + U32, + I8, + U8, + Bool, } pub fn get_track_field_type(field: &str) -> Option { - let field = match field { - "size" => TrackField::I64, - "duration" => TrackField::F64, - "bitrate" => TrackField::F64, - "sampleRate" => TrackField::F64, - "file" => TrackField::String, - "dateModified" => TrackField::I64, - "dateAdded" => TrackField::I64, - "name" => TrackField::String, - "importedFrom" => TrackField::String, - "originalId" => TrackField::String, - "artist" => TrackField::String, - "composer" => TrackField::String, - "sortName" => TrackField::String, - "sortArtist" => TrackField::String, - "sortComposer" => TrackField::String, - "genre" => TrackField::String, - "rating" => TrackField::U8, - "year" => TrackField::I64, - "bpm" => TrackField::F64, - "comments" => TrackField::String, - "grouping" => TrackField::String, - "liked" => TrackField::Bool, - "disliked" => TrackField::Bool, - "disabled" => TrackField::Bool, - "compilation" => TrackField::Bool, - "albumName" => TrackField::String, - "albumArtist" => TrackField::String, - "sortAlbumName" => TrackField::String, - "sortAlbumArtist" => TrackField::String, - "trackNum" => TrackField::U32, - "trackCount" => TrackField::U32, - "discNum" => TrackField::U32, - "discCount" => TrackField::U32, - "dateImported" => TrackField::I64, - "playCount" => TrackField::U32, - "skipCount" => TrackField::U32, - "volume" => TrackField::I8, - _ => return None, - }; - return Some(field); + let field = match field { + "size" => TrackField::I64, + "duration" => TrackField::F64, + "bitrate" => TrackField::F64, + "sampleRate" => TrackField::F64, + "file" => TrackField::String, + "dateModified" => TrackField::I64, + "dateAdded" => TrackField::I64, + "name" => TrackField::String, + "importedFrom" => TrackField::String, + "originalId" => TrackField::String, + "artist" => TrackField::String, + "composer" => TrackField::String, + "sortName" => TrackField::String, + "sortArtist" => TrackField::String, + "sortComposer" => TrackField::String, + "genre" => TrackField::String, + "rating" => TrackField::U8, + "year" => TrackField::I64, + "bpm" => TrackField::F64, + "comments" => TrackField::String, + "grouping" => TrackField::String, + "liked" => TrackField::Bool, + "disliked" => TrackField::Bool, + "disabled" => TrackField::Bool, + "compilation" => TrackField::Bool, + "albumName" => TrackField::String, + "albumArtist" => TrackField::String, + "sortAlbumName" => TrackField::String, + "sortAlbumArtist" => TrackField::String, + "trackNum" => TrackField::U32, + "trackCount" => TrackField::U32, + "discNum" => TrackField::U32, + "discCount" => TrackField::U32, + "dateImported" => TrackField::I64, + "playCount" => TrackField::U32, + "skipCount" => TrackField::U32, + "volume" => TrackField::I8, + _ => return None, + }; + return Some(field); } diff --git a/src-native/library_types.rs b/src-native/library_types.rs index 47e4aaf..5423a5b 100644 --- a/src-native/library_types.rs +++ b/src-native/library_types.rs @@ -9,151 +9,151 @@ use std::borrow::Cow; #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(deny_unknown_fields)] pub struct Library { - pub tracks: LinkedHashMap, - pub trackLists: TrackLists, - /// v1 playtime has two issues: - /// - some durations are double counted (or triple, etc.) - /// - timestamps aren't updated after pausing - pub v1PlayTime: Vec, - pub playTime: Vec, + pub tracks: LinkedHashMap, + pub trackLists: TrackLists, + /// v1 playtime has two issues: + /// - some durations are double counted (or triple, etc.) + /// - timestamps aren't updated after pausing + pub v1PlayTime: Vec, + pub playTime: Vec, } impl Library { - pub fn versioned(&self) -> VersionedLibrary { - VersionedLibrary::V2(Cow::Borrowed(self)) - } + pub fn versioned(&self) -> VersionedLibrary { + VersionedLibrary::V2(Cow::Borrowed(self)) + } } #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(tag = "version", deny_unknown_fields)] pub enum VersionedLibrary<'a> { - #[serde(rename = 1)] - V1(Cow<'a, V1Library>), - #[serde(rename = 2)] - V2(Cow<'a, Library>), + #[serde(rename = 1)] + V1(Cow<'a, V1Library>), + #[serde(rename = 2)] + V2(Cow<'a, Library>), } impl VersionedLibrary<'_> { - pub fn upgrade(self) -> Library { - match self { - VersionedLibrary::V1(v1) => v1.into_owned().upgrade(), - VersionedLibrary::V2(v2) => v2.into_owned(), - } - } + pub fn upgrade(self) -> Library { + match self { + VersionedLibrary::V1(v1) => v1.into_owned().upgrade(), + VersionedLibrary::V2(v2) => v2.into_owned(), + } + } } #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(deny_unknown_fields)] pub struct V1Library { - pub tracks: LinkedHashMap, - pub trackLists: TrackLists, - pub playTime: Vec, + pub tracks: LinkedHashMap, + pub trackLists: TrackLists, + pub playTime: Vec, } impl V1Library { - pub fn upgrade(self) -> Library { - Library { - tracks: self.tracks, - trackLists: self.trackLists, - v1PlayTime: self.playTime, - playTime: Vec::new(), - } - } + pub fn upgrade(self) -> Library { + Library { + tracks: self.tracks, + trackLists: self.trackLists, + v1PlayTime: self.playTime, + playTime: Vec::new(), + } + } } impl Library { - pub fn new() -> Self { - let mut track_lists = LinkedHashMap::new(); - let root = Special { - id: "root".to_string(), - name: SpecialTrackListName::Root, - dateCreated: get_now_timestamp(), - children: Vec::new(), - }; - track_lists.insert("root".to_string(), TrackList::Special(root)); - Library { - v1PlayTime: Vec::new(), - playTime: Vec::new(), - tracks: LinkedHashMap::new(), - trackLists: track_lists, - } - } - pub fn generate_id(&self) -> String { - let alphabet: [char; 32] = [ - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', - 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7', - ]; - for _ in 0..1000 { - let id = nanoid!(7, &alphabet); - if !self.tracks.contains_key(&id) && !self.trackLists.contains_key(&id) { - return id; - } - } - panic!("Error generating ID: Generated IDs already exist") - } - pub fn new_playlist(&self, name: String, description: Option) -> Playlist { - Playlist { - id: self.generate_id(), - name, - description, - liked: false, - disliked: false, - importedFrom: None, - originalId: None, - dateImported: None, - dateCreated: Some(get_now_timestamp()), - tracks: Vec::new(), - } - } - pub fn new_folder(&self, name: String, description: Option) -> Folder { - Folder { - id: self.generate_id(), - name, - description, - liked: false, - disliked: false, - importedFrom: None, - originalId: None, - dateImported: None, - dateCreated: Some(get_now_timestamp()), - children: Vec::new(), - } - } - pub fn get_track(&self, id: &str) -> UniResult<&Track> { - match self.tracks.get(id) { - Some(track) => Ok(track), - None => throw!("Track with ID {} not found", id), - } - } - pub fn get_tracklist(&self, id: &str) -> UniResult<&TrackList> { - let tracklist = self.trackLists.get(id); - Ok(tracklist.ok_or("Playlist ID not found")?) - } - pub fn get_tracklist_mut(&mut self, id: &str) -> UniResult<&mut TrackList> { - let tracklist = self.trackLists.get_mut(id); - Ok(tracklist.ok_or("Playlist ID not found")?) - } - pub fn get_root_tracklist_mut(&mut self) -> UniResult<&mut Special> { - let tracklist = self.trackLists.get_mut("root"); - match tracklist { - Some(TrackList::Special(special)) => match special.name { - SpecialTrackListName::Root => Ok(special), - }, - _ => throw!("Root playlist not found"), - } - } - pub fn get_parent_id(&self, id: &str) -> Option { - for (parent_id, tracklist) in &self.trackLists { - let children = match tracklist { - TrackList::Playlist(_) => continue, - TrackList::Folder(list) => &list.children, - TrackList::Special(list) => &list.children, - }; - for child_id in children { - if child_id == id { - return Some(parent_id.to_string()); - } - } - } - None - } + pub fn new() -> Self { + let mut track_lists = LinkedHashMap::new(); + let root = Special { + id: "root".to_string(), + name: SpecialTrackListName::Root, + dateCreated: get_now_timestamp(), + children: Vec::new(), + }; + track_lists.insert("root".to_string(), TrackList::Special(root)); + Library { + v1PlayTime: Vec::new(), + playTime: Vec::new(), + tracks: LinkedHashMap::new(), + trackLists: track_lists, + } + } + pub fn generate_id(&self) -> String { + let alphabet: [char; 32] = [ + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', + 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7', + ]; + for _ in 0..1000 { + let id = nanoid!(7, &alphabet); + if !self.tracks.contains_key(&id) && !self.trackLists.contains_key(&id) { + return id; + } + } + panic!("Error generating ID: Generated IDs already exist") + } + pub fn new_playlist(&self, name: String, description: Option) -> Playlist { + Playlist { + id: self.generate_id(), + name, + description, + liked: false, + disliked: false, + importedFrom: None, + originalId: None, + dateImported: None, + dateCreated: Some(get_now_timestamp()), + tracks: Vec::new(), + } + } + pub fn new_folder(&self, name: String, description: Option) -> Folder { + Folder { + id: self.generate_id(), + name, + description, + liked: false, + disliked: false, + importedFrom: None, + originalId: None, + dateImported: None, + dateCreated: Some(get_now_timestamp()), + children: Vec::new(), + } + } + pub fn get_track(&self, id: &str) -> UniResult<&Track> { + match self.tracks.get(id) { + Some(track) => Ok(track), + None => throw!("Track with ID {} not found", id), + } + } + pub fn get_tracklist(&self, id: &str) -> UniResult<&TrackList> { + let tracklist = self.trackLists.get(id); + Ok(tracklist.ok_or("Playlist ID not found")?) + } + pub fn get_tracklist_mut(&mut self, id: &str) -> UniResult<&mut TrackList> { + let tracklist = self.trackLists.get_mut(id); + Ok(tracklist.ok_or("Playlist ID not found")?) + } + pub fn get_root_tracklist_mut(&mut self) -> UniResult<&mut Special> { + let tracklist = self.trackLists.get_mut("root"); + match tracklist { + Some(TrackList::Special(special)) => match special.name { + SpecialTrackListName::Root => Ok(special), + }, + _ => throw!("Root playlist not found"), + } + } + pub fn get_parent_id(&self, id: &str) -> Option { + for (parent_id, tracklist) in &self.trackLists { + let children = match tracklist { + TrackList::Playlist(_) => continue, + TrackList::Folder(list) => &list.children, + TrackList::Special(list) => &list.children, + }; + for child_id in children { + if child_id == id { + return Some(parent_id.to_string()); + } + } + } + None + } } pub type TrackID = String; @@ -169,183 +169,183 @@ pub type PlayTime = (TrackID, MsSinceUnixEpoch, i64); #[derive(Serialize, Deserialize, Clone, Debug)] #[napi(object)] pub struct Track { - pub size: i64, - pub duration: f64, - pub bitrate: f64, - pub sampleRate: f64, - pub file: String, - pub dateModified: MsSinceUnixEpoch, - pub dateAdded: MsSinceUnixEpoch, - pub name: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub importedFrom: Option, - /// Imported ID, like iTunes Persistent ID - #[serde(default, skip_serializing_if = "Option::is_none")] - pub originalId: Option, - #[serde(default)] - pub artist: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub composer: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub sortName: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub sortArtist: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub sortComposer: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub genre: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub rating: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub year: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub bpm: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub comments: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub grouping: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub liked: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub disliked: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub disabled: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub compilation: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub albumName: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub albumArtist: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub sortAlbumName: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub sortAlbumArtist: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub trackNum: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub trackCount: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub discNum: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub discCount: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub dateImported: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub playCount: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub plays: Option>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub playsImported: Option>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub skipCount: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub skips: Option>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub skipsImported: Option>, - /// -100 to 100 - #[serde(default, skip_serializing_if = "Option::is_none")] - pub volume: Option, + pub size: i64, + pub duration: f64, + pub bitrate: f64, + pub sampleRate: f64, + pub file: String, + pub dateModified: MsSinceUnixEpoch, + pub dateAdded: MsSinceUnixEpoch, + pub name: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub importedFrom: Option, + /// Imported ID, like iTunes Persistent ID + #[serde(default, skip_serializing_if = "Option::is_none")] + pub originalId: Option, + #[serde(default)] + pub artist: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub composer: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sortName: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sortArtist: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sortComposer: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub genre: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub rating: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub year: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub bpm: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub comments: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub grouping: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub liked: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub disliked: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub disabled: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub compilation: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub albumName: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub albumArtist: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sortAlbumName: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sortAlbumArtist: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub trackNum: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub trackCount: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub discNum: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub discCount: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub dateImported: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub playCount: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub plays: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub playsImported: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub skipCount: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub skips: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub skipsImported: Option>, + /// -100 to 100 + #[serde(default, skip_serializing_if = "Option::is_none")] + pub volume: Option, } #[derive(Serialize, Deserialize, Clone, Debug)] #[napi(object)] pub struct CountObject { - pub count: i64, - pub fromDate: MsSinceUnixEpoch, - pub toDate: MsSinceUnixEpoch, + pub count: i64, + pub fromDate: MsSinceUnixEpoch, + pub toDate: MsSinceUnixEpoch, } #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(tag = "type")] pub enum TrackList { - #[serde(rename = "playlist")] - Playlist(Playlist), - #[serde(rename = "folder")] - Folder(Folder), - #[serde(rename = "special")] - Special(Special), + #[serde(rename = "playlist")] + Playlist(Playlist), + #[serde(rename = "folder")] + Folder(Folder), + #[serde(rename = "special")] + Special(Special), } impl TrackList { - pub fn id(&self) -> &str { - match self { - TrackList::Playlist(list) => &list.id, - TrackList::Folder(list) => &list.id, - TrackList::Special(list) => &list.id, - } - } + pub fn id(&self) -> &str { + match self { + TrackList::Playlist(list) => &list.id, + TrackList::Folder(list) => &list.id, + TrackList::Special(list) => &list.id, + } + } } // Shit, this should've been is_false fn is_true(value: &bool) -> bool { - *value + *value } #[derive(Serialize, Deserialize, Clone, Debug)] #[napi(object)] pub struct Playlist { - pub id: TrackListID, - pub name: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(default, skip_serializing_if = "is_true")] - pub liked: bool, - #[serde(default, skip_serializing_if = "is_true")] - pub disliked: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub importedFrom: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub originalId: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub dateImported: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub dateCreated: Option, - pub tracks: Vec, + pub id: TrackListID, + pub name: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(default, skip_serializing_if = "is_true")] + pub liked: bool, + #[serde(default, skip_serializing_if = "is_true")] + pub disliked: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub importedFrom: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub originalId: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub dateImported: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub dateCreated: Option, + pub tracks: Vec, } #[derive(Serialize, Deserialize, Clone, Debug)] #[napi(object)] pub struct Folder { - pub id: TrackListID, - pub name: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub description: Option, - #[serde(default, skip_serializing_if = "is_true")] - pub liked: bool, - #[serde(default, skip_serializing_if = "is_true")] - pub disliked: bool, - /// For example "itunes" - #[serde(default, skip_serializing_if = "Option::is_none")] - pub importedFrom: Option, - /// For example iTunes Persistent ID - #[serde(default, skip_serializing_if = "Option::is_none")] - pub originalId: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub dateImported: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub dateCreated: Option, - pub children: Vec, + pub id: TrackListID, + pub name: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(default, skip_serializing_if = "is_true")] + pub liked: bool, + #[serde(default, skip_serializing_if = "is_true")] + pub disliked: bool, + /// For example "itunes" + #[serde(default, skip_serializing_if = "Option::is_none")] + pub importedFrom: Option, + /// For example iTunes Persistent ID + #[serde(default, skip_serializing_if = "Option::is_none")] + pub originalId: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub dateImported: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub dateCreated: Option, + pub children: Vec, } #[derive(Serialize, Deserialize, Clone, Debug)] #[napi(object)] pub struct Special { - pub id: TrackListID, - pub name: SpecialTrackListName, - pub dateCreated: MsSinceUnixEpoch, - pub children: Vec, + pub id: TrackListID, + pub name: SpecialTrackListName, + pub dateCreated: MsSinceUnixEpoch, + pub children: Vec, } #[derive(Serialize, Deserialize, Debug)] #[non_exhaustive] #[napi] pub enum SpecialTrackListName { - Root, + Root, } impl ToString for SpecialTrackListName { - fn to_string(&self) -> String { - match self { - SpecialTrackListName::Root => "Root".to_owned(), - } - } + fn to_string(&self) -> String { + match self { + SpecialTrackListName::Root => "Root".to_owned(), + } + } } diff --git a/src-native/page.rs b/src-native/page.rs index 8b1369f..056fa18 100644 --- a/src-native/page.rs +++ b/src-native/page.rs @@ -12,218 +12,218 @@ use std::time::Instant; #[napi(js_name = "open_playlist")] #[allow(dead_code)] pub fn open_playlist(open_playlist_id: String, view_as: Option, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - data.open_playlist(open_playlist_id, view_as) + let data: &mut Data = get_data(&env)?; + data.open_playlist(open_playlist_id, view_as) } #[napi(js_name = "get_page_track")] #[allow(dead_code)] pub fn get_page_track(index: i64, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let page_track_ids = data.get_page_tracks(); - let track_id = page_track_ids.get(index as usize).ok_or(nerr!( - "Track index {} not found in open playlist", - index.to_string() - ))?; - let track = data - .library - .tracks - .get(track_id) - .ok_or(nerr("Track ID not found"))?; - return Ok(track.clone()); + let data: &mut Data = get_data(&env)?; + let page_track_ids = data.get_page_tracks(); + let track_id = page_track_ids.get(index as usize).ok_or(nerr!( + "Track index {} not found in open playlist", + index.to_string() + ))?; + let track = data + .library + .tracks + .get(track_id) + .ok_or(nerr("Track ID not found"))?; + return Ok(track.clone()); } #[napi(js_name = "get_page_track_id")] #[allow(dead_code)] pub fn get_page_track_id(index: i64, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let page_track_ids = data.get_page_tracks(); - let track_id = page_track_ids.get(index as usize).ok_or(nerr!( - "Track index {} not found in open playlist", - index.to_string() - ))?; - return env.create_string(track_id); + let data: &mut Data = get_data(&env)?; + let page_track_ids = data.get_page_tracks(); + let track_id = page_track_ids.get(index as usize).ok_or(nerr!( + "Track index {} not found in open playlist", + index.to_string() + ))?; + return env.create_string(track_id); } #[napi(js_name = "refresh_page")] #[allow(dead_code)] pub fn refresh(env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let sort_key = data.sort_key.clone(); - let sort_desc = data.sort_desc; - sort(data, &sort_key, sort_desc)?; - filter::filter(data, data.filter.clone()); - return env.get_undefined(); + let data: &mut Data = get_data(&env)?; + let sort_key = data.sort_key.clone(); + let sort_desc = data.sort_desc; + sort(data, &sort_key, sort_desc)?; + filter::filter(data, data.filter.clone()); + return env.get_undefined(); } #[napi(js_name = "get_page_track_ids")] #[allow(dead_code)] pub fn get_page_track_ids(env: Env) -> Result> { - let data: &mut Data = get_data(&env)?; - Ok(data.get_page_tracks().to_owned()) + let data: &mut Data = get_data(&env)?; + Ok(data.get_page_tracks().to_owned()) } fn get_tracklist_track_ids(data: &Data, playlist_id: &str) -> UniResult> { - match data.library.get_tracklist(playlist_id)? { - TrackList::Playlist(playlist) => { - let ids = playlist - .tracks - .iter() - .map(|track_id| track_id.to_string()) - .collect(); - Ok(ids) - } - TrackList::Folder(folder) => { - let mut ids: HashSet = HashSet::new(); - for child in &folder.children { - let child_ids = get_tracklist_track_ids(data, &child)?; - ids.extend(child_ids); - } - Ok(ids.into_iter().collect()) - } - TrackList::Special(special) => match special.name { - SpecialTrackListName::Root => { - let track_keys = data.library.tracks.keys(); - let ids = track_keys.map(|track| track.to_string()).collect(); - Ok(ids) - } - }, - } + match data.library.get_tracklist(playlist_id)? { + TrackList::Playlist(playlist) => { + let ids = playlist + .tracks + .iter() + .map(|track_id| track_id.to_string()) + .collect(); + Ok(ids) + } + TrackList::Folder(folder) => { + let mut ids: HashSet = HashSet::new(); + for child in &folder.children { + let child_ids = get_tracklist_track_ids(data, &child)?; + ids.extend(child_ids); + } + Ok(ids.into_iter().collect()) + } + TrackList::Special(special) => match special.name { + SpecialTrackListName::Root => { + let track_keys = data.library.tracks.keys(); + let ids = track_keys.map(|track| track.to_string()).collect(); + Ok(ids) + } + }, + } } pub fn get_track_ids(data: &Data) -> UniResult> { - let now = Instant::now(); - let ids = get_tracklist_track_ids(data, &data.open_playlist_id)?; - println!("Load page tracks: {}ms", now.elapsed().as_millis()); - Ok(ids) + let now = Instant::now(); + let ids = get_tracklist_track_ids(data, &data.open_playlist_id)?; + println!("Load page tracks: {}ms", now.elapsed().as_millis()); + Ok(ids) } #[napi] pub enum ViewAs { - Songs, - Artists, + Songs, + Artists, } impl Default for ViewAs { - fn default() -> Self { - Self::Songs - } + fn default() -> Self { + Self::Songs + } } #[napi(object)] pub struct PageInfo { - pub id: String, - pub view_as: ViewAs, - #[napi(ts_type = "TrackList")] - pub tracklist: JsUnknown, - pub sort_key: String, - pub sort_desc: bool, - pub length: i64, + pub id: String, + pub view_as: ViewAs, + #[napi(ts_type = "TrackList")] + pub tracklist: JsUnknown, + pub sort_key: String, + pub sort_desc: bool, + pub length: i64, } #[allow(dead_code)] #[napi(js_name = "get_page_info")] pub fn get_page_info(env: Env) -> Result { - let data = get_data(&env)?; - let tracklist = data.library.get_tracklist(&data.open_playlist_id)?; - - Ok(PageInfo { - id: data.open_playlist_id.clone(), - view_as: data.view_as, - tracklist: env.to_js_value(tracklist)?, - sort_key: data.sort_key.clone(), - sort_desc: data.sort_desc, - length: data.get_page_tracks().len().try_into().expect("Too long"), - }) + let data = get_data(&env)?; + let tracklist = data.library.get_tracklist(&data.open_playlist_id)?; + + Ok(PageInfo { + id: data.open_playlist_id.clone(), + view_as: data.view_as, + tracklist: env.to_js_value(tracklist)?, + sort_key: data.sort_key.clone(), + sort_desc: data.sort_desc, + length: data.get_page_tracks().len().try_into().expect("Too long"), + }) } #[napi(js_name = "set_group_album_tracks")] #[allow(dead_code)] pub fn set_group_album_tracks(value: bool, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - data.group_album_tracks = value; - env.get_undefined() + let data: &mut Data = get_data(&env)?; + data.group_album_tracks = value; + env.get_undefined() } #[napi(js_name = "sort")] #[allow(dead_code)] pub fn sort_js(sort_key: String, keep_filter: bool, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - - let old_sort_key = &data.sort_key; - if &sort_key == old_sort_key { - data.open_playlist_track_ids.reverse(); - data.sort_desc = !data.sort_desc; - } else { - let field = get_track_field_type(&sort_key); - let desc = match field { - Some(TrackField::String) => false, - _ => true, - }; - - sort(data, &sort_key, desc)?; - } - - if keep_filter { - filter::filter(data, data.filter.clone()); - } - return env.get_undefined(); + let data: &mut Data = get_data(&env)?; + + let old_sort_key = &data.sort_key; + if &sort_key == old_sort_key { + data.open_playlist_track_ids.reverse(); + data.sort_desc = !data.sort_desc; + } else { + let field = get_track_field_type(&sort_key); + let desc = match field { + Some(TrackField::String) => false, + _ => true, + }; + + sort(data, &sort_key, desc)?; + } + + if keep_filter { + filter::filter(data, data.filter.clone()); + } + return env.get_undefined(); } #[napi(object)] pub struct SelectionInfo { - pub from: u32, - pub to: u32, + pub from: u32, + pub to: u32, } #[napi(js_name = "move_tracks")] #[allow(dead_code)] pub fn move_tracks( - mut indexes_to_move: Vec, - to_index: u32, - env: Env, + mut indexes_to_move: Vec, + to_index: u32, + env: Env, ) -> Result { - let data: &mut Data = get_data(&env)?; - indexes_to_move.sort_unstable(); - indexes_to_move.dedup(); - let tracklist = data - .library - .trackLists - .get_mut(&data.open_playlist_id) - .ok_or(nerr!("Playlist ID not found"))?; - let playlist = match tracklist { - TrackList::Playlist(playlist) => playlist, - TrackList::Folder(_) => return Err(nerr!("Cannot rearrange tracks in folder")), - TrackList::Special(_) => return Err(nerr!("Cannot rearrange tracks in special playlist")), - }; - if data.sort_key != "index" || !data.sort_desc { - return Err(nerr!("Cannot rearrange when custom sorting is used")); - } - if data.filter != "" { - return Err(nerr!("Cannot rearrange when filter is used")); - } - let mut start_ids = Vec::new(); - let mut moved_ids = Vec::new(); - let mut end_ids = Vec::new(); - - let mut indexes_to_move = indexes_to_move.iter(); - let mut next_index = indexes_to_move.next().map(|n| *n as usize); - for i in 0..playlist.tracks.len() { - let id = playlist.tracks.remove(0); - if Some(i) == next_index { - next_index = indexes_to_move.next().map(|n| *n as usize); - moved_ids.push(id); - } else if i < to_index as usize { - start_ids.push(id); - } else { - end_ids.push(id); - } - } - let new_from = start_ids.len() as u32; - let new_to = new_from + moved_ids.len() as u32 - 1; - start_ids.append(&mut moved_ids); - start_ids.append(&mut end_ids); - playlist.tracks = start_ids; - Ok(SelectionInfo { - from: new_from, - to: new_to, - }) + let data: &mut Data = get_data(&env)?; + indexes_to_move.sort_unstable(); + indexes_to_move.dedup(); + let tracklist = data + .library + .trackLists + .get_mut(&data.open_playlist_id) + .ok_or(nerr!("Playlist ID not found"))?; + let playlist = match tracklist { + TrackList::Playlist(playlist) => playlist, + TrackList::Folder(_) => return Err(nerr!("Cannot rearrange tracks in folder")), + TrackList::Special(_) => return Err(nerr!("Cannot rearrange tracks in special playlist")), + }; + if data.sort_key != "index" || !data.sort_desc { + return Err(nerr!("Cannot rearrange when custom sorting is used")); + } + if data.filter != "" { + return Err(nerr!("Cannot rearrange when filter is used")); + } + let mut start_ids = Vec::new(); + let mut moved_ids = Vec::new(); + let mut end_ids = Vec::new(); + + let mut indexes_to_move = indexes_to_move.iter(); + let mut next_index = indexes_to_move.next().map(|n| *n as usize); + for i in 0..playlist.tracks.len() { + let id = playlist.tracks.remove(0); + if Some(i) == next_index { + next_index = indexes_to_move.next().map(|n| *n as usize); + moved_ids.push(id); + } else if i < to_index as usize { + start_ids.push(id); + } else { + end_ids.push(id); + } + } + let new_from = start_ids.len() as u32; + let new_to = new_from + moved_ids.len() as u32 - 1; + start_ids.append(&mut moved_ids); + start_ids.append(&mut end_ids); + playlist.tracks = start_ids; + Ok(SelectionInfo { + from: new_from, + to: new_to, + }) } diff --git a/src-native/playlists.rs b/src-native/playlists.rs index d7d8da6..3e8f654 100644 --- a/src-native/playlists.rs +++ b/src-native/playlists.rs @@ -11,417 +11,415 @@ use trash::macos::TrashContextExtMacos; #[napi(object)] pub struct TrackListDetails { - pub id: String, - pub name: String, - pub kind: String, - /// Folders only - pub children: Option>, + pub id: String, + pub name: String, + pub kind: String, + /// Folders only + pub children: Option>, } #[napi(js_name = "get_track_lists_details")] #[allow(dead_code)] pub fn get_track_lists_details(env: Env) -> Result> { - let data: &Data = get_data(&env)?; - Ok( - data - .library - .trackLists - .iter() - .map(|(id, tracklist)| { - return ( - id.clone(), - TrackListDetails { - id: id.clone(), - kind: match tracklist { - TrackList::Special(_) => "special".to_string(), - TrackList::Folder(_) => "folder".to_string(), - TrackList::Playlist(_) => "playlist".to_string(), - }, - name: match tracklist { - TrackList::Special(tracklist) => tracklist.name.to_string(), - TrackList::Folder(tracklist) => tracklist.name.clone(), - TrackList::Playlist(tracklist) => tracklist.name.clone(), - }, - children: match tracklist { - TrackList::Special(tracklist) => Some(tracklist.children.clone()), - TrackList::Folder(tracklist) => Some(tracklist.children.clone()), - _ => None, - }, - }, - ); - }) - .collect(), - ) + let data: &Data = get_data(&env)?; + Ok(data + .library + .trackLists + .iter() + .map(|(id, tracklist)| { + return ( + id.clone(), + TrackListDetails { + id: id.clone(), + kind: match tracklist { + TrackList::Special(_) => "special".to_string(), + TrackList::Folder(_) => "folder".to_string(), + TrackList::Playlist(_) => "playlist".to_string(), + }, + name: match tracklist { + TrackList::Special(tracklist) => tracklist.name.to_string(), + TrackList::Folder(tracklist) => tracklist.name.clone(), + TrackList::Playlist(tracklist) => tracklist.name.clone(), + }, + children: match tracklist { + TrackList::Special(tracklist) => Some(tracklist.children.clone()), + TrackList::Folder(tracklist) => Some(tracklist.children.clone()), + _ => None, + }, + }, + ); + }) + .collect()) } #[napi(js_name = "get_track_list", ts_return_type = "TrackList")] #[allow(dead_code)] pub fn get_track_list(id: String, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let tracklist = data.library.get_tracklist(&id)?; - env.to_js_value(&tracklist) + let data: &mut Data = get_data(&env)?; + let tracklist = data.library.get_tracklist(&id)?; + env.to_js_value(&tracklist) } fn get_child_ids_recursive( - library: &Library, - id: &String, - ids: &mut HashSet, + library: &Library, + id: &String, + ids: &mut HashSet, ) -> Result<()> { - let folder_children = match library.trackLists.get(id) { - Some(TrackList::Playlist(_)) => return Ok(()), - Some(TrackList::Folder(folder)) => folder.children.clone(), - Some(TrackList::Special(_)) => throw!("Cannot delete special track list"), - None => throw!("No track list with id {}", id), - }; - for child_id in &folder_children { - get_child_ids_recursive(library, &child_id, ids)?; - } - for new_id in folder_children { - let was_new = ids.insert(new_id.clone()); - if !was_new { - throw!("Duplicate track list id {new_id}"); - } - } - Ok(()) + let folder_children = match library.trackLists.get(id) { + Some(TrackList::Playlist(_)) => return Ok(()), + Some(TrackList::Folder(folder)) => folder.children.clone(), + Some(TrackList::Special(_)) => throw!("Cannot delete special track list"), + None => throw!("No track list with id {}", id), + }; + for child_id in &folder_children { + get_child_ids_recursive(library, &child_id, ids)?; + } + for new_id in folder_children { + let was_new = ids.insert(new_id.clone()); + if !was_new { + throw!("Duplicate track list id {new_id}"); + } + } + Ok(()) } fn remove_child_id(library: &mut Library, parent_id: &String, child_id: &String) -> Result<()> { - let parent = match library.trackLists.get_mut(parent_id) { - Some(tracklist) => tracklist, - None => throw!("Parent id {parent_id} not found"), - }; - let children = match parent { - TrackList::Playlist(_) => throw!("Parent id {parent_id} not found"), - TrackList::Folder(folder) => folder.children.clone(), - TrackList::Special(special) => match special.name { - SpecialTrackListName::Root => special.children.clone(), - }, - }; - let new_children: Vec = children - .clone() - .into_iter() - .filter(|id| id != child_id) - .collect(); - match children.len() - new_children.len() { - 0 => throw!("Parent id {child_id} does not contain child"), - 1 => (), - _ => throw!("Child id {child_id} found multiple times"), - }; - match parent { - TrackList::Playlist(_) => panic!(), - TrackList::Folder(folder) => folder.children = new_children, - TrackList::Special(special) => match special.name { - SpecialTrackListName::Root => special.children = new_children, - }, - }; - Ok(()) + let parent = match library.trackLists.get_mut(parent_id) { + Some(tracklist) => tracklist, + None => throw!("Parent id {parent_id} not found"), + }; + let children = match parent { + TrackList::Playlist(_) => throw!("Parent id {parent_id} not found"), + TrackList::Folder(folder) => folder.children.clone(), + TrackList::Special(special) => match special.name { + SpecialTrackListName::Root => special.children.clone(), + }, + }; + let new_children: Vec = children + .clone() + .into_iter() + .filter(|id| id != child_id) + .collect(); + match children.len() - new_children.len() { + 0 => throw!("Parent id {child_id} does not contain child"), + 1 => (), + _ => throw!("Child id {child_id} found multiple times"), + }; + match parent { + TrackList::Playlist(_) => panic!(), + TrackList::Folder(folder) => folder.children = new_children, + TrackList::Special(special) => match special.name { + SpecialTrackListName::Root => special.children = new_children, + }, + }; + Ok(()) } fn delete_track_list(data: &mut Data, id: String) -> Result<()> { - let parent_id = data - .library - .get_parent_id(&id) - .ok_or(nerr!("No parent found"))?; - - let mut ids = HashSet::new(); - ids.insert(id.clone()); - get_child_ids_recursive(&mut data.library, &id, &mut ids)?; - - if ids.contains(&parent_id) { - throw!("Parent id {parent_id} contains itself"); - } - remove_child_id(&mut data.library, &parent_id, &id)?; - for id in &ids { - data.library.trackLists.remove(id); - } - if ids.contains(&data.open_playlist_id) { - data.open_playlist("root".to_string(), None)?; - } - Ok(()) + let parent_id = data + .library + .get_parent_id(&id) + .ok_or(nerr!("No parent found"))?; + + let mut ids = HashSet::new(); + ids.insert(id.clone()); + get_child_ids_recursive(&mut data.library, &id, &mut ids)?; + + if ids.contains(&parent_id) { + throw!("Parent id {parent_id} contains itself"); + } + remove_child_id(&mut data.library, &parent_id, &id)?; + for id in &ids { + data.library.trackLists.remove(id); + } + if ids.contains(&data.open_playlist_id) { + data.open_playlist("root".to_string(), None)?; + } + Ok(()) } /// Returns the deleted track lists, including folder children #[napi(js_name = "delete_track_list")] #[allow(dead_code)] pub fn delete_track_list_js(id: String, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - delete_track_list(data, id) + let data: &mut Data = get_data(&env)?; + delete_track_list(data, id) } #[napi(js_name = "add_tracks_to_playlist")] #[allow(dead_code)] pub fn add_tracks(playlist_id: String, mut track_ids: Vec, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - let playlist = match data.library.get_tracklist_mut(&playlist_id)? { - TrackList::Playlist(playlist) => playlist, - TrackList::Folder(_) => throw!("Cannot add track to folder"), - TrackList::Special(_) => throw!("Cannot add track to special playlist"), - }; - playlist.tracks.append(&mut track_ids); - return Ok(()); + let data: &mut Data = get_data(&env)?; + let playlist = match data.library.get_tracklist_mut(&playlist_id)? { + TrackList::Playlist(playlist) => playlist, + TrackList::Folder(_) => throw!("Cannot add track to folder"), + TrackList::Special(_) => throw!("Cannot add track to special playlist"), + }; + playlist.tracks.append(&mut track_ids); + return Ok(()); } #[napi(js_name = "playlist_filter_duplicates")] #[allow(dead_code)] pub fn filter_duplicates(playlist_id: String, ids: Vec, env: Env) -> Result> { - let data: &mut Data = get_data(&env)?; - let mut track_ids: HashSet = HashSet::from_iter(ids); - let playlist = match data.library.get_tracklist_mut(&playlist_id)? { - TrackList::Playlist(playlist) => playlist, - _ => throw!("Cannot check if folder/special contains track"), - }; - for track in &playlist.tracks { - if track_ids.contains(track) { - track_ids.remove(track); - } - } - let track_ids: Vec = track_ids.into_iter().collect(); - Ok(track_ids) + let data: &mut Data = get_data(&env)?; + let mut track_ids: HashSet = HashSet::from_iter(ids); + let playlist = match data.library.get_tracklist_mut(&playlist_id)? { + TrackList::Playlist(playlist) => playlist, + _ => throw!("Cannot check if folder/special contains track"), + }; + for track in &playlist.tracks { + if track_ids.contains(track) { + track_ids.remove(track); + } + } + let track_ids: Vec = track_ids.into_iter().collect(); + Ok(track_ids) } #[napi(js_name = "remove_from_open_playlist")] #[allow(dead_code)] pub fn remove_from_open(mut indexes_to_remove: Vec, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - indexes_to_remove.sort_unstable(); - indexes_to_remove.dedup(); - let playlist = match data.library.get_tracklist_mut(&data.open_playlist_id)? { - TrackList::Playlist(playlist) => playlist, - TrackList::Folder(_) => throw!("Cannot remove track from folder"), - TrackList::Special(_) => throw!("Cannot remove track from special playlist"), - }; - if data.sort_key != "index" || !data.sort_desc { - throw!("Cannot remove track when custom sorting is used"); - } - if data.filter != "" { - throw!("Cannot remove track when filter is used"); - } - let mut new_list = Vec::new(); - let mut indexes_to_remove = indexes_to_remove.iter(); - let mut next_index = indexes_to_remove.next().map(|n| *n as usize); - for i in 0..playlist.tracks.len() { - let id = playlist.tracks.remove(0); - if Some(i) == next_index { - next_index = indexes_to_remove.next().map(|n| *n as usize); - } else { - new_list.push(id); - } - } - playlist.tracks = new_list; - return Ok(()); + let data: &mut Data = get_data(&env)?; + indexes_to_remove.sort_unstable(); + indexes_to_remove.dedup(); + let playlist = match data.library.get_tracklist_mut(&data.open_playlist_id)? { + TrackList::Playlist(playlist) => playlist, + TrackList::Folder(_) => throw!("Cannot remove track from folder"), + TrackList::Special(_) => throw!("Cannot remove track from special playlist"), + }; + if data.sort_key != "index" || !data.sort_desc { + throw!("Cannot remove track when custom sorting is used"); + } + if data.filter != "" { + throw!("Cannot remove track when filter is used"); + } + let mut new_list = Vec::new(); + let mut indexes_to_remove = indexes_to_remove.iter(); + let mut next_index = indexes_to_remove.next().map(|n| *n as usize); + for i in 0..playlist.tracks.len() { + let id = playlist.tracks.remove(0); + if Some(i) == next_index { + next_index = indexes_to_remove.next().map(|n| *n as usize); + } else { + new_list.push(id); + } + } + playlist.tracks = new_list; + return Ok(()); } fn remove_from_all_playlists(library: &mut Library, id: &str) { - for (_, tracklist) in &mut library.trackLists { - let playlist = match tracklist { - TrackList::Playlist(playlist) => playlist, - _ => continue, - }; - playlist.tracks.retain(|current_id| current_id != id); - } + for (_, tracklist) in &mut library.trackLists { + let playlist = match tracklist { + TrackList::Playlist(playlist) => playlist, + _ => continue, + }; + playlist.tracks.retain(|current_id| current_id != id); + } } fn get_page_ids(data: &mut Data, indexes: Vec) -> UniResult> { - let mut ids = Vec::new(); - let page_track_ids = data.get_page_tracks(); - for index in indexes { - let id = match page_track_ids.get(index as usize) { - Some(id) => id, - None => throw!("Track index not found"), - }; - ids.push(id.clone()); - } - Ok(ids) + let mut ids = Vec::new(); + let page_track_ids = data.get_page_tracks(); + for index in indexes { + let id = match page_track_ids.get(index as usize) { + Some(id) => id, + None => throw!("Track index not found"), + }; + ids.push(id.clone()); + } + Ok(ids) } fn delete_file(path: &PathBuf) -> UniResult<()> { - #[allow(unused_mut)] - let mut trash_context = trash::TrashContext::new(); + #[allow(unused_mut)] + let mut trash_context = trash::TrashContext::new(); - #[cfg(target_os = "macos")] - trash_context.set_delete_method(trash::macos::DeleteMethod::NsFileManager); + #[cfg(target_os = "macos")] + trash_context.set_delete_method(trash::macos::DeleteMethod::NsFileManager); - match trash_context.delete(&path) { - Ok(_) => Ok(()), - Err(_) => throw!("Failed moving file to trash: {}", path.to_string_lossy()), - } + match trash_context.delete(&path) { + Ok(_) => Ok(()), + Err(_) => throw!("Failed moving file to trash: {}", path.to_string_lossy()), + } } #[napi(js_name = "delete_tracks_in_open")] #[allow(dead_code)] pub fn delete_tracks_in_open(mut indexes_to_delete: Vec, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - indexes_to_delete.sort_unstable(); - indexes_to_delete.dedup(); - let ids_to_delete = get_page_ids(data, indexes_to_delete)?; - let library = &mut data.library; - - for id_to_delete in &ids_to_delete { - let file_path = { - let track = library.get_track(id_to_delete)?; - data.paths.tracks_dir.join(&track.file) - }; - if !file_path.exists() { - throw!("File does not exist: {}", file_path.to_string_lossy()); - } - - remove_from_all_playlists(library, &id_to_delete); - library - .tracks - .remove(id_to_delete) - .expect("Track ID not found when deleting"); - delete_file(&file_path)?; - } - return Ok(()); + let data: &mut Data = get_data(&env)?; + indexes_to_delete.sort_unstable(); + indexes_to_delete.dedup(); + let ids_to_delete = get_page_ids(data, indexes_to_delete)?; + let library = &mut data.library; + + for id_to_delete in &ids_to_delete { + let file_path = { + let track = library.get_track(id_to_delete)?; + data.paths.tracks_dir.join(&track.file) + }; + if !file_path.exists() { + throw!("File does not exist: {}", file_path.to_string_lossy()); + } + + remove_from_all_playlists(library, &id_to_delete); + library + .tracks + .remove(id_to_delete) + .expect("Track ID not found when deleting"); + delete_file(&file_path)?; + } + return Ok(()); } #[napi(js_name = "new_playlist")] #[allow(dead_code)] pub fn new_playlist( - name: String, - description: String, - is_folder: bool, - parent_id: String, - env: Env, + name: String, + description: String, + is_folder: bool, + parent_id: String, + env: Env, ) -> Result<()> { - let data: &mut Data = get_data(&env)?; - let library = &mut data.library; - - let list = match is_folder { - true => { - let folder = library.new_folder(name, str_to_option(description)); - TrackList::Folder(folder) - } - false => { - let playlist = library.new_playlist(name, str_to_option(description)); - TrackList::Playlist(playlist) - } - }; - - let parent = match library.trackLists.get_mut(&parent_id) { - Some(parent) => parent, - None => throw!("Parent not found"), - }; - - match parent { - TrackList::Playlist(_) => throw!("Parent cannot be playlist"), - TrackList::Folder(folder) => { - folder.children.push(list.id().to_string()); - library.trackLists.insert(list.id().to_string(), list); - } - TrackList::Special(special) => match special.name { - SpecialTrackListName::Root => { - special.children.push(list.id().to_string()); - library.trackLists.insert(list.id().to_string(), list); - } - }, - }; - - return Ok(()); + let data: &mut Data = get_data(&env)?; + let library = &mut data.library; + + let list = match is_folder { + true => { + let folder = library.new_folder(name, str_to_option(description)); + TrackList::Folder(folder) + } + false => { + let playlist = library.new_playlist(name, str_to_option(description)); + TrackList::Playlist(playlist) + } + }; + + let parent = match library.trackLists.get_mut(&parent_id) { + Some(parent) => parent, + None => throw!("Parent not found"), + }; + + match parent { + TrackList::Playlist(_) => throw!("Parent cannot be playlist"), + TrackList::Folder(folder) => { + folder.children.push(list.id().to_string()); + library.trackLists.insert(list.id().to_string(), list); + } + TrackList::Special(special) => match special.name { + SpecialTrackListName::Root => { + special.children.push(list.id().to_string()); + library.trackLists.insert(list.id().to_string(), list); + } + }, + }; + + return Ok(()); } #[napi(js_name = "update_playlist")] #[allow(dead_code)] pub fn update_playlist(id: String, name: String, description: String, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - - match data.library.trackLists.get_mut(&id) { - Some(TrackList::Special(_)) => throw!("Cannot edit special playlists"), - Some(TrackList::Playlist(playlist)) => { - playlist.name = name; - playlist.description = str_to_option(description); - } - Some(TrackList::Folder(folder)) => { - folder.name = name; - folder.description = str_to_option(description); - } - None => throw!("Playlist not found"), - }; - - return Ok(()); + let data: &mut Data = get_data(&env)?; + + match data.library.trackLists.get_mut(&id) { + Some(TrackList::Special(_)) => throw!("Cannot edit special playlists"), + Some(TrackList::Playlist(playlist)) => { + playlist.name = name; + playlist.description = str_to_option(description); + } + Some(TrackList::Folder(folder)) => { + folder.name = name; + folder.description = str_to_option(description); + } + None => throw!("Playlist not found"), + }; + + return Ok(()); } fn get_all_tracklist_children(data: &Data, playlist_id: &str) -> UniResult> { - let direct_children = match data.library.get_tracklist(playlist_id)? { - TrackList::Folder(folder) => &folder.children, - TrackList::Special(special) => &special.children, - TrackList::Playlist(_) => return Ok(Vec::new()), - }; - let mut all_children = Vec::new(); - for child_id in direct_children { - all_children.push(child_id.clone()); - match data.library.get_tracklist(child_id)? { - TrackList::Playlist(_) => {} - TrackList::Folder(folder) => { - all_children.extend(get_all_tracklist_children(data, &folder.id)?) - } - TrackList::Special(special) => { - all_children.extend(get_all_tracklist_children(data, &special.id)?) - } - } - } - Ok(all_children) + let direct_children = match data.library.get_tracklist(playlist_id)? { + TrackList::Folder(folder) => &folder.children, + TrackList::Special(special) => &special.children, + TrackList::Playlist(_) => return Ok(Vec::new()), + }; + let mut all_children = Vec::new(); + for child_id in direct_children { + all_children.push(child_id.clone()); + match data.library.get_tracklist(child_id)? { + TrackList::Playlist(_) => {} + TrackList::Folder(folder) => { + all_children.extend(get_all_tracklist_children(data, &folder.id)?) + } + TrackList::Special(special) => { + all_children.extend(get_all_tracklist_children(data, &special.id)?) + } + } + } + Ok(all_children) } fn get_children_if_user_editable<'a>( - library: &'a mut Library, - id: &'a str, + library: &'a mut Library, + id: &'a str, ) -> UniResult<&'a mut Vec> { - let children = match library.trackLists.get_mut(id) { - Some(TrackList::Folder(folder)) => &mut folder.children, - Some(TrackList::Special(special)) => match special.name { - SpecialTrackListName::Root => &mut special.children, - }, - None => throw!("Attempted to move from/to non-existant folder"), - _ => throw!("Attempted to move from/to non-folder"), - }; - Ok(children) + let children = match library.trackLists.get_mut(id) { + Some(TrackList::Folder(folder)) => &mut folder.children, + Some(TrackList::Special(special)) => match special.name { + SpecialTrackListName::Root => &mut special.children, + }, + None => throw!("Attempted to move from/to non-existant folder"), + _ => throw!("Attempted to move from/to non-folder"), + }; + Ok(children) } #[napi(js_name = "move_playlist")] #[allow(dead_code)] pub fn move_playlist( - id: String, - from_id: String, - to_id: String, - to_index: u32, - env: Env, + id: String, + from_id: String, + to_id: String, + to_index: u32, + env: Env, ) -> Result<()> { - let data: &mut Data = get_data(&env)?; - - match data.library.trackLists.get(&id) { - Some(TrackList::Special(_)) => throw!("Cannot move special playlist"), - None => throw!("List not found"), - _ => {} - }; - - // check that the to_id is valid before we remove it from from_id - get_children_if_user_editable(&mut data.library, &to_id)?; - - if id == to_id { - throw!("Cannot move playlist into itself"); - } - - let from_id_children = get_all_tracklist_children(&data, &id)?; - if from_id_children.contains(&to_id) { - throw!("Cannot move playlist to a child of itself"); - } - - let children = get_children_if_user_editable(&mut data.library, &from_id)?; - let i = match children.iter().position(|child_id| child_id == &id) { - None => throw!("Could not find playlist"), - Some(i) => i, - }; - children.remove(i); - - let to_folder_children = get_children_if_user_editable(&mut data.library, &to_id)?; - let to_index = to_index.try_into().unwrap(); - let move_down = from_id == to_id && i < to_index; - if move_down { - to_folder_children.insert(to_index - 1, id); - } else { - to_folder_children.insert(to_index, id); - } - - Ok(()) + let data: &mut Data = get_data(&env)?; + + match data.library.trackLists.get(&id) { + Some(TrackList::Special(_)) => throw!("Cannot move special playlist"), + None => throw!("List not found"), + _ => {} + }; + + // check that the to_id is valid before we remove it from from_id + get_children_if_user_editable(&mut data.library, &to_id)?; + + if id == to_id { + throw!("Cannot move playlist into itself"); + } + + let from_id_children = get_all_tracklist_children(&data, &id)?; + if from_id_children.contains(&to_id) { + throw!("Cannot move playlist to a child of itself"); + } + + let children = get_children_if_user_editable(&mut data.library, &from_id)?; + let i = match children.iter().position(|child_id| child_id == &id) { + None => throw!("Could not find playlist"), + Some(i) => i, + }; + children.remove(i); + + let to_folder_children = get_children_if_user_editable(&mut data.library, &to_id)?; + let to_index = to_index.try_into().unwrap(); + let move_down = from_id == to_id && i < to_index; + if move_down { + to_folder_children.insert(to_index - 1, id); + } else { + to_folder_children.insert(to_index, id); + } + + Ok(()) } diff --git a/src-native/sidebar_view.rs b/src-native/sidebar_view.rs index 860376b..b974b5f 100644 --- a/src-native/sidebar_view.rs +++ b/src-native/sidebar_view.rs @@ -11,48 +11,48 @@ use std::io::Write; #[derive(Serialize, Deserialize)] pub struct SidebarView { - pub shown_playlist_folders: HashSet, + pub shown_playlist_folders: HashSet, } impl SidebarView { - pub fn load(paths: &Paths) -> SidebarView { - match path_to_json(paths.local_data_dir.join("view.json")) { - Ok(view_cache) => view_cache, - Err(_) => SidebarView { - shown_playlist_folders: HashSet::new(), - }, - } - } - pub fn save(&self, paths: &Paths) -> UniResult<()> { - let json_str = match serde_json::to_string(self) { - Ok(json_str) => json_str, - Err(_) => throw!("Error saving view_cache"), - }; - let file_path = paths.local_data_dir.join("view.json"); - let af = AtomicFile::new(file_path, AllowOverwrite); - let result = af.write(|f| f.write_all(json_str.as_bytes())); - match result { - Ok(_) => {} - Err(_) => throw!("Error writing view_cache"), - }; - Ok(()) - } + pub fn load(paths: &Paths) -> SidebarView { + match path_to_json(paths.local_data_dir.join("view.json")) { + Ok(view_cache) => view_cache, + Err(_) => SidebarView { + shown_playlist_folders: HashSet::new(), + }, + } + } + pub fn save(&self, paths: &Paths) -> UniResult<()> { + let json_str = match serde_json::to_string(self) { + Ok(json_str) => json_str, + Err(_) => throw!("Error saving view_cache"), + }; + let file_path = paths.local_data_dir.join("view.json"); + let af = AtomicFile::new(file_path, AllowOverwrite); + let result = af.write(|f| f.write_all(json_str.as_bytes())); + match result { + Ok(_) => {} + Err(_) => throw!("Error writing view_cache"), + }; + Ok(()) + } } #[napi(js_name = "shown_playlist_folders")] #[allow(dead_code)] pub fn shown_playlist_folders(env: Env) -> Result> { - let data: &Data = get_data(&env)?; - let shown_folders = &data.view_cache.shown_playlist_folders; - Ok(shown_folders.iter().cloned().collect()) + let data: &Data = get_data(&env)?; + let shown_folders = &data.view_cache.shown_playlist_folders; + Ok(shown_folders.iter().cloned().collect()) } #[napi(js_name = "view_folder_set_show")] #[allow(dead_code)] pub fn view_folder_set_show(id: String, show: bool, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - if show { - data.view_cache.shown_playlist_folders.insert(id); - } else { - data.view_cache.shown_playlist_folders.remove(&id); - } - let _ = data.view_cache.save(&data.paths); - Ok(()) + let data: &mut Data = get_data(&env)?; + if show { + data.view_cache.shown_playlist_folders.insert(id); + } else { + data.view_cache.shown_playlist_folders.remove(&id); + } + let _ = data.view_cache.save(&data.paths); + Ok(()) } diff --git a/src-native/sort.rs b/src-native/sort.rs index 2c2ac41..5e8b027 100644 --- a/src-native/sort.rs +++ b/src-native/sort.rs @@ -7,198 +7,198 @@ use std::cmp::Ordering; use std::time::Instant; fn get_field_str<'a>(track: &'a Track, sort_key: &str) -> Option<&'a String> { - match sort_key { - "file" => Some(&track.file), - "name" => Some(&track.name), - "importedFrom" => track.importedFrom.as_ref(), - "originalId" => track.originalId.as_ref(), - "artist" => Some(&track.artist), - "composer" => track.composer.as_ref(), - "sortName" => track.sortName.as_ref(), - "sortArtist" => track.sortArtist.as_ref(), - "sortComposer" => track.sortComposer.as_ref(), - "genre" => track.genre.as_ref(), - "comments" => track.comments.as_ref(), - "grouping" => track.grouping.as_ref(), - "albumName" => track.albumName.as_ref(), - "albumArtist" => track.albumArtist.as_ref(), - "sortAlbumName" => track.sortAlbumName.as_ref(), - "sortAlbumArtist" => track.sortAlbumArtist.as_ref(), - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "file" => Some(&track.file), + "name" => Some(&track.name), + "importedFrom" => track.importedFrom.as_ref(), + "originalId" => track.originalId.as_ref(), + "artist" => Some(&track.artist), + "composer" => track.composer.as_ref(), + "sortName" => track.sortName.as_ref(), + "sortArtist" => track.sortArtist.as_ref(), + "sortComposer" => track.sortComposer.as_ref(), + "genre" => track.genre.as_ref(), + "comments" => track.comments.as_ref(), + "grouping" => track.grouping.as_ref(), + "albumName" => track.albumName.as_ref(), + "albumArtist" => track.albumArtist.as_ref(), + "sortAlbumName" => track.sortAlbumName.as_ref(), + "sortAlbumArtist" => track.sortAlbumArtist.as_ref(), + _ => panic!("Field type not found for {}", sort_key), + } } fn get_field_f64(track: &Track, sort_key: &str) -> Option { - match sort_key { - "duration" => Some(track.duration), - "bitrate" => Some(track.bitrate), - "sampleRate" => Some(track.sampleRate), - "bpm" => track.bpm, - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "duration" => Some(track.duration), + "bitrate" => Some(track.bitrate), + "sampleRate" => Some(track.sampleRate), + "bpm" => track.bpm, + _ => panic!("Field type not found for {}", sort_key), + } } fn get_field_i64(track: &Track, sort_key: &str) -> Option { - match sort_key { - "size" => Some(track.size), - "dateModified" => Some(track.dateModified), - "dateAdded" => Some(track.dateAdded), - "dateImported" => track.dateImported, - "year" => track.year, - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "size" => Some(track.size), + "dateModified" => Some(track.dateModified), + "dateAdded" => Some(track.dateAdded), + "dateImported" => track.dateImported, + "year" => track.year, + _ => panic!("Field type not found for {}", sort_key), + } } fn get_field_u32(track: &Track, sort_key: &str) -> Option { - match sort_key { - "trackNum" => track.trackNum, - "trackCount" => track.trackCount, - "discNum" => track.discNum, - "discCount" => track.discCount, - "playCount" => track.playCount, - "skipCount" => track.skipCount, - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "trackNum" => track.trackNum, + "trackCount" => track.trackCount, + "discNum" => track.discNum, + "discCount" => track.discCount, + "playCount" => track.playCount, + "skipCount" => track.skipCount, + _ => panic!("Field type not found for {}", sort_key), + } } fn get_field_i8(track: &Track, sort_key: &str) -> Option { - match sort_key { - "volume" => track.volume, - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "volume" => track.volume, + _ => panic!("Field type not found for {}", sort_key), + } } fn get_field_u8(track: &Track, sort_key: &str) -> Option { - match sort_key { - "rating" => track.rating, - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "rating" => track.rating, + _ => panic!("Field type not found for {}", sort_key), + } } fn get_field_bool(track: &Track, sort_key: &str) -> Option { - match sort_key { - "liked" => track.liked, - "disliked" => track.disliked, - "disabled" => track.disabled, - "compilation" => track.compilation, - _ => panic!("Field type not found for {}", sort_key), - } + match sort_key { + "liked" => track.liked, + "disliked" => track.disliked, + "disabled" => track.disabled, + "compilation" => track.compilation, + _ => panic!("Field type not found for {}", sort_key), + } } pub fn sort(data: &mut Data, sort_key: &str, desc: bool) -> UniResult<()> { - let now = Instant::now(); + let now = Instant::now(); - if sort_key == "index" { - // No need to sort for index. Indexes descend from "first to last" - // instead of "high to low", so it needs to be reversed - let playlist = data - .library - .trackLists - .get(&data.open_playlist_id) - .ok_or("Playlist ID not found")?; - match playlist { - TrackList::Playlist(_) => { - data.open_playlist_track_ids = page::get_track_ids(&data)?; - data.sort_key = sort_key.to_string(); - data.sort_desc = true; - println!("Sort: {}ms", now.elapsed().as_millis()); - return Ok(()); - } - TrackList::Folder(_) | TrackList::Special(_) => return Ok(()), - } - } + if sort_key == "index" { + // No need to sort for index. Indexes descend from "first to last" + // instead of "high to low", so it needs to be reversed + let playlist = data + .library + .trackLists + .get(&data.open_playlist_id) + .ok_or("Playlist ID not found")?; + match playlist { + TrackList::Playlist(_) => { + data.open_playlist_track_ids = page::get_track_ids(&data)?; + data.sort_key = sort_key.to_string(); + data.sort_desc = true; + println!("Sort: {}ms", now.elapsed().as_millis()); + return Ok(()); + } + TrackList::Folder(_) | TrackList::Special(_) => return Ok(()), + } + } - data.open_playlist_track_ids = page::get_track_ids(&data)?; + data.open_playlist_track_ids = page::get_track_ids(&data)?; - let tracks = &data.library.tracks; - let field = match get_track_field_type(sort_key) { - Some(field) => field, - None => throw!("Field type not found for {sort_key}"), - }; - let subsort_field = data.group_album_tracks - && match sort_key { - "dateAdded" | "albumName" | "comments" | "genre" | "year" | "artist" => true, - _ => false, - }; - data.open_playlist_track_ids.sort_by(|id_a, id_b| { - let track_a = tracks.get(id_a).expect("Track ID non-existant (1)"); - let track_b = tracks.get(id_b).expect("Track ID non-existant (2)"); - if subsort_field - && track_a.albumName.is_some() - && track_a.albumName == track_b.albumName - && track_a.albumArtist.is_some() - && track_a.albumArtist == track_b.albumArtist - { - match compare_track_field(track_a, track_b, "discNum", &TrackField::U32) { - Ordering::Equal => {} - order => return order, - }; - match compare_track_field(track_a, track_b, "trackNum", &TrackField::U32) { - Ordering::Equal => {} - order => return order, - }; - } - let order = compare_track_field(track_a, track_b, sort_key, &field); - return match desc { - true => order.reverse(), - false => order, - }; - }); - data.sort_key = sort_key.to_string(); - data.sort_desc = desc; - println!("Sort: {}ms", now.elapsed().as_millis()); - return Ok(()); + let tracks = &data.library.tracks; + let field = match get_track_field_type(sort_key) { + Some(field) => field, + None => throw!("Field type not found for {sort_key}"), + }; + let subsort_field = data.group_album_tracks + && match sort_key { + "dateAdded" | "albumName" | "comments" | "genre" | "year" | "artist" => true, + _ => false, + }; + data.open_playlist_track_ids.sort_by(|id_a, id_b| { + let track_a = tracks.get(id_a).expect("Track ID non-existant (1)"); + let track_b = tracks.get(id_b).expect("Track ID non-existant (2)"); + if subsort_field + && track_a.albumName.is_some() + && track_a.albumName == track_b.albumName + && track_a.albumArtist.is_some() + && track_a.albumArtist == track_b.albumArtist + { + match compare_track_field(track_a, track_b, "discNum", &TrackField::U32) { + Ordering::Equal => {} + order => return order, + }; + match compare_track_field(track_a, track_b, "trackNum", &TrackField::U32) { + Ordering::Equal => {} + order => return order, + }; + } + let order = compare_track_field(track_a, track_b, sort_key, &field); + return match desc { + true => order.reverse(), + false => order, + }; + }); + data.sort_key = sort_key.to_string(); + data.sort_desc = desc; + println!("Sort: {}ms", now.elapsed().as_millis()); + return Ok(()); } pub fn compare_track_field(a: &Track, b: &Track, sort_key: &str, field: &TrackField) -> Ordering { - match field { - TrackField::String => { - let empty_str = &"".to_string(); - let str_a = get_field_str(a, sort_key).unwrap_or(empty_str); - let str_b = get_field_str(b, sort_key).unwrap_or(empty_str); - if str_a == "" && str_b == "" { - return Ordering::Equal; - } - if str_a == "" { - return Ordering::Greater; - } - if str_b == "" { - return Ordering::Less; - } - return compare_str(str_a, str_b); - } - TrackField::F64 => { - let num_a = get_field_f64(a, sort_key).unwrap_or(0.0); - let num_b = get_field_f64(b, sort_key).unwrap_or(0.0); - match num_a.partial_cmp(&num_b) { - Some(v) => v, - None => panic!("Unable to compare f64 {} and {}", num_a, num_b), - } - } - TrackField::I64 => { - let num_a = get_field_i64(a, sort_key).unwrap_or(0); - let num_b = get_field_i64(b, sort_key).unwrap_or(0); - return num_a.cmp(&num_b); - } - TrackField::U32 => { - let num_a = get_field_u32(a, sort_key).unwrap_or(0); - let num_b = get_field_u32(b, sort_key).unwrap_or(0); - return num_a.cmp(&num_b); - } - TrackField::I8 => { - let num_a = get_field_i8(a, sort_key).unwrap_or(0); - let num_b = get_field_i8(b, sort_key).unwrap_or(0); - return num_a.cmp(&num_b); - } - TrackField::U8 => { - let num_a = get_field_u8(a, sort_key).unwrap_or(0); - let num_b = get_field_u8(b, sort_key).unwrap_or(0); - return num_a.cmp(&num_b); - } - TrackField::Bool => { - let bool_a = get_field_bool(a, sort_key).unwrap_or(false); //? look into this - let bool_b = get_field_bool(b, sort_key).unwrap_or(false); //? look into this - return bool_a.cmp(&bool_b); - } - } + match field { + TrackField::String => { + let empty_str = &"".to_string(); + let str_a = get_field_str(a, sort_key).unwrap_or(empty_str); + let str_b = get_field_str(b, sort_key).unwrap_or(empty_str); + if str_a == "" && str_b == "" { + return Ordering::Equal; + } + if str_a == "" { + return Ordering::Greater; + } + if str_b == "" { + return Ordering::Less; + } + return compare_str(str_a, str_b); + } + TrackField::F64 => { + let num_a = get_field_f64(a, sort_key).unwrap_or(0.0); + let num_b = get_field_f64(b, sort_key).unwrap_or(0.0); + match num_a.partial_cmp(&num_b) { + Some(v) => v, + None => panic!("Unable to compare f64 {} and {}", num_a, num_b), + } + } + TrackField::I64 => { + let num_a = get_field_i64(a, sort_key).unwrap_or(0); + let num_b = get_field_i64(b, sort_key).unwrap_or(0); + return num_a.cmp(&num_b); + } + TrackField::U32 => { + let num_a = get_field_u32(a, sort_key).unwrap_or(0); + let num_b = get_field_u32(b, sort_key).unwrap_or(0); + return num_a.cmp(&num_b); + } + TrackField::I8 => { + let num_a = get_field_i8(a, sort_key).unwrap_or(0); + let num_b = get_field_i8(b, sort_key).unwrap_or(0); + return num_a.cmp(&num_b); + } + TrackField::U8 => { + let num_a = get_field_u8(a, sort_key).unwrap_or(0); + let num_b = get_field_u8(b, sort_key).unwrap_or(0); + return num_a.cmp(&num_b); + } + TrackField::Bool => { + let bool_a = get_field_bool(a, sort_key).unwrap_or(false); //? look into this + let bool_b = get_field_bool(b, sort_key).unwrap_or(false); //? look into this + return bool_a.cmp(&bool_b); + } + } } diff --git a/src-native/tracks/import.rs b/src-native/tracks/import.rs index 5c9c8db..5227aef 100644 --- a/src-native/tracks/import.rs +++ b/src-native/tracks/import.rs @@ -11,448 +11,448 @@ use std::path::Path; #[derive(PartialEq)] pub enum FileType { - Mp3, - M4a, - Opus, + Mp3, + M4a, + Opus, } impl FileType { - pub fn from_path(path: &Path) -> UniResult { - let ext = path.extension().unwrap_or_default().to_string_lossy(); - match ext.as_ref() { - "mp3" => Ok(FileType::Mp3), - "m4a" => Ok(FileType::M4a), - "opus" => Ok(FileType::Opus), - _ => throw!("Unsupported file extension {}", ext), - } - } - pub fn from_lofty_file_type(lofty_type: lofty::file::FileType) -> UniResult { - match lofty_type { - lofty::file::FileType::Mpeg => Ok(FileType::Mp3), - lofty::file::FileType::Mp4 => Ok(FileType::M4a), - lofty::file::FileType::Opus => Ok(FileType::Opus), - _ => throw!("Unsupported file type {:?}", lofty_type), - } - } - pub fn file_extension(&self) -> &'static str { - match self { - FileType::Mp3 => "mp3", - FileType::M4a => "m4a", - FileType::Opus => "opus", - } - } + pub fn from_path(path: &Path) -> UniResult { + let ext = path.extension().unwrap_or_default().to_string_lossy(); + match ext.as_ref() { + "mp3" => Ok(FileType::Mp3), + "m4a" => Ok(FileType::M4a), + "opus" => Ok(FileType::Opus), + _ => throw!("Unsupported file extension {}", ext), + } + } + pub fn from_lofty_file_type(lofty_type: lofty::file::FileType) -> UniResult { + match lofty_type { + lofty::file::FileType::Mpeg => Ok(FileType::Mp3), + lofty::file::FileType::Mp4 => Ok(FileType::M4a), + lofty::file::FileType::Opus => Ok(FileType::Opus), + _ => throw!("Unsupported file type {:?}", lofty_type), + } + } + pub fn file_extension(&self) -> &'static str { + match self { + FileType::Mp3 => "mp3", + FileType::M4a => "m4a", + FileType::Opus => "opus", + } + } } impl std::fmt::Display for FileType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.file_extension()) - } + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.file_extension()) + } } pub fn import_auto(data: &Data, path: &Path, now: i64) -> UniResult { - let track = match FileType::from_path(path)? { - FileType::Mp3 => import_mp3(data, path, now)?, - FileType::M4a => import_m4a(data, path, now)?, - FileType::Opus => import_opus(data, path, now)?, - }; - Ok(track) + let track = match FileType::from_path(path)? { + FileType::Mp3 => import_mp3(data, path, now)?, + FileType::M4a => import_m4a(data, path, now)?, + FileType::Opus => import_opus(data, path, now)?, + }; + Ok(track) } fn get_and_fix_id3_year(tag: &mut id3::Tag) -> Option { - match tag.date_recorded() { - Some(tdrc) => Some(i64::from(tdrc.year)), - None => match tag.year() { - Some(tyer) => { - let x = tag::id3_timestamp_from_year(tyer); - tag.set_date_recorded(x); - Some(i64::from(tyer)) - } - None => match tag.date_released() { - Some(tdrl) => { - tag.set_date_recorded(tag::id3_timestamp_from_year(tdrl.year)); - Some(i64::from(tdrl.year)) - } - None => None, - }, - }, - } + match tag.date_recorded() { + Some(tdrc) => Some(i64::from(tdrc.year)), + None => match tag.year() { + Some(tyer) => { + let x = tag::id3_timestamp_from_year(tyer); + tag.set_date_recorded(x); + Some(i64::from(tyer)) + } + None => match tag.date_released() { + Some(tdrl) => { + tag.set_date_recorded(tag::id3_timestamp_from_year(tdrl.year)); + Some(i64::from(tdrl.year)) + } + None => None, + }, + }, + } } fn get_first_text_m4a(tag: &mp4ameta::Tag, id: [u8; 4]) -> Option { - let fourcc = mp4ameta::Fourcc(id); - let mut frames = tag.data_of(&fourcc); - let data = match frames.next() { - Some(data) => data, - None => return None, - }; - match data.string() { - Some(s) => Some(s.to_string()), - None => None, - } + let fourcc = mp4ameta::Fourcc(id); + let mut frames = tag.data_of(&fourcc); + let data = match frames.next() { + Some(data) => data, + None => return None, + }; + match data.string() { + Some(s) => Some(s.to_string()), + None => None, + } } pub fn read_file_metadata(path: &Path) -> UniResult { - match std::fs::metadata(path) { - Ok(file_md) => Ok(file_md), - Err(err) => match err.kind() { - std::io::ErrorKind::NotFound => throw!("File does not exist"), - _ => throw!("Unable to access file: {}", err), - }, - } + match std::fs::metadata(path) { + Ok(file_md) => Ok(file_md), + Err(err) => match err.kind() { + std::io::ErrorKind::NotFound => throw!("File does not exist"), + _ => throw!("Unable to access file: {}", err), + }, + } } pub fn import_opus(data: &Data, track_path: &Path, now: i64) -> UniResult { - let file_md = read_file_metadata(track_path)?; - - let mut date_modified = match file_md.modified() { - Ok(sys_time) => sys_time_to_timestamp(&sys_time), - Err(_) => now, - }; - - let mut file = match File::open(track_path) { - Ok(file) => file, - Err(e) => throw!("Unable to open file: {}", e), - }; - let mut opusfile = match OpusFile::read_from(&mut file, ParseOptions::new()) { - Ok(opusfile) => opusfile, - Err(e) => throw!("Unable to read opus tags: {}", e), - }; - let opus_properties = *opusfile.properties(); - - let mut tag_changed = false; - let tag = opusfile.vorbis_comments_mut(); - - let title = match tag.title() { - Some(title) => title.into_owned(), - None => { - let file_stem = match track_path.file_stem() { - Some(stem) => stem.to_string_lossy().into_owned(), - None => "".to_string(), - }; - tag.set_title(file_stem.clone()); - tag_changed = true; - file_stem - } - }; - let artist = tag.artist().map(|s| s.into_owned()).unwrap_or_default(); - - let tracks_dir = &data.paths.tracks_dir; - let filename = generate_filename(tracks_dir, &artist, &title, "opus"); - let dest_path = tracks_dir.join(&filename); - - match fs::copy(track_path, &dest_path) { - Ok(_) => (), - Err(e) => throw!("Error copying file: {e}"), - }; - println!( - "{} -> {}", - track_path.to_string_lossy(), - dest_path.to_string_lossy() - ); - - if tag_changed { - println!("Writing:::::::"); - match tag.save_to_path(&dest_path, lofty::config::WriteOptions::default()) { - Ok(_) => (), - Err(e) => throw!("Unable to tag file {}: {e}", dest_path.to_string_lossy()), - }; - // manually set date_modified because the date_modified doens't seem to - // immediately update after tag.write_to_path(). - date_modified = now; - } - - let track = Track { - size: file_md.len() as i64, - duration: opus_properties.duration().as_secs_f64(), - bitrate: (opus_properties.audio_bitrate() * 1000).into(), // kbps to bps - sampleRate: opus_properties.input_sample_rate().into(), - file: filename, - dateModified: date_modified, - dateAdded: now, - name: title, - importedFrom: None, - originalId: None, - artist, - composer: tag.get("COMPOSER").map(|s| s.to_string()), - sortName: tag.get("TITLESORT").map(|s| s.to_string()), - sortArtist: tag.get("ARTISTSORT").map(|s| s.to_string()), - sortComposer: tag.get("COMPOSERSORT").map(|s| s.to_string()), - genre: tag.genre().map(|s| s.into_owned()), - rating: None, - year: tag.year().map(|y| y.into()), - bpm: match tag.get("BPM") { - Some(n) => n.parse().ok(), - None => None, - }, - comments: tag.comment().map(|s| s.into_owned()), - grouping: tag.get("GROUPING").map(|s| s.to_string()), - liked: None, - disliked: None, - disabled: None, - compilation: None, - albumName: tag.album().map(|s| s.to_string()), - albumArtist: tag.get("ALBUMARTIST").map(|s| s.to_string()), - sortAlbumName: tag.get("ALBUMSORT").map(|s| s.to_string()), - sortAlbumArtist: tag.get("ALBUMARTISTSORT").map(|s| s.to_string()), - trackNum: tag.track(), - trackCount: tag.track_total(), - discNum: tag.disk(), - discCount: tag.disk_total(), - dateImported: None, - playCount: None, - plays: None, - playsImported: None, - skipCount: None, - skips: None, - skipsImported: None, - volume: None, - }; - Ok(track) + let file_md = read_file_metadata(track_path)?; + + let mut date_modified = match file_md.modified() { + Ok(sys_time) => sys_time_to_timestamp(&sys_time), + Err(_) => now, + }; + + let mut file = match File::open(track_path) { + Ok(file) => file, + Err(e) => throw!("Unable to open file: {}", e), + }; + let mut opusfile = match OpusFile::read_from(&mut file, ParseOptions::new()) { + Ok(opusfile) => opusfile, + Err(e) => throw!("Unable to read opus tags: {}", e), + }; + let opus_properties = *opusfile.properties(); + + let mut tag_changed = false; + let tag = opusfile.vorbis_comments_mut(); + + let title = match tag.title() { + Some(title) => title.into_owned(), + None => { + let file_stem = match track_path.file_stem() { + Some(stem) => stem.to_string_lossy().into_owned(), + None => "".to_string(), + }; + tag.set_title(file_stem.clone()); + tag_changed = true; + file_stem + } + }; + let artist = tag.artist().map(|s| s.into_owned()).unwrap_or_default(); + + let tracks_dir = &data.paths.tracks_dir; + let filename = generate_filename(tracks_dir, &artist, &title, "opus"); + let dest_path = tracks_dir.join(&filename); + + match fs::copy(track_path, &dest_path) { + Ok(_) => (), + Err(e) => throw!("Error copying file: {e}"), + }; + println!( + "{} -> {}", + track_path.to_string_lossy(), + dest_path.to_string_lossy() + ); + + if tag_changed { + println!("Writing:::::::"); + match tag.save_to_path(&dest_path, lofty::config::WriteOptions::default()) { + Ok(_) => (), + Err(e) => throw!("Unable to tag file {}: {e}", dest_path.to_string_lossy()), + }; + // manually set date_modified because the date_modified doens't seem to + // immediately update after tag.write_to_path(). + date_modified = now; + } + + let track = Track { + size: file_md.len() as i64, + duration: opus_properties.duration().as_secs_f64(), + bitrate: (opus_properties.audio_bitrate() * 1000).into(), // kbps to bps + sampleRate: opus_properties.input_sample_rate().into(), + file: filename, + dateModified: date_modified, + dateAdded: now, + name: title, + importedFrom: None, + originalId: None, + artist, + composer: tag.get("COMPOSER").map(|s| s.to_string()), + sortName: tag.get("TITLESORT").map(|s| s.to_string()), + sortArtist: tag.get("ARTISTSORT").map(|s| s.to_string()), + sortComposer: tag.get("COMPOSERSORT").map(|s| s.to_string()), + genre: tag.genre().map(|s| s.into_owned()), + rating: None, + year: tag.year().map(|y| y.into()), + bpm: match tag.get("BPM") { + Some(n) => n.parse().ok(), + None => None, + }, + comments: tag.comment().map(|s| s.into_owned()), + grouping: tag.get("GROUPING").map(|s| s.to_string()), + liked: None, + disliked: None, + disabled: None, + compilation: None, + albumName: tag.album().map(|s| s.to_string()), + albumArtist: tag.get("ALBUMARTIST").map(|s| s.to_string()), + sortAlbumName: tag.get("ALBUMSORT").map(|s| s.to_string()), + sortAlbumArtist: tag.get("ALBUMARTISTSORT").map(|s| s.to_string()), + trackNum: tag.track(), + trackCount: tag.track_total(), + discNum: tag.disk(), + discCount: tag.disk_total(), + dateImported: None, + playCount: None, + plays: None, + playsImported: None, + skipCount: None, + skips: None, + skipsImported: None, + volume: None, + }; + Ok(track) } pub fn import_m4a(data: &Data, track_path: &Path, now: i64) -> UniResult { - let file_md = read_file_metadata(track_path)?; - - let mut date_modified = match file_md.modified() { - Ok(sys_time) => sys_time_to_timestamp(&sys_time), - Err(_) => now, - }; - - let mut tag_changed = false; - let mut tag = match mp4ameta::Tag::read_from_path(track_path) { - Ok(tag) => tag, - Err(e) => match e.kind { - mp4ameta::ErrorKind::NoTag => { - throw!("No m4a tags found in file. Auto creating m4a tags is not yet supported") - } - _ => { - throw!("Error reading m4a tags: {}", e) - } - }, - }; - - let audio_info = tag.audio_info(); - let duration = match audio_info.duration { - Some(duration) => duration, - None => throw!("Unable to read duration of m4a file"), - }; - let bitrate = match audio_info.avg_bitrate { - Some(bitrate) => bitrate, - None => throw!("Unable to read bitrate of m4a file"), - }; - let sample_rate = match audio_info.sample_rate { - Some(sample_rate) => sample_rate, - None => throw!("Unable to read sample rate of m4a file"), - }; - - let year = match tag.year() { - Some(year_str) => match year_str.parse() { - Ok(year) => Some(year), - Err(e) => throw!("Unable to read year of m4a file: {}", e), - }, - None => None, - }; - - let title = match tag.title() { - Some(title) => title.to_owned(), - None => { - let file_stem = match track_path.file_stem() { - Some(stem) => stem.to_string_lossy().into_owned(), - None => "".to_string(), - }; - tag.set_title(&file_stem); - tag_changed = true; - file_stem - } - }; - let artist = tag.artist(); - - let tracks_dir = &data.paths.tracks_dir; - let filename = generate_filename(tracks_dir, artist.unwrap_or(""), &title, "m4a"); - let dest_path = tracks_dir.join(&filename); - - match fs::copy(track_path, &dest_path) { - Ok(_) => (), - Err(e) => throw!("Error copying file: {e}"), - }; - println!( - "{} -> {}", - track_path.to_string_lossy(), - dest_path.to_string_lossy() - ); - - if tag_changed { - match tag.write_to_path(&dest_path) { - Ok(_) => (), - Err(e) => throw!("Unable to tag file {}: {e}", dest_path.to_string_lossy()), - }; - // manually set date_modified because the date_modified doens't seem to - // immediately update after tag.write_to_path(). - date_modified = now; - } - println!("Images: {:?}", tag.images().collect::>().len()); - - let track = Track { - size: file_md.len() as i64, - duration: duration.as_secs_f64(), - bitrate: bitrate.into(), - sampleRate: sample_rate.hz().into(), - file: filename, - dateModified: date_modified, - dateAdded: now, - name: title.to_string(), - importedFrom: None, - originalId: None, - artist: artist.unwrap_or_default().to_string(), - composer: tag.composer().map(|s| s.to_string()), - sortName: get_first_text_m4a(&tag, *b"sonm"), - sortArtist: get_first_text_m4a(&tag, *b"soar"), - sortComposer: get_first_text_m4a(&tag, *b"soco"), - genre: tag.genre().map(|s| s.to_owned()), - rating: None, - year, - bpm: tag.bpm().map(|bpm| bpm.into()), - comments: tag.comment().map(|g| g.to_string()), - grouping: tag.grouping().map(|g| g.to_string()), - liked: None, - disliked: None, - disabled: None, - compilation: None, - albumName: tag.album().map(|s| s.to_owned()), - albumArtist: tag.album_artist().map(|s| s.to_owned()), - sortAlbumName: get_first_text_m4a(&tag, *b"soal"), - sortAlbumArtist: get_first_text_m4a(&tag, *b"soaa"), - trackNum: tag.track_number().map(|n| n.into()), - trackCount: tag.total_tracks().map(|n| n.into()), - discNum: tag.disc_number().map(|n| n.into()), - discCount: tag.total_discs().map(|n| n.into()), - dateImported: None, - playCount: None, - plays: None, - playsImported: None, - skipCount: None, - skips: None, - skipsImported: None, - volume: None, - }; - Ok(track) + let file_md = read_file_metadata(track_path)?; + + let mut date_modified = match file_md.modified() { + Ok(sys_time) => sys_time_to_timestamp(&sys_time), + Err(_) => now, + }; + + let mut tag_changed = false; + let mut tag = match mp4ameta::Tag::read_from_path(track_path) { + Ok(tag) => tag, + Err(e) => match e.kind { + mp4ameta::ErrorKind::NoTag => { + throw!("No m4a tags found in file. Auto creating m4a tags is not yet supported") + } + _ => { + throw!("Error reading m4a tags: {}", e) + } + }, + }; + + let audio_info = tag.audio_info(); + let duration = match audio_info.duration { + Some(duration) => duration, + None => throw!("Unable to read duration of m4a file"), + }; + let bitrate = match audio_info.avg_bitrate { + Some(bitrate) => bitrate, + None => throw!("Unable to read bitrate of m4a file"), + }; + let sample_rate = match audio_info.sample_rate { + Some(sample_rate) => sample_rate, + None => throw!("Unable to read sample rate of m4a file"), + }; + + let year = match tag.year() { + Some(year_str) => match year_str.parse() { + Ok(year) => Some(year), + Err(e) => throw!("Unable to read year of m4a file: {}", e), + }, + None => None, + }; + + let title = match tag.title() { + Some(title) => title.to_owned(), + None => { + let file_stem = match track_path.file_stem() { + Some(stem) => stem.to_string_lossy().into_owned(), + None => "".to_string(), + }; + tag.set_title(&file_stem); + tag_changed = true; + file_stem + } + }; + let artist = tag.artist(); + + let tracks_dir = &data.paths.tracks_dir; + let filename = generate_filename(tracks_dir, artist.unwrap_or(""), &title, "m4a"); + let dest_path = tracks_dir.join(&filename); + + match fs::copy(track_path, &dest_path) { + Ok(_) => (), + Err(e) => throw!("Error copying file: {e}"), + }; + println!( + "{} -> {}", + track_path.to_string_lossy(), + dest_path.to_string_lossy() + ); + + if tag_changed { + match tag.write_to_path(&dest_path) { + Ok(_) => (), + Err(e) => throw!("Unable to tag file {}: {e}", dest_path.to_string_lossy()), + }; + // manually set date_modified because the date_modified doens't seem to + // immediately update after tag.write_to_path(). + date_modified = now; + } + println!("Images: {:?}", tag.images().collect::>().len()); + + let track = Track { + size: file_md.len() as i64, + duration: duration.as_secs_f64(), + bitrate: bitrate.into(), + sampleRate: sample_rate.hz().into(), + file: filename, + dateModified: date_modified, + dateAdded: now, + name: title.to_string(), + importedFrom: None, + originalId: None, + artist: artist.unwrap_or_default().to_string(), + composer: tag.composer().map(|s| s.to_string()), + sortName: get_first_text_m4a(&tag, *b"sonm"), + sortArtist: get_first_text_m4a(&tag, *b"soar"), + sortComposer: get_first_text_m4a(&tag, *b"soco"), + genre: tag.genre().map(|s| s.to_owned()), + rating: None, + year, + bpm: tag.bpm().map(|bpm| bpm.into()), + comments: tag.comment().map(|g| g.to_string()), + grouping: tag.grouping().map(|g| g.to_string()), + liked: None, + disliked: None, + disabled: None, + compilation: None, + albumName: tag.album().map(|s| s.to_owned()), + albumArtist: tag.album_artist().map(|s| s.to_owned()), + sortAlbumName: get_first_text_m4a(&tag, *b"soal"), + sortAlbumArtist: get_first_text_m4a(&tag, *b"soaa"), + trackNum: tag.track_number().map(|n| n.into()), + trackCount: tag.total_tracks().map(|n| n.into()), + discNum: tag.disc_number().map(|n| n.into()), + discCount: tag.total_discs().map(|n| n.into()), + dateImported: None, + playCount: None, + plays: None, + playsImported: None, + skipCount: None, + skips: None, + skipsImported: None, + volume: None, + }; + Ok(track) } fn get_first_text_id3(tag: &id3::Tag, id: &str) -> Option { - let frame = tag.get(id)?; - let text = frame.content().text()?; - Some(text.to_owned()) + let frame = tag.get(id)?; + let text = frame.content().text()?; + Some(text.to_owned()) } pub fn import_mp3(data: &Data, track_path: &Path, now: i64) -> UniResult { - let file_md = read_file_metadata(track_path)?; - - let mut date_modified = match file_md.modified() { - Ok(sys_time) => sys_time_to_timestamp(&sys_time), - Err(_) => now, - }; - - let mp3_md = match mp3_metadata::read_from_file(track_path) { - Ok(md) => md, - Err(e) => throw!("Error reading mp3 metadata: {}", e), - }; - let duration = mp3_md.duration.as_secs_f64(); - let sample_rate = match mp3_md.frames.get(0) { - Some(frame) => frame.sampling_freq as f64, - None => throw!("Unable to read first audio frame"), - }; - let bitrate = { - let mut bits = 0; - for frame in mp3_md.frames { - bits += frame.size; - } - bits *= 8; // kbits to kb - let bitrate = f64::from(bits) / duration; - bitrate.round() - }; - - let mut tag_changed = false; - let mut tag = match id3::Tag::read_from_path(track_path) { - Ok(tag) => tag, - Err(_) => id3::Tag::new(), - }; - - let year = get_and_fix_id3_year(&mut tag); - - let title = match tag.title() { - Some(title) => title.to_owned(), - None => { - let file_stem = match track_path.file_stem() { - Some(stem) => stem.to_string_lossy().into_owned(), - None => "".to_string(), - }; - tag.set_title(&file_stem); - tag_changed = true; - file_stem - } - }; - let artist = tag.artist(); - - let tracks_dir = &data.paths.tracks_dir; - let filename = generate_filename(tracks_dir, artist.unwrap_or(""), &title, "mp3"); - let dest_path = tracks_dir.join(&filename); - - match fs::copy(track_path, &dest_path) { - Ok(_) => (), - Err(e) => throw!("Error copying file: {e}"), - }; - - if tag_changed { - match tag.write_to_path(&dest_path, id3::Version::Id3v24) { - Ok(_) => (), - Err(e) => throw!("Unable to tag file {}: {e}", dest_path.to_string_lossy()), - }; - // manually set date_modified because the date_modified doens't seem to - // immediately update after tag.write_to_path(). - date_modified = now; - } - - let track = Track { - size: file_md.len() as i64, - duration, - bitrate, - sampleRate: sample_rate, - file: filename, - dateModified: date_modified, - dateAdded: now, - name: title.to_string(), - importedFrom: None, - originalId: None, - artist: artist.unwrap_or_default().to_string(), - composer: get_first_text_id3(&tag, "TCOM"), - sortName: get_first_text_id3(&tag, "TSOT"), - sortArtist: get_first_text_id3(&tag, "TSOP"), - sortComposer: get_first_text_id3(&tag, "TSOC"), - genre: tag.genre().map(|s| s.to_owned()), - rating: None, - year, - bpm: match get_first_text_id3(&tag, "TBPM") { - Some(n) => n.parse().ok(), - None => None, - }, - comments: tag.comments().next().map(|c| c.text.clone()), - grouping: get_first_text_id3(&tag, "GRP1"), - liked: None, - disliked: None, - disabled: None, - compilation: None, - albumName: tag.album().map(|s| s.to_owned()), - albumArtist: tag.album_artist().map(|s| s.to_owned()), - sortAlbumName: get_first_text_id3(&tag, "TSOA"), - sortAlbumArtist: get_first_text_id3(&tag, "TSO2"), - trackNum: tag.track(), - trackCount: tag.total_tracks(), - discNum: tag.disc(), - discCount: tag.total_discs(), - dateImported: None, - playCount: None, - plays: None, - playsImported: None, - skipCount: None, - skips: None, - skipsImported: None, - volume: None, - }; - Ok(track) + let file_md = read_file_metadata(track_path)?; + + let mut date_modified = match file_md.modified() { + Ok(sys_time) => sys_time_to_timestamp(&sys_time), + Err(_) => now, + }; + + let mp3_md = match mp3_metadata::read_from_file(track_path) { + Ok(md) => md, + Err(e) => throw!("Error reading mp3 metadata: {}", e), + }; + let duration = mp3_md.duration.as_secs_f64(); + let sample_rate = match mp3_md.frames.get(0) { + Some(frame) => frame.sampling_freq as f64, + None => throw!("Unable to read first audio frame"), + }; + let bitrate = { + let mut bits = 0; + for frame in mp3_md.frames { + bits += frame.size; + } + bits *= 8; // kbits to kb + let bitrate = f64::from(bits) / duration; + bitrate.round() + }; + + let mut tag_changed = false; + let mut tag = match id3::Tag::read_from_path(track_path) { + Ok(tag) => tag, + Err(_) => id3::Tag::new(), + }; + + let year = get_and_fix_id3_year(&mut tag); + + let title = match tag.title() { + Some(title) => title.to_owned(), + None => { + let file_stem = match track_path.file_stem() { + Some(stem) => stem.to_string_lossy().into_owned(), + None => "".to_string(), + }; + tag.set_title(&file_stem); + tag_changed = true; + file_stem + } + }; + let artist = tag.artist(); + + let tracks_dir = &data.paths.tracks_dir; + let filename = generate_filename(tracks_dir, artist.unwrap_or(""), &title, "mp3"); + let dest_path = tracks_dir.join(&filename); + + match fs::copy(track_path, &dest_path) { + Ok(_) => (), + Err(e) => throw!("Error copying file: {e}"), + }; + + if tag_changed { + match tag.write_to_path(&dest_path, id3::Version::Id3v24) { + Ok(_) => (), + Err(e) => throw!("Unable to tag file {}: {e}", dest_path.to_string_lossy()), + }; + // manually set date_modified because the date_modified doens't seem to + // immediately update after tag.write_to_path(). + date_modified = now; + } + + let track = Track { + size: file_md.len() as i64, + duration, + bitrate, + sampleRate: sample_rate, + file: filename, + dateModified: date_modified, + dateAdded: now, + name: title.to_string(), + importedFrom: None, + originalId: None, + artist: artist.unwrap_or_default().to_string(), + composer: get_first_text_id3(&tag, "TCOM"), + sortName: get_first_text_id3(&tag, "TSOT"), + sortArtist: get_first_text_id3(&tag, "TSOP"), + sortComposer: get_first_text_id3(&tag, "TSOC"), + genre: tag.genre().map(|s| s.to_owned()), + rating: None, + year, + bpm: match get_first_text_id3(&tag, "TBPM") { + Some(n) => n.parse().ok(), + None => None, + }, + comments: tag.comments().next().map(|c| c.text.clone()), + grouping: get_first_text_id3(&tag, "GRP1"), + liked: None, + disliked: None, + disabled: None, + compilation: None, + albumName: tag.album().map(|s| s.to_owned()), + albumArtist: tag.album_artist().map(|s| s.to_owned()), + sortAlbumName: get_first_text_id3(&tag, "TSOA"), + sortAlbumArtist: get_first_text_id3(&tag, "TSO2"), + trackNum: tag.track(), + trackCount: tag.total_tracks(), + discNum: tag.disc(), + discCount: tag.total_discs(), + dateImported: None, + playCount: None, + plays: None, + playsImported: None, + skipCount: None, + skips: None, + skipsImported: None, + volume: None, + }; + Ok(track) } diff --git a/src-native/tracks/md.rs b/src-native/tracks/md.rs index 69cbca4..88c26bc 100644 --- a/src-native/tracks/md.rs +++ b/src-native/tracks/md.rs @@ -11,193 +11,193 @@ use std::path::PathBuf; #[derive(Serialize, Deserialize, Debug)] #[napi(object)] pub struct TrackMD { - pub name: String, - pub artist: String, - pub albumName: String, - pub albumArtist: String, - pub composer: String, - pub grouping: String, - pub genre: String, - pub year: String, - pub trackNum: String, - pub trackCount: String, - pub discNum: String, - pub discCount: String, - pub bpm: String, - // compilation: String, - // rating: String, - // liked: String, - // playCount: String, - pub comments: String, + pub name: String, + pub artist: String, + pub albumName: String, + pub albumArtist: String, + pub composer: String, + pub grouping: String, + pub genre: String, + pub year: String, + pub trackNum: String, + pub trackCount: String, + pub discNum: String, + pub discCount: String, + pub bpm: String, + // compilation: String, + // rating: String, + // liked: String, + // playCount: String, + pub comments: String, } pub fn update_track_info( - tracks_dir: &PathBuf, - track: &mut Track, - tag: &mut Tag, - new_info: TrackMD, + tracks_dir: &PathBuf, + track: &mut Track, + tag: &mut Tag, + new_info: TrackMD, ) -> UniResult<()> { - let old_path = tracks_dir.join(&track.file); - if !old_path.exists() { - throw!("File does not exist: {}", track.file); - } - let ext = old_path.extension().unwrap_or_default().to_string_lossy(); - - // name - match new_info.name.as_ref() { - "" => tag.remove_title(), - value => tag.set_title(value), - }; - let new_name = new_info.name.clone(); - - // artists - match new_info.artist.as_ref() { - "" => tag.remove_artists(), - value => tag.set_artist(value), - }; - let new_artist = new_info.artist.clone(); - - // album_name - match new_info.albumName.as_ref() { - "" => tag.remove_album(), - value => tag.set_album(value), - }; - let new_album_name = str_to_option(new_info.albumName); - - // album_artist - match new_info.albumArtist.as_ref() { - "" => tag.remove_album_artists(), - value => tag.set_album_artist(value), - }; - let new_album_artist = str_to_option(new_info.albumArtist); - - // composer - match new_info.composer.as_ref() { - "" => tag.remove_composers(), - value => tag.set_composer(value), - }; - let new_composer = str_to_option(new_info.composer); - - // grouping - match new_info.grouping.as_ref() { - "" => tag.remove_groupings(), - value => tag.set_grouping(value), - }; - let new_grouping = str_to_option(new_info.grouping); - - // genre - match new_info.genre.as_ref() { - "" => tag.remove_genres(), - value => tag.set_genre(value), - }; - let new_genre = str_to_option(new_info.genre); - - // year - let new_year_i32 = match new_info.year.as_ref() { - "" => None, - value => match value.parse() { - Ok(n) => Some(n), - Err(_) => throw!("Invalid year"), - }, - }; - let new_year_i64 = new_year_i32.map(i64::from); - match new_year_i32 { - None => tag.remove_year(), - Some(value) => tag.set_year(value), - }; - - // track_number, track_count - let new_track_number: Option = match new_info.trackNum.as_ref() { - "" => None, - value => match value.parse() { - Ok(n) => Some(n), - Err(_) => throw!("Invalid track number"), - }, - }; - let new_track_count: Option = match new_info.trackCount.as_ref() { - "" => None, - value => match value.parse() { - Ok(n) => Some(n), - Err(_) => throw!("Invalid track count"), - }, - }; - match tag.set_track_info(new_track_number, new_track_count) { - Ok(()) => {} - // don't set tag at all if number is required - Err(SetInfoError::NumberRequired) => tag.set_track_info(None, None)?, - Err(e) => Err(e)?, - } - - // disc_number, disc_count - let new_disc_number: Option = match new_info.discNum.as_ref() { - "" => None, - value => match value.parse() { - Ok(n) => Some(n), - Err(_) => throw!("Invalid disc number"), - }, - }; - let new_disc_count: Option = match new_info.discCount.as_ref() { - "" => None, - value => match value.parse() { - Ok(n) => Some(n), - Err(_) => throw!("Invalid disc count"), - }, - }; - match tag.set_disc_info(new_disc_number, new_disc_count) { - Ok(()) => {} - // don't set tag at all if number is required - Err(SetInfoError::NumberRequired) => tag.set_disc_info(None, None)?, - Err(e) => Err(e)?, - }; - - let new_bpm: Option = match new_info.bpm.as_ref() { - "" => None, - value => match value.parse() { - Ok(n) => Some(n), - Err(_) => throw!("Invalid bpm"), - }, - }; - match new_bpm { - None => tag.remove_bpm(), - Some(value) => tag.set_bpm(value), - }; - - // comment - match new_info.comments.as_ref() { - "" => tag.remove_comments(), - value => tag.set_comment(value), - }; - let new_comments = str_to_option(new_info.comments); - - // save tag - tag.write_to_path(&old_path)?; - - // move file - if new_name != track.name || new_artist != track.artist { - let new_filename = generate_filename(tracks_dir, &new_artist, &new_name, &ext); - let new_path = tracks_dir.join(&new_filename); - match fs::rename(old_path, new_path) { - Ok(_) => { - track.file = new_filename; - } - Err(_) => {} - } - } - - track.name = new_name; - track.artist = new_artist; - track.albumName = new_album_name; - track.albumArtist = new_album_artist; - track.composer = new_composer; - track.grouping = new_grouping; - track.genre = new_genre; - track.year = new_year_i64; - track.trackNum = new_track_number; - track.trackCount = new_track_count; - track.discNum = new_disc_number; - track.discCount = new_disc_count; - track.bpm = new_bpm.map(|n| n.into()); - track.comments = new_comments; - - Ok(()) + let old_path = tracks_dir.join(&track.file); + if !old_path.exists() { + throw!("File does not exist: {}", track.file); + } + let ext = old_path.extension().unwrap_or_default().to_string_lossy(); + + // name + match new_info.name.as_ref() { + "" => tag.remove_title(), + value => tag.set_title(value), + }; + let new_name = new_info.name.clone(); + + // artists + match new_info.artist.as_ref() { + "" => tag.remove_artists(), + value => tag.set_artist(value), + }; + let new_artist = new_info.artist.clone(); + + // album_name + match new_info.albumName.as_ref() { + "" => tag.remove_album(), + value => tag.set_album(value), + }; + let new_album_name = str_to_option(new_info.albumName); + + // album_artist + match new_info.albumArtist.as_ref() { + "" => tag.remove_album_artists(), + value => tag.set_album_artist(value), + }; + let new_album_artist = str_to_option(new_info.albumArtist); + + // composer + match new_info.composer.as_ref() { + "" => tag.remove_composers(), + value => tag.set_composer(value), + }; + let new_composer = str_to_option(new_info.composer); + + // grouping + match new_info.grouping.as_ref() { + "" => tag.remove_groupings(), + value => tag.set_grouping(value), + }; + let new_grouping = str_to_option(new_info.grouping); + + // genre + match new_info.genre.as_ref() { + "" => tag.remove_genres(), + value => tag.set_genre(value), + }; + let new_genre = str_to_option(new_info.genre); + + // year + let new_year_i32 = match new_info.year.as_ref() { + "" => None, + value => match value.parse() { + Ok(n) => Some(n), + Err(_) => throw!("Invalid year"), + }, + }; + let new_year_i64 = new_year_i32.map(i64::from); + match new_year_i32 { + None => tag.remove_year(), + Some(value) => tag.set_year(value), + }; + + // track_number, track_count + let new_track_number: Option = match new_info.trackNum.as_ref() { + "" => None, + value => match value.parse() { + Ok(n) => Some(n), + Err(_) => throw!("Invalid track number"), + }, + }; + let new_track_count: Option = match new_info.trackCount.as_ref() { + "" => None, + value => match value.parse() { + Ok(n) => Some(n), + Err(_) => throw!("Invalid track count"), + }, + }; + match tag.set_track_info(new_track_number, new_track_count) { + Ok(()) => {} + // don't set tag at all if number is required + Err(SetInfoError::NumberRequired) => tag.set_track_info(None, None)?, + Err(e) => Err(e)?, + } + + // disc_number, disc_count + let new_disc_number: Option = match new_info.discNum.as_ref() { + "" => None, + value => match value.parse() { + Ok(n) => Some(n), + Err(_) => throw!("Invalid disc number"), + }, + }; + let new_disc_count: Option = match new_info.discCount.as_ref() { + "" => None, + value => match value.parse() { + Ok(n) => Some(n), + Err(_) => throw!("Invalid disc count"), + }, + }; + match tag.set_disc_info(new_disc_number, new_disc_count) { + Ok(()) => {} + // don't set tag at all if number is required + Err(SetInfoError::NumberRequired) => tag.set_disc_info(None, None)?, + Err(e) => Err(e)?, + }; + + let new_bpm: Option = match new_info.bpm.as_ref() { + "" => None, + value => match value.parse() { + Ok(n) => Some(n), + Err(_) => throw!("Invalid bpm"), + }, + }; + match new_bpm { + None => tag.remove_bpm(), + Some(value) => tag.set_bpm(value), + }; + + // comment + match new_info.comments.as_ref() { + "" => tag.remove_comments(), + value => tag.set_comment(value), + }; + let new_comments = str_to_option(new_info.comments); + + // save tag + tag.write_to_path(&old_path)?; + + // move file + if new_name != track.name || new_artist != track.artist { + let new_filename = generate_filename(tracks_dir, &new_artist, &new_name, &ext); + let new_path = tracks_dir.join(&new_filename); + match fs::rename(old_path, new_path) { + Ok(_) => { + track.file = new_filename; + } + Err(_) => {} + } + } + + track.name = new_name; + track.artist = new_artist; + track.albumName = new_album_name; + track.albumArtist = new_album_artist; + track.composer = new_composer; + track.grouping = new_grouping; + track.genre = new_genre; + track.year = new_year_i64; + track.trackNum = new_track_number; + track.trackCount = new_track_count; + track.discNum = new_disc_number; + track.discCount = new_disc_count; + track.bpm = new_bpm.map(|n| n.into()); + track.comments = new_comments; + + Ok(()) } diff --git a/src-native/tracks/mod.rs b/src-native/tracks/mod.rs index 3bd553d..75d60f7 100644 --- a/src-native/tracks/mod.rs +++ b/src-native/tracks/mod.rs @@ -14,266 +14,266 @@ mod tag; pub use tag::Tag; fn id_to_track<'a>(env: &'a Env, id: &String) -> Result<&'a mut Track> { - let data: &mut Data = get_data(env)?; - let tracks = &mut data.library.tracks; - let track = tracks.get_mut(id).ok_or(nerr("Track ID not found"))?; - return Ok(track); + let data: &mut Data = get_data(env)?; + let tracks = &mut data.library.tracks; + let track = tracks.get_mut(id).ok_or(nerr("Track ID not found"))?; + return Ok(track); } #[napi(js_name = "get_track")] #[allow(dead_code)] pub fn get_track(id: String, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let tracks = &data.library.tracks; - let track = tracks.get(&id).ok_or(nerr("Track ID not found"))?; - Ok(track.clone()) + let data: &mut Data = get_data(&env)?; + let tracks = &data.library.tracks; + let track = tracks.get(&id).ok_or(nerr("Track ID not found"))?; + Ok(track.clone()) } #[napi(js_name = "track_exists")] #[allow(dead_code)] pub fn track_exists(id: String, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let tracks = &data.library.tracks; - Ok(tracks.contains_key(&id)) + let data: &mut Data = get_data(&env)?; + let tracks = &data.library.tracks; + Ok(tracks.contains_key(&id)) } #[napi(js_name = "add_play")] #[allow(dead_code)] pub fn add_play(track_id: String, env: Env) -> Result<()> { - let track = id_to_track(&env, &track_id)?; - let timestamp = get_now_timestamp(); - match &mut track.plays { - None => track.plays = Some(vec![timestamp]), - Some(plays) => plays.push(timestamp), - } - match &mut track.playCount { - None => track.playCount = Some(1), - Some(play_count) => *play_count += 1, - } - Ok(()) + let track = id_to_track(&env, &track_id)?; + let timestamp = get_now_timestamp(); + match &mut track.plays { + None => track.plays = Some(vec![timestamp]), + Some(plays) => plays.push(timestamp), + } + match &mut track.playCount { + None => track.playCount = Some(1), + Some(play_count) => *play_count += 1, + } + Ok(()) } #[napi(js_name = "add_skip")] #[allow(dead_code)] pub fn add_skip(track_id: String, env: Env) -> Result<()> { - let track = id_to_track(&env, &track_id)?; - let timestamp = get_now_timestamp(); - match &mut track.skips { - None => track.skips = Some(vec![timestamp]), - Some(skips) => skips.push(timestamp), - } - match &mut track.skipCount { - None => track.skipCount = Some(1), - Some(skip_count) => *skip_count += 1, - } - Ok(()) + let track = id_to_track(&env, &track_id)?; + let timestamp = get_now_timestamp(); + match &mut track.skips { + None => track.skips = Some(vec![timestamp]), + Some(skips) => skips.push(timestamp), + } + match &mut track.skipCount { + None => track.skipCount = Some(1), + Some(skip_count) => *skip_count += 1, + } + Ok(()) } #[napi(js_name = "add_play_time")] #[allow(dead_code)] pub fn add_play_time(id: TrackID, start: MsSinceUnixEpoch, dur_ms: i64, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - let tracks = &mut data.library.tracks; - tracks.get_mut(&id).ok_or(nerr("Track ID not found"))?; - data.library.playTime.push((id, start, dur_ms)); - Ok(()) + let data: &mut Data = get_data(&env)?; + let tracks = &mut data.library.tracks; + tracks.get_mut(&id).ok_or(nerr("Track ID not found"))?; + data.library.playTime.push((id, start, dur_ms)); + Ok(()) } /// File path, artwork index struct ReadCover(PathBuf, usize); impl Task for ReadCover { - type Output = Vec; - type JsValue = JsBuffer; - fn compute(&mut self) -> Result { - let path = &self.0; - let index = self.1; + type Output = Vec; + type JsValue = JsBuffer; + fn compute(&mut self) -> Result { + let path = &self.0; + let index = self.1; - let tag = Tag::read_from_path(path)?; - let image = match tag.get_image_consume(index) { - Some(image) => image, - None => { - return Err(nerr!("No image")); - } - }; + let tag = Tag::read_from_path(path)?; + let image = match tag.get_image_consume(index) { + Some(image) => image, + None => { + return Err(nerr!("No image")); + } + }; - Ok(image.data) - } - fn resolve(&mut self, env: Env, output: Self::Output) -> Result { - let result = env.create_buffer_copy(output)?; - return Ok(result.into_raw()); - } + Ok(image.data) + } + fn resolve(&mut self, env: Env, output: Self::Output) -> Result { + let result = env.create_buffer_copy(output)?; + return Ok(result.into_raw()); + } } #[napi(js_name = "read_cover_async", ts_return_type = "Promise")] #[allow(dead_code)] pub fn read_cover_async(track_id: String, index: u16, env: Env) -> Result { - let data: &mut Data = get_data(&env)?; - let track = id_to_track(&env, &track_id)?; - let tracks_dir = &data.paths.tracks_dir; - let file_path = tracks_dir.join(&track.file); - let task = ReadCover(file_path, index.into()); - env.spawn(task).map(|t| t.promise_object()) + let data: &mut Data = get_data(&env)?; + let track = id_to_track(&env, &track_id)?; + let tracks_dir = &data.paths.tracks_dir; + let file_path = tracks_dir.join(&track.file); + let task = ReadCover(file_path, index.into()); + env.spawn(task).map(|t| t.promise_object()) } #[napi( - js_name = "read_cover_async_path", - ts_return_type = "Promise" + js_name = "read_cover_async_path", + ts_return_type = "Promise" )] #[allow(dead_code)] pub fn read_cover_async_path(path: String, index: u16, env: Env) -> Result { - let task = ReadCover(path.into(), index.into()); - env.spawn(task).map(|t| t.promise_object()) + let task = ReadCover(path.into(), index.into()); + env.spawn(task).map(|t| t.promise_object()) } fn sanitize_filename(input: &String) -> String { - let mut string = input.replace('/', "_"); - string = string.replace('?', "_"); - string = string.replace('<', "_"); - string = string.replace('>', "_"); - string = string.replace('\\', "_"); - string = string.replace(':', "_"); - string = string.replace('*', "_"); - string = string.replace('\"', "_"); - // prevent control characters: - string = string.replace("0x", "__"); - // Filenames can be max 255 bytes. We use 230 to give - // margin for the fileNum and file extension. - string.truncate(230); - return string; + let mut string = input.replace('/', "_"); + string = string.replace('?', "_"); + string = string.replace('<', "_"); + string = string.replace('>', "_"); + string = string.replace('\\', "_"); + string = string.replace(':', "_"); + string = string.replace('*', "_"); + string = string.replace('\"', "_"); + // prevent control characters: + string = string.replace("0x", "__"); + // Filenames can be max 255 bytes. We use 230 to give + // margin for the fileNum and file extension. + string.truncate(230); + return string; } pub fn generate_filename(dest_dir: &Path, artist: &str, title: &str, ext: &str) -> String { - let beginning = artist.to_owned() + " - " + title; - let beginning = sanitize_filename(&beginning); + let beginning = artist.to_owned() + " - " + title; + let beginning = sanitize_filename(&beginning); - let mut file_num: u32 = 1; - let mut filename = beginning.clone() + "." + ext; - for i in 0..9999 { - if i == 1000 { - panic!("Already got 500 files with that artist and title") - } - let full_path = dest_dir.join(&filename); - if full_path.exists() { - file_num += 1; - filename = beginning.clone() + " " + file_num.to_string().as_str() + "." + ext; - } else { - break; - } - } - return filename; + let mut file_num: u32 = 1; + let mut filename = beginning.clone() + "." + ext; + for i in 0..9999 { + if i == 1000 { + panic!("Already got 500 files with that artist and title") + } + let full_path = dest_dir.join(&filename); + if full_path.exists() { + file_num += 1; + filename = beginning.clone() + " " + file_num.to_string().as_str() + "." + ext; + } else { + break; + } + } + return filename; } #[napi(js_name = "import_file")] #[allow(dead_code)] pub fn import_file(path: String, now: MsSinceUnixEpoch, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - let id = data.library.generate_id(); - let track = import::import_auto(&data, Path::new(&path), now)?; - data.library.tracks.insert(id, track); - Ok(()) + let data: &mut Data = get_data(&env)?; + let id = data.library.generate_id(); + let track = import::import_auto(&data, Path::new(&path), now)?; + data.library.tracks.insert(id, track); + Ok(()) } #[napi(js_name = "load_tags")] #[allow(dead_code)] pub fn load_tags(track_id: String, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - data.current_tag = None; - let track = id_to_track(&env, &track_id)?; + let data: &mut Data = get_data(&env)?; + data.current_tag = None; + let track = id_to_track(&env, &track_id)?; - let path = data.paths.tracks_dir.join(&track.file); - let tag = Tag::read_from_path(&path)?; - data.current_tag = Some(tag); - Ok(()) + let path = data.paths.tracks_dir.join(&track.file); + let tag = Tag::read_from_path(&path)?; + data.current_tag = Some(tag); + Ok(()) } #[napi(object)] pub struct JsImage { - pub index: i64, - pub total_images: i64, - pub mime_type: String, - pub data: JsBuffer, + pub index: i64, + pub total_images: i64, + pub mime_type: String, + pub data: JsBuffer, } #[napi(js_name = "get_image")] #[allow(dead_code)] pub fn get_image(index: u32, env: Env) -> Result> { - let data: &Data = get_data(&env)?; + let data: &Data = get_data(&env)?; - let tag = match &data.current_tag { - Some(tag) => tag, - None => return Ok(None), - }; - let img = match tag.get_image_ref(index as usize) { - Some(image) => image, - None => return Ok(None), - }; + let tag = match &data.current_tag { + Some(tag) => tag, + None => return Ok(None), + }; + let img = match tag.get_image_ref(index as usize) { + Some(image) => image, + None => return Ok(None), + }; - let js_image = JsImage { - index: img.index, - total_images: img.total_images, - mime_type: img.mime_type, - data: env.create_buffer_copy(img.data)?.into_raw(), - }; - Ok(Some(js_image)) + let js_image = JsImage { + index: img.index, + total_images: img.total_images, + mime_type: img.mime_type, + data: env.create_buffer_copy(img.data)?.into_raw(), + }; + Ok(Some(js_image)) } #[napi(js_name = "set_image")] #[allow(dead_code)] pub fn set_image(index: u32, path_str: String, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - let path = data.paths.tracks_dir.join(path_str); - match &mut data.current_tag { - Some(tag) => { - let ext = path.extension().unwrap_or_default().to_string_lossy(); - let mime_type = match ext.as_ref() { - "jpg" | "jpeg" => "image/jpeg".to_string(), - "png" => "image/png".to_string(), - "bmp" => "image/bmp".to_string(), - ext => throw!("Unsupported file type: {}", ext), - }; - let new_bytes = match fs::read(&path) { - Ok(b) => b, - Err(e) => throw!("Error reading that file: {}", e), - }; - tag.set_image(index as usize, new_bytes, &mime_type)?; - } - None => throw!("No tag loaded"), - }; - Ok(()) + let data: &mut Data = get_data(&env)?; + let path = data.paths.tracks_dir.join(path_str); + match &mut data.current_tag { + Some(tag) => { + let ext = path.extension().unwrap_or_default().to_string_lossy(); + let mime_type = match ext.as_ref() { + "jpg" | "jpeg" => "image/jpeg".to_string(), + "png" => "image/png".to_string(), + "bmp" => "image/bmp".to_string(), + ext => throw!("Unsupported file type: {}", ext), + }; + let new_bytes = match fs::read(&path) { + Ok(b) => b, + Err(e) => throw!("Error reading that file: {}", e), + }; + tag.set_image(index as usize, new_bytes, &mime_type)?; + } + None => throw!("No tag loaded"), + }; + Ok(()) } #[napi(js_name = "set_image_data")] #[allow(dead_code)] pub fn set_image_data(index: u32, bytes: JsArrayBuffer, mime_type: String, env: Env) -> Result<()> { - let bytes: Vec = bytes.into_value()?.to_vec(); - let data: &mut Data = get_data(&env)?; - match &mut data.current_tag { - Some(tag) => tag.set_image(index as usize, bytes, &mime_type)?, - None => throw!("No tag loaded"), - }; - Ok(()) + let bytes: Vec = bytes.into_value()?.to_vec(); + let data: &mut Data = get_data(&env)?; + match &mut data.current_tag { + Some(tag) => tag.set_image(index as usize, bytes, &mime_type)?, + None => throw!("No tag loaded"), + }; + Ok(()) } #[napi(js_name = "remove_image")] #[allow(dead_code)] pub fn remove_image(index: u32, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - match data.current_tag { - Some(ref mut tag) => tag.remove_image(index as usize), - None => {} - }; - Ok(()) + let data: &mut Data = get_data(&env)?; + match data.current_tag { + Some(ref mut tag) => tag.remove_image(index as usize), + None => {} + }; + Ok(()) } #[napi(js_name = "update_track_info")] #[allow(dead_code)] pub fn update_track_info(track_id: String, info: md::TrackMD, env: Env) -> Result<()> { - let data: &mut Data = get_data(&env)?; - let track = id_to_track(&env, &track_id)?; + let data: &mut Data = get_data(&env)?; + let track = id_to_track(&env, &track_id)?; - let tag = match &mut data.current_tag { - Some(tag) => tag, - None => throw!("No tag loaded"), - }; - md::update_track_info(&data.paths.tracks_dir, track, tag, info)?; + let tag = match &mut data.current_tag { + Some(tag) => tag, + None => throw!("No tag loaded"), + }; + md::update_track_info(&data.paths.tracks_dir, track, tag, info)?; - Ok(()) + Ok(()) } diff --git a/src-native/tracks/tag.rs b/src-native/tracks/tag.rs index 8dcf44a..ffd505b 100644 --- a/src-native/tracks/tag.rs +++ b/src-native/tracks/tag.rs @@ -5,628 +5,631 @@ use std::io::Cursor; use std::path::{Path, PathBuf}; pub enum SetInfoError { - NumberRequired, - Other(String), + NumberRequired, + Other(String), } impl ToString for SetInfoError { - fn to_string(self: &SetInfoError) -> String { - match self { - SetInfoError::NumberRequired => "Number required".to_string(), - SetInfoError::Other(s) => s.to_string(), - } - } + fn to_string(self: &SetInfoError) -> String { + match self { + SetInfoError::NumberRequired => "Number required".to_string(), + SetInfoError::Other(s) => s.to_string(), + } + } } impl From for napi::Error { - fn from(err: SetInfoError) -> napi::Error { - napi::Error::from_reason(err.to_string()) - } + fn from(err: SetInfoError) -> napi::Error { + napi::Error::from_reason(err.to_string()) + } } impl From for UniError { - fn from(err: SetInfoError) -> UniError { - err.to_string().into() - } + fn from(err: SetInfoError) -> UniError { + err.to_string().into() + } } pub fn id3_timestamp_from_year(year: i32) -> id3::Timestamp { - id3::Timestamp { - year, - month: None, - day: None, - hour: None, - minute: None, - second: None, - } + id3::Timestamp { + year, + month: None, + day: None, + hour: None, + minute: None, + second: None, + } } pub struct Image { - // i64 because napi doesn't support u64 - pub index: i64, - pub total_images: i64, - pub mime_type: String, - pub data: Vec, + // i64 because napi doesn't support u64 + pub index: i64, + pub total_images: i64, + pub mime_type: String, + pub data: Vec, } pub struct ImageRef<'a> { - // i64 because napi doesn't support u64 - pub index: i64, - pub total_images: i64, - pub mime_type: String, - pub data: &'a [u8], + // i64 because napi doesn't support u64 + pub index: i64, + pub total_images: i64, + pub mime_type: String, + pub data: &'a [u8], } pub enum Tag { - Id3(id3::Tag), - Mp4(mp4ameta::Tag), - Lofty(lofty::tag::Tag), + Id3(id3::Tag), + Mp4(mp4ameta::Tag), + Lofty(lofty::tag::Tag), } impl Tag { - pub fn read_from_path(path: &PathBuf) -> UniResult { - if !path.exists() { - throw!("File does not exist: {}", path.to_string_lossy()); - } - let ext = path.extension().unwrap_or_default().to_string_lossy(); + pub fn read_from_path(path: &PathBuf) -> UniResult { + if !path.exists() { + throw!("File does not exist: {}", path.to_string_lossy()); + } + let ext = path.extension().unwrap_or_default().to_string_lossy(); - let tag = match ext.as_ref() { - "mp3" => { - let tag = match id3::Tag::read_from_path(path) { - Ok(tag) => tag, - Err(_) => id3::Tag::new(), - }; - Tag::Id3(tag) - } - "m4a" => { - let tag = match mp4ameta::Tag::read_from_path(path) { - Ok(tag) => tag, - Err(e) => match e.kind { - mp4ameta::ErrorKind::NoTag => { - throw!("No m4a tags found in file. Auto creating m4a tags is not yet supported") - } - _ => { - throw!("Error reading m4a tags: {}", e) - } - }, - }; - Tag::Mp4(tag) - } - "opus" => { - let probe = match lofty::probe::Probe::open(path) { - Ok(f) => { - let parse_options = lofty::config::ParseOptions::new() - .read_properties(false) - .parsing_mode(lofty::config::ParsingMode::Strict); - f.options(parse_options) - } - Err(e) => throw!("File does not exist: {}", e), - }; + let tag = match ext.as_ref() { + "mp3" => { + let tag = match id3::Tag::read_from_path(path) { + Ok(tag) => tag, + Err(_) => id3::Tag::new(), + }; + Tag::Id3(tag) + } + "m4a" => { + let tag = match mp4ameta::Tag::read_from_path(path) { + Ok(tag) => tag, + Err(e) => match e.kind { + mp4ameta::ErrorKind::NoTag => { + throw!("No m4a tags found in file. Auto creating m4a tags is not yet supported") + } + _ => { + throw!("Error reading m4a tags: {}", e) + } + }, + }; + Tag::Mp4(tag) + } + "opus" => { + let probe = match lofty::probe::Probe::open(path) { + Ok(f) => { + let parse_options = lofty::config::ParseOptions::new() + .read_properties(false) + .parsing_mode(lofty::config::ParsingMode::Strict); + f.options(parse_options) + } + Err(e) => throw!("File does not exist: {}", e), + }; - let mut tagged_file = match probe.read() { - Ok(f) => f, - Err(e) => throw!("Unable to read file: {}", e), - }; + let mut tagged_file = match probe.read() { + Ok(f) => f, + Err(e) => throw!("Unable to read file: {}", e), + }; - let tag = match tagged_file.remove(lofty::tag::TagType::VorbisComments) { - Some(t) => t, - None => lofty::tag::Tag::new(lofty::tag::TagType::VorbisComments), - }; - Tag::Lofty(tag) - } - _ => throw!("Unsupported file extension: {}", ext), - }; - Ok(tag) - } - pub fn write_to_path(&mut self, path: &Path) -> UniResult<()> { - match self { - Tag::Id3(tag) => { - match tag.write_to_path(path, id3::Version::Id3v24) { - Ok(_) => {} - Err(e) => throw!("Unable to tag file: {}", e.description), - }; - } - Tag::Mp4(tag) => { - match tag.write_to_path(path) { - Ok(_) => {} - Err(e) => throw!("Unable to tag file: {}", e.description), - }; - } - Tag::Lofty(tag) => { - match tag.save_to_path(path, lofty::config::WriteOptions::default()) { - Ok(_) => {} - Err(e) => throw!("Unable to tag file: {}", e), - }; - } - }; - Ok(()) - } - pub fn remove_title(&mut self) { - match self { - Tag::Id3(tag) => tag.remove_title(), - Tag::Mp4(tag) => tag.remove_title(), - Tag::Lofty(tag) => tag.remove_title(), - } - } - pub fn set_title(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_title(value), - Tag::Mp4(tag) => tag.set_title(value), - Tag::Lofty(tag) => tag.set_title(value.to_string()), - } - } - pub fn remove_artists(&mut self) { - match self { - Tag::Id3(tag) => tag.remove_artist(), - Tag::Mp4(tag) => tag.remove_artists(), - Tag::Lofty(tag) => tag.remove_artist(), - } - } - pub fn set_artist(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_artist(value), - Tag::Mp4(tag) => tag.set_artist(value), - Tag::Lofty(tag) => tag.set_artist(value.to_string()), - } - } - pub fn remove_album(&mut self) { - match self { - Tag::Id3(tag) => tag.remove_album(), - Tag::Mp4(tag) => tag.remove_album(), - Tag::Lofty(tag) => tag.remove_album(), - } - } - pub fn set_album(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_album(value), - Tag::Mp4(tag) => tag.set_album(value), - Tag::Lofty(tag) => tag.set_album(value.to_string()), - } - } - pub fn remove_album_artists(&mut self) { - match self { - Tag::Id3(tag) => tag.remove_album_artist(), - Tag::Mp4(tag) => tag.remove_album_artists(), - Tag::Lofty(tag) => { - let _ = tag.remove_key(&lofty::tag::ItemKey::AlbumArtist); - } - } - } - pub fn set_album_artist(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_album_artist(value), - Tag::Mp4(tag) => tag.set_album_artist(value), - Tag::Lofty(tag) => { - let inserted = tag.insert_text(lofty::tag::ItemKey::AlbumArtist, value.to_string()); - assert!(inserted, "Failed to set album artist"); - } - } - } - pub fn remove_composers(&mut self) { - match self { - Tag::Id3(tag) => { - tag.remove("TCOM"); - } - Tag::Mp4(tag) => tag.remove_composers(), - Tag::Lofty(tag) => { - let _ = tag.remove_key(&lofty::tag::ItemKey::Composer); - } - } - } - pub fn set_composer(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_text("TCOM", value), - Tag::Mp4(tag) => tag.set_composer(value), - Tag::Lofty(tag) => { - let inserted = tag.insert_text(lofty::tag::ItemKey::Composer, value.to_string()); - assert!(inserted, "Failed to set composer"); - } - } - } - pub fn remove_groupings(&mut self) { - match self { - Tag::Id3(tag) => { - tag.remove("GRP1"); - } - Tag::Mp4(tag) => tag.remove_groupings(), - Tag::Lofty(tag) => { - let _ = tag.remove_key(&lofty::tag::ItemKey::ContentGroup); - } - } - } - pub fn set_grouping(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_text("GRP1", value), - Tag::Mp4(tag) => tag.set_grouping(value), - Tag::Lofty(tag) => { - let inserted = tag.insert_text(lofty::tag::ItemKey::ContentGroup, value.to_string()); - assert!(inserted, "Failed to set grouping"); - } - } - } - pub fn remove_genres(&mut self) { - match self { - Tag::Id3(tag) => tag.remove_genre(), - Tag::Mp4(tag) => tag.remove_genres(), - Tag::Lofty(tag) => tag.remove_genre(), - } - } - pub fn set_genre(&mut self, value: &str) { - match self { - Tag::Id3(tag) => tag.set_genre(value), - Tag::Mp4(tag) => tag.set_genre(value), - Tag::Lofty(tag) => tag.set_genre(value.to_string()), - } - } - pub fn remove_year(&mut self) { - match self { - Tag::Id3(tag) => { - tag.remove_year(); - tag.remove_date_recorded(); - } - Tag::Mp4(tag) => tag.remove_year(), - Tag::Lofty(tag) => tag.remove_year(), - } - } - pub fn set_year(&mut self, value: i32) { - match self { - Tag::Id3(tag) => { - tag.set_year(value); - tag.set_date_recorded(id3_timestamp_from_year(value)); - } - Tag::Mp4(tag) => tag.set_year(value.to_string()), - Tag::Lofty(tag) => { - let u = if value < 0 { 0 } else { value as u32 }; - tag.set_year(u); - } - } - } - /// For some tag types, `total` cannot exist without `number`. In those - /// cases, `total` is assumed to be `None`. - pub fn set_track_info( - &mut self, - number: Option, - total: Option, - ) -> Result<(), SetInfoError> { - match self { - Tag::Id3(tag) => match (number, total) { - (Some(number), Some(total)) => { - tag.set_track(number); - tag.set_total_tracks(total); - } - (Some(number), None) => { - tag.remove_total_tracks(); - tag.set_track(number); - } - (None, Some(_)) => { - return Err(SetInfoError::NumberRequired); - } - (None, None) => { - tag.remove_total_tracks(); - tag.remove_track(); - } - }, - Tag::Mp4(tag) => { - if number.unwrap_or(0) > u16::MAX as u32 { - let msg = "Track number too large for this file".to_string(); - return Err(SetInfoError::Other(msg)); - } - if total.unwrap_or(0) > u16::MAX as u32 { - let msg = "Total tracks too large for this file".to_string(); - return Err(SetInfoError::Other(msg)); - } - match number { - Some(number) => tag.set_track_number(number as u16), - None => tag.remove_track_number(), - } - match total { - Some(total) => tag.set_total_tracks(total as u16), - None => tag.remove_total_tracks(), - } - } - Tag::Lofty(tag) => { - match number { - Some(number) => tag.set_track(number), - None => tag.remove_track(), - } - match total { - Some(total) => tag.set_track_total(total), - None => tag.remove_track_total(), - } - } - } - Ok(()) - } - /// For some tag types, `total` cannot exist without `number`. In those - /// cases, `total` is assumed to be `None`. - pub fn set_disc_info( - &mut self, - number: Option, - total: Option, - ) -> Result<(), SetInfoError> { - match self { - Tag::Id3(tag) => match (number, total) { - (Some(number), Some(total)) => { - tag.set_disc(number); - tag.set_total_discs(total); - } - (Some(number), None) => { - tag.remove_total_discs(); - tag.set_disc(number); - } - (None, Some(_)) => { - return Err(SetInfoError::NumberRequired); - } - (None, None) => { - tag.remove_total_discs(); - tag.remove_disc(); - } - }, - Tag::Mp4(tag) => { - if number.unwrap_or(0) > u16::MAX as u32 { - let msg = "Disc number too large for this file".to_string(); - return Err(SetInfoError::Other(msg)); - } - if total.unwrap_or(0) > u16::MAX as u32 { - let msg = "Total discs too large for this file".to_string(); - return Err(SetInfoError::Other(msg)); - } - match number { - Some(number) => tag.set_disc_number(number as u16), - None => tag.remove_disc_number(), - } - match total { - Some(total) => tag.set_total_discs(total as u16), - None => tag.remove_total_discs(), - } - } - Tag::Lofty(tag) => { - match number { - Some(number) => tag.set_disk(number), - None => tag.remove_disk(), - } - match total { - Some(total) => tag.set_disk_total(total), - None => tag.remove_disk_total(), - } - } - } - Ok(()) - } - pub fn remove_bpm(&mut self) { - match self { - Tag::Id3(tag) => { - tag.remove("TBPM"); - } - Tag::Mp4(tag) => tag.remove_bpm(), - Tag::Lofty(tag) => { - let _ = tag.remove_key(&lofty::tag::ItemKey::Bpm); - } - }; - } - pub fn set_bpm(&mut self, value: u16) { - match self { - Tag::Id3(tag) => { - tag.set_text("TBPM", value.to_string()); - } - Tag::Mp4(tag) => { - tag.set_bpm(value); - } - Tag::Lofty(tag) => { - let inserted = tag.insert_text(lofty::tag::ItemKey::Bpm, value.to_string()); - assert!(inserted, "Failed to set BPM"); - } - }; - } - pub fn remove_comments(&mut self) { - match self { - Tag::Id3(tag) => { - tag.remove("COMM"); - } - Tag::Mp4(tag) => tag.remove_comments(), - Tag::Lofty(tag) => tag.remove_comment(), - }; - } - pub fn set_comment(&mut self, value: &str) { - match self { - Tag::Id3(tag) => { - tag.remove_comment(None, None); - tag.add_frame(id3::frame::Comment { - lang: "eng".to_string(), - description: "".to_string(), - text: value.to_string(), - }); - } - Tag::Mp4(tag) => tag.set_comment(value), - Tag::Lofty(tag) => tag.set_comment(value.to_string()), - } - } - pub fn set_image(&mut self, index: usize, data: Vec, mime_type: &str) -> UniResult<()> { - match self { - Tag::Id3(tag) => { - let mut pic_frames: Vec<_> = tag - .frames() - .filter(|frame| frame.content().picture().is_some()) - .cloned() - .collect(); - let mut new_pic = id3::frame::Picture { - mime_type: match mime_type { - "image/jpeg" | "image/png" => mime_type.to_string(), - ext => throw!("Unsupported file type: {}", ext), - }, - picture_type: id3::frame::PictureType::Other, - description: "".to_string(), - data, - }; - match pic_frames.get_mut(index) { - Some(old_frame) => { - let old_pic = old_frame.content().picture().unwrap(); - new_pic.picture_type = old_pic.picture_type; - new_pic.description = old_pic.description.clone(); - let new_frame = id3::Frame::with_content("APIC", id3::Content::Picture(new_pic)); - *old_frame = new_frame; - } - None => { - if index == pic_frames.len() { - let new_frame = id3::Frame::with_content("APIC", id3::Content::Picture(new_pic)); - pic_frames.insert(index, new_frame); - } else { - throw!("Index out of range"); - } - } - } - tag.remove_all_pictures(); - for pic_frame in pic_frames { - tag.add_frame(pic_frame); - } - } - Tag::Mp4(tag) => { - let mut artworks: Vec<_> = tag.take_artworks().collect(); - let new_artwork = mp4ameta::Img { - fmt: match mime_type { - "image/jpeg" => mp4ameta::ImgFmt::Jpeg, - "image/png" => mp4ameta::ImgFmt::Png, - "image/bmp" => mp4ameta::ImgFmt::Bmp, - ext => throw!("Unsupported file type: {}", ext), - }, - data, - }; - match artworks.get_mut(index) { - Some(artwork) => { - *artwork = new_artwork; - } - None => { - if index == artworks.len() { - artworks.push(new_artwork); - } else { - throw!("Index out of range"); - } - } - } - tag.set_artworks(artworks); - } - Tag::Lofty(tag) => { - let mut reader = Cursor::new(data); - let picture = match lofty::picture::Picture::from_reader(&mut reader) { - Ok(picture) => picture, - Err(e) => throw!("Unable to read picture: {}", e), - }; - match picture.mime_type() { - Some(lofty::picture::MimeType::Png | lofty::picture::MimeType::Jpeg) => { - tag.set_picture(index, picture); - } - _ => throw!("Unsupported picture type"), - } - } - } - Ok(()) - } - pub fn get_image_ref(&self, index: usize) -> Option { - match self { - Tag::Id3(tag) => match tag.pictures().nth(index) { - Some(pic) => Some(ImageRef { - index: index.try_into().expect("usize conv"), - total_images: tag.pictures().count().try_into().expect("usize conv"), - data: &pic.data, - mime_type: pic.mime_type.clone(), - }), - None => None, - }, - Tag::Mp4(tag) => match tag.artworks().nth(index) { - Some(artwork) => Some(ImageRef { - index: index.try_into().expect("usize conv"), - total_images: tag.artworks().count().try_into().expect("usize conv"), - data: artwork.data, - mime_type: match artwork.fmt { - mp4ameta::ImgFmt::Bmp => "image/bmp".to_string(), - mp4ameta::ImgFmt::Jpeg => "image/jpeg".to_string(), - mp4ameta::ImgFmt::Png => "image/png".to_string(), - }, - }), - None => None, - }, - Tag::Lofty(tag) => { - let pictures = tag.pictures(); - match pictures.get(index) { - Some(pic) => { - let data = pic.data(); - Some(ImageRef { - index: index.try_into().expect("usize conv"), - total_images: pictures.len().try_into().expect("usize conv"), - data, - mime_type: match pic.mime_type() { - Some(mime_type) => mime_type.to_string(), - _ => return None, - }, - }) - } - None => None, - } - } - } - } - pub fn get_image_consume(self, index: usize) -> Option { - match self { - Tag::Id3(tag) => match tag.pictures().nth(index) { - Some(pic) => Some(Image { - index: index.try_into().expect("usize conv"), - total_images: tag.pictures().count().try_into().expect("usize conv"), - data: pic.data.to_vec(), - mime_type: pic.mime_type.clone(), - }), - None => None, - }, - Tag::Mp4(mut tag) => { - let total_images = tag.artworks().count().try_into().expect("usize conv"); - match tag.take_artworks().nth(index) { - Some(artwork) => Some(Image { - index: index.try_into().expect("usize conv"), - total_images, - data: artwork.data, - mime_type: match artwork.fmt { - mp4ameta::ImgFmt::Bmp => "image/bmp".to_string(), - mp4ameta::ImgFmt::Jpeg => "image/jpeg".to_string(), - mp4ameta::ImgFmt::Png => "image/png".to_string(), - }, - }), - None => None, - } - } - Tag::Lofty(mut tag) => { - let pictures_len = tag.pictures().len(); - if tag.picture_count() <= index.try_into().expect("usize conv") { - return None; - } - let pic = tag.remove_picture(index); - Some(Image { - index: index.try_into().expect("usize conv"), - total_images: pictures_len.try_into().expect("usize conv"), - mime_type: match pic.mime_type() { - Some(mime_type) => mime_type.to_string(), - _ => return None, - }, - data: pic.into_data(), - }) - } - } - } - pub fn remove_image(&mut self, index: usize) { - match self { - Tag::Id3(ref mut tag) => { - let mut pic_frames: Vec<_> = tag - .frames() - .filter(|frame| frame.content().picture().is_some()) - .cloned() - .collect(); - pic_frames.remove(index); - tag.remove_all_pictures(); - for pic_frame in pic_frames { - tag.add_frame(pic_frame); - } - } - Tag::Mp4(ref mut tag) => { - let mut artworks: Vec<_> = tag.take_artworks().collect(); - artworks.remove(index); - tag.set_artworks(artworks); - } - Tag::Lofty(tag) => { - tag.remove_picture(index); - } - } - } + let tag = match tagged_file.remove(lofty::tag::TagType::VorbisComments) { + Some(t) => t, + None => lofty::tag::Tag::new(lofty::tag::TagType::VorbisComments), + }; + Tag::Lofty(tag) + } + _ => throw!("Unsupported file extension: {}", ext), + }; + Ok(tag) + } + pub fn write_to_path(&mut self, path: &Path) -> UniResult<()> { + match self { + Tag::Id3(tag) => { + match tag.write_to_path(path, id3::Version::Id3v24) { + Ok(_) => {} + Err(e) => throw!("Unable to tag file: {}", e.description), + }; + } + Tag::Mp4(tag) => { + match tag.write_to_path(path) { + Ok(_) => {} + Err(e) => throw!("Unable to tag file: {}", e.description), + }; + } + Tag::Lofty(tag) => { + match tag.save_to_path(path, lofty::config::WriteOptions::default()) { + Ok(_) => {} + Err(e) => throw!("Unable to tag file: {}", e), + }; + } + }; + Ok(()) + } + pub fn remove_title(&mut self) { + match self { + Tag::Id3(tag) => tag.remove_title(), + Tag::Mp4(tag) => tag.remove_title(), + Tag::Lofty(tag) => tag.remove_title(), + } + } + pub fn set_title(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_title(value), + Tag::Mp4(tag) => tag.set_title(value), + Tag::Lofty(tag) => tag.set_title(value.to_string()), + } + } + pub fn remove_artists(&mut self) { + match self { + Tag::Id3(tag) => tag.remove_artist(), + Tag::Mp4(tag) => tag.remove_artists(), + Tag::Lofty(tag) => tag.remove_artist(), + } + } + pub fn set_artist(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_artist(value), + Tag::Mp4(tag) => tag.set_artist(value), + Tag::Lofty(tag) => tag.set_artist(value.to_string()), + } + } + pub fn remove_album(&mut self) { + match self { + Tag::Id3(tag) => tag.remove_album(), + Tag::Mp4(tag) => tag.remove_album(), + Tag::Lofty(tag) => tag.remove_album(), + } + } + pub fn set_album(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_album(value), + Tag::Mp4(tag) => tag.set_album(value), + Tag::Lofty(tag) => tag.set_album(value.to_string()), + } + } + pub fn remove_album_artists(&mut self) { + match self { + Tag::Id3(tag) => tag.remove_album_artist(), + Tag::Mp4(tag) => tag.remove_album_artists(), + Tag::Lofty(tag) => { + let _ = tag.remove_key(&lofty::tag::ItemKey::AlbumArtist); + } + } + } + pub fn set_album_artist(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_album_artist(value), + Tag::Mp4(tag) => tag.set_album_artist(value), + Tag::Lofty(tag) => { + let inserted = tag.insert_text(lofty::tag::ItemKey::AlbumArtist, value.to_string()); + assert!(inserted, "Failed to set album artist"); + } + } + } + pub fn remove_composers(&mut self) { + match self { + Tag::Id3(tag) => { + tag.remove("TCOM"); + } + Tag::Mp4(tag) => tag.remove_composers(), + Tag::Lofty(tag) => { + let _ = tag.remove_key(&lofty::tag::ItemKey::Composer); + } + } + } + pub fn set_composer(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_text("TCOM", value), + Tag::Mp4(tag) => tag.set_composer(value), + Tag::Lofty(tag) => { + let inserted = tag.insert_text(lofty::tag::ItemKey::Composer, value.to_string()); + assert!(inserted, "Failed to set composer"); + } + } + } + pub fn remove_groupings(&mut self) { + match self { + Tag::Id3(tag) => { + tag.remove("GRP1"); + } + Tag::Mp4(tag) => tag.remove_groupings(), + Tag::Lofty(tag) => { + let _ = tag.remove_key(&lofty::tag::ItemKey::ContentGroup); + } + } + } + pub fn set_grouping(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_text("GRP1", value), + Tag::Mp4(tag) => tag.set_grouping(value), + Tag::Lofty(tag) => { + let inserted = + tag.insert_text(lofty::tag::ItemKey::ContentGroup, value.to_string()); + assert!(inserted, "Failed to set grouping"); + } + } + } + pub fn remove_genres(&mut self) { + match self { + Tag::Id3(tag) => tag.remove_genre(), + Tag::Mp4(tag) => tag.remove_genres(), + Tag::Lofty(tag) => tag.remove_genre(), + } + } + pub fn set_genre(&mut self, value: &str) { + match self { + Tag::Id3(tag) => tag.set_genre(value), + Tag::Mp4(tag) => tag.set_genre(value), + Tag::Lofty(tag) => tag.set_genre(value.to_string()), + } + } + pub fn remove_year(&mut self) { + match self { + Tag::Id3(tag) => { + tag.remove_year(); + tag.remove_date_recorded(); + } + Tag::Mp4(tag) => tag.remove_year(), + Tag::Lofty(tag) => tag.remove_year(), + } + } + pub fn set_year(&mut self, value: i32) { + match self { + Tag::Id3(tag) => { + tag.set_year(value); + tag.set_date_recorded(id3_timestamp_from_year(value)); + } + Tag::Mp4(tag) => tag.set_year(value.to_string()), + Tag::Lofty(tag) => { + let u = if value < 0 { 0 } else { value as u32 }; + tag.set_year(u); + } + } + } + /// For some tag types, `total` cannot exist without `number`. In those + /// cases, `total` is assumed to be `None`. + pub fn set_track_info( + &mut self, + number: Option, + total: Option, + ) -> Result<(), SetInfoError> { + match self { + Tag::Id3(tag) => match (number, total) { + (Some(number), Some(total)) => { + tag.set_track(number); + tag.set_total_tracks(total); + } + (Some(number), None) => { + tag.remove_total_tracks(); + tag.set_track(number); + } + (None, Some(_)) => { + return Err(SetInfoError::NumberRequired); + } + (None, None) => { + tag.remove_total_tracks(); + tag.remove_track(); + } + }, + Tag::Mp4(tag) => { + if number.unwrap_or(0) > u16::MAX as u32 { + let msg = "Track number too large for this file".to_string(); + return Err(SetInfoError::Other(msg)); + } + if total.unwrap_or(0) > u16::MAX as u32 { + let msg = "Total tracks too large for this file".to_string(); + return Err(SetInfoError::Other(msg)); + } + match number { + Some(number) => tag.set_track_number(number as u16), + None => tag.remove_track_number(), + } + match total { + Some(total) => tag.set_total_tracks(total as u16), + None => tag.remove_total_tracks(), + } + } + Tag::Lofty(tag) => { + match number { + Some(number) => tag.set_track(number), + None => tag.remove_track(), + } + match total { + Some(total) => tag.set_track_total(total), + None => tag.remove_track_total(), + } + } + } + Ok(()) + } + /// For some tag types, `total` cannot exist without `number`. In those + /// cases, `total` is assumed to be `None`. + pub fn set_disc_info( + &mut self, + number: Option, + total: Option, + ) -> Result<(), SetInfoError> { + match self { + Tag::Id3(tag) => match (number, total) { + (Some(number), Some(total)) => { + tag.set_disc(number); + tag.set_total_discs(total); + } + (Some(number), None) => { + tag.remove_total_discs(); + tag.set_disc(number); + } + (None, Some(_)) => { + return Err(SetInfoError::NumberRequired); + } + (None, None) => { + tag.remove_total_discs(); + tag.remove_disc(); + } + }, + Tag::Mp4(tag) => { + if number.unwrap_or(0) > u16::MAX as u32 { + let msg = "Disc number too large for this file".to_string(); + return Err(SetInfoError::Other(msg)); + } + if total.unwrap_or(0) > u16::MAX as u32 { + let msg = "Total discs too large for this file".to_string(); + return Err(SetInfoError::Other(msg)); + } + match number { + Some(number) => tag.set_disc_number(number as u16), + None => tag.remove_disc_number(), + } + match total { + Some(total) => tag.set_total_discs(total as u16), + None => tag.remove_total_discs(), + } + } + Tag::Lofty(tag) => { + match number { + Some(number) => tag.set_disk(number), + None => tag.remove_disk(), + } + match total { + Some(total) => tag.set_disk_total(total), + None => tag.remove_disk_total(), + } + } + } + Ok(()) + } + pub fn remove_bpm(&mut self) { + match self { + Tag::Id3(tag) => { + tag.remove("TBPM"); + } + Tag::Mp4(tag) => tag.remove_bpm(), + Tag::Lofty(tag) => { + let _ = tag.remove_key(&lofty::tag::ItemKey::Bpm); + } + }; + } + pub fn set_bpm(&mut self, value: u16) { + match self { + Tag::Id3(tag) => { + tag.set_text("TBPM", value.to_string()); + } + Tag::Mp4(tag) => { + tag.set_bpm(value); + } + Tag::Lofty(tag) => { + let inserted = tag.insert_text(lofty::tag::ItemKey::Bpm, value.to_string()); + assert!(inserted, "Failed to set BPM"); + } + }; + } + pub fn remove_comments(&mut self) { + match self { + Tag::Id3(tag) => { + tag.remove("COMM"); + } + Tag::Mp4(tag) => tag.remove_comments(), + Tag::Lofty(tag) => tag.remove_comment(), + }; + } + pub fn set_comment(&mut self, value: &str) { + match self { + Tag::Id3(tag) => { + tag.remove_comment(None, None); + tag.add_frame(id3::frame::Comment { + lang: "eng".to_string(), + description: "".to_string(), + text: value.to_string(), + }); + } + Tag::Mp4(tag) => tag.set_comment(value), + Tag::Lofty(tag) => tag.set_comment(value.to_string()), + } + } + pub fn set_image(&mut self, index: usize, data: Vec, mime_type: &str) -> UniResult<()> { + match self { + Tag::Id3(tag) => { + let mut pic_frames: Vec<_> = tag + .frames() + .filter(|frame| frame.content().picture().is_some()) + .cloned() + .collect(); + let mut new_pic = id3::frame::Picture { + mime_type: match mime_type { + "image/jpeg" | "image/png" => mime_type.to_string(), + ext => throw!("Unsupported file type: {}", ext), + }, + picture_type: id3::frame::PictureType::Other, + description: "".to_string(), + data, + }; + match pic_frames.get_mut(index) { + Some(old_frame) => { + let old_pic = old_frame.content().picture().unwrap(); + new_pic.picture_type = old_pic.picture_type; + new_pic.description = old_pic.description.clone(); + let new_frame = + id3::Frame::with_content("APIC", id3::Content::Picture(new_pic)); + *old_frame = new_frame; + } + None => { + if index == pic_frames.len() { + let new_frame = + id3::Frame::with_content("APIC", id3::Content::Picture(new_pic)); + pic_frames.insert(index, new_frame); + } else { + throw!("Index out of range"); + } + } + } + tag.remove_all_pictures(); + for pic_frame in pic_frames { + tag.add_frame(pic_frame); + } + } + Tag::Mp4(tag) => { + let mut artworks: Vec<_> = tag.take_artworks().collect(); + let new_artwork = mp4ameta::Img { + fmt: match mime_type { + "image/jpeg" => mp4ameta::ImgFmt::Jpeg, + "image/png" => mp4ameta::ImgFmt::Png, + "image/bmp" => mp4ameta::ImgFmt::Bmp, + ext => throw!("Unsupported file type: {}", ext), + }, + data, + }; + match artworks.get_mut(index) { + Some(artwork) => { + *artwork = new_artwork; + } + None => { + if index == artworks.len() { + artworks.push(new_artwork); + } else { + throw!("Index out of range"); + } + } + } + tag.set_artworks(artworks); + } + Tag::Lofty(tag) => { + let mut reader = Cursor::new(data); + let picture = match lofty::picture::Picture::from_reader(&mut reader) { + Ok(picture) => picture, + Err(e) => throw!("Unable to read picture: {}", e), + }; + match picture.mime_type() { + Some(lofty::picture::MimeType::Png | lofty::picture::MimeType::Jpeg) => { + tag.set_picture(index, picture); + } + _ => throw!("Unsupported picture type"), + } + } + } + Ok(()) + } + pub fn get_image_ref(&self, index: usize) -> Option { + match self { + Tag::Id3(tag) => match tag.pictures().nth(index) { + Some(pic) => Some(ImageRef { + index: index.try_into().expect("usize conv"), + total_images: tag.pictures().count().try_into().expect("usize conv"), + data: &pic.data, + mime_type: pic.mime_type.clone(), + }), + None => None, + }, + Tag::Mp4(tag) => match tag.artworks().nth(index) { + Some(artwork) => Some(ImageRef { + index: index.try_into().expect("usize conv"), + total_images: tag.artworks().count().try_into().expect("usize conv"), + data: artwork.data, + mime_type: match artwork.fmt { + mp4ameta::ImgFmt::Bmp => "image/bmp".to_string(), + mp4ameta::ImgFmt::Jpeg => "image/jpeg".to_string(), + mp4ameta::ImgFmt::Png => "image/png".to_string(), + }, + }), + None => None, + }, + Tag::Lofty(tag) => { + let pictures = tag.pictures(); + match pictures.get(index) { + Some(pic) => { + let data = pic.data(); + Some(ImageRef { + index: index.try_into().expect("usize conv"), + total_images: pictures.len().try_into().expect("usize conv"), + data, + mime_type: match pic.mime_type() { + Some(mime_type) => mime_type.to_string(), + _ => return None, + }, + }) + } + None => None, + } + } + } + } + pub fn get_image_consume(self, index: usize) -> Option { + match self { + Tag::Id3(tag) => match tag.pictures().nth(index) { + Some(pic) => Some(Image { + index: index.try_into().expect("usize conv"), + total_images: tag.pictures().count().try_into().expect("usize conv"), + data: pic.data.to_vec(), + mime_type: pic.mime_type.clone(), + }), + None => None, + }, + Tag::Mp4(mut tag) => { + let total_images = tag.artworks().count().try_into().expect("usize conv"); + match tag.take_artworks().nth(index) { + Some(artwork) => Some(Image { + index: index.try_into().expect("usize conv"), + total_images, + data: artwork.data, + mime_type: match artwork.fmt { + mp4ameta::ImgFmt::Bmp => "image/bmp".to_string(), + mp4ameta::ImgFmt::Jpeg => "image/jpeg".to_string(), + mp4ameta::ImgFmt::Png => "image/png".to_string(), + }, + }), + None => None, + } + } + Tag::Lofty(mut tag) => { + let pictures_len = tag.pictures().len(); + if tag.picture_count() <= index.try_into().expect("usize conv") { + return None; + } + let pic = tag.remove_picture(index); + Some(Image { + index: index.try_into().expect("usize conv"), + total_images: pictures_len.try_into().expect("usize conv"), + mime_type: match pic.mime_type() { + Some(mime_type) => mime_type.to_string(), + _ => return None, + }, + data: pic.into_data(), + }) + } + } + } + pub fn remove_image(&mut self, index: usize) { + match self { + Tag::Id3(ref mut tag) => { + let mut pic_frames: Vec<_> = tag + .frames() + .filter(|frame| frame.content().picture().is_some()) + .cloned() + .collect(); + pic_frames.remove(index); + tag.remove_all_pictures(); + for pic_frame in pic_frames { + tag.add_frame(pic_frame); + } + } + Tag::Mp4(ref mut tag) => { + let mut artworks: Vec<_> = tag.take_artworks().collect(); + artworks.remove(index); + tag.set_artworks(artworks); + } + Tag::Lofty(tag) => { + tag.remove_picture(index); + } + } + } } diff --git a/src/App.svelte b/src/App.svelte index 9355700..02d34ce 100755 --- a/src/App.svelte +++ b/src/App.svelte @@ -1,332 +1,332 @@ - Ferrum + Ferrum
{ - if (e.target) { - if (checkShortcut(e, 'ArrowUp', { cmdOrCtrl: true })) { - e.preventDefault() - ipcRenderer.invoke('volume_change', true) - } else if (checkShortcut(e, 'ArrowDown', { cmdOrCtrl: true })) { - e.preventDefault() - ipcRenderer.invoke('volume_change', false) - } - } - }} + on:dragenter|capture={dragEnterOrOver} + on:keydown={(e) => { + if (e.target) { + if (checkShortcut(e, 'ArrowUp', { cmdOrCtrl: true })) { + e.preventDefault() + ipcRenderer.invoke('volume_change', true) + } else if (checkShortcut(e, 'ArrowDown', { cmdOrCtrl: true })) { + e.preventDefault() + ipcRenderer.invoke('volume_change', false) + } + } + }} > -
- -
-
-
-

- {#if $page.tracklist.id === 'root'} - {#if $page.viewAs === view_as_songs} - Songs -
{$page.length} songs
- {:else if $page.viewAs === view_as_artists} - Artists -
- {page.get_artists().length} artists -
- {/if} - {:else if $page.tracklist.type !== 'special'} - {$page.tracklist.name} -
{$page.length} songs
- {/if} -

- {#if 'description' in $page.tracklist && $page.tracklist.description !== ''} -
{$page.tracklist.description}
- {/if} -
- {#if $page.viewAs === 0} - - {:else} - - {/if} -
- {#if $queueVisible} - - {/if} -
- - {#if droppable} - -
-

Drop files to import

-
-
{#if trackInfoList} - (trackInfoList = null)} /> + (trackInfoList = null)} /> {/if} {#if playlistInfo} - (playlistInfo = null)} /> + (playlistInfo = null)} /> {/if} {#if showItunesImport} - (showItunesImport = false)} /> + (showItunesImport = false)} /> {/if} diff --git a/src/app.css b/src/app.css index 3d446e4..ad1d7b6 100644 --- a/src/app.css +++ b/src/app.css @@ -1,33 +1,33 @@ @import 'tailwindcss'; input:focus-visible { - outline: none; + outline: none; } @theme { - --default-transition-timing-function: cubic-bezier(0.33, 1, 0.68, 1); /* cubic-out */ - --color-background: hsl(0, 0%, 100%); - --color-foreground: black; - --color-edges: hsla(215, 16%, 47%, 0.6); + --default-transition-timing-function: cubic-bezier(0.33, 1, 0.68, 1); /* cubic-out */ + --color-background: hsl(0, 0%, 100%); + --color-foreground: black; + --color-edges: hsla(215, 16%, 47%, 0.6); } @media (prefers-color-scheme: dark) { - :root { - --color-background: hsl(120, 11%, 7%); - --color-foreground: white; - } + :root { + --color-background: hsl(120, 11%, 7%); + --color-foreground: white; + } } @layer base { - * { - border-color: #333333; - } + * { + border-color: #333333; + } } @layer utilities { - .parent-active-zoom { - @apply transition duration-[50ms]; - } - :active > .parent-active-zoom { - @apply scale-95 opacity-70; - } + .parent-active-zoom { + @apply transition duration-[50ms]; + } + :active > .parent-active-zoom { + @apply scale-95 opacity-70; + } } diff --git a/src/assets/fonts.css b/src/assets/fonts.css index 809af91..32b3ed9 100644 --- a/src/assets/fonts.css +++ b/src/assets/fonts.css @@ -1,4 +1,4 @@ @font-face { - font-family: 'Open Sans'; - src: url('./OpenSans-Regular.ttf'); + font-family: 'Open Sans'; + src: url('./OpenSans-Regular.ttf'); } diff --git a/src/components/ArtistList.svelte b/src/components/ArtistList.svelte index 30c01bb..1c20e91 100644 --- a/src/components/ArtistList.svelte +++ b/src/components/ArtistList.svelte @@ -1,23 +1,23 @@
-

(Work in progress)

+

(Work in progress)

- {#each artists as artist} -

- {#if artist.target} - {artist.target} - {:else} - Unknown Artist - {/if} -

- {/each} + {#each artists as artist} +

+ {#if artist.target} + {artist.target} + {:else} + Unknown Artist + {/if} +

+ {/each}
diff --git a/src/components/Button.svelte b/src/components/Button.svelte index 0c3e9d7..bb8d176 100644 --- a/src/components/Button.svelte +++ b/src/components/Button.svelte @@ -1,67 +1,67 @@ diff --git a/src/components/DragGhost.svelte b/src/components/DragGhost.svelte index 4b1f466..0946c33 100644 --- a/src/components/DragGhost.svelte +++ b/src/components/DragGhost.svelte @@ -1,25 +1,25 @@
-
+
diff --git a/src/components/Filter.svelte b/src/components/Filter.svelte index 1ff3fd3..cca4d4f 100644 --- a/src/components/Filter.svelte +++ b/src/components/Filter.svelte @@ -1,46 +1,46 @@ diff --git a/src/components/ItunesImport.svelte b/src/components/ItunesImport.svelte index 29bbb87..5852b8b 100644 --- a/src/components/ItunesImport.svelte +++ b/src/components/ItunesImport.svelte @@ -1,140 +1,140 @@ -
- {#if stage === 'select' || stage === 'fileSelect'} -

- Select an iTunes Library.xml file. To get that file, open iTunes and click - on - File > Library > Export Library... -

-

- All your tracks need to be downloaded for this to work. If you have tracks from iTunes - Store/Apple Music, it might not work. -

-

The following will not be imported:

-
    -
  • - Lyrics, Equalizer, Skip when shuffling, Remember playback position, Start time, Stop time -
  • -
  • Album ratings, album likes and album dislikes
  • -
  • The following track metadata:
  • -
  • Music videos, podcasts, audiobooks, voice memos etc.
  • -
  • Smart playlists, Genius playlists and Genius Mix playlists
  • -
  • View options
  • -
-
- - -
- {:else if stage === 'scanning'} - Scanning... - {:else if 'tracksCount' in stage} - {#if stage.errors.length > 0} -
-

{stage.errors.length} Errors

- {#each stage.errors as error} -

{error}

- {/each} -
-

The following will be imported:

- {:else} -

Success, no errors! The following will be imported:

- {/if} -
    -
  • Playlists: {stage.playlistsCount}
  • -
  • Tracks: {stage.tracksCount}
  • -
-
- - -
- {/if} -
+
+ {#if stage === 'select' || stage === 'fileSelect'} +

+ Select an iTunes Library.xml file. To get that file, open iTunes and click + on + File > Library > Export Library... +

+

+ All your tracks need to be downloaded for this to work. If you have tracks from iTunes + Store/Apple Music, it might not work. +

+

The following will not be imported:

+
    +
  • + Lyrics, Equalizer, Skip when shuffling, Remember playback position, Start time, Stop time +
  • +
  • Album ratings, album likes and album dislikes
  • +
  • The following track metadata:
  • +
  • Music videos, podcasts, audiobooks, voice memos etc.
  • +
  • Smart playlists, Genius playlists and Genius Mix playlists
  • +
  • View options
  • +
+
+ + +
+ {:else if stage === 'scanning'} + Scanning... + {:else if 'tracksCount' in stage} + {#if stage.errors.length > 0} +
+

{stage.errors.length} Errors

+ {#each stage.errors as error} +

{error}

+ {/each} +
+

The following will be imported:

+ {:else} +

Success, no errors! The following will be imported:

+ {/if} +
    +
  • Playlists: {stage.playlistsCount}
  • +
  • Tracks: {stage.tracksCount}
  • +
+
+ + +
+ {/if} +
diff --git a/src/components/Modal.svelte b/src/components/Modal.svelte index 513e1ef..6de81ea 100644 --- a/src/components/Modal.svelte +++ b/src/components/Modal.svelte @@ -1,108 +1,108 @@ { - clickable = true - }} + on:click={() => { + clickable = true + }} /> { - if (clickable) { - onCancel() - } - }} - on:keydown - on:keydown={(e) => { - if (checkShortcut(e, 'Escape') && cancelOnEscape) { - onCancel() - } - }} - on:keydown|self={(e) => { - if (form && checkShortcut(e, 'Enter')) { - form() - e.preventDefault() - } - }} + class="modal m-auto" + bind:this={dialogEl} + on:click|self={() => { + if (clickable) { + onCancel() + } + }} + on:keydown + on:keydown={(e) => { + if (checkShortcut(e, 'Escape') && cancelOnEscape) { + onCancel() + } + }} + on:keydown|self={(e) => { + if (form && checkShortcut(e, 'Enter')) { + form() + e.preventDefault() + } + }} > - { - clickable = false - }} - on:mouseup={() => { - clickable = false - }} - role="none" - > - {#if title !== null} -

{title}

- {/if} - - {#if $$slots.buttons} -
- -
- {/if} -
+ { + clickable = false + }} + on:mouseup={() => { + clickable = false + }} + role="none" + > + {#if title !== null} +

{title}

+ {/if} + + {#if $$slots.buttons} +
+ +
+ {/if} +
diff --git a/src/components/Player.svelte b/src/components/Player.svelte index 5a82bd7..10adfd7 100644 --- a/src/components/Player.svelte +++ b/src/components/Player.svelte @@ -1,347 +1,347 @@
-
- {#if !$stopped && $playingTrack} -
- {#if $coverSrc} - - {:else} - - - - {/if} -
-
-
- {$playingTrack.name} -
-
- {$playingTrack.artist} -
-
- {/if} -
-
-
- - +
+ {#if !$stopped && $playingTrack} +
+ {#if $coverSrc} + + {:else} + + + + {/if} +
+
+
+ {$playingTrack.name} +
+
+ {$playingTrack.artist} +
+
+ {/if} +
+
+
+ + - + - + - -
-
- {getDuration($timeRecord.elapsed)} - { - seek(value * $timeRecord.duration) - }} - /> - {getDuration($timeRecord.duration)} -
-
-
- - - -
+ +
+
+ {getDuration($timeRecord.elapsed)} + { + seek(value * $timeRecord.duration) + }} + /> + {getDuration($timeRecord.duration)} +
+
+
+ + + +
diff --git a/src/components/PlaylistInfo.svelte b/src/components/PlaylistInfo.svelte index 89fdd48..df699fa 100644 --- a/src/components/PlaylistInfo.svelte +++ b/src/components/PlaylistInfo.svelte @@ -1,73 +1,73 @@ -
- -