diff --git a/.github/ISSUE_TEMPLATE/post_release_checklist.md b/.github/ISSUE_TEMPLATE/post_release_checklist.md new file mode 100644 index 0000000000..6ec79123ae --- /dev/null +++ b/.github/ISSUE_TEMPLATE/post_release_checklist.md @@ -0,0 +1,58 @@ +--- +name: Post-release checklist +about: Verify deployment and downstream updates after a reVISit release +title: 'Post-release Checklist vX.Y.Z' +labels: QA +assignees: '' +--- +# Post-release Checklist vX.Y.Z + +## [Study Repository](https://github.com/revisit-studies/study) + +### Release Automation + +- [ ] Confirm the `Release new version` workflow completed successfully +- [ ] Confirm the release commit and `vX.Y.Z` tag were created and version-pinned URLs reference the new tag +- [ ] Confirm the GitHub release was created and review the generated release notes +- [ ] Confirm the production deployment completed successfully +- [ ] Smoke test the production website + +### Storage + +- [ ] Run the Firebase cleanup in dry-run mode and review the planned deletions (`./scripts/clear-out-firebase.sh --include-dev --jobs 8`) +- [ ] Clear Firebase test data (`./scripts/clear-out-firebase.sh --include-dev --jobs 8 --execute`) + +## [Documentation Repository](https://github.com/revisit-studies/reVISit-studies.github.io) + +- [ ] Confirm the documentation deployment completed successfully +- [ ] Spot-check the live documentation and library list +- [ ] Remove old bug fix version + +## [Template Repository](https://github.com/revisit-studies/template) + +- [ ] Run the `Sync from Upstream` workflow with `upstream_ref` set to `vX.Y.Z` +- [ ] Confirm the deployment completed successfully +- [ ] Smoke test the deployed website + +## [Replication Studies Repository](https://github.com/revisit-studies/replication-studies) + +- [ ] Run the `Sync from Upstream` workflow with `upstream_ref` set to `vX.Y.Z` +- [ ] Confirm the deployment completed successfully +- [ ] Smoke test the deployed website + +## [ReVISitPy Repository](https://github.com/revisit-studies/revisitpy) + +- [ ] Confirm the `Create a new minor version and push to PyPi and GitHub` workflow completed successfully +- [ ] Confirm the new [`revisitpy`](https://pypi.org/project/revisitpy/) version is available on PyPI + +## [ReVISitPy Server Repository](https://github.com/revisit-studies/revisitpy-server) + +- [ ] Confirm the `Create a new version and push to PyPi and GitHub` workflow completed successfully +- [ ] Confirm the new [`revisitpy-server`](https://pypi.org/project/revisitpy-server/) version is available on PyPI + +## TODOs + +Create or link issues for any bugs found during post-release verification. +Add any other required follow-up tasks. + +- [ ] ... diff --git a/.github/ISSUE_TEMPLATE/pre_release_checklist.md b/.github/ISSUE_TEMPLATE/pre_release_checklist.md new file mode 100644 index 0000000000..ab1ea1ce02 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pre_release_checklist.md @@ -0,0 +1,183 @@ +--- +name: Pre-release checklist +about: Prepare and review an upcoming reVISit release +title: 'Pre-release Checklist vX.Y.Z' +labels: QA +assignees: '' +--- +# Pre-release Checklist vX.Y.Z + +## Release Pull Request + +- [ ] Confirm the release pull request targets `main` +- [ ] Confirm the pull request title exactly matches `vX.Y.Z` +- [ ] Confirm all required checks pass +- [ ] Confirm the pull request has the required approvals +- [ ] Confirm the release pull request preview deployed successfully +- [ ] Create the post-release checklist issue and link it here + +## [Study Repository](https://github.com/revisit-studies/study) + +### Run Studies + +Run each study in the release PR preview. Confirm it completes without unexpected errors and its participant data appears correctly in the analysis pages. + +#### Demo Studies + +- [ ] `demo-html` +- [ ] `demo-html-input` +- [ ] `demo-form-elements` +- [ ] `demo-training` +- [ ] `demo-html-trrack` +- [ ] `demo-svelte-trrack` +- [ ] `demo-react-trrack` +- [ ] `demo-screen-recording` +- [ ] `demo-image` +- [ ] `demo-vega` +- [ ] `demo-video` +- [ ] `demo-dynamic` +- [ ] `demo-condition` +- [ ] `demo-style` +- [ ] `demo-yaml` +- [ ] `demo-ranking-widget` +- [ ] `demo-upset` +- [ ] `demo-choropleth-map` + +#### Example Studies + +- [ ] `example-VLAT-adaptive` +- [ ] `example-brush-interactions` +- [ ] `example-cleveland` +- [ ] `example-llm-chatbot` +- [ ] `example-mvnv` + +#### Tutorials + +- [ ] `tutorial` +- [ ] `tutorial-replication` + +#### Tests + +- [ ] `test-audio` +- [ ] `test-component-timeout` +- [ ] `test-device-restriction` +- [ ] `test-library` +- [ ] `test-likert-matrix` +- [ ] `test-parser-errors` +- [ ] `test-randomization` +- [ ] `test-skip-logic` +- [ ] `test-step-logic` + +#### Libraries + +- [ ] `library-adaptive-vlat` +- [ ] `library-beauvis` +- [ ] `library-berlin-num` +- [ ] `library-calvi` +- [ ] `library-color-blindness` +- [ ] `library-demographics` +- [ ] `library-graph-literacy-scale` +- [ ] `library-mic-check` +- [ ] `library-mini-vlat` +- [ ] `library-nasa-tlx` +- [ ] `library-previs` +- [ ] `library-quis` +- [ ] `library-sam` +- [ ] `library-screen-recording` +- [ ] `library-smeq` +- [ ] `library-sus` +- [ ] `library-ueq` +- [ ] `library-ueq-s` +- [ ] `library-umux` +- [ ] `library-umux-lite` +- [ ] `library-virtual-chinrest` +- [ ] `library-vlat` + +### Analysis Pages + +- [ ] Study Summary + - [ ] Filter works correctly + - [ ] Statistics look correct +- [ ] Participant View + - [ ] Filter works correctly + - [ ] Reject / Undo reject participant works correctly + - [ ] Replay timeline looks correct +- [ ] Replay + - [ ] Replay works correctly at different play speeds + - [ ] Check provenance data (audio, screen, etc.) + - [ ] Navigate to the next and previous participant IDs + - [ ] Add participant tags + - [ ] Navigate to the next and previous participant tasks + - [ ] Add task tags + - [ ] Load transcripts (e.g. `demo-screen-recording`) + - [ ] Download audio/screen recordings (e.g. `demo-screen-recording`) + - [ ] Reject / Undo reject participant works correctly +- [ ] Trial Stats + - [ ] Filter works correctly + - [ ] Overview stats look correct + - [ ] Vega stimulus for answers looks correct +- [ ] Coding + - [ ] Filter works correctly + - [ ] Add text tags + - [ ] Add annotations + - [ ] Replay works correctly at different play speeds + - [ ] Navigate to the next and previous participant IDs + - [ ] Add participant tags + - [ ] Navigate to the next and previous participant tasks + - [ ] Add task tags + - [ ] Load transcripts (e.g. `demo-screen-recording`) + - [ ] Download audio/screen recordings (e.g. `demo-screen-recording`) + - [ ] Reject / Undo reject participant works correctly +- [ ] Live Monitor + - [ ] Filter works correctly + - [ ] Check participant count header + - [ ] Check live monitor tracker +- [ ] Config + - [ ] Filter works correctly + - [ ] Download configs (by selecting from the table) / Download config (single download from actions column) + - [ ] Compare configs + - [ ] View config +- [ ] Manage + - [ ] Changing ReVISit Modes updates the study card and study browser + - [ ] Add a new stage and edit stage color + - [ ] Create a data snapshot + - [ ] Confirm Manage is only accessible to administrators +- [ ] File download + - [ ] JSON export + - [ ] Tidy download export + - [ ] Download audio recordings + - [ ] Download screen recordings + - [ ] Download provenance data +- [ ] Change study from the study dropdown +- [ ] Click Go to study and confirm it opens the study + +### Generated Files + +- [ ] If parser types changed, regenerate the study config schemas using `yarn generate-schemas` +- [ ] If libraries changed, regenerate library documentation and example studies using `yarn generate-library-docs` and `yarn generate-library-examples` + +### Documentation + +- [ ] Update comments in `store/types.ts`, `parser/types.ts`, `storage/types.ts`, `storage/engines/types.ts` +- [ ] Update `typedocReadMe.md` +- [ ] Verify documentation links in the [Study Repository](https://github.com/revisit-studies/study) are up-to-date and point to the current reVISit documentation pages + +## [Documentation Repository](https://github.com/revisit-studies/reVISit-studies.github.io) + +- [ ] Update documentation for release changes +- [ ] Update screenshots +- [ ] Review documentation for accuracy, typos, outdated content, and expired links +- [ ] Review [library list](https://revisit.dev/docs/designing-studies/plugin-libraries/) +- [ ] Check the adoption Google Form for newly published papers +- [ ] Validate example code + +## [ReVISitPy Repository](https://github.com/revisit-studies/revisitpy) + +- [ ] If parser types or schemas changed, confirm they are compatible with ReVISitPy code generation + +## TODOs + +Create or link any release-blocking issues or bugs found during release QA. +Add any other tasks that must be completed before the release. + +- [ ] ... diff --git a/.github/workflows/dependency-lock-drift.yml b/.github/workflows/dependency-lock-drift.yml new file mode 100644 index 0000000000..072a259354 --- /dev/null +++ b/.github/workflows/dependency-lock-drift.yml @@ -0,0 +1,52 @@ +name: Dependency lockfile drift + +on: + pull_request: + paths: + - '.github/workflows/dependency-lock-drift.yml' + - '.npmrc' + - 'package.json' + - 'package-lock.json' + - 'scripts/check-lockfile-drift.mjs' + - 'yarn.lock' + push: + branches: + - dev + - main + paths: + - '.github/workflows/dependency-lock-drift.yml' + - '.npmrc' + - 'package.json' + - 'package-lock.json' + - 'scripts/check-lockfile-drift.mjs' + - 'yarn.lock' + +jobs: + check: + name: Check npm lock matches Yarn lock + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Use the lockfile generator version + run: npm install --global npm@11.12.1 + + - name: Check npm lockfile metadata + run: | + cp yarn.lock "$RUNNER_TEMP/yarn.lock" + npm install --package-lock-only --ignore-scripts + cp "$RUNNER_TEMP/yarn.lock" yarn.lock + git diff --exit-code -- package-lock.json + + - name: Check for dependency drift + run: node scripts/check-lockfile-drift.mjs + + - name: Verify npm install and build + run: | + npm ci + npm run build diff --git a/.github/workflows/lint_build.yaml b/.github/workflows/lint_build.yaml index d336dc8b0d..4ce7b79600 100644 --- a/.github/workflows/lint_build.yaml +++ b/.github/workflows/lint_build.yaml @@ -11,4 +11,20 @@ on: jobs: lint: - uses: revisit-studies/.github/.github/workflows/lint.yaml@main + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: 'yarn' + + - name: Install yarn packages (from cache if available) + run: yarn install --frozen-lockfile + + - name: Run linter + run: yarn lint + + - name: Build application + run: yarn build diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 229dbfdb41..3080ea77c5 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -10,7 +10,7 @@ jobs: test: name: 🧪 ${{ matrix.project }} E2E Tests runs-on: ${{ matrix.os }} - timeout-minutes: 20 + timeout-minutes: 40 env: PLAYWRIGHT_BROWSERS_PATH: ${{ matrix.cache_dir }} PW_CI_REPORTER: dot @@ -55,9 +55,13 @@ jobs: path: ${{ matrix.cache_dir }} key: ${{ runner.os }}-${{ matrix.project }}-pw-${{ hashFiles('**/.playwright-version') }} - - name: Install Playwright Browsers - if: steps.playwright-cache.outputs.cache-hit != 'true' - run: yarn playwright install --with-deps ${{ matrix.project }} + - name: Install Playwright Chromium + if: steps.playwright-cache.outputs.cache-hit != 'true' && matrix.project == 'chromium' + run: yarn playwright install --with-deps --only-shell chromium + + - name: Install Playwright WebKit + if: steps.playwright-cache.outputs.cache-hit != 'true' && matrix.project == 'webkit' + run: yarn playwright install webkit - name: Run Playwright tests run: yarn test --project=${{ matrix.project }} diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..521a9f7c07 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/AGENTS.md b/AGENTS.md index 43033ed9be..4bc0c1f8d2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,14 +27,17 @@ The study configurations are defined in JSON files with schemas. These configs s Imported Libraries We provide several libraries to facilitate the development of user studies, such as vlat, mini-vlat, nasa-tlx, color-blindness, and more. These libraries are components and sequences that are defined in public/libraries/. Each library has its own folder containing the necessary code and assets. Use only libraries that exist under public/libraries/ (no ad-hoc local component imports in study configs). You can import these libraries into your study configs to enhance the functionality and user experience of your studies by adding the libraries to the top level `importedLibraries` field in the study config, and then referencing the components in the `baseComponent` field or in sequences and the sequences in the `sequences` field. When referencing the components and sequences use the following syntax `"$libraryName.components.componentName"` and `"$libraryName.sequences.sequenceName"` respectively. +Large Media Assets +Large bundled-library media should not be committed directly to this repository. Put heavyweight shared library assets in the public `revisit-studies/library-assets` repository, tag the asset release, and reference files from study/library configs with tag-pinned raw GitHub URLs such as `https://raw.githubusercontent.com/revisit-studies/library-assets/v1/...`. + Storage Engines ReVISit supports multiple storage backends for storing study data, including Firebase and Supabase. This allows researchers to choose the backend that best fits their needs in terms of scalability, ease of use, and integration with other tools. The storage engines are abstracted in the codebase, allowing for easy addition of new storage solutions in the future. The storage engine implementations can be found in src/storage/ directory. How you should interact with the codebase -When working with the ReVISit codebase, work only with the source code files available to you. If you need an external library, please ask for approval first (and include how well used the library is). Make sure to follow best practices for React and TypeScript development, including proper state management, component structuring, and code documentation. Pay extra attention to lifecycle methods and hooks to ensure optimal performance and avoid memory leaks, including any updates to existing code. If you encounter any issues or have suggestions for improvements, feel free to bring them up for discussion. You can run git commands but don't run them unless asked to. Don't interact with GitHub directly. Always check package.json for the scripts available to you for building, testing, and running the project. +When working with the ReVISit codebase, work only with the source code files available to you. If you need an external library, please ask for approval first (and include how well used the library is). Make sure to follow best practices for React and TypeScript development, including proper state management, component structuring, and code documentation. Pay extra attention to lifecycle methods and hooks to ensure optimal performance and avoid memory leaks, including any updates to existing code. If you encounter any issues or have suggestions for improvements, feel free to bring them up for discussion. You can run git commands but don't run them unless asked to. Always check package.json for the scripts available to you for building, testing, and running the project. Testing -When adding a new feature or modifying code try to maximize unit test coverage. Unit tests should be colocated with the files they are testing, have the same names as the file with .spec., and use the vitest framework. Apply this to both UI/react code as well as non-UI code. For UI code, we use playwright for end-to-end testing. Try to add e2e tests for any new features that involve user interaction. E2E tests are located in the tests/ directory at the root of the project. Don't run `yarn test` directly; instead, describe the tests you want to run, and I'll handle executing them. You can run unittests locally using `yarn unittest`. Preferred commands are those listed in package.json (e.g., `yarn unittest`, `yarn lint`, `yarn typecheck`, `yarn serve`, `yarn build`). +When adding a new feature or modifying code try to maximize unit test coverage. Unit tests should live in a sibling `tests/` folder near the code they are testing, keep the same base name as the tested file with `.spec.`, and use the vitest framework. For example, `src/store/hooks/useReplay.ts` should be tested in `src/store/hooks/tests/useReplay.spec.tsx`. Root-level app specs should live in `src/tests/`. Apply this to both UI/react code as well as non-UI code. For UI code, we use playwright for end-to-end testing. Try to add e2e tests for any new features that involve user interaction. E2E tests are located in the `tests/` directory at the repo root. Don't run `yarn test` directly; instead, describe the tests you want to run, and I'll handle executing them. You can run unittests locally using `yarn unittest`. Preferred commands are those listed in package.json (e.g., `yarn unittest`, `yarn lint`, `yarn typecheck`, `yarn serve`, `yarn build`). Parser When adding new features, sometimes it's required to update the parser and the associated types. The parser is located in src/parser/. The parser is responsible for validating and transforming the study config JSON files into a format that the application can use. When updating the parser, ensure that you also update the corresponding types in src/parser/types.ts to reflect any changes made to the study config schema. Make sure to add unit tests for any new parser functionality to ensure its correctness. Additionally, changes to the parser types will require updates to the generated JSON schema files located in src/schemas/. You can regenerate these schema files by running `yarn generate-schemas`. diff --git a/LibraryDocGenerator.spec.ts b/LibraryDocGenerator.spec.ts new file mode 100644 index 0000000000..5585736c24 --- /dev/null +++ b/LibraryDocGenerator.spec.ts @@ -0,0 +1,124 @@ +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import { createRequire } from 'module'; +import { + afterEach, + describe, + expect, + it, +} from 'vitest'; + +const require = createRequire(import.meta.url); +const { generateMd, generateLibraryDocs, getLibraries } = require('./libraryDocGenerator.cjs'); + +describe('libraryDocGenerator', () => { + const tempDirs: string[] = []; + + afterEach(() => { + tempDirs.forEach((dir) => { + if (fs.existsSync(dir)) { + fs.rmSync(dir, { recursive: true, force: true }); + } + }); + tempDirs.length = 0; + }); + + it('generateMd includes components, sequences, and reference sections', () => { + const md = generateMd('demo-lib', { + description: 'Demo description', + reference: 'Some reference', + doi: '10.1000/xyz', + externalLink: 'https://example.com', + components: { beta: {}, alpha: {} }, + sequences: { second: {}, first: {} }, + additionalDescription: 'Extra details', + }, true); + + expect(md).toContain('# demo-lib'); + expect(md).toContain('## Available Components'); + expect(md).toContain('- alpha'); + expect(md).toContain('- beta'); + expect(md).toContain('## Available Sequences'); + expect(md).toContain('- first'); + expect(md).toContain('- second'); + expect(md).toContain('## Reference'); + expect(md).toContain('https://dx.doi.org/10.1000/xyz'); + expect(md).toContain('## Additional Description'); + }); + + it('generateMd handles example reference text and external-link-only docs links', () => { + const exampleMd = generateMd('demo-lib', { + description: 'Demo description', + reference: 'Some reference', + components: {}, + sequences: {}, + }, false); + + expect(exampleMd).toContain('This is an example study of the library `demo-lib`.'); + expect(exampleMd).toContain('Some reference'); + expect(exampleMd).not.toContain(':::note[Reference]'); + + const docsMd = generateMd('demo-lib', { + description: 'Demo description', + externalLink: 'https://example.com', + components: {}, + sequences: {}, + }, true); + + expect(docsMd).toContain('referenceLinks={['); + expect(docsMd).toContain('{name: "demo-lib", url: "https://example.com"}'); + expect(docsMd).not.toContain('{name: "DOI"'); + + const docsWithDoiOnly = generateMd('demo-lib', { + description: 'Demo description', + doi: '10.1000/xyz', + components: {}, + sequences: {}, + }, true); + + expect(docsWithDoiOnly).toContain('{name: "DOI", url: "https://dx.doi.org/10.1000/xyz"}'); + expect(docsWithDoiOnly).not.toContain('{name: "demo-lib", url:'); + }); + + it('getLibraries filters hidden entries and .DS_Store entries', () => { + const base = fs.mkdtempSync(path.join(os.tmpdir(), 'lib-doc-list-')); + tempDirs.push(base); + const libsPath = path.join(base, 'public', 'libraries'); + fs.mkdirSync(libsPath, { recursive: true }); + fs.mkdirSync(path.join(libsPath, 'alpha')); + fs.mkdirSync(path.join(libsPath, '.hidden')); + fs.writeFileSync(path.join(libsPath, '.DS_Store'), ''); + + expect(getLibraries(libsPath)).toEqual(['alpha']); + }); + + it('generateLibraryDocs writes docs and example markdown when assets folder exists', () => { + const base = fs.mkdtempSync(path.join(os.tmpdir(), 'lib-doc-run-')); + tempDirs.push(base); + const libraryName = 'alpha'; + const librariesPath = path.join(base, 'public', 'libraries', libraryName); + const exampleAssetsPath = path.join(base, 'public', `library-${libraryName}`, 'assets'); + + fs.mkdirSync(librariesPath, { recursive: true }); + fs.mkdirSync(exampleAssetsPath, { recursive: true }); + fs.writeFileSync( + path.join(librariesPath, 'config.json'), + JSON.stringify({ + description: 'Alpha description', + components: { compA: {} }, + sequences: {}, + }), + ); + + generateLibraryDocs(base); + + const docsOut = path.join(base, 'docsLibraries', `${libraryName}.md`); + const exampleOut = path.join(exampleAssetsPath, `${libraryName}.md`); + + expect(fs.existsSync(docsOut)).toBe(true); + expect(fs.existsSync(exampleOut)).toBe(true); + expect(fs.readFileSync(docsOut, 'utf8')).toContain('# alpha'); + expect(fs.readFileSync(exampleOut, 'utf8')).toContain('This is an example study'); + }); +}); diff --git a/LibraryExampleStudyGenerator.spec.ts b/LibraryExampleStudyGenerator.spec.ts new file mode 100644 index 0000000000..eac24fed47 --- /dev/null +++ b/LibraryExampleStudyGenerator.spec.ts @@ -0,0 +1,88 @@ +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import { createRequire } from 'module'; +import { + afterEach, + describe, + expect, + it, + vi, +} from 'vitest'; + +const require = createRequire(import.meta.url); +const { + createExampleConfig, + generateLibraryExamples, + getLibraries, +} = require('./libraryExampleStudyGenerator.cjs'); + +describe('libraryExampleStudyGenerator', () => { + const tempDirs: string[] = []; + + afterEach(() => { + tempDirs.forEach((dir) => { + if (fs.existsSync(dir)) { + fs.rmSync(dir, { recursive: true, force: true }); + } + }); + tempDirs.length = 0; + }); + + it('createExampleConfig builds config with expected defaults', () => { + const config = createExampleConfig('my-lib'); + + expect(config.studyMetadata.title).toBe('my-lib Example Study'); + expect(config.importedLibraries).toEqual(['my-lib']); + expect(config.components.introduction.path).toBe('library-my-lib/assets/my-lib.md'); + expect(config.sequence.components).toEqual(['introduction']); + }); + + it('getLibraries filters hidden entries and .DS_Store entries', () => { + const base = fs.mkdtempSync(path.join(os.tmpdir(), 'lib-example-list-')); + tempDirs.push(base); + const libsPath = path.join(base, 'public', 'libraries'); + fs.mkdirSync(libsPath, { recursive: true }); + fs.mkdirSync(path.join(libsPath, 'alpha')); + fs.mkdirSync(path.join(libsPath, '.hidden')); + fs.writeFileSync(path.join(libsPath, '.DS_Store'), ''); + + expect(getLibraries(libsPath)).toEqual(['alpha']); + }); + + it('generateLibraryExamples creates missing example study and invokes doc generation command', () => { + const base = fs.mkdtempSync(path.join(os.tmpdir(), 'lib-example-run-')); + tempDirs.push(base); + const libraryName = 'alpha'; + const librariesPath = path.join(base, 'public', 'libraries', libraryName); + fs.mkdirSync(librariesPath, { recursive: true }); + + const generateDocsFn = vi.fn(); + generateLibraryExamples(base, generateDocsFn); + + const examplePath = path.join(base, 'public', `library-${libraryName}`); + const configPath = path.join(examplePath, 'config.json'); + const assetsPath = path.join(examplePath, 'assets'); + + expect(fs.existsSync(examplePath)).toBe(true); + expect(fs.existsSync(assetsPath)).toBe(true); + expect(fs.existsSync(configPath)).toBe(true); + expect(generateDocsFn).toHaveBeenCalledTimes(1); + expect(generateDocsFn).toHaveBeenCalledWith(base); + }); + + it('throws when doc generation fails', () => { + const base = fs.mkdtempSync(path.join(os.tmpdir(), 'lib-example-error-')); + tempDirs.push(base); + fs.mkdirSync(path.join(base, 'public', 'libraries', 'alpha'), { recursive: true }); + const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined); + const generateDocsFn = vi.fn(() => { + throw new Error('test Error'); + }); + + expect(() => generateLibraryExamples(base, generateDocsFn)).toThrow('test Error'); + + expect(errorSpy).toHaveBeenCalledWith(expect.stringContaining('Error running libraryDocGenerator.cjs: Error: test Error')); + errorSpy.mockRestore(); + }); +}); diff --git a/README.md b/README.md index 5a0aa021dc..5fd2d61f8b 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ yarn test ## Release Instructions -Releasing reVISit.dev happens automatically when a PR is merged into the `main` branch. The name of the pull request should be the title of the release, e.g. `v1.0.0`. Releasing creates a tag with the same name as the PR, but the official GitHub release should be created manually. The `main` branch is protected and requires two reviews before merging. +Releasing reVISit.dev happens automatically when a PR is merged into the `main` branch. The pull request title must exactly match the release version, e.g. `v1.0.0`. The release workflow updates version-pinned references, creates a release commit, and pushes a tag with the same name as the PR. Pushing the tag automatically creates the official GitHub release with generated release notes. The `main` branch is protected and requires two reviews before merging. The workflow for release looks as follows: Develop features on feature branch @@ -63,36 +63,6 @@ Dev branch | PR (1 per release) Main branch | Run release workflow on merge -References are updated and commit is tagged - -### Release Follow-Up - -- [ ] Verify docs links in the [Study Repository](https://github.com/revisit-studies/study) are up to date and point to the current reVISit documentation pages. -- [ ] After the release is complete, run the template update process so downstream study templates include the latest release changes. - - -## QC Checklist - -### [Study Repository](https://github.com/revisit-studies/study) - -**Studies** -- [ ] Review all studies for any crashes/bugs -- [ ] Check provenance data (audio, screen, etc.) - -**File Download** -- [ ] JSON export -- [ ] Tidy download export -- [ ] Download audio recordings -- [ ] Download screen recordings -- [ ] Download configs - -**Docs** -- [ ] Update comments in `store/types.ts`, `parser/types.ts`, `storage/types.ts`, `storage/engines/types.ts` -- [ ] Update `typedocReadMe.md` - -### [Documentation Repository](https://github.com/revisit-studies/reVISit-studies.github.io) -- [ ] Review docs -- [ ] Review [library list](https://revisit.dev/docs/designing-studies/plugin-libraries/) -- [ ] Check for typos / outdated docs -- [ ] Validate example code -- [ ] Update screenshots +References are updated, and a release commit and tag are pushed +| Tag push and repository dispatch events +GitHub release is created and downstream builds are triggered diff --git a/libraryDocGenerator.cjs b/libraryDocGenerator.cjs index c33d3b9812..f2d9209953 100644 --- a/libraryDocGenerator.cjs +++ b/libraryDocGenerator.cjs @@ -54,40 +54,50 @@ import StructuredLinks from '@site/src/components/StructuredLinks/StructuredLink />` : ''} `; -const librariesPath = path.join(__dirname, './public/libraries'); -const docsLibrariesPath = path.join(__dirname, './docsLibraries'); - -const libraries = fs.readdirSync(librariesPath) +const getLibraries = (libsPath) => fs.readdirSync(libsPath) .filter((library) => !library.startsWith('.') && !library.endsWith('.DS_Store')); -if (!fs.existsSync(docsLibrariesPath)) { - fs.mkdirSync(docsLibrariesPath); -} +const generateLibraryDocs = (base) => { + const librariesPath = path.join(base, 'public', 'libraries'); + const docsLibrariesPath = path.join(base, 'docsLibraries'); -libraries.forEach((library) => { - const libraryPath = path.join(librariesPath, library, 'config.json'); - const libraryConfig = JSON.parse(fs.readFileSync(libraryPath, 'utf8')); + const libraries = getLibraries(librariesPath); - const docsMd = generateMd(library, libraryConfig, true); - const exampleMd = generateMd(library, libraryConfig, false); + if (!fs.existsSync(docsLibrariesPath)) { + fs.mkdirSync(docsLibrariesPath); + } - // Save to docsLibraries folder - const docsLibraryPath = path.join(docsLibrariesPath, `${library}.md`); - fs.writeFileSync(docsLibraryPath, docsMd); - // eslint-disable-next-line no-console - console.log(`Documentation saved to ${docsLibraryPath}`); + libraries.forEach((library) => { + const libraryPath = path.join(librariesPath, library, 'config.json'); + const libraryConfig = JSON.parse(fs.readFileSync(libraryPath, 'utf8')); - // Save to example study assets folder if assets folder exists - // Add a prefix to baseMarkdown when saving to example assets - const exampleAssetsPath = path.join(__dirname, 'public', `library-${library}`, 'assets'); - if (fs.existsSync(exampleAssetsPath)) { - const exampleDocsPath = path.join(exampleAssetsPath, `${library}.md`); - fs.writeFileSync(exampleDocsPath, exampleMd); + const docsMd = generateMd(library, libraryConfig, true); + const exampleMd = generateMd(library, libraryConfig, false); + // Save to docsLibraries folder + const docsLibraryPath = path.join(docsLibrariesPath, `${library}.md`); + fs.writeFileSync(docsLibraryPath, docsMd); // eslint-disable-next-line no-console - console.log(`Documentation saved to ${exampleDocsPath}`); - } -}); + console.log(`Documentation saved to ${docsLibraryPath}`); + + // Save to example study assets folder if assets folder exists + // Add a prefix to baseMarkdown when saving to example assets + const exampleAssetsPath = path.join(base, 'public', `library-${library}`, 'assets'); + if (fs.existsSync(exampleAssetsPath)) { + const exampleDocsPath = path.join(exampleAssetsPath, `${library}.md`); + fs.writeFileSync(exampleDocsPath, exampleMd); + + // eslint-disable-next-line no-console + console.log(`Documentation saved to ${exampleDocsPath}`); + } + }); + + // eslint-disable-next-line no-console + console.log('Library documentation generated'); +}; + +if (require.main === module) { + generateLibraryDocs(__dirname); +} -// eslint-disable-next-line no-console -console.log('Library documentation generated'); +module.exports = { generateMd, getLibraries, generateLibraryDocs }; diff --git a/libraryExampleStudyGenerator.cjs b/libraryExampleStudyGenerator.cjs index 05cbfdc894..1c4870033f 100644 --- a/libraryExampleStudyGenerator.cjs +++ b/libraryExampleStudyGenerator.cjs @@ -9,12 +9,7 @@ const fs = require('fs'); const path = require('path'); -const { exec } = require('child_process'); - -// Path to the libraries directory containing reusable components and sequences -const librariesPath = path.join(__dirname, './public/libraries'); -const publicPath = path.join(__dirname, './public'); - +const { generateLibraryDocs } = require('./libraryDocGenerator.cjs'); // Create example study config template const createExampleConfig = (libraryName) => ({ @@ -49,60 +44,66 @@ const createExampleConfig = (libraryName) => ({ }, }); -// Process each library -const libraries = fs.readdirSync(librariesPath) +const getLibraries = (libsPath) => fs.readdirSync(libsPath) .filter(library => !library.startsWith('.') && !library.endsWith('.DS_Store')); -libraries.forEach((library) => { - // Skip hidden folders and files, and libraries in skip list - if (library.startsWith('.')) { - // eslint-disable-next-line no-console - console.log(`Skipping ${library} library`); - return; - } +const generateLibraryExamples = (base, generateDocsFn = generateLibraryDocs) => { + const librariesPath = path.join(base, 'public', 'libraries'); + const publicPath = path.join(base, 'public'); - const exampleFolderName = `library-${library}`; - const examplePath = path.join(publicPath, exampleFolderName); - - // Check if example folder already exists - if (!fs.existsSync(examplePath)) { - // Create the example folder - fs.mkdirSync(examplePath); - // eslint-disable-next-line no-console - console.log(`Created ${exampleFolderName} directory`); - - // Create assets directory - const assetsPath = path.join(examplePath, 'assets'); - fs.mkdirSync(assetsPath); - // eslint-disable-next-line no-console - console.log(`Created ${exampleFolderName}/assets directory`); - - // Create config.json - const configPath = path.join(examplePath, 'config.json'); - const configContent = createExampleConfig(library); - fs.writeFileSync(configPath, JSON.stringify(configContent, null, 2)); - // eslint-disable-next-line no-console - console.log(`Created/Updated ${exampleFolderName}/config.json`); - } + // Process each library + const libraries = getLibraries(librariesPath); -}); + libraries.forEach((library) => { + // Skip hidden folders and files, and libraries in skip list + if (library.startsWith('.')) { + // eslint-disable-next-line no-console + console.log(`Skipping ${library} library`); + return; + } + + const exampleFolderName = `library-${library}`; + const examplePath = path.join(publicPath, exampleFolderName); + + // Check if example folder already exists + if (!fs.existsSync(examplePath)) { + // Create the example folder + fs.mkdirSync(examplePath); + // eslint-disable-next-line no-console + console.log(`Created ${exampleFolderName} directory`); + + // Create assets directory + const assetsPath = path.join(examplePath, 'assets'); + fs.mkdirSync(assetsPath); + // eslint-disable-next-line no-console + console.log(`Created ${exampleFolderName}/assets directory`); -// eslint-disable-next-line no-console -console.log('Library example generation complete'); + // Create config.json + const configPath = path.join(examplePath, 'config.json'); + const configContent = createExampleConfig(library); + fs.writeFileSync(configPath, JSON.stringify(configContent, null, 2)); + // eslint-disable-next-line no-console + console.log(`Created/Updated ${exampleFolderName}/config.json`); + } + }); -// Run libraryDocGenerator.cjs after example generation -// To generate the library.md files which will be placed in the assets/ folder of each example study for the introduction component -// eslint-disable-next-line no-console -console.log('Generating library documentation...'); -exec('node libraryDocGenerator.cjs', (error, stdout, stderr) => { - if (error) { + // eslint-disable-next-line no-console + console.log('Library example generation complete'); + + // Generate library.md files in the same base directory so example-study assets + // are written to the requested target tree, not the caller's current working directory. + // eslint-disable-next-line no-console + console.log('Generating library documentation...'); + try { + generateDocsFn(base); + } catch (error) { console.error(`Error running libraryDocGenerator.cjs: ${error}`); - return; - } - if (stderr) { - console.error(`libraryDocGenerator.cjs stderr: ${stderr}`); - return; + throw error; } - // eslint-disable-next-line no-console - console.log(stdout); -}); +}; + +if (require.main === module) { + generateLibraryExamples(__dirname); +} + +module.exports = { createExampleConfig, getLibraries, generateLibraryExamples }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..1354cd322b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15919 @@ +{ + "name": "revisit", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "revisit", + "version": "2.0.0", + "hasInstallScript": true, + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "@mantine/core": "^7.10.1", + "@mantine/dates": "^7.10.1", + "@mantine/form": "^7.10.1", + "@mantine/hooks": "^7.10.1", + "@mantine/modals": "^7.10.1", + "@mantine/notifications": "^7.12.0", + "@mui/icons-material": "^7.0.0", + "@mui/material": "^7.0.0", + "@mui/system": "^7.0.0", + "@mui/x-data-grid": "^8.0.0", + "@quentinroy/latin-square": "^1.1.1", + "@reduxjs/toolkit": "^2.9.0", + "@supabase/supabase-js": "^2.57.4", + "@tabler/icons-react": "^3.35.0", + "@tanstack/react-virtual": "^3.13.13", + "@trrack/core": "^1.3.0", + "@types/crypto-js": "^4.2.2", + "@types/hjson": "^2.4.6", + "@types/node": "^24.5.2", + "@visdesignlab/upset2-react": "^1.1.0", + "ajv": "^8.18.0", + "arquero": "^5.4.0", + "crypto-js": "^4.2.0", + "d3": "^7.9.0", + "dayjs": "^1.11.18", + "diff": "^8.0.2", + "eslint-config-airbnb": "^19.0.4", + "firebase": "^11.2.0", + "hjson": "^3.2.2", + "jszip": "^3.10.1", + "localforage": "^1.10.0", + "lodash.debounce": "^4.0.8", + "lodash.isequal": "^4.5.0", + "lodash.merge": "^4.6.2", + "lodash.throttle": "^4.1.1", + "mantine-react-table": "^2.0.0-beta.9", + "plyr": "^3.8.4", + "plyr-react": "^6.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^9.0.3", + "react-redux": "^9.2.0", + "react-router": "^7.15.0", + "react-vega": "^7.6.0", + "recoil": "^0.5.0", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "topojson-client": "^3.1.0", + "ts-json-schema-generator": "^2.4.0", + "typedoc": "^0.28.13", + "typedoc-plugin-markdown": "^4.9.0", + "use-deep-compare-effect": "^1.8.1", + "uuid": "^14.0.0", + "vega": "^6.2.0", + "vega-lite": "^5.23.0", + "vite": "^7.3.2", + "wavesurfer-react": "^3.0.4", + "wavesurfer.js": "^7.10.1", + "yaml": "^2.9.0" + }, + "devDependencies": { + "@eslint/compat": "^1.3.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.36.0", + "@playwright/test": "^1.55.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/d3": "^7.4.0", + "@types/lodash.isequal": "^4.5.8", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@types/topojson-client": "^3.1.5", + "@types/topojson-specification": "^1.0.5", + "@types/uuid": "^11.0.0", + "@typescript-eslint/eslint-plugin": "^8.44.0", + "@typescript-eslint/parser": "^8.44.0", + "@vitejs/plugin-react-swc": "^4.1.0", + "@vitest/coverage-v8": "3.2.4", + "eslint": "^9.36.0", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "globals": "^16.4.0", + "husky": "^9.1.7", + "jsdom": "^29.1.1", + "lint-staged": "^16.1.6", + "typescript": "^5.9.2", + "vitest": "^4.1.0", + "vitest-localstorage-mock": "^0.1.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", + "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", + "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", + "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", + "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.1.tgz", + "integrity": "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "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.1", + "minimatch": "^3.1.3", + "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/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "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/@eslint/eslintrc/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, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@firebase/ai": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-1.4.1.tgz", + "integrity": "sha512-bcusQfA/tHjUjBTnMx6jdoPMpDl3r8K15Z+snHz9wq0Foox0F/V+kNLXucEOHoTL2hTc9l+onZCyBJs2QoIC3g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.17.tgz", + "integrity": "sha512-n5vfBbvzduMou/2cqsnKrIes4auaBjdhg8QNA2ZQZ59QgtO2QiwBaXQZQE4O4sgB0Ds1tvLgUUkY+pwzu6/xEg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.23", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.23.tgz", + "integrity": "sha512-3AdO10RN18G5AzREPoFgYhW6vWXr3u+OYQv6pl3CX6Fky8QRk0AHurZlY3Q1xkXO0TDxIsdhO3y65HF7PBOJDw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.17", + "@firebase/analytics-types": "0.8.3", + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", + "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.2.tgz", + "integrity": "sha512-jwtMmJa1BXXDCiDx1vC6SFN/+HfYG53UkfJa6qeN5ogvOunzbFDO3wISZy5n9xgYFUrEP6M7e8EG++riHNTv9w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.10.1.tgz", + "integrity": "sha512-MgNdlms9Qb0oSny87pwpjKush9qUwCJhfmTJHDfrcKo4neLGiSeVE4qJkzP7EQTIUFKp84pbTxobSAXkiuQVYQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.26.tgz", + "integrity": "sha512-PkX+XJMLDea6nmnopzFKlr+s2LMQGqdyT2DHdbx1v1dPSqOol2YzgpgymmhC67vitXVpNvS3m/AiWQWWhhRRPQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check": "0.10.1", + "@firebase/app-check-types": "0.5.3", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", + "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", + "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-compat": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.2.tgz", + "integrity": "sha512-LssbyKHlwLeiV8GBATyOyjmHcMpX/tFjzRUCS1jnwGAew1VsBB4fJowyS5Ud5LdFbYpJeS+IQoC+RQxpK7eH3Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app": "0.13.2", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", + "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.8.tgz", + "integrity": "sha512-GpuTz5ap8zumr/ocnPY57ZanX02COsXloY6Y/2LYPAuXYiaJRf6BAGDEdRq1BMjP93kqQnKNuKZUTMZbQ8MNYA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.28.tgz", + "integrity": "sha512-HpMSo/cc6Y8IX7bkRIaPPqT//Jt83iWy5rmDWeThXQCAImstkdNo3giFLORJwrZw2ptiGkOij64EH1ztNJzc7Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth": "1.10.8", + "@firebase/auth-types": "0.13.0", + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", + "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-types": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", + "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.18.tgz", + "integrity": "sha512-n28kPCkE2dL2U28fSxZJjzPPVpKsQminJ6NrzcKXAI0E/lYC8YhfwpyllScqVEvAI3J2QgJZWYgrX+1qGI+SQQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/data-connect": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.10.tgz", + "integrity": "sha512-VMVk7zxIkgwlVQIWHOKFahmleIjiVFwFOjmakXPd/LDgaB/5vzwsB5DWIYo+3KhGxWpidQlR8geCIn39YflJIQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.20.tgz", + "integrity": "sha512-H9Rpj1pQ1yc9+4HQOotFGLxqAXwOzCHsRSRjcQFNOr8lhUt6LeYjf0NSRL04sc4X0dWe8DsCvYKxMYvFG/iOJw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.11.tgz", + "integrity": "sha512-itEsHARSsYS95+udF/TtIzNeQ0Uhx4uIna0sk4E0wQJBUnLc/G1X6D7oRljoOuwwCezRLGvWBRyNrugv/esOEw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/database": "1.0.20", + "@firebase/database-types": "1.0.15", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.15.tgz", + "integrity": "sha512-XWHJ0VUJ0k2E9HDMlKxlgy/ZuTa9EvHCGLjaKSUvrQnwhgZuRU5N3yX6SZ+ftf2hTzZmfRkv+b3QRvGg40bKNw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.3", + "@firebase/util": "1.12.1" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.8.0.tgz", + "integrity": "sha512-QSRk+Q1/CaabKyqn3C32KSFiOdZpSqI9rpLK5BHPcooElumOBooPFa6YkDdiT+/KhJtel36LdAacha9BptMj2A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "@firebase/webchannel-wrapper": "1.0.3", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.53", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.53.tgz", + "integrity": "sha512-qI3yZL8ljwAYWrTousWYbemay2YZa+udLWugjdjju2KODWtLG94DfO4NALJgPLv8CVGcDHNFXoyQexdRA0Cz8Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/firestore": "4.8.0", + "@firebase/firestore-types": "3.0.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", + "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.9.tgz", + "integrity": "sha512-FG95w6vjbUXN84Ehezc2SDjGmGq225UYbHrb/ptkRT7OTuCiQRErOQuyt1jI1tvcDekdNog+anIObihNFz79Lg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.18", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.26.tgz", + "integrity": "sha512-A798/6ff5LcG2LTWqaGazbFYnjBW8zc65YfID/en83ALmkhu2b0G8ykvQnLtakbV9ajrMYPn7Yc/XcYsZIUsjA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/functions": "0.12.9", + "@firebase/functions-types": "0.6.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", + "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/installations": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.18.tgz", + "integrity": "sha512-NQ86uGAcvO8nBRwVltRL9QQ4Reidc/3whdAasgeWCPIcrhOKDuNpAALa6eCVryLnK14ua2DqekCOX5uC9XbU/A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.18.tgz", + "integrity": "sha512-aLFohRpJO5kKBL/XYL4tN+GdwEB/Q6Vo9eZOM/6Kic7asSUgmSfGPpGUZO1OAaSRGwF4Lqnvi1f/f9VZnKzChw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/installations-types": "0.5.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", + "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz", + "integrity": "sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.22", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.22.tgz", + "integrity": "sha512-GJcrPLc+Hu7nk+XQ70Okt3M1u1eRr2ZvpMbzbc54oTPJZySHcX9ccZGVFcsZbSZ6o1uqumm8Oc7OFkD3Rn1/og==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.12.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.22.tgz", + "integrity": "sha512-5ZHtRnj6YO6f/QPa/KU6gryjmX4Kg33Kn4gRpNU6M1K47Gm8kcQwPkX7erRUYEH1mIWptfvjvXMHWoZaWjkU7A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/messaging": "0.12.22", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", + "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/performance": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.7.tgz", + "integrity": "sha512-JTlTQNZKAd4+Q5sodpw6CN+6NmwbY72av3Lb6wUKTsL7rb3cuBIhQSrslWbVz0SwK3x0ZNcqX24qtRbwKiv+6w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0", + "web-vitals": "^4.2.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.20.tgz", + "integrity": "sha512-XkFK5NmOKCBuqOKWeRgBUFZZGz9SzdTZp4OqeUg+5nyjapTiZ4XoiiUL8z7mB2q+63rPmBl7msv682J3rcDXIQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/performance": "0.7.7", + "@firebase/performance-types": "0.2.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", + "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/remote-config": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.6.5.tgz", + "integrity": "sha512-fU0c8HY0vrVHwC+zQ/fpXSqHyDMuuuglV94VF6Yonhz8Fg2J+KOowPGANM0SZkLvVOYpTeWp3ZmM+F6NjwWLnw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.18.tgz", + "integrity": "sha512-YiETpldhDy7zUrnS8e+3l7cNs0sL7+tVAxvVYU0lu7O+qLHbmdtAxmgY+wJqWdW2c9nDvBFec7QiF58pEUu0qQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/remote-config": "0.6.5", + "@firebase/remote-config-types": "0.4.0", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.4.0.tgz", + "integrity": "sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/storage": { + "version": "0.13.14", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.14.tgz", + "integrity": "sha512-xTq5ixxORzx+bfqCpsh+o3fxOsGoDjC1nO0Mq2+KsOcny3l7beyBhP/y1u5T6mgsFQwI1j6oAkbT5cWdDBx87g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.24.tgz", + "integrity": "sha512-XHn2tLniiP7BFKJaPZ0P8YQXKiVJX+bMyE2j2YWjYfaddqiJnROJYqSomwW6L3Y+gZAga35ONXUJQju6MB6SOQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/storage": "0.13.14", + "@firebase/storage-types": "0.8.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", + "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.1.tgz", + "integrity": "sha512-zGlBn/9Dnya5ta9bX/fgEoNC3Cp8s6h+uYPYaDieZsFOAdHP/ExzQ/eaDgxD3GOROdPkLKpvKY0iIzr9adle0w==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz", + "integrity": "sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==", + "license": "Apache-2.0" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@fontsource/roboto": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz", + "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==", + "license": "MIT" + }, + "node_modules/@gerrit0/mini-shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz", + "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^3.22.0", + "@shikijs/langs": "^3.22.0", + "@shikijs/themes": "^3.22.0", + "@shikijs/types": "^3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", + "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "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, + "license": "ISC", + "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-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "MIT", + "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/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, + "license": "MIT", + "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/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mantine/core": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.17.8.tgz", + "integrity": "sha512-42sfdLZSCpsCYmLCjSuntuPcDg3PLbakSmmYfz5Auea8gZYLr+8SS5k647doVu0BRAecqYOytkX2QC5/u/8VHw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.28", + "clsx": "^2.1.1", + "react-number-format": "^5.4.3", + "react-remove-scroll": "^2.6.2", + "react-textarea-autosize": "8.5.9", + "type-fest": "^4.27.0" + }, + "peerDependencies": { + "@mantine/hooks": "7.17.8", + "react": "^18.x || ^19.x", + "react-dom": "^18.x || ^19.x" + } + }, + "node_modules/@mantine/dates": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-7.17.8.tgz", + "integrity": "sha512-KYog/YL83PnsMef7EZagpOFq9I2gfnK0eYSzC8YvV9Mb6t/x9InqRssGWVb0GIr+TNILpEkhKoGaSKZNy10Q1g==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "@mantine/core": "7.17.8", + "@mantine/hooks": "7.17.8", + "dayjs": ">=1.0.0", + "react": "^18.x || ^19.x", + "react-dom": "^18.x || ^19.x" + } + }, + "node_modules/@mantine/form": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/form/-/form-7.17.8.tgz", + "integrity": "sha512-cRLAMYOsZT17jyV9Myl29xacgaswGVAz3Ku6bvphBFad7Nzorra809uKFJxm2yKW5NknZ4ENHSXjyru7k0GTGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "klona": "^2.0.6" + }, + "peerDependencies": { + "react": "^18.x || ^19.x" + } + }, + "node_modules/@mantine/hooks": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.17.8.tgz", + "integrity": "sha512-96qygbkTjRhdkzd5HDU8fMziemN/h758/EwrFu7TlWrEP10Vw076u+Ap/sG6OT4RGPZYYoHrTlT+mkCZblWHuw==", + "license": "MIT", + "peerDependencies": { + "react": "^18.x || ^19.x" + } + }, + "node_modules/@mantine/modals": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/modals/-/modals-7.17.8.tgz", + "integrity": "sha512-7Eylnopjh8b0xIrtXnle8DsNsLghq82uUYMalm54nMaCSD9N/qAuCPGfAE0k2tsWj5cGDC2/uMbU0RSBjGanbA==", + "license": "MIT", + "peerDependencies": { + "@mantine/core": "7.17.8", + "@mantine/hooks": "7.17.8", + "react": "^18.x || ^19.x", + "react-dom": "^18.x || ^19.x" + } + }, + "node_modules/@mantine/notifications": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-7.17.8.tgz", + "integrity": "sha512-/YK16IZ198W6ru/IVecCtHcVveL08u2c8TbQTu/2p26LSIM9AbJhUkrU6H+AO0dgVVvmdmNdvPxcJnfq3S9TMg==", + "license": "MIT", + "dependencies": { + "@mantine/store": "7.17.8", + "react-transition-group": "4.4.5" + }, + "peerDependencies": { + "@mantine/core": "7.17.8", + "@mantine/hooks": "7.17.8", + "react": "^18.x || ^19.x", + "react-dom": "^18.x || ^19.x" + } + }, + "node_modules/@mantine/store": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@mantine/store/-/store-7.17.8.tgz", + "integrity": "sha512-/FrB6PAVH4NEjQ1dsc9qOB+VvVlSuyjf4oOOlM9gscPuapDP/79Ryq7JkhHYfS55VWQ/YUlY24hDI2VV+VptXg==", + "license": "MIT", + "peerDependencies": { + "react": "^18.x || ^19.x" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.8.tgz", + "integrity": "sha512-s9UHZo7QJVly7gNArEZkbbsimHqJZhElgBpXIJdehZ4OWXt+CCr0SBDgUCDJnQrqpd1dWK2dLq5rmO4mCBmI3w==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.8.tgz", + "integrity": "sha512-88sWg/UJc1X82OMO+ISR4E3P58I3BjFVg0qkmDu7OWlN8VijneZD3ylFA+ImxuPjMHW3SHosfSJYy1fztoz0fw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^7.3.8", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.8.tgz", + "integrity": "sha512-QKd1RhDXE1hf2sQDNayA9ic9jGkEgvZOf0tTkJxlBPG8ns8aS4rS8WwYURw2x5y3739p0HauUXX9WbH7UufFLw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/core-downloads-tracker": "^7.3.8", + "@mui/system": "^7.3.8", + "@mui/types": "^7.4.11", + "@mui/utils": "^7.3.8", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.3", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^7.3.8", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.8.tgz", + "integrity": "sha512-du5dlPZ9XL3xW2apHoGDXBI+QLtyVJGrXNCfcNYfP/ojkz1RQ0rRV6VG9Rkm1DqEFRG8mjjTL7zmE1Bvn1eR4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/utils": "^7.3.8", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.8.tgz", + "integrity": "sha512-JHAeXQzS0tJ+Fq3C6J4TVDsW+yKhO4uuxuiLaopNStJeQYBIUCXpKYyUCcgXym4AmhbznQnv9RlHywSH6b0FOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.8.tgz", + "integrity": "sha512-hoFRj4Zw2Km8DPWZp/nKG+ao5Jw5LSk2m/e4EGc6M3RRwXKEkMSG4TgtfVJg7dS2homRwtdXSMW+iRO0ZJ4+IA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/private-theming": "^7.3.8", + "@mui/styled-engine": "^7.3.8", + "@mui/types": "^7.4.11", + "@mui/utils": "^7.3.8", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.11.tgz", + "integrity": "sha512-fZ2xO9D08IKOxO2oUBi1nnVKH6oJUD+64cnv4YAaFoC0E5+i1+S5AHbNqqvZlYYsbPEQ6qEVwuBqY3jl5W4G+Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.8.tgz", + "integrity": "sha512-kZRcE2620CBGr+XI8YMmwPj6WIPwSF7uMJjvSfqd8zXVvlz0MCJbzRRUGNf8NgflCLthdji2DdS643TeyJ3+nA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/types": "^7.4.11", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-data-grid": { + "version": "8.27.1", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-8.27.1.tgz", + "integrity": "sha512-Xje197cUzmch33vLip5KR44SQ0CB49iutBTaoIMSxIVSfNqI8BadEh8PpPCacuTeSty06tJKpBMe66NNYWfHFw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.5", + "@mui/x-internals": "8.26.0", + "@mui/x-virtualizer": "0.3.3", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0", + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-8.26.0.tgz", + "integrity": "sha512-B9OZau5IQUvIxwpJZhoFJKqRpmWf5r0yMmSXjQuqb5WuqM755EuzWJOenY48denGoENzMLT8hQpA0hRTeU2IPA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.5", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-virtualizer": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@mui/x-virtualizer/-/x-virtualizer-0.3.3.tgz", + "integrity": "sha512-6ugUh7UAhQYdgPgHLu181zqufh3Y8IqEU9Pe6Huzj0xkRi3NwMx/ZzvrHf2WazNOh2uLhQ5ZM2wFqDu3mxBWZA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.5", + "@mui/x-internals": "8.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.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, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", + "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, + "node_modules/@quentinroy/latin-square": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@quentinroy/latin-square/-/latin-square-1.1.1.tgz", + "integrity": "sha512-oqoIesMQz2FIc2iOxGA472iD/drvevRJOo84e3uNlC7YzUvWFVPrnfcT4JlFq5IC060+DR2kyaeQzJEzMueZwg==", + "license": "ISC" + }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/konva": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/konva/-/konva-9.7.5.tgz", + "integrity": "sha512-BelrmyY6w0FGoNSEfSJltjQDUoW0Prxf+FzGjyLuLs+V9M9OM/aHnYqOlvQEfQsZx6C/ZiDOn5BZl8iH8SDf+Q==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "konva": ">=2.6", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-konva": "^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0" + } + }, + "node_modules/@react-spring/native": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/native/-/native-9.7.5.tgz", + "integrity": "sha512-C1S500BNP1I05MftElyLv2nIqaWQ0MAByOAK/p4vuXcUK3XcjFaAJ385gVLgV2rgKfvkqRoz97PSwbh+ZCETEg==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "16.8.0 || >=17.0.0 || >=18.0.0", + "react-native": ">=0.58" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", + "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT" + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/zdog": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/zdog/-/zdog-9.7.5.tgz", + "integrity": "sha512-VV7vmb52wGHgDA1ry6hv+QgxTs78fqjKEQnj+M8hiBg+dwOsTtqqM24ADtc4cMAhPW+eZhVps8ZNKtjt8ouHFA==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-zdog": ">=1.0", + "zdog": ">=1.0" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz", + "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@supabase/auth-js": { + "version": "2.71.1", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.71.1.tgz", + "integrity": "sha512-mMIQHBRc+SKpZFRB2qtupuzulaUhFYupNyxqDj5Jp/LyPvcWvjaJzZzObv6URtL/O6lPxkanASnotGtNpS3H2Q==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.6.tgz", + "integrity": "sha512-bhjZ7rmxAibjgmzTmQBxJU6ZIBCCJTc3Uwgvdi4FewueUTAGO5hxZT1Sj6tiD+0dSXf9XI87BDdJrg12z8Uaew==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/node-fetch": { + "version": "2.6.15", + "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", + "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.21.4", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.21.4.tgz", + "integrity": "sha512-TxZCIjxk6/dP9abAi89VQbWWMBbybpGWyvmIzTd79OeravM13OjR/YEYeyUOPcM1C3QyvXkvPZhUfItvmhY1IQ==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.15.5", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.15.5.tgz", + "integrity": "sha512-/Rs5Vqu9jejRD8ZeuaWXebdkH+J7V6VySbCZ/zQM93Ta5y3mAmocjioa/nzlB6qvFmyylUgKVS1KpE212t30OA==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.13", + "@types/phoenix": "^1.6.6", + "@types/ws": "^8.18.1", + "ws": "^8.18.2" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.12.1.tgz", + "integrity": "sha512-QWg3HV6Db2J81VQx0PqLq0JDBn4Q8B1FYn1kYcbla8+d5WDmTdwwMr+EJAxNOSs9W4mhKMv+EYCpCrTFlTj4VQ==", + "license": "MIT", + "dependencies": { + "@supabase/node-fetch": "^2.6.14" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.57.4", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.57.4.tgz", + "integrity": "sha512-LcbTzFhHYdwfQ7TRPfol0z04rLEyHabpGYANME6wkQ/kLtKNmI+Vy+WEM8HxeOZAtByUFxoUTTLwhXmrh+CcVw==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.71.1", + "@supabase/functions-js": "2.4.6", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "1.21.4", + "@supabase/realtime-js": "2.15.5", + "@supabase/storage-js": "2.12.1" + } + }, + "node_modules/@swc/core": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.11.tgz", + "integrity": "sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.11", + "@swc/core-darwin-x64": "1.15.11", + "@swc/core-linux-arm-gnueabihf": "1.15.11", + "@swc/core-linux-arm64-gnu": "1.15.11", + "@swc/core-linux-arm64-musl": "1.15.11", + "@swc/core-linux-x64-gnu": "1.15.11", + "@swc/core-linux-x64-musl": "1.15.11", + "@swc/core-win32-arm64-msvc": "1.15.11", + "@swc/core-win32-ia32-msvc": "1.15.11", + "@swc/core-win32-x64-msvc": "1.15.11" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz", + "integrity": "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", + "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", + "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", + "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", + "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", + "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", + "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", + "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", + "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", + "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tabler/icons": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.37.1.tgz", + "integrity": "sha512-neLCWkuyNHEPXCyYu6nbN4S3g/59BTa4qyITAugYVpq1YzYNDOZooW7/vRWH98ZItXAudxdKU8muFT7y1PqzuA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.37.1.tgz", + "integrity": "sha512-R7UE71Jji7i4Su56Y9zU1uYEBakUejuDJvyuYVmBuUoqp/x3Pn4cv2huarexR3P0GJ2eHg4rUj9l5zccqS6K/Q==", + "license": "MIT", + "dependencies": { + "@tabler/icons": "" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "license": "MIT", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.18.tgz", + "integrity": "sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.18.tgz", + "integrity": "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@trrack/core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@trrack/core/-/core-1.3.0.tgz", + "integrity": "sha512-uOWRwCvvvNURZLXoI4lIAs0wXc98EhiCn3YGkXbDdpRCsuxyaz5+baatyPENxocCLFoWBY7X9w11ceZUO7KCqQ==", + "dependencies": { + "@reduxjs/toolkit": "^1.9.1", + "fast-json-patch": "^3.1.1", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@reduxjs/toolkit": "^1.9.1", + "fast-json-patch": "^3.1.1", + "uuid": "^9.0.0" + } + }, + "node_modules/@trrack/core/node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "license": "MIT", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@trrack/core/node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@trrack/core/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/@trrack/core/node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "license": "MIT", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/@trrack/core/node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "license": "MIT" + }, + "node_modules/@trrack/core/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "license": "MIT" + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT" + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "license": "MIT" + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hjson": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/hjson/-/hjson-2.4.6.tgz", + "integrity": "sha512-tEQ4hlyKfsb9WWeueUY5eRnU2eK+KdE0eofSpQ05v9Aah4VvWwIRIid/ZN1zZZ0TfeVTRDgabKKqKZXEkfD3Sw==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash.isequal": { + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.8.tgz", + "integrity": "sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", + "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/phoenix": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", + "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/topojson-client": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/topojson-client/-/topojson-client-3.1.5.tgz", + "integrity": "sha512-C79rySTyPxnQNNguTZNI1Ct4D7IXgvyAs3p9HPecnl6mNrJ5+UhvGNYcZfpROYV2lMHI48kJPxwR+F9C6c7nmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/topojson-specification": "*" + } + }, + "node_modules/@types/topojson-specification": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/topojson-specification/-/topojson-specification-1.0.5.tgz", + "integrity": "sha512-C7KvcQh+C2nr6Y2Ub4YfgvWvWCgP2nOQMtfhlnwsRL4pYmmwzBS7HclGiS87eQfDOU/DLQpX6GEscviaz4yLIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-11.0.0.tgz", + "integrity": "sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==", + "deprecated": "This is a stub types definition. uuid provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "uuid": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.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.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "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.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.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/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "deprecated": "Potential CWE-502 - Update to 1.3.1 or higher", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@visdesignlab/upset2-core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@visdesignlab/upset2-core/-/upset2-core-1.1.0.tgz", + "integrity": "sha512-deJyBilFQy3VOTl49oAwePVIZRnKyKepRSG5k7Ta7HHd1jimALk9nNqiJvAdM3EoocduGgi2LJB/vl/ltduOSw==", + "license": "MIT", + "dependencies": { + "d3-array": "^3.2.4", + "d3-drag": "^3.0.0", + "d3-dsv": "^3.0.1", + "d3-selection": "^3.0.0", + "hyperid": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@visdesignlab/upset2-react": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@visdesignlab/upset2-react/-/upset2-react-1.1.0.tgz", + "integrity": "sha512-KIa4vR9DiMn47tTrlgmYVAmpNqlYzNWYcVrYDLpc74FpoKJJHg1HrFoiWqFRmip5fyp77DqY2bL9yxAG3pudCw==", + "license": "MIT", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@fontsource/roboto": "^4.5.1", + "@visdesignlab/upset2-core": "v1.1.0", + "d3-array": "^3.2.4", + "d3-drag": "^3.0.0", + "d3-scale": "^4.0.2", + "d3-selection": "^3.0.0", + "react-markdown": "^8.0.7", + "react-spring": "^9.4.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^7.0.2", + "@mui/material": "^7.0.2", + "@mui/system": "^7.0.2", + "@mui/x-data-grid": "^8.1.0", + "@trrack/core": "^1.3.0-beta.1", + "@trrack/vis-react": "^1.3.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-vega": "^7.4.4", + "recoil": "^0.5.2", + "vega": "^5.32.0", + "vega-lite": "^5.2.0" + }, + "peerDependenciesMeta": { + "@mui/x-data-grid": { + "optional": true + }, + "@trrack/vis-react": { + "optional": true + } + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@visdesignlab/upset2-react/node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@visdesignlab/upset2-react/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.3.tgz", + "integrity": "sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2", + "@swc/core": "^1.15.11" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz", + "integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "chai": "^6.2.2", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz", + "integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz", + "integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format/node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz", + "integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.0", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz", + "integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "@vitest/utils": "4.1.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz", + "integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz", + "integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.0", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/utils/node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/apache-arrow": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-15.0.2.tgz", + "integrity": "sha512-RvwlFxLRpO405PLGffx4N2PYLiF7FD86Q1hHl6J2XCWiq+tTCzpb9ngFw0apFDcXZBMpCzMuwAvA7hjyL1/73A==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.2", + "@types/command-line-args": "^5.2.1", + "@types/command-line-usage": "^5.0.2", + "@types/node": "^20.6.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^23.5.26", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.cjs" + } + }, + "node_modules/apache-arrow/node_modules/@types/node": { + "version": "20.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/apache-arrow/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "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==", + "license": "Python-2.0" + }, + "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, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/arquero": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/arquero/-/arquero-5.4.1.tgz", + "integrity": "sha512-yZhBU0/bYaB3mfqWShl0Opb3WaIOOWpnQ/pNvpIwQ5AXm4vd6ryljjl1l5RtHR/ENK7BSmNJD6SPygLXhnan9A==", + "license": "BSD-3-Clause", + "dependencies": { + "acorn": "^8.12.0", + "apache-arrow": "^15.0.2", + "node-fetch": "^2.7.0" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", + "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "license": "MIT", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "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-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==", + "license": "MIT" + }, + "node_modules/cliui/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "license": "MIT", + "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/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/custom-event-polyfill": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz", + "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "license": "ISC", + "dependencies": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.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", + "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" + }, + "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-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + }, + "engines": { + "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", + "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz", + "integrity": "sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "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": "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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "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/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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, + "license": "MIT", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/firebase": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.10.0.tgz", + "integrity": "sha512-nKBXoDzF0DrXTBQJlZa+sbC5By99ysYU1D6PkMRYknm0nCW7rJly47q492Ht7Ndz5MeYSBuboKuhS1e6mFC03w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/ai": "1.4.1", + "@firebase/analytics": "0.10.17", + "@firebase/analytics-compat": "0.2.23", + "@firebase/app": "0.13.2", + "@firebase/app-check": "0.10.1", + "@firebase/app-check-compat": "0.3.26", + "@firebase/app-compat": "0.4.2", + "@firebase/app-types": "0.9.3", + "@firebase/auth": "1.10.8", + "@firebase/auth-compat": "0.5.28", + "@firebase/data-connect": "0.3.10", + "@firebase/database": "1.0.20", + "@firebase/database-compat": "2.0.11", + "@firebase/firestore": "4.8.0", + "@firebase/firestore-compat": "0.3.53", + "@firebase/functions": "0.12.9", + "@firebase/functions-compat": "0.3.26", + "@firebase/installations": "0.6.18", + "@firebase/installations-compat": "0.2.18", + "@firebase/messaging": "0.12.22", + "@firebase/messaging-compat": "0.2.22", + "@firebase/performance": "0.7.7", + "@firebase/performance-compat": "0.2.20", + "@firebase/remote-config": "0.6.5", + "@firebase/remote-config-compat": "0.2.18", + "@firebase/storage": "0.13.14", + "@firebase/storage-compat": "0.3.24", + "@firebase/util": "1.12.1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatbuffers": { + "version": "23.5.26", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-23.5.26.tgz", + "integrity": "sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==", + "license": "SEE LICENSE IN LICENSE" + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", + "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "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/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.3.tgz", + "integrity": "sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hjson": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/hjson/-/hjson-3.2.2.tgz", + "integrity": "sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q==", + "license": "MIT", + "bin": { + "hjson": "bin/hjson" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyperid": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.3.0.tgz", + "integrity": "sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==", + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "uuid": "^8.3.2", + "uuid-parse": "^1.1.0" + } + }, + "node_modules/hyperid/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/immer": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz", + "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", + "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.25.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "engines": { + "node": ">=0.8" + } + }, + "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, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lint-staged": { + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", + "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.2", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/loadjs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loadjs/-/loadjs-4.3.0.tgz", + "integrity": "sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==", + "license": "MIT" + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage/node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mantine-react-table": { + "version": "2.0.0-beta.9", + "resolved": "https://registry.npmjs.org/mantine-react-table/-/mantine-react-table-2.0.0-beta.9.tgz", + "integrity": "sha512-ZdfcwebWaPERoDvAuk43VYcBCzamohARVclnbuepT0PHZ0wRcDPMBR+zgaocL+pFy8EXUGwvWTOKNh25ITpjNQ==", + "license": "MIT", + "dependencies": { + "@tanstack/match-sorter-utils": "8.19.4", + "@tanstack/react-table": "8.20.5", + "@tanstack/react-virtual": "3.11.2" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kevinvandy" + }, + "peerDependencies": { + "@mantine/core": "^7.9", + "@mantine/dates": "^7.9", + "@mantine/hooks": "^7.9", + "@tabler/icons-react": ">=2.23.0", + "clsx": ">=2", + "dayjs": ">=1.11", + "react": ">=18.0", + "react-dom": ">=18.0" + } + }, + "node_modules/mantine-react-table/node_modules/@tanstack/react-virtual": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", + "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.11.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/mantine-react-table/node_modules/@tanstack/virtual-core": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", + "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/mdast-util-definitions/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "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, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "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, + "license": "MIT", + "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/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "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==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT" + }, + "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, + "license": "BlueOak-1.0.0", + "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, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/plyr": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/plyr/-/plyr-3.8.4.tgz", + "integrity": "sha512-DrzLbK9Wol3zeiuZCleD9aUOl0KAaBHR9H6WVVVYPZ4Ya+LYxUFTgSF1jooHcMQCv96Ws96wCaZzIoP3bES8pQ==", + "license": "MIT", + "dependencies": { + "core-js": "^3.45.1", + "custom-event-polyfill": "^1.0.7", + "loadjs": "^4.3.0", + "rangetouch": "^2.0.1", + "url-polyfill": "^1.1.13" + } + }, + "node_modules/plyr-react": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/plyr-react/-/plyr-react-6.0.0.tgz", + "integrity": "sha512-P8M+BuQoGrCd7m6K4QwwQlcSS1E26OeXuJTAmgLx11B9UqJrdc3Ka4TFwPwF3jul4EsVxSK9Zn1ME3DV8m9gdw==", + "license": "MIT", + "dependencies": { + "react-aptor": "^2.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "plyr": "^3.7.7", + "react": ">=16.8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.1.tgz", + "integrity": "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/rangetouch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rangetouch/-/rangetouch-2.0.1.tgz", + "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-aptor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-aptor/-/react-aptor-2.0.0.tgz", + "integrity": "sha512-YnCayokuhAwmBBP4Oc0bbT2l6ApfsjbY3DEEVUddIKZEBlGl1npzjHHzWnSqWuboSbMZvRqUM01Io9yiIp1wcg==", + "license": "MIT", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-number-format": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz", + "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==", + "license": "MIT", + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.0.tgz", + "integrity": "sha512-HW9vYwuM8f4yx66Izy8xfrzCM+SBJluoZcCbww9A1TySax11S5Vgw6fi3ZjMONw9J4gQwngL7PzkyIpJJpJ7RQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-spring": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/react-spring/-/react-spring-9.7.5.tgz", + "integrity": "sha512-oG6DkDZIASHzPiGYw5KwrCvoFZqsaO3t2R7KE37U6S/+8qWSph/UjRQalPpZxlbgheqV9LT62H6H9IyoopHdug==", + "license": "MIT", + "dependencies": { + "@react-spring/core": "~9.7.5", + "@react-spring/konva": "~9.7.5", + "@react-spring/native": "~9.7.5", + "@react-spring/three": "~9.7.5", + "@react-spring/web": "~9.7.5", + "@react-spring/zdog": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", + "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-vega": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/react-vega/-/react-vega-7.7.1.tgz", + "integrity": "sha512-Dj7n1LkfJEkY/FdwQfOZqIQ+wGUcJNwlTuWhYcuQtbBpTgvtI4wwqOvJ0QWBE19nXMU7t9HmP8sqQO5v6soOlg==", + "license": "Apache-2.0", + "dependencies": { + "@types/react": "*", + "fast-deep-equal": "^3.1.1", + "prop-types": "^15.8.1", + "vega-embed": "6.5.1" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18 || ^19", + "vega": "*", + "vega-lite": "*" + } + }, + "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==", + "license": "MIT", + "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/recoil": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.5.2.tgz", + "integrity": "sha512-Edibzpu3dbUMLy6QRg73WL8dvMl9Xqhp+kU+f2sJtXxsaXvAlxU/GcnDE8HXPkprXrhHF2e6SZozptNvjNF5fw==", + "license": "MIT", + "dependencies": { + "hamt_plus": "1.0.2" + }, + "peerDependencies": { + "react": ">=16.13.1" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz", + "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "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/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, + "license": "MIT" + }, + "node_modules/string-width-cjs/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/test-exclude": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^10.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.30.tgz", + "integrity": "sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.30" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.30.tgz", + "integrity": "sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-json-schema-generator": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.5.0.tgz", + "integrity": "sha512-sYY7AInozRbtj9OD3ynJJuMDWZ5lGxzxTevtmH3W9Hnd2J2szBC0HdPqSyuIirXnQ6g8KDJxS/HENoypUwBrlg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "commander": "^14.0.2", + "json5": "^2.2.3", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.5.0", + "tslib": "^2.8.1", + "typescript": "^5.9.3" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/ts-json-schema-generator/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", + "license": "Apache-2.0", + "dependencies": { + "@gerrit0/mini-shiki": "^3.17.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.8.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18", + "pnpm": ">= 10" + }, + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.10.0.tgz", + "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==", + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.28.x" + } + }, + "node_modules/typedoc/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-polyfill": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.14.tgz", + "integrity": "sha512-p4f3TTAG6ADVF3mwbXw7hGw+QJyw5CnNGvYh5fCuQQZIiuKUswqcznyV3pGDP9j0TSmC4UvRKm8kl1QsX1diiQ==", + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-composed-ref": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz", + "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-deep-compare-effect": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz", + "integrity": "sha512-kbeNVZ9Zkc0RFGpfMN3MNfaKNvcLNyxOAAd9O4CBZ+kCBXXscn9s/4I+8ytUER4RDpEYs5+O6Rs4PqiZ+rHr5Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "dequal": "^2.0.2" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz", + "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", + "license": "MIT", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/uuid-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", + "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==", + "license": "MIT" + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/vega": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-6.2.0.tgz", + "integrity": "sha512-BIwalIcEGysJdQDjeVUmMWB3e50jPDNAMfLJscjEvpunU9bSt7X1OYnQxkg3uBwuRRI4nWfFZO9uIW910nLeGw==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-crossfilter": "~5.1.0", + "vega-dataflow": "~6.1.0", + "vega-encode": "~5.1.0", + "vega-event-selector": "~4.0.0", + "vega-expression": "~6.1.0", + "vega-force": "~5.1.0", + "vega-format": "~2.1.0", + "vega-functions": "~6.1.0", + "vega-geo": "~5.1.0", + "vega-hierarchy": "~5.1.0", + "vega-label": "~2.1.0", + "vega-loader": "~5.1.0", + "vega-parser": "~7.1.0", + "vega-projection": "~2.1.0", + "vega-regression": "~2.1.0", + "vega-runtime": "~7.1.0", + "vega-scale": "~8.1.0", + "vega-scenegraph": "~5.1.0", + "vega-statistics": "~2.0.0", + "vega-time": "~3.1.0", + "vega-transforms": "~5.1.0", + "vega-typings": "~2.1.0", + "vega-util": "~2.1.0", + "vega-view": "~6.1.0", + "vega-view-transforms": "~5.1.0", + "vega-voronoi": "~5.1.0", + "vega-wordcloud": "~5.1.0" + }, + "funding": { + "url": "https://app.hubspot.com/payments/GyPC972GD9Rt" + } + }, + "node_modules/vega-canvas": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-2.0.0.tgz", + "integrity": "sha512-9x+4TTw/USYST5nx4yN272sy9WcqSRjAR0tkQYZJ4cQIeon7uVsnohvoPQK1JZu7K1QXGUqzj08z0u/UegBVMA==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-crossfilter": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-5.1.0.tgz", + "integrity": "sha512-EmVhfP3p6AM7o/lPan/QAoqjblI19BxWUlvl2TSs0xjQd8KbaYYbS4Ixt3cmEvl0QjRdBMF6CdJJ/cy9DTS4Fw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-dataflow": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-6.1.0.tgz", + "integrity": "sha512-JxumGlODtFbzoQ4c/jQK8Tb/68ih0lrexlCozcMfTAwQ12XhTqCvlafh7MAKKTMBizjOfaQTHm4Jkyb1H5CfyQ==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-format": "^2.1.0", + "vega-loader": "^5.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-embed": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-6.5.1.tgz", + "integrity": "sha512-yz/L1bN3+fLOpgXVb/8sCRv4GlZpD2/ngeKJAFRiHTIRm5zK6W0KuqZZvyGaO7E4s7RuYjW1TWhRIOqh5rS5hA==", + "license": "BSD-3-Clause", + "dependencies": { + "fast-json-patch": "^3.0.0-1", + "json-stringify-pretty-compact": "^2.0.0", + "semver": "^7.1.3", + "vega-schema-url-parser": "^1.1.0", + "vega-themes": "^2.8.2", + "vega-tooltip": "^0.22.0" + }, + "peerDependencies": { + "vega": "^5.8.0", + "vega-lite": "*" + } + }, + "node_modules/vega-encode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-5.1.0.tgz", + "integrity": "sha512-q26oI7B+MBQYcTQcr5/c1AMsX3FvjZLQOBi7yI0vV+GEn93fElDgvhQiYrgeYSD4Exi/jBPeUXuN6p4bLz16kA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-interpolate": "^3.0.1", + "vega-dataflow": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-event-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-4.0.0.tgz", + "integrity": "sha512-CcWF4m4KL/al1Oa5qSzZ5R776q8lRxCj3IafCHs5xipoEHrkgu1BWa7F/IH5HrDNXeIDnqOpSV1pFsAWRak4gQ==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-expression": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.1.0.tgz", + "integrity": "sha512-hHgNx/fQ1Vn1u6vHSamH7lRMsOa/yQeHGGcWVmh8fZafLdwdhCM91kZD9p7+AleNpgwiwzfGogtpATFaMmDFYg==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/estree": "^1.0.8", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-force": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-5.1.0.tgz", + "integrity": "sha512-wdnchOSeXpF9Xx8Yp0s6Do9F7YkFeOn/E/nENtsI7NOcyHpICJ5+UkgjUo9QaQ/Yu+dIDU+sP/4NXsUtq6SMaQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-force": "^3.0.0", + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-2.1.0.tgz", + "integrity": "sha512-i9Ht33IgqG36+S1gFDpAiKvXCPz+q+1vDhDGKK8YsgMxGOG4PzinKakI66xd7SdV4q97FgpR7odAXqtDN2wKqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-format": "^3.1.0", + "d3-time-format": "^4.1.0", + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-functions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-6.1.1.tgz", + "integrity": "sha512-Due6jP0y0FfsGMTrHnzUGnEwXPu7VwE+9relfo+LjL/tRPYnnKqwWvzt7n9JkeBuZqjkgYjMzm/WucNn6Hkw5A==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.1", + "vega-dataflow": "^6.1.0", + "vega-expression": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-scenegraph": "^5.1.0", + "vega-selections": "^6.1.0", + "vega-statistics": "^2.0.0", + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-geo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-5.1.0.tgz", + "integrity": "sha512-H8aBBHfthc3rzDbz/Th18+Nvp00J73q3uXGAPDQqizioDm/CoXCK8cX4pMePydBY9S6ikBiGJrLKFDa80wI20g==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.1", + "vega-canvas": "^2.0.0", + "vega-dataflow": "^6.1.0", + "vega-projection": "^2.1.0", + "vega-statistics": "^2.0.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-hierarchy": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-5.1.0.tgz", + "integrity": "sha512-rZlU8QJNETlB6o73lGCPybZtw2fBBsRIRuFE77aCLFHdGsh6wIifhplVarqE9icBqjUHRRUOmcEYfzwVIPr65g==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-2.1.0.tgz", + "integrity": "sha512-/hgf+zoA3FViDBehrQT42Lta3t8In6YwtMnwjYlh72zNn1p3c7E3YUBwqmAqTM1x+tudgzMRGLYig+bX1ewZxQ==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-canvas": "^2.0.0", + "vega-dataflow": "^6.1.0", + "vega-scenegraph": "^5.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-lite": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.23.0.tgz", + "integrity": "sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==", + "license": "BSD-3-Clause", + "dependencies": { + "json-stringify-pretty-compact": "~4.0.0", + "tslib": "~2.8.1", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.1", + "vega-util": "~1.17.2", + "yargs": "~17.7.2" + }, + "bin": { + "vl2pdf": "bin/vl2pdf", + "vl2png": "bin/vl2png", + "vl2svg": "bin/vl2svg", + "vl2vg": "bin/vl2vg" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vega": "^5.24.0" + } + }, + "node_modules/vega-lite/node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/vega-lite/node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-lite/node_modules/vega-expression": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.2.tgz", + "integrity": "sha512-fFeDTh4UtOxlZWL54jf1ZqJHinyerWq/ROiqrQxqLkNJRJ86RmxYTgXwt65UoZ/l4VUv9eAd2qoJeDEf610Umw==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.3" + } + }, + "node_modules/vega-lite/node_modules/vega-util": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.3.tgz", + "integrity": "sha512-nSNpZLUrRvFo46M5OK4O6x6f08WD1yOcEzHNlqivF+sDLSsVpstaF6fdJYwrbf/debFi2L9Tkp4gZQtssup9iQ==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-5.1.0.tgz", + "integrity": "sha512-GaY3BdSPbPNdtrBz8SYUBNmNd8mdPc3mtdZfdkFazQ0RD9m+Toz5oR8fKnTamNSk9fRTJX0Lp3uEqxrAlQVreg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dsv": "^3.0.1", + "topojson-client": "^3.1.0", + "vega-format": "^2.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-7.1.0.tgz", + "integrity": "sha512-g0lrYxtmYVW8G6yXpIS4J3Uxt9OUSkc0bLu5afoYDo4rZmoOOdll3x3ebActp5LHPW+usZIE+p5nukRS2vEc7Q==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^6.1.0", + "vega-event-selector": "^4.0.0", + "vega-functions": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-projection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-2.1.0.tgz", + "integrity": "sha512-EjRjVSoMR5ibrU7q8LaOQKP327NcOAM1+eZ+NO4ANvvAutwmbNVTmfA1VpPH+AD0AlBYc39ND/wnRk7SieDiXA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-geo": "^3.1.1", + "d3-geo-projection": "^4.0.0", + "vega-scale": "^8.1.0" + } + }, + "node_modules/vega-regression": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-2.1.0.tgz", + "integrity": "sha512-HzC7MuoEwG1rIxRaNTqgcaYF03z/ZxYkQR2D5BN0N45kLnHY1HJXiEcZkcffTsqXdspLjn47yLi44UoCwF5fxQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "vega-dataflow": "^6.1.0", + "vega-statistics": "^2.0.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-runtime": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-7.1.0.tgz", + "integrity": "sha512-mItI+WHimyEcZlZrQ/zYR3LwHVeyHCWwp7MKaBjkU8EwkSxEEGVceyGUY9X2YuJLiOgkLz/6juYDbMv60pfwYA==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-scale": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-8.1.0.tgz", + "integrity": "sha512-VEgDuEcOec8+C8+FzLcnAmcXrv2gAJKqQifCdQhkgnsLa978vYUgVfCut/mBSMMHbH8wlUV1D0fKZTjRukA1+A==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-scale-chromatic": "^3.1.0", + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-scenegraph": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-5.1.0.tgz", + "integrity": "sha512-4gA89CFIxkZX+4Nvl8SZF2MBOqnlj9J5zgdPh/HPx+JOwtzSlUqIhxFpFj7GWYfwzr/PyZnguBLPihPw1Og/cA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^2.0.0", + "vega-loader": "^5.1.0", + "vega-scale": "^8.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-schema-url-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz", + "integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-selections": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-6.1.2.tgz", + "integrity": "sha512-xJ+V4qdd46nk2RBdwIRrQm2iSTMHdlu/omhLz1pqRL3jZDrkqNBXimrisci2kIKpH2WBpA1YVagwuZEKBmF2Qw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "3.2.4", + "vega-expression": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-statistics": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-2.0.0.tgz", + "integrity": "sha512-dGPfDXnBlgXbZF3oxtkb8JfeRXd5TYHx25Z/tIoaa9jWua4Vf/AoW2wwh8J1qmMy8J03/29aowkp1yk4DOPazQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4" + } + }, + "node_modules/vega-themes": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.15.0.tgz", + "integrity": "sha512-DicRAKG9z+23A+rH/3w3QjJvKnlGhSbbUXGjBvYGseZ1lvj9KQ0BXZ2NS/+MKns59LNpFNHGi9us/wMlci4TOA==", + "license": "BSD-3-Clause", + "peerDependencies": { + "vega": "*", + "vega-lite": "*" + } + }, + "node_modules/vega-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-3.1.0.tgz", + "integrity": "sha512-G93mWzPwNa6UYQRkr8Ujur9uqxbBDjDT/WpXjbDY0yygdSkRT+zXF+Sb4gjhW0nPaqdiwkn0R6kZcSPMj1bMNA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-time": "^3.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-tooltip": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.22.1.tgz", + "integrity": "sha512-mPmzxwvi6+2ZgbZ/+mNC7XbSu5I6Ckon8zdgUfH9neb+vV7CKlV/FYypMdVN/9iDMFUqGzybYdqNOiSPPIxFEQ==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-util": "^1.13.1" + } + }, + "node_modules/vega-tooltip/node_modules/vega-util": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.3.tgz", + "integrity": "sha512-nSNpZLUrRvFo46M5OK4O6x6f08WD1yOcEzHNlqivF+sDLSsVpstaF6fdJYwrbf/debFi2L9Tkp4gZQtssup9iQ==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-5.1.0.tgz", + "integrity": "sha512-mj/sO2tSuzzpiXX8JSl4DDlhEmVwM/46MTAzTNQUQzJPMI/n4ChCjr/SdEbfEyzlD4DPm1bjohZGjLc010yuMg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "vega-dataflow": "^6.1.0", + "vega-statistics": "^2.0.0", + "vega-time": "^3.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-typings": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-2.1.0.tgz", + "integrity": "sha512-zdis4Fg4gv37yEvTTSZEVMNhp8hwyEl7GZ4X4HHddRVRKxWFsbyKvZx/YW5Z9Ox4sjxVA2qHzEbod4Fdx+SEJA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/geojson": "7946.0.16", + "vega-event-selector": "^4.0.0", + "vega-expression": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-util": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-2.1.0.tgz", + "integrity": "sha512-PGfp0m0QCufDmcxKJCWQy4Ov23FoF8DSXmoJwSezi3itQaa2hbxK0+xwsTMP2vy4PR16Pu25HMzgMwXVW1+33w==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-view": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-6.1.0.tgz", + "integrity": "sha512-hmHDm/zC65lb23mb9Tr9Gx0wkxP0TMS31LpMPYxIZpvInxvUn7TYitkOtz1elr63k2YZrgmF7ztdGyQ4iCQ5fQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.4", + "d3-timer": "^3.0.1", + "vega-dataflow": "^6.1.0", + "vega-format": "^2.1.0", + "vega-functions": "^6.1.0", + "vega-runtime": "^7.1.0", + "vega-scenegraph": "^5.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-view-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-5.1.0.tgz", + "integrity": "sha512-fpigh/xn/32t+An1ShoY3MLeGzNdlbAp2+HvFKzPpmpMTZqJEWkk/J/wHU7Swyc28Ta7W1z3fO+8dZkOYO5TWQ==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^6.1.0", + "vega-scenegraph": "^5.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-voronoi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-5.1.0.tgz", + "integrity": "sha512-uKdsoR9x60mz7eYtVG+NhlkdQXeVdMr6jHNAHxs+W+i6kawkUp5S9jp1xf1FmW/uZvtO1eqinHQNwATcDRsiUg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-delaunay": "^6.0.4", + "vega-dataflow": "^6.1.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vega-wordcloud": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-5.1.0.tgz", + "integrity": "sha512-sSdNmT8y2D7xXhM2h76dKyaYn3PA4eV49WUUkfYfqHz/vpcu10GSAoFxLhQQTkbZXR+q5ZB63tFUow9W2IFo6g==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-canvas": "^2.0.0", + "vega-dataflow": "^6.1.0", + "vega-scale": "^8.1.0", + "vega-statistics": "^2.0.0", + "vega-util": "^2.1.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz", + "integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.0", + "@vitest/mocker": "4.1.0", + "@vitest/pretty-format": "4.1.0", + "@vitest/runner": "4.1.0", + "@vitest/snapshot": "4.1.0", + "@vitest/spy": "4.1.0", + "@vitest/utils": "4.1.0", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.0", + "@vitest/browser-preview": "4.1.0", + "@vitest/browser-webdriverio": "4.1.0", + "@vitest/ui": "4.1.0", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest-localstorage-mock": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/vitest-localstorage-mock/-/vitest-localstorage-mock-0.1.2.tgz", + "integrity": "sha512-1oee6iDWhhquzVogssbpwQi6a2F3L+nCKF2+qqyCs5tH0sOYRyTqnsfj2dtmEQiL4xtJkHLn42hEjHGESlsJHw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vitest": "*" + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest/node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vitest/node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wavesurfer-react": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/wavesurfer-react/-/wavesurfer-react-3.0.5.tgz", + "integrity": "sha512-0d4dqLuvvpBfNVTcXCT8niAtXg9LuS6VBwfISS2Kj+DA5uRVpFeW8h0SfP9CF4rqS8OJ4K51U0qbblnghngqeQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16 || ^17 || ^18 || ^19", + "wavesurfer.js": "^7" + } + }, + "node_modules/wavesurfer.js": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-7.12.1.tgz", + "integrity": "sha512-NswPjVHxk0Q1F/VMRemCPUzSojjuHHisQrBqQiRXg7MVbe3f5vQ6r0rTTXA/a/neC/4hnOEC4YpXca4LpH0SUg==", + "license": "BSD-3-Clause" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "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, + "license": "MIT", + "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/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, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "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==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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==", + "license": "MIT" + }, + "node_modules/yargs/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json index 5825240db5..f5b1738b33 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "generate-library-examples": "node libraryExampleStudyGenerator.cjs", "test": "playwright test", "unittest": "vitest", + "unittest-coverage": "vitest run --coverage --coverage.reporter=text", "find-revisit-users": "bash scripts/find-revisit-users.sh", - "preinstall": "node -e \"if(!/yarn\\.js$/.test(process.env.npm_execpath))throw new Error('Use yarn')\"", "postinstall": "husky" }, "lint-staged": { @@ -98,6 +98,9 @@ "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.36.0", "@playwright/test": "^1.55.0", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "@types/d3": "^7.4.0", "@types/lodash.isequal": "^4.5.8", "@types/react": "^19.1.13", @@ -108,6 +111,7 @@ "@typescript-eslint/eslint-plugin": "^8.44.0", "@typescript-eslint/parser": "^8.44.0", "@vitejs/plugin-react-swc": "^4.1.0", + "@vitest/coverage-v8": "3.2.4", "eslint": "^9.36.0", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", diff --git a/public/demo-form-elements/config.json b/public/demo-form-elements/config.json index dccb2ac6e9..076840eb55 100644 --- a/public/demo-form-elements/config.json +++ b/public/demo-form-elements/config.json @@ -393,7 +393,10 @@ ], "minSelections": 1, "maxSelections": 3, - "default": ["Line", "test"] + "default": [ + "Line", + "test" + ] }, { "id": "default-radio", @@ -1003,4 +1006,4 @@ "Sidebar Form Elements" ] } -} +} \ No newline at end of file diff --git a/public/demo-html-trrack/assets/dots-count.html b/public/demo-html-trrack/assets/dots-count.html index cf15fbfc43..3c860c1437 100644 --- a/public/demo-html-trrack/assets/dots-count.html +++ b/public/demo-html-trrack/assets/dots-count.html @@ -5,7 +5,40 @@ Trrack Demo + @@ -17,8 +50,14 @@
- - + + + + + + + +
@@ -32,6 +71,7 @@ // Task id should match the task's answer id in the config file const taskId = 'circlesCount'; + const maxDots = 20; function dots(initialDots) { const height = 50; @@ -110,31 +150,69 @@ // Render the dots on screen using state from trrack const dotActions = dots(trrack.getState().dots); - // Register a listener to update the dot chart based on trrack updates. - trrack.currentChange(() => { + const addButton = document.getElementById("add"); + const removeButton = document.getElementById("rem"); + const addControl = document.getElementById("add-control"); + const removeControl = document.getElementById("remove-control"); + const addTooltip = document.getElementById("add-limit-tooltip"); + const removeTooltip = document.getElementById("remove-limit-tooltip"); + + function setLimitState(button, control, tooltip, disabled) { + button.disabled = disabled; + tooltip.hidden = !disabled; + + if (disabled) { + button.setAttribute("aria-describedby", tooltip.id); + control.tabIndex = 0; + } else { + button.removeAttribute("aria-describedby"); + control.removeAttribute("tabindex"); + } + } + + function renderState(currentDots) { + dotActions.update(currentDots); + setLimitState(addButton, addControl, addTooltip, currentDots.length >= maxDots); + setLimitState(removeButton, removeControl, removeTooltip, currentDots.length === 0); + } + + function publishState() { const dots = trrack.getState().dots; - dotActions.update(dots); + renderState(dots); Revisit.postAnswers({ [taskId]: dots.length }); Revisit.postProvenance(trrack.graph.backend); - }); + } + + // Register a listener to update the dot chart based on trrack updates. + trrack.currentChange(publishState); // Bind button to update dots - document.getElementById("add").onclick = () => - trrack.apply("Add Dot", updateDots("add")); + addButton.onclick = () => { + if (trrack.getState().dots.length < maxDots) { + trrack.apply("Add Dot", updateDots("add")); + } + }; - document.getElementById("rem").onclick = () => - trrack.apply("Remove Dot", updateDots("remove")); + removeButton.onclick = () => { + if (trrack.getState().dots.length > 0) { + trrack.apply("Remove Dot", updateDots("remove")); + } + }; // Bind undo/redo document.getElementById("undo").onclick = () => trrack.undo(); document.getElementById("redo").onclick = () => trrack.redo(); Revisit.onProvenanceReceive((prov) => { - dotActions.update(prov.dots); - }) + if (Array.isArray(prov?.dots)) { + renderState(prov.dots); + } + }); + + publishState(); - \ No newline at end of file + diff --git a/public/demo-style/assets/style/layout.css b/public/demo-style/assets/style/layout.css index 57a46c5715..589bfea0ff 100644 --- a/public/demo-style/assets/style/layout.css +++ b/public/demo-style/assets/style/layout.css @@ -18,11 +18,30 @@ margin-bottom: 20px; } +/* ResponseBlock wraps each response before rendering the styled card. Place + * those wrappers on the demo grid so custom response ids can keep styling the cards. */ +.responseBlock > div { + min-width: 0; +} + +.responseBlock > div > .response { + box-sizing: border-box; + height: 100%; + min-width: 0; +} + +.responseBlock > div > .response:has(input[type="checkbox"], input[type="radio"]) { + overflow-x: auto; +} + /* Positions the title across the full width at the top */ -#layout-title { +.responseBlock > div:has(> #layout-title) { grid-row: 1; /* Span across all 6 columns */ grid-column: span 6; +} + +#layout-title { border: none; box-shadow: none; padding: 0; @@ -38,7 +57,7 @@ } /* Positions the color response in the first 2 columns of row 2 */ -#layout-color { +.responseBlock > div:has(> #layout-color) { /* Places the color response in row 2 */ grid-row: 2; /* Spans across 2 columns */ @@ -46,31 +65,31 @@ } /* Positions the website response in columns 3-4 of row 2 */ -#layout-website { +.responseBlock > div:has(> #layout-website) { grid-row: 2; grid-column: span 2; } /* Positions the web enjoyment response in columns 5-6 of row 2 */ -#layout-web-enjoyment { +.responseBlock > div:has(> #layout-web-enjoyment) { grid-row: 2; grid-column: span 2; } /* Positions the website design response in the first 3 columns of row 3 */ -#layout-website-design { +.responseBlock > div:has(> #layout-website-design) { grid-row: 3; grid-column: span 3; } /* Positions the preference response in columns 4-6 of row 3 */ -#layout-preference { +.responseBlock > div:has(> #layout-preference) { grid-row: 3; grid-column: span 3; } /* Positions the opinion response across the full width in row 4 */ -#layout-opinion { +.responseBlock > div:has(> #layout-opinion) { grid-row: 4; grid-column: span 6; } @@ -91,4 +110,4 @@ /* Moves the response up by 2 pixels */ transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); -} \ No newline at end of file +} diff --git a/public/demo-svelte-trrack/assets/DotCounter.svelte b/public/demo-svelte-trrack/assets/DotCounter.svelte new file mode 100644 index 0000000000..fa596c4d87 --- /dev/null +++ b/public/demo-svelte-trrack/assets/DotCounter.svelte @@ -0,0 +1,75 @@ + + +
+
+ + +
+ +
+ + + {#if atMaximum} + Maximum of 20 dots reached. + {/if} + + + + {#if atMinimum} + Minimum of 0 dots reached. + {/if} + +
+ + + {#each visibleDots as dot} + + {/each} + +
+ + diff --git a/public/demo-svelte-trrack/assets/dots-count.html b/public/demo-svelte-trrack/assets/dots-count.html new file mode 100644 index 0000000000..10d69adfb2 --- /dev/null +++ b/public/demo-svelte-trrack/assets/dots-count.html @@ -0,0 +1,149 @@ + + + + + + Svelte Trrack Demo + + + + + + +
+ + + + + + + + diff --git a/public/demo-svelte-trrack/assets/introduction.md b/public/demo-svelte-trrack/assets/introduction.md new file mode 100644 index 0000000000..44013c144b --- /dev/null +++ b/public/demo-svelte-trrack/assets/introduction.md @@ -0,0 +1,11 @@ +This is an example study to show how to implement the [Trrack library](https://apps.vdl.sci.utah.edu/trrack) for provenance tracking in a Svelte website stimulus. In this example, the number of dots added or removed is tracked and sent back to the reVISit app. + +It also demonstrates how to implement undo/redo in a Svelte stimulus. + +## Relevant files: + * [The Config](https://github.com/revisit-studies/study/blob/main/public/demo-svelte-trrack/config.json) + * [DotCounter.svelte](https://github.com/revisit-studies/study/blob/main/public/demo-svelte-trrack/assets/DotCounter.svelte) + * [dots-count.html](https://github.com/revisit-studies/study/blob/main/public/demo-svelte-trrack/assets/dots-count.html) + +## Relevant documentation: + * [Provenance Tracking](https://revisit.dev/docs/designing-studies/provenance-tracking/) diff --git a/public/demo-svelte-trrack/config.json b/public/demo-svelte-trrack/config.json new file mode 100644 index 0000000000..5b68194f44 --- /dev/null +++ b/public/demo-svelte-trrack/config.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://raw.githubusercontent.com/revisit-studies/study/v2.4.3/src/parser/StudyConfigSchema.json", + "studyMetadata": { + "title": "Svelte with Trrack library", + "version": "pilot", + "authors": [ + "The reVISit Team" + ], + "date": "2026-06-10", + "description": "An example study that implements Trrack provenance tracking in a Svelte website stimulus.", + "organizations": [ + "University of Utah", + "WPI" + ] + }, + "uiConfig": { + "contactEmail": "contact@revisit.dev", + "helpTextPath": "demo-svelte-trrack/assets/introduction.md", + "logoPath": "revisitAssets/revisitLogoSquare.svg", + "withProgressBar": true, + "autoDownloadStudy": false, + "withSidebar": true, + "windowEventDebounceTime": 200 + }, + "components": { + "introduction": { + "type": "markdown", + "path": "demo-svelte-trrack/assets/introduction.md", + "response": [] + }, + "countDots": { + "type": "website", + "nextButtonLocation": "sidebar", + "meta": { + "difficulty": "easy" + }, + "description": "Add a total of 10 to 15 circles", + "instruction": "Add a total of 10 to 15 circles.", + "path": "demo-svelte-trrack/assets/dots-count.html", + "response": [ + { + "id": "circlesCount", + "prompt": "Answer:", + "location": "sidebar", + "type": "reactive", + "hidden": false + } + ] + } + }, + "sequence": { + "order": "fixed", + "components": [ + "introduction", + "countDots" + ] + } +} diff --git a/public/global.json b/public/global.json index afca88eeea..a0fd358d3a 100644 --- a/public/global.json +++ b/public/global.json @@ -5,10 +5,11 @@ "tutorial-replication", "demo-html", "demo-html-input", - "demo-form-elements", - "demo-training", - "demo-html-trrack", - "demo-react-trrack", + "demo-form-elements", + "demo-training", + "demo-html-trrack", + "demo-svelte-trrack", + "demo-react-trrack", "demo-screen-recording", "demo-image", "demo-vega", @@ -41,6 +42,8 @@ "library-screen-recording", "library-smeq", "library-sus", + "library-ueq", + "library-ueq-s", "library-umux", "library-umux-lite", "library-virtual-chinrest", @@ -49,11 +52,11 @@ "test-device-restriction", "test-library", "test-likert-matrix", - "test-parser-errors", - "test-randomization", - "test-component-timeout", - "test-skip-logic", - "test-step-logic" + "test-parser-errors", + "test-randomization", + "test-component-timeout", + "test-skip-logic", + "test-step-logic" ], "configs": { "tutorial": { @@ -89,12 +92,15 @@ "demo-condition": { "path": "demo-condition/config.json" }, - "demo-html-trrack": { - "path": "demo-html-trrack/config.json" - }, - "demo-react-trrack": { - "path": "demo-react-trrack/config.json" - }, + "demo-html-trrack": { + "path": "demo-html-trrack/config.json" + }, + "demo-svelte-trrack": { + "path": "demo-svelte-trrack/config.json" + }, + "demo-react-trrack": { + "path": "demo-react-trrack/config.json" + }, "demo-image": { "path": "demo-image/config.json" }, @@ -189,6 +195,14 @@ "path": "library-sus/config.json", "test": true }, + "library-ueq": { + "path": "library-ueq/config.json", + "test": true + }, + "library-ueq-s": { + "path": "library-ueq-s/config.json", + "test": true + }, "library-vlat": { "path": "library-vlat/config.json", "test": true @@ -211,17 +225,17 @@ "path": "test-parser-errors/config.json", "test": true }, - "test-randomization": { - "path": "test-randomization/config.json", - "test": true - }, - "test-component-timeout": { - "path": "test-component-timeout/config.json", - "test": true - }, - "test-skip-logic": { - "path": "test-skip-logic/config.json", - "test": true + "test-randomization": { + "path": "test-randomization/config.json", + "test": true + }, + "test-component-timeout": { + "path": "test-component-timeout/config.json", + "test": true + }, + "test-skip-logic": { + "path": "test-skip-logic/config.json", + "test": true }, "test-step-logic": { "path": "test-step-logic/config.json", diff --git a/public/libraries/calvi/assets/questions/normal/N1.jpg b/public/libraries/calvi/assets/questions/normal/N1.jpg deleted file mode 100644 index 21eba79aa6..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N1.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N10.jpg b/public/libraries/calvi/assets/questions/normal/N10.jpg deleted file mode 100644 index 6c28e29a17..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N10.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N11.jpg b/public/libraries/calvi/assets/questions/normal/N11.jpg deleted file mode 100644 index 440e24c4f5..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N11.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N12.jpg b/public/libraries/calvi/assets/questions/normal/N12.jpg deleted file mode 100644 index 6a4223ea01..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N12.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N13.jpg b/public/libraries/calvi/assets/questions/normal/N13.jpg deleted file mode 100644 index 1178111dc6..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N13.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N14.jpg b/public/libraries/calvi/assets/questions/normal/N14.jpg deleted file mode 100644 index bdaf3637bf..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N14.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N15.jpg b/public/libraries/calvi/assets/questions/normal/N15.jpg deleted file mode 100644 index e6a269fcbc..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N15.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N2.jpg b/public/libraries/calvi/assets/questions/normal/N2.jpg deleted file mode 100644 index a78463fd56..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N2.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N3.jpg b/public/libraries/calvi/assets/questions/normal/N3.jpg deleted file mode 100644 index 084026212a..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N3.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N4.jpg b/public/libraries/calvi/assets/questions/normal/N4.jpg deleted file mode 100644 index 6a7f2047df..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N4.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N5.jpg b/public/libraries/calvi/assets/questions/normal/N5.jpg deleted file mode 100644 index c9057a038f..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N5.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N6.jpg b/public/libraries/calvi/assets/questions/normal/N6.jpg deleted file mode 100644 index 1be9c960c7..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N6.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N7.jpg b/public/libraries/calvi/assets/questions/normal/N7.jpg deleted file mode 100644 index b74b1339be..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N7.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N8.jpg b/public/libraries/calvi/assets/questions/normal/N8.jpg deleted file mode 100644 index a84a71aa12..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N8.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/normal/N9.jpg b/public/libraries/calvi/assets/questions/normal/N9.jpg deleted file mode 100644 index a0360f0608..0000000000 Binary files a/public/libraries/calvi/assets/questions/normal/N9.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T1.jpg b/public/libraries/calvi/assets/questions/trick/T1.jpg deleted file mode 100644 index 3ef41a393e..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T1.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T10.jpg b/public/libraries/calvi/assets/questions/trick/T10.jpg deleted file mode 100644 index 95d0be5423..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T10.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T11.jpg b/public/libraries/calvi/assets/questions/trick/T11.jpg deleted file mode 100644 index 4f9e76c35b..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T11.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T12.jpg b/public/libraries/calvi/assets/questions/trick/T12.jpg deleted file mode 100644 index 3646c79712..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T12.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T13.jpg b/public/libraries/calvi/assets/questions/trick/T13.jpg deleted file mode 100644 index df273c00cc..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T13.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T14.jpg b/public/libraries/calvi/assets/questions/trick/T14.jpg deleted file mode 100644 index 3066303d4d..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T14.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T15.jpg b/public/libraries/calvi/assets/questions/trick/T15.jpg deleted file mode 100644 index 0a3f7aff2d..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T15.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T16.jpg b/public/libraries/calvi/assets/questions/trick/T16.jpg deleted file mode 100644 index 6c84872009..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T16.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T17.jpg b/public/libraries/calvi/assets/questions/trick/T17.jpg deleted file mode 100644 index d7ba58933f..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T17.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T18.jpg b/public/libraries/calvi/assets/questions/trick/T18.jpg deleted file mode 100644 index c2c4f1b6b0..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T18.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T19.jpg b/public/libraries/calvi/assets/questions/trick/T19.jpg deleted file mode 100644 index 8b698dfd93..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T19.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T2.jpg b/public/libraries/calvi/assets/questions/trick/T2.jpg deleted file mode 100644 index 1354850614..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T2.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T20.jpg b/public/libraries/calvi/assets/questions/trick/T20.jpg deleted file mode 100644 index fa47c36cf7..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T20.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T21.jpg b/public/libraries/calvi/assets/questions/trick/T21.jpg deleted file mode 100644 index f51b2ad8b2..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T21.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T22.jpg b/public/libraries/calvi/assets/questions/trick/T22.jpg deleted file mode 100644 index 83e5f77b82..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T22.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T23.jpg b/public/libraries/calvi/assets/questions/trick/T23.jpg deleted file mode 100644 index d63dffb18a..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T23.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T25.jpg b/public/libraries/calvi/assets/questions/trick/T25.jpg deleted file mode 100644 index 28a72405d2..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T25.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T26.jpg b/public/libraries/calvi/assets/questions/trick/T26.jpg deleted file mode 100644 index 86b7049874..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T26.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T27.jpg b/public/libraries/calvi/assets/questions/trick/T27.jpg deleted file mode 100644 index 3796779158..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T27.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T28.jpg b/public/libraries/calvi/assets/questions/trick/T28.jpg deleted file mode 100644 index 2cb3d61d60..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T28.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T29.jpg b/public/libraries/calvi/assets/questions/trick/T29.jpg deleted file mode 100644 index 202df8df0a..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T29.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T3.jpg b/public/libraries/calvi/assets/questions/trick/T3.jpg deleted file mode 100644 index 52f5ce667f..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T3.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T30.jpg b/public/libraries/calvi/assets/questions/trick/T30.jpg deleted file mode 100644 index 02eed55c58..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T30.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T34.jpg b/public/libraries/calvi/assets/questions/trick/T34.jpg deleted file mode 100644 index 35998377a9..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T34.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T35.jpg b/public/libraries/calvi/assets/questions/trick/T35.jpg deleted file mode 100644 index 6e48dde9e0..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T35.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T36.jpg b/public/libraries/calvi/assets/questions/trick/T36.jpg deleted file mode 100644 index 5035e90854..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T36.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T37.jpg b/public/libraries/calvi/assets/questions/trick/T37.jpg deleted file mode 100644 index 069c687d2d..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T37.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T38.jpg b/public/libraries/calvi/assets/questions/trick/T38.jpg deleted file mode 100644 index c38193f543..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T38.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T39.jpg b/public/libraries/calvi/assets/questions/trick/T39.jpg deleted file mode 100644 index bccfb2d63a..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T39.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T4.jpg b/public/libraries/calvi/assets/questions/trick/T4.jpg deleted file mode 100644 index 5da1976d57..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T4.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T40.jpg b/public/libraries/calvi/assets/questions/trick/T40.jpg deleted file mode 100644 index 697cbee567..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T40.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T42.jpg b/public/libraries/calvi/assets/questions/trick/T42.jpg deleted file mode 100644 index 204bfc93a6..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T42.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T43.jpg b/public/libraries/calvi/assets/questions/trick/T43.jpg deleted file mode 100644 index 2900db479e..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T43.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T44.jpg b/public/libraries/calvi/assets/questions/trick/T44.jpg deleted file mode 100644 index 183a0cce2a..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T44.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T45.jpg b/public/libraries/calvi/assets/questions/trick/T45.jpg deleted file mode 100644 index ddaea51eb8..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T45.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T46.jpg b/public/libraries/calvi/assets/questions/trick/T46.jpg deleted file mode 100644 index 9009afe418..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T46.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T47.jpg b/public/libraries/calvi/assets/questions/trick/T47.jpg deleted file mode 100644 index d7d6bb2679..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T47.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T48.jpg b/public/libraries/calvi/assets/questions/trick/T48.jpg deleted file mode 100644 index 35c91546e3..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T48.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T49.jpg b/public/libraries/calvi/assets/questions/trick/T49.jpg deleted file mode 100644 index e41f242ce7..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T49.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T5.jpg b/public/libraries/calvi/assets/questions/trick/T5.jpg deleted file mode 100644 index 27fb697b60..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T5.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T50.jpg b/public/libraries/calvi/assets/questions/trick/T50.jpg deleted file mode 100644 index ae6a121d5c..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T50.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T52.jpg b/public/libraries/calvi/assets/questions/trick/T52.jpg deleted file mode 100644 index d1a2729f64..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T52.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T6.jpg b/public/libraries/calvi/assets/questions/trick/T6.jpg deleted file mode 100644 index 280ebe4fe2..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T6.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T8.jpg b/public/libraries/calvi/assets/questions/trick/T8.jpg deleted file mode 100644 index 996e41f114..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T8.jpg and /dev/null differ diff --git a/public/libraries/calvi/assets/questions/trick/T9.jpg b/public/libraries/calvi/assets/questions/trick/T9.jpg deleted file mode 100644 index 9a1bdf6705..0000000000 Binary files a/public/libraries/calvi/assets/questions/trick/T9.jpg and /dev/null differ diff --git a/public/libraries/calvi/config.json b/public/libraries/calvi/config.json index 8b0e709425..9be177acf8 100644 --- a/public/libraries/calvi/config.json +++ b/public/libraries/calvi/config.json @@ -7,7 +7,7 @@ "N1": { "description": "Visitors at Movie Theaters in 2001", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N1.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N1.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -48,7 +48,7 @@ "N2": { "description": "Traffic Accidents Trend", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N2.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N2.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -89,7 +89,7 @@ "N3": { "description": "Customers at Three Bike Shops", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N3.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N3.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -130,7 +130,7 @@ "N4": { "description": "Advertising Expense Breakdown", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N4.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N4.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -171,7 +171,7 @@ "N5": { "description": "Perfume Brand Market Share", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N5.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N5.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -212,7 +212,7 @@ "N6": { "description": "Monthly Number of New Clients", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N6.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N6.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -253,7 +253,7 @@ "N7": { "description": "Restaurant Openings in 2000", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N7.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N7.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -290,7 +290,7 @@ "N8": { "description": "Beers Consumed in 2005", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N8.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N8.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -327,7 +327,7 @@ "N9": { "description": "Store C\u2019s Sales vs Store B", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N9.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N9.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -368,7 +368,7 @@ "N10": { "description": "SAT Score vs. Income", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N10.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N10.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -405,7 +405,7 @@ "N11": { "description": "Sleep vs. Time Outdoors", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N11.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N11.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -446,7 +446,7 @@ "N12": { "description": "Grocery Store Market Share", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N12.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N12.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -487,7 +487,7 @@ "N13": { "description": "Education Level of Residents", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N13.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N13.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -528,7 +528,7 @@ "N14": { "description": "Lego ownership by state", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N14.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N14.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -569,7 +569,7 @@ "N15": { "description": "Restaurant R popularity worldwide", "type": "image", - "path": "libraries/calvi/assets/questions/normal/N15.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/normal/N15.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -610,7 +610,7 @@ "T1": { "description": "Sunny Days in Summer vs Winter", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T1.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T1.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -647,7 +647,7 @@ "T2": { "description": "Windy Days in Summer vs Winter", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T2.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T2.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -684,7 +684,7 @@ "T3": { "description": "Concert Ticket Sales", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T3.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T3.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -725,7 +725,7 @@ "T4": { "description": "Water Bottle Price Comparison", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T4.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T4.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -766,7 +766,7 @@ "T5": { "description": "Visitors at Train Stations", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T5.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T5.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -807,7 +807,7 @@ "T6": { "description": "Bacteria Trend 1970\u20132020", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T6.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T6.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -848,7 +848,7 @@ "T8": { "description": "Visitors at Amusement Parks", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T8.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T8.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -889,7 +889,7 @@ "T9": { "description": "Brand C Sales vs B", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T9.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T9.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -930,7 +930,7 @@ "T10": { "description": "Species Prevalence by State", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T10.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T10.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -967,7 +967,7 @@ "T11": { "description": "Risk of Bacteria Z in WY vs ND", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T11.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T11.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1004,7 +1004,7 @@ "T12": { "description": "Tree Planting Trend 1960\u20131980", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T12.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T12.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1041,7 +1041,7 @@ "T13": { "description": "Bookstore Trend 2000\u20132020", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T13.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T13.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1078,7 +1078,7 @@ "T14": { "description": "Movie Release Trend", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T14.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T14.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1119,7 +1119,7 @@ "T15": { "description": "Sales Trend for Item X (Apr to Jul)", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T15.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T15.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1156,7 +1156,7 @@ "T16": { "description": "Apple Harvest Trend", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T16.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T16.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1193,7 +1193,7 @@ "T17": { "description": "Sunlight vs Growth for Plant P", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T17.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T17.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1234,7 +1234,7 @@ "T18": { "description": "Vacation Days vs Satisfaction", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T18.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T18.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1275,7 +1275,7 @@ "T19": { "description": "Weight vs Survival Rate for Z", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T19.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T19.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1316,7 +1316,7 @@ "T20": { "description": "Prevalence of Plant Y Globally", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T20.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T20.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1357,7 +1357,7 @@ "T21": { "description": "Bar chart of rainfall over 14 days", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T21.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T21.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1398,7 +1398,7 @@ "T22": { "description": "Line chart of airport visitors from 2000 to 2005", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T22.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T22.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1435,7 +1435,7 @@ "T23": { "description": "Area chart of monthly shirt sales in 2021", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T23.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T23.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1472,7 +1472,7 @@ "T25": { "description": "Market share of shampoo brands", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T25.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T25.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1513,7 +1513,7 @@ "T26": { "description": "Votes for candidates", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T26.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T26.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1554,7 +1554,7 @@ "T27": { "description": "GDP growth trend", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T27.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T27.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1591,7 +1591,7 @@ "T28": { "description": "Cell phone brand market share", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T28.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T28.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1628,7 +1628,7 @@ "T29": { "description": "Household car ownership", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T29.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T29.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1665,7 +1665,7 @@ "T30": { "description": "Precipitation comparison", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T30.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T30.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1702,7 +1702,7 @@ "T34": { "description": "Board game sales trend analysis", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T34.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T34.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1743,7 +1743,7 @@ "T35": { "description": "Vegetable planting trends by three farms", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T35.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T35.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1784,7 +1784,7 @@ "T36": { "description": "Car counts in parking lots", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T36.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T36.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1821,7 +1821,7 @@ "T37": { "description": "Hiring trend in company Z", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T37.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T37.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1862,7 +1862,7 @@ "T38": { "description": "Work hours and happiness correlation", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T38.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T38.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1899,7 +1899,7 @@ "T39": { "description": "Work hours and salary correlation", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T39.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T39.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1936,7 +1936,7 @@ "T40": { "description": "Weight analysis of species C", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T40.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T40.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -1973,7 +1973,7 @@ "T42": { "description": "Infection rates per 1,000", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T42.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T42.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2014,7 +2014,7 @@ "T43": { "description": "Sales trend for gift shop A", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T43.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T43.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2055,7 +2055,7 @@ "T44": { "description": "Book price trend in City Z", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T44.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T44.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2096,7 +2096,7 @@ "T45": { "description": "Ice cream brand voting across states", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T45.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T45.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2137,7 +2137,7 @@ "T46": { "description": "Water sales vs temperature", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T46.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T46.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2174,7 +2174,7 @@ "T47": { "description": "Reading preferences by time of day", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T47.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T47.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2211,7 +2211,7 @@ "T48": { "description": "Voting on hiking trails", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T48.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T48.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2252,7 +2252,7 @@ "T49": { "description": "Average mall customers in Town X", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T49.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T49.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2293,7 +2293,7 @@ "T50": { "description": "Average new buildings in City Z", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T50.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T50.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ @@ -2334,7 +2334,7 @@ "T52": { "description": "Monthly sales trend for store B", "type": "image", - "path": "libraries/calvi/assets/questions/trick/T52.jpg", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/calvi/questions/trick/T52.jpg", "nextButtonLocation": "sidebar", "nextButtonText": "Continue", "response": [ diff --git a/public/libraries/ueq-s/config.json b/public/libraries/ueq-s/config.json new file mode 100644 index 0000000000..039e566eb8 --- /dev/null +++ b/public/libraries/ueq-s/config.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://raw.githubusercontent.com/revisit-studies/study/v2.4.3/src/parser/LibraryConfigSchema.json", + "description": "The Short Version of the User Experience Questionnaire (UEQ-S) is a short version of the User Experience Questionnaire (UEQ), which is a widely used tool to measure user experience. This library contains one component with 8 questions. The component is the full UEQ-S questionnaire with 8 questions.", + "reference": "M. Schrepp, A. Hinderks, and J. Thomaschewski, Design and Evaluation of a Short Version of the User Experience Questionnaire (UEQ-S), International Journal of Interactive Multimedia and Artificial Intelligence, vol. 4, no. 6, pp. 103–108, Sep. 2017.", + "doi": "10.9781/ijimai.2017.09.001", + "components": { + "ueq-s": { + "type": "questionnaire", + "response": [ + { + "id": "ueq-s-response", + "prompt": "For each word pair, select a value from 1 (left word) to 7 (right word).", + "secondaryText": "1 = left word, 7 = right word", + "required": true, + "location": "aboveStimulus", + "type": "matrix-radio", + "answerOptions": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ], + "questionOptions": [ + { + "label": "Obstructive - Supportive", + "value": "obstructive-supportive", + "leftLabel": "Obstructive", + "rightLabel": "Supportive" + }, + { + "label": "Complicated - Easy", + "value": "complicated-easy", + "leftLabel": "Complicated", + "rightLabel": "Easy" + }, + { + "label": "Inefficient - Efficient", + "value": "inefficient-efficient", + "leftLabel": "Inefficient", + "rightLabel": "Efficient" + }, + { + "label": "Clear - Confusing", + "value": "clear-confusing", + "leftLabel": "Clear", + "rightLabel": "Confusing" + }, + { + "label": "Boring - Exciting", + "value": "boring-exciting", + "leftLabel": "Boring", + "rightLabel": "Exciting" + }, + { + "label": "Not interesting - Interesting", + "value": "not-interesting-interesting", + "leftLabel": "Not interesting", + "rightLabel": "Interesting" + }, + { + "label": "Conventional - Inventive", + "value": "conventional-inventive", + "leftLabel": "Conventional", + "rightLabel": "Inventive" + }, + { + "label": "Usual - Leading edge", + "value": "usual-leading-edge", + "leftLabel": "Usual", + "rightLabel": "Leading edge" + } + ] + } + ] + } + }, + "sequences": {} +} diff --git a/public/libraries/ueq/config.json b/public/libraries/ueq/config.json new file mode 100644 index 0000000000..a7d5a94a1b --- /dev/null +++ b/public/libraries/ueq/config.json @@ -0,0 +1,191 @@ +{ + "$schema": "https://raw.githubusercontent.com/revisit-studies/study/v2.4.3/src/parser/LibraryConfigSchema.json", + "description": "User Experience Questionnaire (UEQ) is a fast and reliable questionnaire to measure the User Experience of interactive products. This library contains one component with 26 questions. The component is the full UEQ questionnaire with 26 questions.", + "reference": "B. Laugwitz, M. Schrepp, and T. Held, Construction and Evaluation of a User Experience Questionnaire, USAB 2008, LNCS 5298, pp. 63–76, 2008.", + "doi": "10.1007/978-3-540-89350-9_6", + "externalLink": "https://www.ueq-online.org/", + "components": { + "ueq": { + "type": "questionnaire", + "response": [ + { + "id": "ueq-response", + "prompt": "For each word pair, select a value from 1 (left word) to 7 (right word).", + "secondaryText": "1 = left word, 7 = right word", + "required": true, + "location": "aboveStimulus", + "type": "matrix-radio", + "answerOptions": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ], + "questionOptions": [ + { + "label": "Annoying - Enjoyable", + "value": "annoying-enjoyable", + "leftLabel": "Annoying", + "rightLabel": "Enjoyable" + }, + { + "label": "Not understandable - Understandable", + "value": "not-understandable-understandable", + "leftLabel": "Not understandable", + "rightLabel": "Understandable" + }, + { + "label": "Creative - Dull", + "value": "creative-dull", + "leftLabel": "Creative", + "rightLabel": "Dull" + }, + { + "label": "Easy to learn - Difficult to learn", + "value": "easy-to-learn-difficult-to-learn", + "leftLabel": "Easy to learn", + "rightLabel": "Difficult to learn" + }, + { + "label": "Valuable - Inferior", + "value": "valuable-inferior", + "leftLabel": "Valuable", + "rightLabel": "Inferior" + }, + { + "label": "Boring - Exciting", + "value": "boring-exciting", + "leftLabel": "Boring", + "rightLabel": "Exciting" + }, + { + "label": "Not interesting - Interesting", + "value": "not-interesting-interesting", + "leftLabel": "Not interesting", + "rightLabel": "Interesting" + }, + { + "label": "Unpredictable - Predictable", + "value": "unpredictable-predictable", + "leftLabel": "Unpredictable", + "rightLabel": "Predictable" + }, + { + "label": "Fast - Slow", + "value": "fast-slow", + "leftLabel": "Fast", + "rightLabel": "Slow" + }, + { + "label": "Inventive - Conventional", + "value": "inventive-conventional", + "leftLabel": "Inventive", + "rightLabel": "Conventional" + }, + { + "label": "Obstructive - Supportive", + "value": "obstructive-supportive", + "leftLabel": "Obstructive", + "rightLabel": "Supportive" + }, + { + "label": "Good - Bad", + "value": "good-bad", + "leftLabel": "Good", + "rightLabel": "Bad" + }, + { + "label": "Complicated - Easy", + "value": "complicated-easy", + "leftLabel": "Complicated", + "rightLabel": "Easy" + }, + { + "label": "Unlikable - Pleasing", + "value": "unlikable-pleasing", + "leftLabel": "Unlikable", + "rightLabel": "Pleasing" + }, + { + "label": "Usual - Leading edge", + "value": "usual-leading-edge", + "leftLabel": "Usual", + "rightLabel": "Leading edge" + }, + { + "label": "Unpleasant - Pleasant", + "value": "unpleasant-pleasant", + "leftLabel": "Unpleasant", + "rightLabel": "Pleasant" + }, + { + "label": "Secure - Not secure", + "value": "secure-not-secure", + "leftLabel": "Secure", + "rightLabel": "Not secure" + }, + { + "label": "Motivating - Demotivating", + "value": "motivating-demotivating", + "leftLabel": "Motivating", + "rightLabel": "Demotivating" + }, + { + "label": "Meets expectations - Does not meet expectations", + "value": "meets-expectations-does-not-meet-expectations", + "leftLabel": "Meets expectations", + "rightLabel": "Does not meet expectations" + }, + { + "label": "Inefficient - Efficient", + "value": "inefficient-efficient", + "leftLabel": "Inefficient", + "rightLabel": "Efficient" + }, + { + "label": "Clear - Confusing", + "value": "clear-confusing", + "leftLabel": "Clear", + "rightLabel": "Confusing" + }, + { + "label": "Impractical - Practical", + "value": "impractical-practical", + "leftLabel": "Impractical", + "rightLabel": "Practical" + }, + { + "label": "Organized - Cluttered", + "value": "organized-cluttered", + "leftLabel": "Organized", + "rightLabel": "Cluttered" + }, + { + "label": "Attractive - Unattractive", + "value": "attractive-unattractive", + "leftLabel": "Attractive", + "rightLabel": "Unattractive" + }, + { + "label": "Friendly - Unfriendly", + "value": "friendly-unfriendly", + "leftLabel": "Friendly", + "rightLabel": "Unfriendly" + }, + { + "label": "Conservative - Innovative", + "value": "conservative-innovative", + "leftLabel": "Conservative", + "rightLabel": "Innovative" + } + ], + "questionOrder": "random" + } + ] + } + }, + "sequences": {} +} diff --git a/public/libraries/vlat/assets/VLAT1.png b/public/libraries/vlat/assets/VLAT1.png deleted file mode 100644 index 3a2416523f..0000000000 Binary files a/public/libraries/vlat/assets/VLAT1.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT10.png b/public/libraries/vlat/assets/VLAT10.png deleted file mode 100644 index 22bbe949c3..0000000000 Binary files a/public/libraries/vlat/assets/VLAT10.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT11.png b/public/libraries/vlat/assets/VLAT11.png deleted file mode 100644 index 13532392ce..0000000000 Binary files a/public/libraries/vlat/assets/VLAT11.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT12.png b/public/libraries/vlat/assets/VLAT12.png deleted file mode 100644 index 51f9d4fcbc..0000000000 Binary files a/public/libraries/vlat/assets/VLAT12.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT2.png b/public/libraries/vlat/assets/VLAT2.png deleted file mode 100644 index 530a82f97e..0000000000 Binary files a/public/libraries/vlat/assets/VLAT2.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT3.png b/public/libraries/vlat/assets/VLAT3.png deleted file mode 100644 index bda44b6216..0000000000 Binary files a/public/libraries/vlat/assets/VLAT3.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT4.png b/public/libraries/vlat/assets/VLAT4.png deleted file mode 100644 index 85d853b908..0000000000 Binary files a/public/libraries/vlat/assets/VLAT4.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT5.png b/public/libraries/vlat/assets/VLAT5.png deleted file mode 100644 index 1c8e1572e4..0000000000 Binary files a/public/libraries/vlat/assets/VLAT5.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT6.png b/public/libraries/vlat/assets/VLAT6.png deleted file mode 100644 index c2e59e2106..0000000000 Binary files a/public/libraries/vlat/assets/VLAT6.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT7.png b/public/libraries/vlat/assets/VLAT7.png deleted file mode 100644 index cb4e30c5c4..0000000000 Binary files a/public/libraries/vlat/assets/VLAT7.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT8.png b/public/libraries/vlat/assets/VLAT8.png deleted file mode 100644 index a4447ff6e2..0000000000 Binary files a/public/libraries/vlat/assets/VLAT8.png and /dev/null differ diff --git a/public/libraries/vlat/assets/VLAT9.png b/public/libraries/vlat/assets/VLAT9.png deleted file mode 100644 index 3370c14adb..0000000000 Binary files a/public/libraries/vlat/assets/VLAT9.png and /dev/null differ diff --git a/public/libraries/vlat/config.json b/public/libraries/vlat/config.json index 645b3e9277..cfdcc9a790 100644 --- a/public/libraries/vlat/config.json +++ b/public/libraries/vlat/config.json @@ -6,7 +6,7 @@ "baseComponents": { "line": { "type": "image", - "path": "libraries/vlat/assets/VLAT1.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT1.png", "style": { "width": "800px" }, @@ -16,7 +16,7 @@ }, "bar": { "type": "image", - "path": "libraries/vlat/assets/VLAT2.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT2.png", "style": { "width": "800px" }, @@ -26,7 +26,7 @@ }, "stackbar": { "type": "image", - "path": "libraries/vlat/assets/VLAT3.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT3.png", "style": { "width": "800px" }, @@ -36,7 +36,7 @@ }, "stackbar100": { "type": "image", - "path": "libraries/vlat/assets/VLAT4.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT4.png", "style": { "width": "800px" }, @@ -46,7 +46,7 @@ }, "pie": { "type": "image", - "path": "libraries/vlat/assets/VLAT5.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT5.png", "style": { "width": "800px" }, @@ -56,7 +56,7 @@ }, "histogram": { "type": "image", - "path": "libraries/vlat/assets/VLAT6.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT6.png", "style": { "width": "800px" }, @@ -66,7 +66,7 @@ }, "scatterplot": { "type": "image", - "path": "libraries/vlat/assets/VLAT7.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT7.png", "style": { "width": "800px" }, @@ -76,7 +76,7 @@ }, "area": { "type": "image", - "path": "libraries/vlat/assets/VLAT8.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT8.png", "style": { "width": "800px" }, @@ -86,7 +86,7 @@ }, "stackarea": { "type": "image", - "path": "libraries/vlat/assets/VLAT9.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT9.png", "style": { "width": "800px" }, @@ -96,7 +96,7 @@ }, "bubble": { "type": "image", - "path": "libraries/vlat/assets/VLAT10.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT10.png", "style": { "width": "800px" }, @@ -106,7 +106,7 @@ }, "map": { "type": "image", - "path": "libraries/vlat/assets/VLAT11.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT11.png", "style": { "width": "800px" }, @@ -116,7 +116,7 @@ }, "treemap": { "type": "image", - "path": "libraries/vlat/assets/VLAT12.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT12.png", "style": { "width": "800px" }, @@ -1358,7 +1358,7 @@ "instruction": "What is the total length of the metro system in Beijing?", "instructionLocation": "sidebar", "type": "image", - "path": "libraries/vlat/assets/VLAT10.png", + "path": "https://raw.githubusercontent.com/revisit-studies/library-assets/v1/vlat/VLAT10.png", "style": { "width": "800px" }, diff --git a/public/library-ueq-s/assets/ueq-s.md b/public/library-ueq-s/assets/ueq-s.md new file mode 100644 index 0000000000..8c7da4e142 --- /dev/null +++ b/public/library-ueq-s/assets/ueq-s.md @@ -0,0 +1,24 @@ + +# ueq-s + +This is an example study of the library `ueq-s`. + +The Short Version of the User Experience Questionnaire (UEQ-S) is a short version of the User Experience Questionnaire (UEQ), which is a widely used tool to measure user experience. This library contains one component with 8 questions. The component is the full UEQ-S questionnaire with 8 questions. + +## Reference + +M. Schrepp, A. Hinderks, and J. Thomaschewski, Design and Evaluation of a Short Version of the User Experience Questionnaire (UEQ-S), International Journal of Interactive Multimedia and Artificial Intelligence, vol. 4, no. 6, pp. 103–108, Sep. 2017. + +DOI: [10.9781/ijimai.2017.09.001](https://dx.doi.org/10.9781/ijimai.2017.09.001) d + +## Available Components + +- ueq-s + +## Available Sequences + +None + + + + diff --git a/public/library-ueq-s/config.json b/public/library-ueq-s/config.json new file mode 100644 index 0000000000..779d3203a6 --- /dev/null +++ b/public/library-ueq-s/config.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://raw.githubusercontent.com/revisit-studies/study/dev/src/parser/StudyConfigSchema.json", + "studyMetadata": { + "title": "The Short Version of the User Experience Questionnaire (UEQ-S)", + "version": "1.0.0", + "authors": [ + "The reVISit Team" + ], + "date": "2026-06-04", + "description": "Example study using the ueq-s library.", + "organizations": [ + "University of Utah", + "WPI" + ] + }, + "uiConfig": { + "contactEmail": "", + "logoPath": "revisitAssets/revisitLogoSquare.svg", + "withProgressBar": true, + "withSidebar": true + }, + "importedLibraries": [ + "ueq-s" + ], + "components": { + "introduction": { + "type": "markdown", + "path": "library-ueq-s/assets/ueq-s.md", + "response": [] + } + }, + "sequence": { + "order": "fixed", + "components": [ + "introduction", + "$ueq-s.components.ueq-s" + ] + } +} \ No newline at end of file diff --git a/public/library-ueq/assets/ueq.md b/public/library-ueq/assets/ueq.md new file mode 100644 index 0000000000..56f9aec713 --- /dev/null +++ b/public/library-ueq/assets/ueq.md @@ -0,0 +1,26 @@ + +# ueq + +This is an example study of the library `ueq`. + +User Experience Questionnaire (UEQ) is a fast and reliable questionnaire to measure the User Experience of interactive products. This library contains one component with 26 questions. The component is the full UEQ questionnaire with 26 questions. + +## Reference + +B. Laugwitz, M. Schrepp, and T. Held, Construction and Evaluation of a User Experience Questionnaire, USAB 2008, LNCS 5298, pp. 63–76, 2008. + +DOI: [10.1007/978-3-540-89350-9_6](https://dx.doi.org/10.1007/978-3-540-89350-9_6) + +Link: [https://www.ueq-online.org/](https://www.ueq-online.org/) + +## Available Components + +- ueq + +## Available Sequences + +None + + + + diff --git a/public/library-ueq/config.json b/public/library-ueq/config.json new file mode 100644 index 0000000000..bd7b10ca5a --- /dev/null +++ b/public/library-ueq/config.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://raw.githubusercontent.com/revisit-studies/study/dev/src/parser/StudyConfigSchema.json", + "studyMetadata": { + "title": "User Experience Questionnaire (UEQ)", + "version": "1.0.0", + "authors": [ + "The reVISit Team" + ], + "date": "2026-06-04", + "description": "Example study using the ueq library.", + "organizations": [ + "University of Utah", + "WPI" + ] + }, + "uiConfig": { + "contactEmail": "", + "logoPath": "revisitAssets/revisitLogoSquare.svg", + "withProgressBar": true, + "withSidebar": true + }, + "importedLibraries": [ + "ueq" + ], + "components": { + "introduction": { + "type": "markdown", + "path": "library-ueq/assets/ueq.md", + "response": [] + } + }, + "sequence": { + "order": "fixed", + "components": [ + "introduction", + "$ueq.components.ueq" + ] + } +} \ No newline at end of file diff --git a/public/tutorial/_answers/config.json b/public/tutorial/_answers/config.json index 32e5e0a0b7..17fbd4cfbb 100644 --- a/public/tutorial/_answers/config.json +++ b/public/tutorial/_answers/config.json @@ -8,7 +8,7 @@ "The reVISit Community", "You :)" ], - "date": "2026-02-23", + "date": "2026-06-08", "description": "This tutorial will teach you how to create a reVISit study and use all of the features that reVISit has to offer.", "organizations": [ "University of Utah", @@ -318,7 +318,7 @@ }, "reactExamplePenguins": { "type": "react-component", - "instruction": "Consider only cars that have a miles per gallon value greater than 30 AND weigh more than 2000 pounds. Which country or region produces the most and the least of these cars?", + "instruction": "How many Gentoo penguins weigh less than 4.5k grams (g)?", "path": "tutorial/assets/ReactExample.tsx", "response": [ { @@ -468,4 +468,4 @@ } ] } -} \ No newline at end of file +} diff --git a/public/tutorial/_answers/replication-config.json b/public/tutorial/_answers/replication-config.json index 13d3c09df8..399a1ca501 100644 --- a/public/tutorial/_answers/replication-config.json +++ b/public/tutorial/_answers/replication-config.json @@ -6,7 +6,7 @@ "authors": [ "The reVISit Team" ], - "date": "2026-02-23", + "date": "2026-06-08", "description": "This is a reVISit variation study of JND(Just Noticeable Difference) Scatter Plot experiment.", "organizations": [ "University of Utah", @@ -15,7 +15,7 @@ }, "uiConfig": { "contactEmail": "contact@revisit.dev", - "helpTextPath": "ScatterJND-study/assets/help.md", + "helpTextPath": "tutorial/assets/help.md", "logoPath": "revisitAssets/revisitLogoSquare.svg", "withProgressBar": true, "autoDownloadStudy": false, @@ -99,19 +99,14 @@ "sequence": { "order": "fixed", "components": [ + "practice T1 A:0.3 B:0.7", + "practice T2 A:0.9 B:0.6", + "practice T3 A:0.6 B:0.3", { - "order": "fixed", - "components": [ - "practice T1 A:0.3 B:0.7", - "practice T2 A:0.9 B:0.6", - "practice T3 A:0.6 B:0.3", - { - "order": "dynamic", - "id": "steppedSequence", - "functionPath": "tutorial/assets/replication/JNDDynamic.tsx", - "parameters": {} - } - ] + "order": "dynamic", + "id": "steppedSequence", + "functionPath": "tutorial/assets/replication/JNDDynamic.tsx", + "parameters": {} } ] } diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.1_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.10_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.1_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.10_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.2_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.20_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.2_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.20_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.3_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.30_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.3_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.30_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.4_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.40_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.4_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.40_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.5_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.50_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.5_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.50_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.6_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.60_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.6_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.60_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.7_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.70_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.7_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.70_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.8_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.80_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.8_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.80_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_0.9_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_0.90_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_0.9_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_0.90_size_100.csv diff --git a/public/tutorial/assets/datasets/size_100/dataset_1.0_size_100.csv b/public/tutorial/assets/datasets/size_100/dataset_1.00_size_100.csv similarity index 100% rename from public/tutorial/assets/datasets/size_100/dataset_1.0_size_100.csv rename to public/tutorial/assets/datasets/size_100/dataset_1.00_size_100.csv diff --git a/public/tutorial/data/emissions.csv b/public/tutorial/data/emissions.csv deleted file mode 100644 index 53d98fc309..0000000000 --- a/public/tutorial/data/emissions.csv +++ /dev/null @@ -1,49 +0,0 @@ -,Country,Carbon dioxide,Greenhouse gases,Hydrofluorocarbons,Methane,Nitrogen trifluoride,Nitrous oxide,Perfluorocarbons,Sulphur hexafluoride,Unspecified mix of HFCs and PFCs -0,Australia,388777.53,528631.65,11405.41,109934.74,,18060.12,291.48,162.36, -1,Austria,66018.63,77532.35,1485.82,6499.26,11.96,3122.74,23.4,370.53, -2,Belarus,60938.2,91988.2,208.96,17875.94,6.05,12938.02,10.54,10.49, -3,Belgium,95668.08,110951.73,2397.3,7870.1,5.25,4733.21,182.0,95.79, -4,Bulgaria,42281.88,53917.27,739.42,6560.6,,4312.08,0.01,23.27, -5,Canada,537173.74,670428.3,11433.41,90509.76,0.62,30231.4,752.88,326.5, -6,Croatia,17410.63,24446.42,1699.28,3887.16,,1439.72,,9.63, -7,Cyprus,7029.36,8670.02,353.49,1097.4,,173.53,,16.24, -8,Czech Republic,96665.23,118381.69,3711.4,13223.99,1.46,4683.99,30.95,64.68, -9,Denmark,31306.35,45515.58,356.19,8644.7,,5192.77,0.01,15.57, -10,Estonia,10419.92,12615.17,190.21,1152.94,,849.03,,3.07, -11,European Union – 27 countries (from 01/02/2020),2814421.65,3468394.08,69863.8,401658.56,71.29,174381.19,1617.27,4837.8,1542.54 -12,Finland,37947.18,47799.49,837.6,4819.22,,4171.05,1.59,22.85, -13,France,320908.3,420060.76,9984.62,62196.31,11.6,26031.4,390.18,538.34, -14,Germany,678798.87,760358.01,8069.18,45687.75,13.72,24767.16,190.95,2663.74,166.64 -15,Greece,57556.33,77488.83,4675.45,11323.42,,3817.43,111.18,5.03, -16,Hungary,48563.86,64217.84,1862.46,9206.95,,4485.77,1.76,97.04, -17,Iceland,3510.05,4662.24,157.25,654.08,,248.94,88.95,2.97, -18,Ireland,37547.28,62109.87,672.99,17649.7,12.07,6146.64,64.95,16.23, -19,Italy,337229.88,417591.43,15387.77,47087.05,15.23,17193.34,395.32,257.5,25.33 -20,Japan,1062129.24,1168094.47,53561.04,27361.36,380.11,19459.73,3155.54,2047.45, -21,Kazakhstan,255142.93,338123.36,2706.49,59921.35,,20340.56,9.65,2.37, -22,Latvia,7240.5,10725.29,250.34,1889.57,,1332.78,,12.1, -23,Liechtenstein,145.88,183.9,7.99,21.81,,8.16,0.0,0.05, -24,Lithuania,13829.67,20251.51,512.85,3301.1,,2595.25,,12.63, -25,Luxembourg,8429.71,9390.73,43.69,663.18,,244.23,,9.92, -26,Malta,1606.73,2133.62,228.8,241.7,,55.96,0.01,0.41, -27,Monaco,64.42,73.63,5.58,0.66,,2.85,0.0,0.12, -28,Netherlands,139906.96,167153.25,1172.45,18715.26,,7155.25,79.45,123.87, -29,New Zealand,34318.0,76824.59,1483.22,33019.35,,7937.6,50.69,15.73, -30,Norway,40662.91,48901.96,628.42,5256.61,,2068.77,222.76,62.48, -31,OECD - Europe,,4364518.0,,,,,,, -32,OECD - Total,,14920010.0,,,,,,, -33,OECD America,,8048043.0,,,,,,, -34,OECD Asia Oceania,,2507448.5,,,,,,, -35,Poland,331077.16,399438.49,4937.26,42704.71,,20616.67,10.08,92.6, -36,Portugal,39938.33,56359.41,3158.99,10272.78,,2938.57,26.54,24.2, -37,Romania,77190.58,115403.15,1908.24,25785.35,,10465.42,3.4,50.17, -38,Russia,1711993.32,2156599.34,38619.93,314778.31,1.59,88400.86,1628.56,1176.77, -39,Slovak Republic,35166.81,41226.49,672.37,3700.76,,1663.74,5.37,17.44, -40,Slovenia,13059.97,16106.48,267.04,2085.12,,670.6,7.04,16.71, -41,Spain,230269.46,288847.82,3612.74,41492.47,,11830.99,51.39,240.2,1350.56 -42,Sweden,38524.79,47816.7,840.83,4519.68,,3850.11,41.69,39.61, -43,Switzerland,35787.34,45135.72,1241.48,5104.0,0.37,2845.14,28.37,129.03, -44,Türkiye,452702.79,564389.75,7209.8,64020.23,,40306.09,6.79,144.05, -45,Ukraine,210153.3,327258.77,1901.02,71536.71,,43618.8,,48.94, -46,United Kingdom,348409.72,429489.47,10819.71,51738.66,0.34,17906.35,192.88,421.82, -47,United States,5032212.82,6340228.29,158774.99,727444.74,636.46,393279.02,3541.3,8018.58,16320.39 diff --git a/public/tutorial/data/movies.csv b/public/tutorial/data/movies.csv deleted file mode 100644 index 3cd90a3b8b..0000000000 --- a/public/tutorial/data/movies.csv +++ /dev/null @@ -1,421 +0,0 @@ -,id,Title,Rotten_Tomatoes_Rating,IMDB_Rating,Genre,Gross Income,Production Budget -3,3,The Abyss,88.0,7.6,Action,54243125.0,70000000.0 -4,4,Ace Ventura: Pet Detective,49.0,6.6,Comedy,72217396.0,12000000.0 -6,6,Annie Hall,98.0,8.2,Comedy,38251425.0,4000000.0 -7,7,Apocalypse Now,98.0,8.6,Action,78800000.0,31500000.0 -8,8,Back to the Future,96.0,8.4,Adventure,210609762.0,19000000.0 -9,9,Back to the Future Part II,64.0,7.5,Adventure,118450002.0,40000000.0 -10,10,Back to the Future Part III,71.0,7.1,Adventure,87666629.0,40000000.0 -12,12,Bad Boys,39.0,6.6,Action,65647413.0,23000000.0 -14,14,Ben-Hur,91.0,8.2,Adventure,73000000.0,15000000.0 -15,15,Beverly Hills Cop,83.0,7.3,Action,234760478.0,15000000.0 -16,16,Big,96.0,7.2,Comedy,114968774.0,18000000.0 -19,19,The Bridge on the River Kwai,95.0,8.4,Drama,33300000.0,3000000.0 -20,20,Braveheart,77.0,8.4,Drama,75545647.0,72000000.0 -22,22,Blazing Saddles,89.0,7.8,Comedy,119500000.0,2600000.0 -24,24,Batman Returns,78.0,6.9,Action,162831698.0,80000000.0 -25,25,Batman Forever,43.0,5.4,Action,184031112.0,100000000.0 -26,26,Batman,71.0,7.6,Action,251188924.0,35000000.0 -28,28,Casino Royale,30.0,8.0,Comedy,22744718.0,12000000.0 -29,29,Close Encounters of the Third Kind,95.0,7.8,Adventure,166000000.0,20000000.0 -30,30,The Cable Guy,52.0,5.8,Comedy,60240295.0,47000000.0 -31,31,A Christmas Story,88.0,8.0,Comedy,19294144.0,3250000.0 -32,32,Clerks,88.0,7.9,Comedy,3073428.0,27000.0 -33,33,Clash of the Titans,65.0,5.9,Adventure,30000000.0,15000000.0 -34,34,Casablanca,97.0,8.8,Drama,10462500.0,950000.0 -35,35,Casino,81.0,8.1,Drama,42438300.0,52000000.0 -37,37,Desperado,61.0,7.0,Action,25532388.0,7000000.0 -40,40,Dead Poets' Society,86.0,7.8,Drama,95860116.0,16400000.0 -49,49,Edward Scissorhands,91.0,8.0,Comedy,53976987.0,20000000.0 -50,50,Ed Wood,91.0,8.1,Comedy,5828466.0,18000000.0 -55,55,A Few Good Men,83.0,7.6,Drama,141340178.0,33000000.0 -57,57,Forrest Gump,70.0,8.6,Drama,329694499.0,55000000.0 -62,62,Goodfellas,97.0,8.8,Drama,46743809.0,25000000.0 -65,65,Ghost,81.0,6.9,Drama,217631306.0,22000000.0 -66,66,Goldeneye,80.0,7.2,Action,106429941.0,60000000.0 -67,67,Glory,93.0,8.0,Action,26593580.0,18000000.0 -68,68,Gandhi,85.0,8.2,Drama,52767889.0,22000000.0 -69,69,Goldfinger,96.0,7.9,Action,51100000.0,3000000.0 -70,70,Groundhog Day,96.0,8.2,Comedy,70906973.0,14600000.0 -71,71,Gremlins,78.0,7.0,Comedy,148168459.0,11000000.0 -72,72,Gone with the Wind,97.0,8.2,Drama,198680470.0,3900000.0 -73,73,Highlander,66.0,7.2,Action,5900000.0,16000000.0 -74,74,Home Alone 2: Lost in New York,21.0,5.8,Comedy,173585516.0,20000000.0 -75,75,Home Alone,47.0,7.0,Comedy,285761243.0,15000000.0 -76,76,Hook,24.0,6.2,Adventure,119654823.0,70000000.0 -77,77,Happy Gilmore,58.0,6.9,Comedy,38623460.0,10000000.0 -80,80,Independence Day,61.0,6.5,Adventure,306169255.0,75000000.0 -82,82,JFK,83.0,8.0,Drama,70405498.0,40000000.0 -83,83,Jumanji,48.0,6.4,Adventure,100458310.0,65000000.0 -84,84,Jurassic Park,87.0,7.9,Action,357067947.0,63000000.0 -86,86,Kindergarten Cop,50.0,5.8,Comedy,91457688.0,26000000.0 -88,88,Last Action Hero,38.0,5.9,Action,50016394.0,85000000.0 -90,90,Alien³,37.0,6.3,Action,54927174.0,55000000.0 -91,91,The Lion King,92.0,8.2,Adventure,328539505.0,79300000.0 -92,92,The Last of the Mohicans,97.0,7.8,Action,72455275.0,40000000.0 -93,93,Lethal Weapon,90.0,7.6,Action,65192350.0,15000000.0 -94,94,Leaving Las Vegas,89.0,7.6,Drama,31983777.0,4000000.0 -95,95,Lawrence of Arabia,98.0,8.6,Adventure,37495385.0,15000000.0 -96,96,The Mask,75.0,6.6,Comedy,119920129.0,18000000.0 -97,97,Mars Attacks!,50.0,6.3,Comedy,37771017.0,80000000.0 -98,98,Amadeus,96.0,8.4,Drama,51973029.0,18000000.0 -100,100,Mallrats,53.0,7.1,Comedy,2108367.0,6100000.0 -101,101,Mrs. Doubtfire,64.0,6.6,Comedy,219195051.0,25000000.0 -103,103,Indiana Jones and the Temple of Doom,85.0,7.5,Adventure,179880271.0,28000000.0 -104,104,Indiana Jones and the Last Crusade,89.0,8.3,Adventure,197171806.0,48000000.0 -105,105,The English Patient,83.0,7.3,Drama,78716374.0,35000000.0 -109,109,Philadelphia,74.0,7.6,Drama,77324422.0,26000000.0 -112,112,Platoon,86.0,8.2,Drama,137963328.0,6000000.0 -113,113,Predator,76.0,7.8,Action,59735548.0,18000000.0 -114,114,The Princess Bride,95.0,8.1,Adventure,30857000.0,15000000.0 -117,117,Pulp Fiction,94.0,8.9,Drama,107928762.0,8000000.0 -119,119,Robin Hood: Prince of Thieves,56.0,6.7,Adventure,165493908.0,50000000.0 -120,120,Raging Bull,98.0,8.4,Drama,23380203.0,18000000.0 -121,121,RoboCop,88.0,7.6,Action,53424681.0,13000000.0 -125,125,Rain Man,87.0,8.0,Comedy,172825435.0,25000000.0 -126,126,The Rock,66.0,7.2,Action,134069511.0,75000000.0 -127,127,Airplane!,98.0,7.8,Comedy,83453539.0,3500000.0 -129,129,Scarface,88.0,8.2,Drama,44942821.0,25000000.0 -130,130,Schindler's List,97.0,8.9,Drama,96067179.0,25000000.0 -131,131,Spartacus,96.0,8.0,Action,30000000.0,12000000.0 -132,132,Stargate,46.0,6.7,Action,71565669.0,55000000.0 -134,134,The Shawshank Redemption,88.0,9.2,Drama,28241469.0,25000000.0 -136,136,Sling Blade,96.0,8.0,Drama,24475416.0,4833610.0 -138,138,Sleepers,73.0,7.3,Drama,53300852.0,44000000.0 -139,139,The Usual Suspects,87.0,8.7,Drama,23341568.0,6000000.0 -141,141,Spaceballs,65.0,6.9,Comedy,38119483.0,22700000.0 -142,142,Stand by Me,94.0,8.2,Drama,52287414.0,8000000.0 -145,145,Top Gun,45.0,6.5,Action,176786701.0,15000000.0 -147,147,Trainspotting,89.0,8.2,Drama,16501785.0,3100000.0 -148,148,True Lies,69.0,7.2,Action,146282411.0,100000000.0 -149,149,Terminator 2: Judgment Day,98.0,8.5,Action,204859496.0,100000000.0 -150,150,The Terminator,100.0,8.1,Action,38019031.0,6400000.0 -152,152,Total Recall,81.0,7.4,Action,119394839.0,65000000.0 -153,153,Twister,57.0,6.0,Action,241888385.0,88000000.0 -154,154,Taxi Driver,98.0,8.6,Drama,21100000.0,1000000.0 -155,155,Toy Story,100.0,8.2,Adventure,191796233.0,30000000.0 -156,156,The Untouchables,81.0,8.0,Action,76270454.0,25000000.0 -157,157,Who Framed Roger Rabbit?,98.0,7.6,Comedy,154112492.0,70000000.0 -158,158,What's Eating Gilbert Grape,88.0,7.8,Drama,9170214.0,11000000.0 -159,159,Waterworld,42.0,5.7,Action,88246220.0,175000000.0 -161,161,Wayne's World,84.0,6.9,Comedy,121697323.0,20000000.0 -166,166,Cloverfield,76.0,7.4,Action,80048433.0,25000000.0 -168,168,16 Blocks,55.0,6.7,Action,36895141.0,45000000.0 -170,170,21 Grams,81.0,7.9,Drama,16248701.0,20000000.0 -171,171,25th Hour,78.0,7.9,Drama,13084595.0,4500000.0 -174,174,300,60.0,7.8,Action,210614939.0,60000000.0 -176,176,Three Kings,94.0,7.3,Action,60652036.0,48000000.0 -180,180,Seven Pounds,27.0,7.6,Drama,69951824.0,54000000.0 -181,181,8 Mile,74.0,6.7,Drama,116724075.0,41000000.0 -182,182,The Whole Nine Yards,45.0,6.6,Comedy,57262492.0,24000000.0 -184,184,A Bug's Life,91.0,7.3,Adventure,162798565.0,45000000.0 -185,185,Adaptation,91.0,7.9,Comedy,22498520.0,18500000.0 -186,186,Air Force One,78.0,6.3,Action,172956409.0,85000000.0 -187,187,Alice in Wonderland,51.0,6.7,Adventure,334191110.0,200000000.0 -190,190,Almost Famous,88.0,8.0,Comedy,32522352.0,60000000.0 -191,191,Evan Almighty,23.0,5.5,Comedy,100289690.0,175000000.0 -192,192,Bruce Almighty,48.0,6.6,Comedy,242704995.0,81000000.0 -193,193,Alexander,16.0,5.4,Adventure,34297191.0,155000000.0 -194,194,American Beauty,89.0,8.6,Drama,130058047.0,15000000.0 -196,196,American History X,83.0,8.6,Drama,6719864.0,10000000.0 -197,197,American Gangster,79.0,7.9,Drama,130164645.0,100000000.0 -199,199,American Pie 2,52.0,6.2,Comedy,145096820.0,30000000.0 -200,200,American Wedding,56.0,6.1,Comedy,104354205.0,55000000.0 -201,201,American Pie,59.0,6.9,Comedy,101800948.0,12000000.0 -205,205,Anger Management,43.0,6.1,Comedy,135560942.0,56000000.0 -206,206,Analyze This,68.0,6.6,Comedy,106885658.0,30000000.0 -207,207,Apocalypto,64.0,7.9,Adventure,50866635.0,40000000.0 -208,208,King Arthur,31.0,6.2,Adventure,51877963.0,90000000.0 -211,211,Atonement,83.0,7.9,Drama,50980159.0,30000000.0 -214,214,Austin Powers in Goldmember,54.0,6.2,Comedy,213117789.0,63000000.0 -216,216,The Aviator,88.0,7.6,Drama,102608827.0,110000000.0 -218,218,Babel,69.0,7.6,Drama,34302837.0,20000000.0 -219,219,Bad Boys II,24.0,6.2,Action,138540870.0,130000000.0 -221,221,Batman Begins,84.0,8.3,Action,205343774.0,150000000.0 -222,222,The Curious Case of Benjamin Button,72.0,8.0,Drama,127509326.0,160000000.0 -224,224,Blood Diamond,62.0,8.0,Action,57377916.0,100000000.0 -227,227,Beowulf,70.0,6.6,Adventure,82195215.0,150000000.0 -228,228,Big Fish,77.0,8.1,Drama,66432867.0,70000000.0 -229,229,Before Sunset,95.0,8.0,Drama,5792822.0,2000000.0 -230,230,The Big Lebowski,78.0,8.2,Comedy,17498804.0,15000000.0 -231,231,Black Hawk Down,76.0,7.7,Action,108638745.0,95000000.0 -234,234,Blade,55.0,7.0,Action,70141876.0,45000000.0 -237,237,Blades of Glory,69.0,6.5,Comedy,118594548.0,61000000.0 -238,238,The Blind Side,66.0,7.7,Drama,255959475.0,35000000.0 -239,239,Legally Blonde,67.0,6.2,Comedy,96493426.0,18000000.0 -240,240,Blow,54.0,7.4,Drama,52990775.0,30000000.0 -241,241,A Beautiful Mind,78.0,8.0,Drama,170708996.0,78000000.0 -242,242,The Boondock Saints,19.0,7.8,Action,30471.0,7000000.0 -243,243,The Book of Eli,47.0,6.9,Action,94835059.0,80000000.0 -245,245,Boogie Nights,92.0,7.9,Drama,26410771.0,15000000.0 -246,246,The Bourne Identity,82.0,7.7,Action,121468960.0,60000000.0 -247,247,The Bourne Supremacy,81.0,7.6,Action,176087450.0,85000000.0 -248,248,The Bourne Ultimatum,93.0,8.2,Action,227471070.0,130000000.0 -250,250,Brokeback Mountain,87.0,7.8,Drama,83043761.0,13900000.0 -251,251,In Bruges,80.0,8.1,Comedy,7800825.0,15000000.0 -252,252,Bad Santa,77.0,7.3,Comedy,60060328.0,18000000.0 -253,253,Inglourious Basterds,88.0,8.4,Action,120831050.0,70000000.0 -255,255,Batman & Robin,11.0,3.5,Action,107325195.0,125000000.0 -256,256,Capote,90.0,7.6,Drama,28750530.0,7000000.0 -257,257,Cars,74.0,7.5,Comedy,244082982.0,70000000.0 -258,258,Cast Away,89.0,7.5,Drama,233632142.0,85000000.0 -259,259,Charlie and the Chocolate Factory,82.0,7.1,Comedy,206459076.0,150000000.0 -261,261,Charlie's Angels,67.0,5.5,Adventure,125305545.0,90000000.0 -264,264,Chicken Run,96.0,7.3,Adventure,106793915.0,42000000.0 -266,266,Chocolat,62.0,7.3,Drama,71309760.0,25000000.0 -267,267,Cinderella Man,80.0,8.0,Drama,61649911.0,88000000.0 -268,268,City of Angels,59.0,6.4,Drama,78750909.0,55000000.0 -269,269,Cold Mountain,70.0,7.3,Drama,95632614.0,80000000.0 -270,270,Clerks II,63.0,7.7,Comedy,24148068.0,5000000.0 -271,271,Constantine,46.0,6.7,Action,75976178.0,75000000.0 -272,272,Collateral,86.0,7.8,Action,100170152.0,60000000.0 -273,273,Con Air,57.0,6.6,Action,101117573.0,80000000.0 -274,274,Contact,67.0,7.3,Drama,100920329.0,90000000.0 -275,275,Crank,61.0,7.1,Action,27838408.0,12000000.0 -276,276,The Count of Monte Cristo,74.0,7.6,Drama,54228104.0,40000000.0 -277,277,Cruel Intentions,47.0,6.7,Drama,38230075.0,11000000.0 -279,279,Charlie Wilson's War,81.0,7.3,Drama,66661095.0,75000000.0 -280,280,Daredevil,44.0,5.5,Action,102543518.0,80000000.0 -282,282,Donnie Darko,84.0,8.3,Drama,1270522.0,4500000.0 -284,284,Deep Blue Sea,57.0,5.6,Action,73648228.0,60000000.0 -286,286,Live Free or Die Hard,82.0,7.5,Action,134529403.0,110000000.0 -288,288,Dogma,68.0,7.3,Comedy,30651422.0,10000000.0 -289,289,Donnie Brasco,87.0,7.7,Drama,41954997.0,35000000.0 -290,290,Deep Impact,47.0,6.0,Adventure,140464664.0,80000000.0 -291,291,The Departed,93.0,8.5,Drama,133311000.0,90000000.0 -292,292,Death Race,41.0,6.6,Action,36316032.0,65000000.0 -299,299,Elf,84.0,6.8,Comedy,173398518.0,32000000.0 -300,300,Once Upon a Time in Mexico,68.0,6.2,Action,56330657.0,29000000.0 -302,302,End of Days,11.0,5.4,Action,66889043.0,100000000.0 -303,303,Enemy at the Gates,53.0,7.4,Drama,51396781.0,85000000.0 -304,304,Enemy of the State,70.0,7.2,Action,111549836.0,85000000.0 -306,306,Epic Movie,2.0,2.2,Comedy,39739367.0,20000000.0 -307,307,Eragon,16.0,5.0,Adventure,75030163.0,100000000.0 -308,308,Erin Brockovich,83.0,7.2,Drama,125548685.0,50000000.0 -309,309,Eternal Sunshine of the Spotless Mind,93.0,8.5,Comedy,34366518.0,20000000.0 -310,310,Eurotrip,46.0,6.5,Comedy,17718223.0,25000000.0 -312,312,Eyes Wide Shut,78.0,7.2,Drama,55691208.0,65000000.0 -313,313,Face/Off,93.0,7.3,Action,112276146.0,80000000.0 -314,314,Fear and Loathing in Las Vegas,47.0,7.6,Comedy,10680275.0,18500000.0 -315,315,The Fifth Element,72.0,7.4,Action,63570862.0,95000000.0 -316,316,Fantastic Four,27.0,5.7,Action,154696080.0,87500000.0 -317,317,2 Fast 2 Furious,36.0,5.1,Action,127120058.0,76000000.0 -318,318,The Fast and the Furious,53.0,6.0,Action,144512310.0,38000000.0 -321,321,Fight Club,81.0,8.8,Drama,37030102.0,65000000.0 -323,323,Flags of Our Fathers,73.0,7.2,Drama,33602376.0,53000000.0 -324,324,United 93,91.0,7.8,Drama,31567134.0,18000000.0 -325,325,Finding Nemo,98.0,8.2,Adventure,339714978.0,94000000.0 -326,326,The Fountain,51.0,7.4,Drama,10144010.0,35000000.0 -328,328,Serenity,81.0,8.0,Action,25514517.0,39000000.0 -329,329,The Full Monty,95.0,7.2,Comedy,45950122.0,3500000.0 -331,331,Gangs of New York,75.0,7.4,Drama,77730500.0,97000000.0 -332,332,Gattaca,82.0,7.8,Drama,12532777.0,36000000.0 -333,333,Ghost Rider,26.0,5.2,Action,115802596.0,120000000.0 -335,335,Gladiator,77.0,8.3,Action,187683805.0,103000000.0 -336,336,The Green Mile,77.0,8.4,Drama,136801374.0,60000000.0 -337,337,"Gandhi, My Father",40.0,8.1,Drama,240425.0,5000000.0 -339,339,Godzilla,25.0,4.8,Action,136314294.0,125000000.0 -340,340,Good Will Hunting,97.0,8.1,Drama,138433435.0,10000000.0 -341,341,Galaxy Quest,89.0,7.2,Comedy,71423726.0,45000000.0 -342,342,The Constant Gardener,83.0,7.6,Drama,33579798.0,25500000.0 -343,343,Garden State,86.0,7.9,Drama,26782316.0,2500000.0 -345,345,The Brothers Grimm,37.0,5.9,Adventure,37899638.0,80000000.0 -346,346,How the Grinch Stole Christmas,53.0,5.7,Comedy,260044825.0,123000000.0 -350,350,Ghost World,92.0,7.7,Comedy,6217849.0,5500000.0 -352,352,Hancock,40.0,6.5,Action,227946274.0,150000000.0 -356,356,Hellboy,81.0,6.8,Action,59623958.0,60000000.0 -357,357,High Fidelity,92.0,7.6,Comedy,27277055.0,20000000.0 -358,358,A History of Violence,87.0,7.6,Drama,31493782.0,32000000.0 -359,359,Harold & Kumar Escape from Guantanamo Bay,54.0,6.7,Comedy,38108728.0,12000000.0 -360,360,Harold & Kumar Go to White Castle,74.0,7.2,Comedy,18225165.0,9000000.0 -362,362,The Hangover,78.0,7.9,Comedy,277322503.0,35000000.0 -366,366,The Hours,80.0,7.6,Drama,41675994.0,25000000.0 -367,367,Harry Potter and the Chamber of Secrets,82.0,7.2,Adventure,261987880.0,100000000.0 -368,368,Harry Potter and the Prisoner of Azkaban,90.0,7.7,Adventure,249538952.0,130000000.0 -369,369,Harry Potter and the Goblet of Fire,88.0,7.6,Adventure,290013036.0,150000000.0 -370,370,Harry Potter and the Order of the Phoenix,78.0,7.4,Adventure,292004738.0,150000000.0 -371,371,Harry Potter and the Half-Blood Prince,83.0,7.3,Adventure,301959197.0,250000000.0 -373,373,Happy Feet,74.0,6.7,Adventure,198000317.0,85000000.0 -374,374,The Hitchhiker's Guide to the Galaxy,60.0,6.6,Comedy,51019112.0,45000000.0 -375,375,Hot Fuzz,91.0,8.0,Comedy,23618786.0,16000000.0 -376,376,Hulk,62.0,5.7,Action,132177234.0,137000000.0 -377,377,The Incredible Hulk,66.0,7.1,Adventure,134806913.0,137500000.0 -379,379,Starsky & Hutch,64.0,6.2,Comedy,88200225.0,60000000.0 -381,381,Ice Age,77.0,7.4,Adventure,176387405.0,65000000.0 -383,383,The Illusionist,74.0,7.7,Drama,39868642.0,16500000.0 -385,385,Indiana Jones and the Kingdom of the Crystal Skull,77.0,6.6,Adventure,317023851.0,185000000.0 -386,386,I Now Pronounce You Chuck and Larry,14.0,6.1,Comedy,119725280.0,85000000.0 -388,388,The Insider,96.0,8.0,Drama,28965197.0,68000000.0 -389,389,Iron Man 2,74.0,7.3,Adventure,312128345.0,170000000.0 -390,390,Iron Man,94.0,7.9,Action,318604126.0,186000000.0 -391,391,The Island,40.0,6.9,Action,35818913.0,120000000.0 -392,392,The Italian Job,73.0,6.9,Adventure,106126012.0,60000000.0 -393,393,Jackie Brown,85.0,7.6,Drama,39673162.0,12000000.0 -394,394,Jarhead,61.0,7.2,Drama,62647540.0,72000000.0 -395,395,The World is Not Enough,51.0,6.3,Action,126930660.0,135000000.0 -396,396,Die Another Day,59.0,6.0,Action,160942139.0,142000000.0 -397,397,Casino Royale,94.0,8.0,Action,167365000.0,102000000.0 -398,398,Quantum of Solace,64.0,6.8,Action,169368427.0,230000000.0 -401,401,Jay and Silent Bob Strike Back,53.0,6.8,Comedy,30059386.0,22000000.0 -402,402,Jumper,17.0,5.9,Adventure,80172128.0,82500000.0 -403,403,Juno,93.0,7.9,Comedy,143495265.0,7000000.0 -405,405,Kick-Ass,75.0,8.1,Action,48071303.0,28000000.0 -407,407,Kill Bill: Volume 1,85.0,8.2,Action,70098138.0,55000000.0 -408,408,Kingdom of Heaven,39.0,7.1,Adventure,47398413.0,110000000.0 -409,409,King Kong,83.0,7.6,Adventure,218080025.0,207000000.0 -411,411,The Kingdom,51.0,7.1,Action,47467250.0,72500000.0 -413,413,K-PAX,40.0,7.3,Drama,50315140.0,48000000.0 -414,414,A Knight's Tale,58.0,6.6,Adventure,56083966.0,41000000.0 -415,415,L.A. Confidential,99.0,8.4,Drama,64604977.0,35000000.0 -417,417,Lady in the Water,24.0,5.8,Drama,42285169.0,75000000.0 -419,419,Letters from Iwo Jima,91.0,8.1,Drama,13756082.0,13000000.0 -420,420,Liar Liar,82.0,6.7,Comedy,181410615.0,45000000.0 -421,421,Equilibrium,37.0,7.7,Action,1190018.0,20000000.0 -422,422,The Life Aquatic with Steve Zissou,53.0,7.2,Comedy,24006726.0,50000000.0 -423,423,The Last King of Scotland,87.0,7.8,Drama,17606684.0,6000000.0 -424,424,Little Miss Sunshine,91.0,8.0,Comedy,59891098.0,8000000.0 -428,428,Lord of War,61.0,7.7,Action,24149632.0,42000000.0 -429,429,The Last Samurai,65.0,7.8,Action,111110575.0,120000000.0 -430,430,Lost in Translation,94.0,7.9,Drama,44585453.0,4000000.0 -432,432,Lethal Weapon 4,54.0,6.4,Action,130444603.0,140000000.0 -435,435,Madagascar,55.0,6.6,Adventure,193595521.0,75000000.0 -437,437,Man on the Moon,62.0,7.4,Drama,34580635.0,52000000.0 -438,438,The Matrix,86.0,8.7,Action,171479930.0,65000000.0 -439,439,Vicky Cristina Barcelona,82.0,7.4,Comedy,23213577.0,16000000.0 -441,441,Michael Clayton,90.0,7.5,Drama,49033882.0,21500000.0 -442,442,Master and Commander: The Far Side of the World,85.0,7.5,Adventure,93926386.0,135000000.0 -443,443,Million Dollar Baby,91.0,8.2,Drama,100492203.0,30000000.0 -444,444,Mean Girls,83.0,7.0,Comedy,86047227.0,18000000.0 -445,445,Men in Black,91.0,7.0,Adventure,250690539.0,90000000.0 -447,447,Meet Joe Black,50.0,6.9,Drama,44650003.0,85000000.0 -448,448,Magnolia,83.0,8.0,Drama,22450975.0,37000000.0 -450,450,Mission: Impossible III,70.0,6.9,Action,133501348.0,150000000.0 -451,451,Miss Congeniality,41.0,6.1,Comedy,106807667.0,45000000.0 -454,454,Meet the Fockers,38.0,6.4,Comedy,279167575.0,60000000.0 -455,455,Meet the Parents,84.0,7.0,Comedy,166225040.0,55000000.0 -456,456,Minority Report,91.0,7.7,Action,132024714.0,102000000.0 -457,457,Meet the Spartans,2.0,2.4,Comedy,38233676.0,30000000.0 -459,459,The Matrix Reloaded,73.0,7.1,Action,281553689.0,127000000.0 -460,460,The Matrix Revolutions,37.0,6.5,Action,139259759.0,110000000.0 -461,461,Mulholland Drive,81.0,7.9,Drama,7219578.0,15000000.0 -462,462,The Mummy,54.0,6.8,Adventure,155385488.0,80000000.0 -463,463,The Mummy Returns,47.0,6.2,Adventure,202007640.0,98000000.0 -464,464,The Mummy: Tomb of the Dragon Emperor,13.0,5.1,Adventure,102491776.0,175000000.0 -465,465,Munich,78.0,7.8,Drama,47379090.0,75000000.0 -466,466,Night at the Museum,43.0,6.4,Comedy,250863268.0,110000000.0 -467,467,Miami Vice,47.0,6.0,Action,63478838.0,135000000.0 -468,468,Mystic River,87.0,8.0,Drama,90135191.0,30000000.0 -469,469,The Chronicles of Narnia: Prince Caspian,67.0,6.9,Adventure,141621490.0,225000000.0 -470,470,National Treasure,44.0,6.9,Adventure,173005002.0,100000000.0 -471,471,No Country for Old Men,95.0,8.3,Action,74273505.0,25000000.0 -472,472,The Incredibles,97.0,8.1,Adventure,261441092.0,92000000.0 -473,473,The Negotiator,81.0,7.2,Action,44705766.0,50000000.0 -476,476,The Notebook,52.0,8.0,Drama,81001787.0,30000000.0 -477,477,Napoleon Dynamite,70.0,6.9,Comedy,44540956.0,400000.0 -479,479,Finding Neverland,82.0,7.9,Drama,51676606.0,25000000.0 -480,480,Into the Wild,82.0,8.2,Drama,18354356.0,20000000.0 -481,481,Ocean's Eleven,81.0,7.6,Comedy,183417150.0,110000000.0 -482,482,Ocean's Twelve,55.0,6.0,Adventure,125531634.0,85000000.0 -483,483,Ocean's Thirteen,70.0,6.9,Adventure,117144465.0,85000000.0 -485,485,Any Given Sunday,49.0,6.6,Drama,75530832.0,60000000.0 -486,486,One Hour Photo,81.0,7.0,Drama,31597131.0,12000000.0 -487,487,Old School,60.0,7.0,Comedy,75155000.0,24000000.0 -489,489,The Passion of the Christ,50.0,7.1,Drama,370782930.0,25000000.0 -490,490,Max Payne,17.0,5.4,Action,40687294.0,35000000.0 -495,495,Pirates of the Caribbean: Dead Man's Chest,54.0,7.3,Adventure,423315812.0,225000000.0 -496,496,Pirates of the Caribbean: At World's End,45.0,7.0,Adventure,309420425.0,300000000.0 -497,497,The Chronicles of Riddick,29.0,6.4,Adventure,57712751.0,120000000.0 -499,499,Planet of the Apes,44.0,5.5,Adventure,180011740.0,100000000.0 -501,501,The Punisher,30.0,6.4,Action,33664370.0,33000000.0 -502,502,The Devil Wears Prada,75.0,6.8,Comedy,124740460.0,35000000.0 -503,503,Perfume: The Story of a Murderer,58.0,7.5,Drama,2223293.0,63700000.0 -504,504,The Pursuit of Happyness,66.0,7.8,Drama,162586036.0,55000000.0 -505,505,Pearl Harbor,26.0,5.4,Action,198539855.0,151500000.0 -508,508,The Patriot,62.0,6.9,Drama,113330342.0,110000000.0 -509,509,Public Enemies,68.0,7.1,Drama,97104620.0,102500000.0 -510,510,Punch-Drunk Love,79.0,7.4,Comedy,17791031.0,25000000.0 -512,512,Ratatouille,96.0,8.1,Comedy,206445654.0,150000000.0 -513,513,Rocky Balboa,76.0,7.4,Drama,70269899.0,24000000.0 -515,515,The Reader,61.0,7.7,Drama,34192652.0,33000000.0 -518,518,Resident Evil: Extinction,22.0,6.2,Action,50648679.0,45000000.0 -520,520,Revolutionary Road,68.0,7.6,Drama,22911480.0,35000000.0 -521,521,Be Kind Rewind,65.0,6.6,Comedy,11175164.0,20000000.0 -522,522,Rounders,64.0,7.3,Drama,22921898.0,12000000.0 -523,523,Ronin,68.0,7.2,Action,41610884.0,55000000.0 -524,524,Requiem for a Dream,78.0,8.5,Drama,3635482.0,4500000.0 -525,525,Rat Race,43.0,6.4,Comedy,56607223.0,48000000.0 -526,526,Remember the Titans,72.0,7.5,Drama,115654751.0,30000000.0 -527,527,Road Trip,59.0,6.4,Comedy,68525609.0,16000000.0 -528,528,Rush Hour 2,51.0,6.4,Action,226164286.0,90000000.0 -529,529,Rush Hour,60.0,6.8,Action,141186864.0,35000000.0 -531,531,Hotel Rwanda,90.0,8.3,Drama,23519128.0,17500000.0 -537,537,Scary Movie 2,14.0,4.7,Comedy,71277420.0,45000000.0 -538,538,Scary Movie 3,37.0,5.4,Comedy,110000082.0,45000000.0 -539,539,About Schmidt,85.0,7.3,Drama,65005217.0,30000000.0 -543,543,Stardust,76.0,7.9,Adventure,38634938.0,70000000.0 -544,544,Sex and the City,49.0,5.4,Comedy,152647258.0,57500000.0 -545,545,Swordfish,25.0,6.3,Action,69772969.0,80000000.0 -546,546,Scary Movie,53.0,6.0,Comedy,157019771.0,19000000.0 -547,547,Shaun of the Dead,91.0,8.0,Comedy,13542874.0,5000000.0 -551,551,Sherlock Holmes,69.0,7.5,Adventure,209028679.0,80000000.0 -552,552,Shrek,89.0,8.0,Adventure,267655011.0,50000000.0 -553,553,Shrek 2,89.0,7.5,Adventure,441226247.0,70000000.0 -554,554,Shrek the Third,41.0,6.1,Adventure,322719944.0,160000000.0 -555,555,Shark Tale,35.0,5.9,Adventure,160861908.0,75000000.0 -558,558,The Simpsons Movie,89.0,7.6,Comedy,183135014.0,72500000.0 -559,559,Sin City,77.0,8.3,Action,74103820.0,40000000.0 -564,564,Slumdog Millionaire,94.0,8.3,Drama,141319928.0,14000000.0 -565,565,Smokin' Aces,28.0,6.6,Comedy,35662731.0,17000000.0 -568,568,Lemony Snicket's A Series of Unfortunate Events,71.0,6.9,Comedy,118627117.0,100000000.0 -571,571,Superbad,87.0,7.8,Comedy,121463226.0,17500000.0 -572,572,Spider-Man 2,93.0,7.7,Adventure,373524485.0,200000000.0 -573,573,Spider-Man 3,63.0,6.4,Adventure,336530303.0,258000000.0 -574,574,Spider-Man,89.0,7.4,Adventure,403706375.0,139000000.0 -575,575,Superman Returns,76.0,6.6,Adventure,200120000.0,232000000.0 -576,576,Spy Game,65.0,6.9,Action,62362560.0,90000000.0 -577,577,Starship Troopers,60.0,7.1,Action,54768952.0,100000000.0 -578,578,Stranger Than Fiction,72.0,7.8,Comedy,40435190.0,30000000.0 -580,580,The Perfect Storm,47.0,6.2,Drama,182618434.0,120000000.0 -582,582,Saving Private Ryan,91.0,8.5,Drama,216335085.0,65000000.0 -583,583,S.W.A.T.,48.0,5.9,Action,116877597.0,70000000.0 -584,584,Sideways,97.0,7.8,Drama,71502303.0,17000000.0 -587,587,Talladega Nights: The Ballad of Ricky Bobby,72.0,6.4,Comedy,148213377.0,73000000.0 -588,588,The Talented Mr. Ripley,82.0,7.2,Drama,81292135.0,40000000.0 -591,591,Transformers,57.0,7.3,Action,319246193.0,151000000.0 -592,592,Transformers: Revenge of the Fallen,20.0,6.0,Action,402111870.0,210000000.0 -593,593,The Thin Red Line,78.0,7.5,Drama,36400491.0,52000000.0 -594,594,The League of Extraordinary Gentlemen,17.0,5.5,Adventure,66465204.0,78000000.0 -596,596,Tomorrow Never Dies,55.0,6.4,Action,125304276.0,110000000.0 -599,599,The Day After Tomorrow,46.0,6.3,Adventure,186740799.0,125000000.0 -601,601,Toy Story 2,100.0,8.0,Adventure,245852179.0,90000000.0 -602,602,Toy Story 3,99.0,8.9,Adventure,410640665.0,200000000.0 -603,603,Traffic,91.0,7.8,Drama,124107476.0,48000000.0 -604,604,Training Day,72.0,7.6,Drama,76261036.0,45000000.0 -605,605,Star Trek,94.0,8.2,Adventure,257730019.0,140000000.0 -606,606,The Terminal,60.0,7.1,Drama,77073959.0,75000000.0 -608,608,The Transporter,53.0,6.6,Action,25296447.0,21000000.0 -609,609,Tropic Thunder,83.0,7.2,Comedy,110461307.0,90000000.0 -610,610,Troy,54.0,7.0,Action,133298577.0,150000000.0 -611,611,xXx,48.0,5.5,Action,141930000.0,70000000.0 -612,612,The Truman Show,95.0,8.0,Drama,125618201.0,60000000.0 -616,616,Underworld,30.0,6.7,Action,51970690.0,22000000.0 -617,617,Underworld: Evolution,15.0,6.6,Action,62318875.0,45000000.0 -618,618,Up,98.0,8.4,Adventure,293004164.0,175000000.0 -620,620,V for Vendetta,73.0,8.2,Action,70511035.0,50000000.0 -621,621,Van Helsing,22.0,5.5,Action,120150546.0,170000000.0 -625,625,WALL-E,96.0,8.5,Comedy,223808164.0,180000000.0 -626,626,Watchmen,64.0,7.8,Action,107509799.0,138000000.0 -627,627,We Were Soldiers,62.0,6.9,Drama,78120196.0,70000000.0 -630,630,Walk the Line,82.0,7.9,Drama,119519402.0,29000000.0 -631,631,Wild Wild West,21.0,4.3,Adventure,113805681.0,175000000.0 -633,633,The Wrestler,98.0,8.2,Drama,26236603.0,6000000.0 -634,634,Sky Captain and the World of Tomorrow,72.0,6.3,Adventure,37760080.0,70000000.0 -635,635,The Waterboy,32.0,5.7,Comedy,161491646.0,23000000.0 -637,637,X-Men,82.0,7.4,Action,157299717.0,75000000.0 -639,639,X-Men: The Last Stand,57.0,6.9,Action,234362462.0,150000000.0 -640,640,The Expendables,40.0,7.1,Action,101384023.0,82000000.0 -641,641,Yes Man,43.0,7.0,Comedy,97690976.0,50000000.0 -642,642,You've Got Mail,68.0,6.2,Drama,115821495.0,65000000.0 -643,643,Zoolander,62.0,6.4,Comedy,45172250.0,28000000.0 -644,644,Zombieland,89.0,7.8,Comedy,75590286.0,23600000.0 -645,645,Zack and Miri Make a Porno,65.0,7.0,Comedy,31452765.0,24000000.0 diff --git a/public/tutorial/data/weather.csv b/public/tutorial/data/weather.csv deleted file mode 100644 index 13e974b3dd..0000000000 --- a/public/tutorial/data/weather.csv +++ /dev/null @@ -1,365 +0,0 @@ -id,index,Date,precipitation,Maximum Temperature,temp_min,wind,Weather -0,1097,2015-01-02,1.5,5.6,0.0,2.3,rain -1,1098,2015-01-03,0.0,5.0,1.7,1.7,fog -2,1099,2015-01-04,10.2,10.6,3.3,4.5,rain -3,1100,2015-01-05,8.1,12.2,9.4,6.4,rain -4,1101,2015-01-06,0.0,12.2,6.1,1.3,fog -5,1102,2015-01-07,0.0,7.8,5.6,1.6,fog -6,1103,2015-01-08,0.0,7.8,1.7,2.6,fog -7,1104,2015-01-09,0.3,10.0,3.3,0.6,rain -8,1105,2015-01-10,5.8,7.8,6.1,0.5,rain -9,1106,2015-01-11,1.5,9.4,7.2,1.1,rain -10,1107,2015-01-12,0.0,11.1,4.4,1.6,fog -11,1108,2015-01-13,0.0,9.4,2.8,2.7,fog -12,1109,2015-01-14,0.0,6.1,0.6,2.8,fog -13,1110,2015-01-15,9.7,7.8,1.1,3.2,rain -14,1111,2015-01-16,0.0,11.7,5.6,4.5,fog -15,1112,2015-01-17,26.2,13.3,3.3,2.8,rain -16,1113,2015-01-18,21.3,13.9,7.2,6.6,rain -17,1114,2015-01-19,0.5,10.0,6.1,2.8,rain -18,1115,2015-01-20,0.0,10.0,3.3,3.0,fog -19,1116,2015-01-21,0.0,7.2,-0.5,1.3,fog -20,1117,2015-01-22,0.8,9.4,6.1,1.3,rain -21,1118,2015-01-23,5.8,12.2,8.3,2.6,rain -22,1119,2015-01-24,0.5,14.4,11.1,3.3,rain -23,1120,2015-01-25,0.0,17.2,7.2,1.4,fog -24,1121,2015-01-26,0.0,16.1,6.1,2.2,fog -25,1122,2015-01-27,0.8,11.1,8.3,2.0,rain -26,1123,2015-01-28,0.0,12.2,5.0,1.8,fog -27,1124,2015-01-29,0.0,12.2,3.3,2.9,sun -28,1125,2015-01-30,0.0,8.3,1.1,0.8,fog -29,1126,2015-01-31,0.0,7.2,3.3,1.9,fog -30,1127,2015-02-01,1.5,9.4,4.4,2.6,rain -31,1128,2015-02-02,7.4,11.1,5.0,4.0,rain -32,1129,2015-02-03,1.3,10.0,5.6,1.9,rain -33,1130,2015-02-04,8.4,10.6,4.4,1.7,rain -34,1131,2015-02-05,26.2,13.3,8.3,4.6,rain -35,1132,2015-02-06,17.3,14.4,10.0,4.5,rain -36,1133,2015-02-07,23.6,12.2,9.4,4.6,rain -37,1134,2015-02-08,3.6,15.0,8.3,3.9,rain -38,1135,2015-02-09,6.1,13.3,8.3,2.5,rain -39,1136,2015-02-10,0.3,12.8,8.3,4.0,rain -40,1137,2015-02-11,0.0,12.8,5.6,1.0,fog -41,1138,2015-02-12,1.0,16.7,9.4,2.1,rain -42,1139,2015-02-13,0.0,15.6,6.7,1.7,fog -43,1140,2015-02-14,0.3,14.4,6.7,2.9,rain -44,1141,2015-02-15,0.0,12.2,3.9,4.8,sun -45,1142,2015-02-16,0.0,15.0,5.6,6.6,fog -46,1143,2015-02-17,0.0,16.1,4.4,4.0,sun -47,1144,2015-02-18,0.0,12.2,4.4,2.6,sun -48,1145,2015-02-19,4.6,10.6,8.3,2.2,rain -49,1146,2015-02-20,0.8,11.1,7.2,0.9,rain -50,1147,2015-02-21,0.0,12.2,5.6,4.5,sun -51,1148,2015-02-22,0.0,11.7,3.3,4.2,sun -52,1149,2015-02-23,0.0,12.8,0.6,1.4,sun -53,1150,2015-02-24,0.0,11.1,2.2,1.5,sun -54,1151,2015-02-25,4.1,10.0,6.7,1.0,rain -55,1152,2015-02-26,9.4,11.7,7.8,1.4,rain -56,1153,2015-02-27,18.3,10.0,6.7,4.0,rain -57,1154,2015-02-28,0.0,12.2,3.3,5.1,sun -58,1155,2015-03-01,0.0,11.1,1.1,2.2,sun -59,1156,2015-03-02,0.0,11.1,4.4,4.8,sun -60,1157,2015-03-03,0.0,10.6,0.0,2.1,sun -61,1158,2015-03-04,0.0,12.8,-0.5,1.8,sun -62,1159,2015-03-05,0.0,13.3,2.8,1.3,sun -63,1160,2015-03-06,0.0,15.0,3.3,1.4,sun -64,1161,2015-03-07,0.0,16.7,3.9,2.7,fog -65,1162,2015-03-08,0.0,17.2,3.9,1.7,fog -66,1163,2015-03-09,0.0,14.4,4.4,1.8,fog -67,1164,2015-03-10,0.8,13.3,5.0,2.6,rain -68,1165,2015-03-11,2.5,14.4,8.9,3.1,rain -69,1166,2015-03-12,0.0,17.8,9.4,3.2,sun -70,1167,2015-03-13,2.0,17.2,7.8,2.2,rain -71,1168,2015-03-14,17.0,13.9,9.4,3.8,rain -72,1169,2015-03-15,55.9,10.6,6.1,4.2,rain -73,1170,2015-03-16,1.0,13.9,6.1,3.0,rain -74,1171,2015-03-17,0.8,13.3,4.4,2.6,rain -75,1172,2015-03-18,0.0,15.6,7.2,2.5,sun -76,1173,2015-03-19,0.0,15.6,8.3,1.9,sun -77,1174,2015-03-20,4.1,13.9,8.9,1.9,rain -78,1175,2015-03-21,3.8,13.3,8.3,4.7,rain -79,1176,2015-03-22,1.0,11.7,6.1,2.3,rain -80,1177,2015-03-23,8.1,11.1,5.6,2.8,rain -81,1178,2015-03-24,7.6,12.8,6.1,3.9,rain -82,1179,2015-03-25,5.1,14.4,7.2,4.4,rain -83,1180,2015-03-26,0.0,20.6,10.0,2.2,sun -84,1181,2015-03-27,1.0,18.3,8.9,4.0,rain -85,1182,2015-03-28,0.0,15.6,9.4,5.7,sun -86,1183,2015-03-29,0.0,15.6,8.9,3.0,sun -87,1184,2015-03-30,1.8,17.8,10.6,2.9,rain -88,1185,2015-03-31,1.0,12.8,6.1,4.2,rain -89,1186,2015-04-01,5.1,12.8,5.6,3.2,rain -90,1187,2015-04-02,0.0,13.3,5.6,2.4,sun -91,1188,2015-04-03,1.5,11.1,5.0,3.6,rain -92,1189,2015-04-04,0.0,12.8,3.9,1.7,sun -93,1190,2015-04-05,0.0,16.7,2.8,2.4,sun -94,1191,2015-04-06,1.0,13.9,6.7,3.5,rain -95,1192,2015-04-07,0.5,14.4,6.7,3.9,rain -96,1193,2015-04-08,0.0,17.2,6.1,1.7,sun -97,1194,2015-04-09,0.0,17.2,6.1,2.3,sun -98,1195,2015-04-10,10.9,13.9,7.8,4.6,rain -99,1196,2015-04-11,0.0,11.7,5.6,6.5,sun -100,1197,2015-04-12,0.0,13.3,5.6,3.6,sun -101,1198,2015-04-13,14.0,11.7,3.9,3.6,rain -102,1199,2015-04-14,3.3,11.7,2.8,3.3,rain -103,1200,2015-04-15,0.0,13.9,3.3,2.4,sun -104,1201,2015-04-16,0.0,17.8,3.9,3.1,sun -105,1202,2015-04-17,0.0,18.9,6.1,3.6,sun -106,1203,2015-04-18,0.0,18.9,8.3,3.9,sun -107,1204,2015-04-19,0.0,21.1,8.3,3.6,sun -108,1205,2015-04-20,0.0,22.8,7.8,2.6,sun -109,1206,2015-04-21,5.6,17.2,6.7,3.4,rain -110,1207,2015-04-22,0.0,15.6,5.0,2.3,sun -111,1208,2015-04-23,3.0,12.2,6.7,4.1,rain -112,1209,2015-04-24,3.3,12.2,6.1,5.0,rain -113,1210,2015-04-25,1.3,13.3,5.6,3.0,rain -114,1211,2015-04-26,0.0,15.6,4.4,2.7,fog -115,1212,2015-04-27,0.3,25.0,10.6,2.3,rain -116,1213,2015-04-28,1.8,15.6,8.9,4.3,rain -117,1214,2015-04-29,0.0,16.1,7.2,4.7,sun -118,1215,2015-04-30,0.0,17.2,7.8,2.1,sun -119,1216,2015-05-01,0.0,18.3,8.9,3.7,sun -120,1217,2015-05-02,0.0,18.3,7.8,3.7,sun -121,1218,2015-05-03,0.0,20.6,7.8,2.6,sun -122,1219,2015-05-04,0.0,17.2,7.2,5.2,sun -123,1220,2015-05-05,6.1,14.4,7.2,5.1,rain -124,1221,2015-05-06,0.0,16.7,7.2,2.6,fog -125,1222,2015-05-07,0.0,20.6,6.1,3.0,sun -126,1223,2015-05-08,0.0,23.9,8.3,3.0,sun -127,1224,2015-05-09,0.0,26.7,9.4,2.6,sun -128,1225,2015-05-10,0.0,19.4,11.1,2.8,sun -129,1226,2015-05-11,0.0,13.9,10.0,2.5,fog -130,1227,2015-05-12,4.3,15.6,10.6,3.3,rain -131,1228,2015-05-13,4.1,12.2,10.0,2.8,rain -132,1229,2015-05-14,0.3,17.8,9.4,2.0,rain -133,1230,2015-05-15,0.0,20.0,9.4,2.8,fog -134,1231,2015-05-16,0.0,15.6,11.1,3.0,sun -135,1232,2015-05-17,0.0,19.4,10.6,2.1,sun -136,1233,2015-05-18,0.0,25.6,12.2,3.0,sun -137,1234,2015-05-19,0.0,21.7,11.7,2.6,sun -138,1235,2015-05-20,0.0,23.3,10.6,1.8,fog -139,1236,2015-05-21,0.0,25.6,11.7,2.1,sun -140,1237,2015-05-22,0.0,16.7,11.7,3.7,sun -141,1238,2015-05-23,0.0,16.1,11.7,2.6,sun -142,1239,2015-05-24,0.0,17.8,11.1,2.7,sun -143,1240,2015-05-25,0.0,15.6,11.1,2.7,sun -144,1241,2015-05-26,0.0,21.7,11.7,2.1,sun -145,1242,2015-05-27,0.0,24.4,11.7,1.8,sun -146,1243,2015-05-28,0.0,27.8,12.2,2.1,sun -147,1244,2015-05-29,0.0,26.1,12.8,2.5,sun -148,1245,2015-05-30,0.0,22.8,10.0,2.5,sun -149,1246,2015-05-31,0.0,25.0,11.7,2.2,sun -150,1247,2015-06-01,4.6,16.1,11.7,3.4,rain -151,1248,2015-06-02,0.5,17.8,12.8,5.0,rain -152,1249,2015-06-03,0.0,20.0,11.7,3.0,sun -153,1250,2015-06-04,0.0,22.8,11.7,3.9,sun -154,1251,2015-06-05,0.0,26.7,12.8,4.3,sun -155,1252,2015-06-06,0.0,29.4,13.3,2.6,sun -156,1253,2015-06-07,0.0,31.1,15.6,3.2,sun -157,1254,2015-06-08,0.0,30.6,14.4,3.5,sun -158,1255,2015-06-09,0.0,28.9,14.4,2.7,sun -159,1256,2015-06-10,0.0,25.6,11.1,3.0,sun -160,1257,2015-06-11,0.0,24.4,11.1,3.5,sun -161,1258,2015-06-12,0.0,20.0,11.7,2.3,sun -162,1259,2015-06-13,0.0,23.9,9.4,2.6,sun -163,1260,2015-06-14,0.0,27.8,11.7,3.7,sun -164,1261,2015-06-15,0.0,30.0,16.1,3.5,drizzle -165,1262,2015-06-16,0.0,22.8,11.1,3.0,sun -166,1263,2015-06-17,0.0,25.0,11.1,3.1,sun -167,1264,2015-06-18,0.0,24.4,13.9,3.0,sun -168,1265,2015-06-19,0.5,23.9,13.3,3.2,rain -169,1266,2015-06-20,0.0,25.0,12.8,4.3,sun -170,1267,2015-06-21,0.0,25.6,13.9,3.4,sun -171,1268,2015-06-22,0.0,25.0,12.8,2.4,sun -172,1269,2015-06-23,0.0,26.1,11.7,2.4,sun -173,1270,2015-06-24,0.0,25.6,16.1,2.6,sun -174,1271,2015-06-25,0.0,30.6,15.6,3.0,sun -175,1272,2015-06-26,0.0,31.7,17.8,4.7,sun -176,1273,2015-06-27,0.0,33.3,17.2,3.9,sun -177,1274,2015-06-28,0.3,28.3,18.3,2.1,rain -178,1275,2015-06-29,0.0,28.9,17.2,2.7,sun -179,1276,2015-06-30,0.0,30.6,15.0,3.4,fog -180,1277,2015-07-01,0.0,32.2,17.2,4.3,sun -181,1278,2015-07-02,0.0,33.9,17.8,3.4,sun -182,1279,2015-07-03,0.0,33.3,17.8,2.6,sun -183,1280,2015-07-04,0.0,33.3,15.0,2.9,sun -184,1281,2015-07-05,0.0,32.8,16.7,2.1,sun -185,1282,2015-07-06,0.0,29.4,15.6,3.2,drizzle -186,1283,2015-07-07,0.0,27.2,13.9,2.4,sun -187,1284,2015-07-08,0.0,30.0,14.4,1.9,drizzle -188,1285,2015-07-09,0.0,28.9,14.4,3.4,sun -189,1286,2015-07-10,0.0,21.1,16.7,3.7,sun -190,1287,2015-07-11,0.0,22.2,16.7,3.0,sun -191,1288,2015-07-12,0.0,26.1,16.7,2.2,sun -192,1289,2015-07-13,0.0,25.6,16.1,3.1,sun -193,1290,2015-07-14,0.0,27.8,16.1,3.3,sun -194,1291,2015-07-15,0.0,26.1,14.4,3.2,sun -195,1292,2015-07-16,0.0,26.1,15.0,2.8,sun -196,1293,2015-07-17,0.0,27.8,13.9,3.3,sun -197,1294,2015-07-18,0.0,33.3,17.8,3.4,sun -198,1295,2015-07-19,0.0,35.0,17.2,3.3,sun -199,1296,2015-07-20,0.0,26.7,16.7,3.9,sun -200,1297,2015-07-21,0.0,23.9,15.0,2.4,sun -201,1298,2015-07-22,0.0,23.9,13.9,2.8,sun -202,1299,2015-07-23,0.0,26.1,14.4,1.9,sun -203,1300,2015-07-24,0.3,22.8,13.3,3.8,rain -204,1301,2015-07-25,0.0,21.1,14.4,2.4,fog -205,1302,2015-07-26,2.0,22.2,13.9,2.6,rain -206,1303,2015-07-27,0.0,23.3,12.2,1.9,fog -207,1304,2015-07-28,0.0,27.8,13.9,3.4,sun -208,1305,2015-07-29,0.0,32.2,14.4,3.8,sun -209,1306,2015-07-30,0.0,34.4,17.2,3.5,sun -210,1307,2015-07-31,0.0,34.4,17.8,2.6,sun -211,1308,2015-08-01,0.0,33.3,15.6,3.1,sun -212,1309,2015-08-02,0.0,30.6,16.1,2.0,sun -213,1310,2015-08-03,0.0,28.3,17.2,2.3,sun -214,1311,2015-08-04,0.0,26.1,14.4,2.6,fog -215,1312,2015-08-05,0.0,23.3,12.2,3.5,sun -216,1313,2015-08-06,0.0,25.0,15.0,2.9,sun -217,1314,2015-08-07,0.0,28.3,15.6,3.7,sun -218,1315,2015-08-08,0.0,25.0,15.6,3.6,fog -219,1316,2015-08-09,0.0,28.3,15.0,2.2,sun -220,1317,2015-08-10,0.0,28.9,16.1,2.4,sun -221,1318,2015-08-11,0.0,30.0,16.7,4.4,sun -222,1319,2015-08-12,7.6,28.3,16.7,2.7,rain -223,1320,2015-08-13,0.0,28.3,15.6,2.2,sun -224,1321,2015-08-14,30.5,18.3,15.0,5.2,rain -225,1322,2015-08-15,0.0,21.7,13.9,3.7,sun -226,1323,2015-08-16,0.0,25.0,14.4,3.7,sun -227,1324,2015-08-17,0.0,27.2,13.9,3.0,sun -228,1325,2015-08-18,0.0,30.0,15.0,3.0,sun -229,1326,2015-08-19,0.0,31.7,16.1,2.1,drizzle -230,1327,2015-08-20,2.0,22.8,14.4,4.2,rain -231,1328,2015-08-21,0.0,22.2,14.4,2.6,sun -232,1329,2015-08-22,0.0,26.7,12.2,2.5,drizzle -233,1330,2015-08-23,0.0,27.8,13.9,1.8,drizzle -234,1331,2015-08-24,0.0,23.9,12.2,2.3,sun -235,1332,2015-08-25,0.0,25.6,12.2,3.4,sun -236,1333,2015-08-26,0.0,28.3,13.9,1.7,sun -237,1334,2015-08-27,0.0,29.4,14.4,2.1,sun -238,1335,2015-08-28,0.5,23.3,15.6,2.6,rain -239,1336,2015-08-29,32.5,22.2,13.3,5.8,rain -240,1337,2015-08-30,10.2,20.0,12.8,4.7,rain -241,1338,2015-08-31,0.0,18.9,16.1,5.8,sun -242,1339,2015-09-01,5.8,19.4,13.9,5.0,rain -243,1340,2015-09-02,0.0,19.4,11.1,3.8,sun -244,1341,2015-09-03,0.0,18.3,10.6,2.9,sun -245,1342,2015-09-04,0.0,18.3,10.0,2.9,sun -246,1343,2015-09-05,0.3,20.6,8.9,3.5,rain -247,1344,2015-09-06,5.3,16.1,11.7,2.4,rain -248,1345,2015-09-07,0.3,21.1,13.3,1.5,rain -249,1346,2015-09-08,0.0,22.8,13.3,2.4,sun -250,1347,2015-09-09,0.0,24.4,13.9,3.3,sun -251,1348,2015-09-10,0.0,25.0,14.4,3.6,fog -252,1349,2015-09-11,0.0,27.2,15.0,3.1,sun -253,1350,2015-09-12,0.0,26.7,14.4,2.1,sun -254,1351,2015-09-13,0.5,20.6,12.8,3.0,rain -255,1352,2015-09-14,0.0,16.7,10.6,3.4,sun -256,1353,2015-09-15,0.0,17.8,10.0,2.8,sun -257,1354,2015-09-16,1.0,20.0,10.0,1.9,rain -258,1355,2015-09-17,1.8,18.3,12.8,3.8,rain -259,1356,2015-09-18,0.0,19.4,12.8,2.6,sun -260,1357,2015-09-19,0.0,21.1,14.4,4.3,sun -261,1358,2015-09-20,4.1,22.8,12.2,6.8,rain -262,1359,2015-09-21,0.0,18.3,9.4,2.7,fog -263,1360,2015-09-22,0.0,18.9,7.8,2.0,sun -264,1361,2015-09-23,0.0,20.6,8.3,1.8,sun -265,1362,2015-09-24,0.0,22.2,11.1,2.5,fog -266,1363,2015-09-25,2.0,15.6,12.8,2.6,rain -267,1364,2015-09-26,0.0,18.3,10.0,2.7,sun -268,1365,2015-09-27,0.0,17.8,7.2,3.8,sun -269,1366,2015-09-28,0.0,21.1,9.4,5.1,sun -270,1367,2015-09-29,0.0,21.7,8.9,1.9,sun -271,1368,2015-09-30,0.0,18.3,10.0,1.3,fog -272,1369,2015-10-01,0.0,21.1,9.4,1.3,fog -273,1370,2015-10-02,0.0,15.6,10.0,2.9,fog -274,1371,2015-10-03,0.0,19.4,11.1,4.8,sun -275,1372,2015-10-04,0.0,22.8,10.0,3.7,sun -276,1373,2015-10-05,0.0,23.3,9.4,1.6,sun -277,1374,2015-10-06,0.0,18.3,10.0,2.6,drizzle -278,1375,2015-10-07,9.9,16.1,13.9,2.2,rain -279,1376,2015-10-08,0.0,18.9,13.3,1.1,fog -280,1377,2015-10-09,0.3,19.4,12.2,2.6,rain -281,1378,2015-10-10,28.7,21.1,13.3,4.7,rain -282,1379,2015-10-11,0.0,17.8,10.6,2.6,sun -283,1380,2015-10-12,4.6,18.3,10.6,2.8,rain -284,1381,2015-10-13,1.3,16.7,9.4,3.2,rain -285,1382,2015-10-14,0.0,15.0,10.0,5.0,fog -286,1383,2015-10-15,0.0,21.1,9.4,3.4,fog -287,1384,2015-10-16,0.0,20.0,8.9,1.3,sun -288,1385,2015-10-17,0.3,19.4,11.7,1.3,rain -289,1386,2015-10-18,3.8,15.0,12.8,2.0,rain -290,1387,2015-10-19,0.3,17.2,12.2,2.6,rain -291,1388,2015-10-20,0.0,17.8,10.6,1.8,fog -292,1389,2015-10-21,0.0,16.1,8.3,1.3,fog -293,1390,2015-10-22,0.0,16.1,8.9,2.7,fog -294,1391,2015-10-23,0.0,12.8,7.2,2.6,fog -295,1392,2015-10-24,0.0,15.0,8.9,2.9,fog -296,1393,2015-10-25,8.9,19.4,8.9,3.4,rain -297,1394,2015-10-26,6.9,12.2,10.0,4.6,rain -298,1395,2015-10-27,0.0,16.1,7.8,1.7,fog -299,1396,2015-10-28,3.3,13.9,11.1,2.8,rain -300,1397,2015-10-29,1.8,15.0,12.2,4.7,rain -301,1398,2015-10-30,19.3,17.2,11.7,6.7,rain -302,1399,2015-10-31,33.0,15.6,11.7,7.2,rain -303,1400,2015-11-01,26.2,12.2,8.9,6.0,rain -304,1401,2015-11-02,0.3,11.1,7.2,2.8,rain -305,1402,2015-11-03,0.8,10.6,5.0,1.4,rain -306,1403,2015-11-04,0.0,10.0,3.3,2.2,sun -307,1404,2015-11-05,1.3,11.7,7.8,2.3,rain -308,1405,2015-11-06,0.0,15.6,8.3,2.7,fog -309,1406,2015-11-07,12.7,12.2,9.4,3.0,rain -310,1407,2015-11-08,6.6,11.1,7.8,1.8,rain -311,1408,2015-11-09,3.3,10.0,5.0,1.3,rain -312,1409,2015-11-10,1.3,11.1,3.9,3.9,rain -313,1410,2015-11-11,1.5,11.1,6.1,4.6,rain -314,1411,2015-11-12,9.9,11.1,5.0,5.1,rain -315,1412,2015-11-13,33.5,13.3,9.4,6.5,rain -316,1413,2015-11-14,47.2,9.4,6.1,4.5,rain -317,1414,2015-11-15,22.4,8.9,2.2,4.1,rain -318,1415,2015-11-16,2.0,8.9,1.7,4.0,rain -319,1416,2015-11-17,29.5,13.3,6.7,8.0,rain -320,1417,2015-11-18,1.5,8.9,3.3,3.8,rain -321,1418,2015-11-19,2.0,8.9,2.8,4.2,rain -322,1419,2015-11-20,0.0,8.3,0.6,4.0,fog -323,1420,2015-11-21,0.0,8.9,0.6,4.7,sun -324,1421,2015-11-22,0.0,10.0,1.7,3.1,fog -325,1422,2015-11-23,3.0,6.7,0.0,1.3,rain -326,1423,2015-11-24,7.1,6.7,2.8,4.5,rain -327,1424,2015-11-25,0.0,7.2,0.0,5.7,sun -328,1425,2015-11-26,0.0,9.4,-1.0,4.3,sun -329,1426,2015-11-27,0.0,9.4,-1.6,3.0,sun -330,1427,2015-11-28,0.0,7.2,-2.7,1.0,sun -331,1428,2015-11-29,0.0,1.7,-2.1,0.9,fog -332,1429,2015-11-30,0.5,5.6,-3.8,1.7,rain -333,1430,2015-12-01,12.2,10.0,3.9,3.5,rain -334,1431,2015-12-02,2.5,10.6,4.4,5.0,rain -335,1432,2015-12-03,12.7,15.6,7.8,5.9,rain -336,1433,2015-12-04,2.0,10.6,6.1,4.7,rain -337,1434,2015-12-05,15.7,10.0,6.1,4.0,rain -338,1435,2015-12-06,11.2,12.8,7.2,5.9,rain -339,1436,2015-12-07,27.4,11.1,8.3,3.4,rain -340,1437,2015-12-08,54.1,15.6,10.0,6.2,rain -341,1438,2015-12-09,13.5,12.2,7.8,6.3,rain -342,1439,2015-12-10,9.4,11.7,6.1,7.5,rain -343,1440,2015-12-11,0.3,9.4,4.4,2.8,rain -344,1441,2015-12-12,16.0,8.9,5.6,5.6,rain -345,1442,2015-12-13,1.3,7.8,6.1,6.1,rain -346,1443,2015-12-14,0.0,7.8,1.7,1.7,sun -347,1444,2015-12-15,1.5,6.7,1.1,2.9,rain -348,1445,2015-12-16,3.6,6.1,2.8,2.3,rain -349,1446,2015-12-17,21.8,6.7,3.9,6.0,rain -350,1447,2015-12-18,18.5,8.9,4.4,5.1,rain -351,1448,2015-12-19,0.0,8.3,2.8,4.1,fog -352,1449,2015-12-20,4.3,7.8,4.4,6.7,rain -353,1450,2015-12-21,27.4,5.6,2.8,4.3,rain -354,1451,2015-12-22,4.6,7.8,2.8,5.0,rain -355,1452,2015-12-23,6.1,5.0,2.8,7.6,rain -356,1453,2015-12-24,2.5,5.6,2.2,4.3,rain -357,1454,2015-12-25,5.8,5.0,2.2,1.5,rain -358,1455,2015-12-26,0.0,4.4,0.0,2.5,sun -359,1456,2015-12-27,8.6,4.4,1.7,2.9,rain -360,1457,2015-12-28,1.5,5.0,1.7,1.3,rain -361,1458,2015-12-29,0.0,7.2,0.6,2.6,fog -362,1459,2015-12-30,0.0,5.6,-1.0,3.4,sun -363,1460,2015-12-31,0.0,5.6,-2.1,3.5,sun diff --git a/public/tutorial/replication-config.json b/public/tutorial/replication-config.json index 31702ebb91..a77f79ae69 100644 --- a/public/tutorial/replication-config.json +++ b/public/tutorial/replication-config.json @@ -6,7 +6,7 @@ "authors": [ "The reVISit Team" ], - "date": "2026-02-23", + "date": "2026-06-08", "description": "This is a reVISit variation study of JND(Just Noticeable Difference) Scatter Plot experiment.", "organizations": [ "University of Utah", @@ -15,7 +15,7 @@ }, "uiConfig": { "contactEmail": "contact@revisit.dev", - "helpTextPath": "ScatterJND-study/assets/help.md", + "helpTextPath": "tutorial/assets/help.md", "logoPath": "revisitAssets/revisitLogoSquare.svg", "withProgressBar": true, "autoDownloadStudy": false, diff --git a/scripts/check-lockfile-drift.mjs b/scripts/check-lockfile-drift.mjs new file mode 100644 index 0000000000..60e060cda6 --- /dev/null +++ b/scripts/check-lockfile-drift.mjs @@ -0,0 +1,79 @@ +import fs from 'node:fs'; + +const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf8')); +const packageLock = JSON.parse(fs.readFileSync('package-lock.json', 'utf8')); +const yarnLines = fs.readFileSync('yarn.lock', 'utf8').split(/\r?\n/); + +const yarnSelectorVersions = new Map(); +const yarnPackageVersions = new Set(); +let activeSelectors = []; + +const packageNameFromSelector = (selector) => { + const separator = selector.startsWith('@') + ? selector.indexOf('@', 1) + : selector.indexOf('@'); + return selector.slice(0, separator); +}; + +for (const line of yarnLines) { + if (line && !/^\s/.test(line) && line.endsWith(':')) { + activeSelectors = []; + const selectorPattern = /"([^"]+)"|([^,\s]+)/g; + const header = line.slice(0, -1); + let match = selectorPattern.exec(header); + + while (match) { + activeSelectors.push(match[1] || match[2]); + match = selectorPattern.exec(header); + } + } else if (activeSelectors.length && line.startsWith(' version "')) { + const version = line.match(/^ version "([^"]+)"/)?.[1]; + + for (const selector of activeSelectors) { + yarnSelectorVersions.set(selector, version); + yarnPackageVersions.add(`${packageNameFromSelector(selector)}@${version}`); + } + activeSelectors = []; + } +} + +const errors = []; +const directDependencies = { + ...packageJson.dependencies, + ...packageJson.devDependencies, +}; + +for (const [name, range] of Object.entries(directDependencies)) { + const yarnVersion = yarnSelectorVersions.get(`${name}@${range}`); + const npmVersion = packageLock.packages?.[`node_modules/${name}`]?.version; + + if (!yarnVersion) { + errors.push(`yarn.lock has no resolution for ${name}@${range}`); + } else if (!npmVersion) { + errors.push(`package-lock.json has no root resolution for ${name}`); + } else if (npmVersion !== yarnVersion) { + errors.push(`${name} resolves to ${npmVersion} with npm and ${yarnVersion} with Yarn`); + } +} + +for (const [location, dependency] of Object.entries(packageLock.packages ?? {})) { + if (!location || !dependency.version || dependency.optional) continue; + + const nodeModulesMarker = 'node_modules/'; + const markerIndex = location.lastIndexOf(nodeModulesMarker); + if (markerIndex === -1) continue; + + const name = location.slice(markerIndex + nodeModulesMarker.length); + const packageVersion = `${name}@${dependency.version}`; + if (!yarnPackageVersions.has(packageVersion)) { + errors.push(`${packageVersion} appears only in package-lock.json`); + } +} + +if (errors.length) { + console.error('Dependency lockfiles have drifted:'); + for (const error of errors) console.error(`- ${error}`); + process.exit(1); +} + +console.log(`Lockfiles agree on ${Object.keys(directDependencies).length} direct dependencies.`); diff --git a/scripts/clear-out-firebase.sh b/scripts/clear-out-firebase.sh new file mode 100755 index 0000000000..04d42c4e9b --- /dev/null +++ b/scripts/clear-out-firebase.sh @@ -0,0 +1,727 @@ +#!/usr/bin/env bash + +set -euo pipefail + +DEFAULT_PROJECT_ID="revisit-utah" +DEFAULT_STORAGE_BUCKET="revisit-utah.appspot.com" +DEFAULT_DATABASE_ID="(default)" +DEFAULT_GLOBAL_CONFIG="public/global.json" + +PROJECT_ID="${FIREBASE_PROJECT_ID:-$DEFAULT_PROJECT_ID}" +STORAGE_BUCKET="${FIREBASE_STORAGE_BUCKET:-$DEFAULT_STORAGE_BUCKET}" +DATABASE_ID="${FIRESTORE_DATABASE_ID:-$DEFAULT_DATABASE_ID}" +GLOBAL_CONFIG="$DEFAULT_GLOBAL_CONFIG" +STORAGE_BACKEND="${STORAGE_BACKEND:-gcloud}" +S3_ENDPOINT_URL="${S3_ENDPOINT_URL:-}" +JOBS="${CLEAR_OUT_FIREBASE_JOBS:-4}" +DRY_RUN=1 +INCLUDE_SNAPSHOTS=1 +DISCOVER_FIRESTORE=1 +DISCOVER_STORAGE=1 +STUDY_FILTER_SET=0 +ACTIVE_TASKS=0 +PARALLEL_FAILURES=0 +COLOR_ENABLED=0 +COLOR_RESET="" +COLOR_BLUE="" +COLOR_GREEN="" +COLOR_RED="" +COLOR_YELLOW="" + +PREFIXES=("prod-") +STUDIES=() +EXTRA_FIRESTORE_COLLECTIONS=() + +usage() { + cat <<'EOF' +Usage: + scripts/clear-out-firebase.sh [options] + +Deletes study data from the Firebase project used by the main reVISit deployment. +It preserves the Firestore user-management collection. + +By default this is a dry run. Destructive cleanup requires: + --execute + +Options: + --project PROJECT_ID Firebase project ID. Default: revisit-utah + --bucket BUCKET Storage bucket. Default: revisit-utah.appspot.com + --database DATABASE_ID Firestore database ID. Default: (default) + --global-config PATH Global config to read study IDs from. Default: public/global.json + --study STUDY_ID Only delete one study ID. Can be repeated. + --prefix PREFIX Study collection/storage prefix. Default: prod- + --include-dev Also delete dev- prefixed study data. + --collection COLLECTION Additional Firestore collection to delete. Can be repeated. + --discover-firestore Discover matching top-level Firestore collections when executing. Default. + --no-discover-firestore Only delete derived and explicitly supplied Firestore collection names. + --discover-storage Discover matching top-level storage prefixes when executing. Default. + --no-discover-storage Only delete derived storage prefixes. + --no-snapshots Skip snapshot storage prefix cleanup. + --storage-backend BACKEND gcloud, aws, or none. Default: gcloud + --s3-endpoint-url URL Endpoint URL for --storage-backend aws. + --jobs N Maximum parallel deletes per phase. Default: 4. + --execute Perform deletes instead of printing commands. + -h, --help Show this help. + +Examples: + scripts/clear-out-firebase.sh + scripts/clear-out-firebase.sh --study demo-html-input + scripts/clear-out-firebase.sh --execute + +Notes: + Firestore cleanup uses firebase firestore:delete. + Storage cleanup uses the selected object-storage CLI because Firebase CLI does + not provide the same recursive object cleanup command for Firebase Storage. +EOF +} + +die() { + printf 'error: %s\n' "$*" >&2 + exit 1 +} + +append_unique() { + local value="$1" + shift + local existing + for existing in "$@"; do + if [[ "$existing" == "$value" ]]; then + return 1 + fi + done + return 0 +} + +array_contains() { + local value="$1" + shift + local existing + for existing in "$@"; do + if [[ "$existing" == "$value" ]]; then + return 0 + fi + done + return 1 +} + +setup_colors() { + if [[ -t 1 && -z "${NO_COLOR:-}" ]]; then + COLOR_ENABLED=1 + COLOR_RESET=$'\033[0m' + COLOR_BLUE=$'\033[34m' + COLOR_GREEN=$'\033[32m' + COLOR_RED=$'\033[31m' + COLOR_YELLOW=$'\033[33m' + fi +} + +status_line() { + local color="$1" + local status="$2" + local message="$3" + + if [[ "$COLOR_ENABLED" -eq 1 ]]; then + printf '%s[%s]%s %s\n' "$color" "$status" "$COLOR_RESET" "$message" + else + printf '[%s] %s\n' "$status" "$message" + fi +} + +quote_command() { + local part + for part in "$@"; do + printf '%q ' "$part" + done + printf '\n' +} + +run_command() { + local output_file + + if [[ "$DRY_RUN" -eq 1 ]]; then + printf '[dry-run] ' + quote_command "$@" + return 0 + fi + + printf '[run] ' + quote_command "$@" + + output_file="$(mktemp "${TMPDIR:-/tmp}/clear-out-firebase.XXXXXX")" + if "$@" >"$output_file" 2>&1; then + rm -f "$output_file" + return 0 + fi + + cat "$output_file" >&2 + rm -f "$output_file" + return 1 +} + +reset_parallel_state() { + ACTIVE_TASKS=0 + PARALLEL_FAILURES=0 +} + +wait_for_one_task() { + local status=0 + + wait -n || status=$? + if [[ "$status" -ne 0 ]]; then + PARALLEL_FAILURES=$((PARALLEL_FAILURES + 1)) + fi + ACTIVE_TASKS=$((ACTIVE_TASKS - 1)) +} + +wait_for_all_tasks() { + while [[ "$ACTIVE_TASKS" -gt 0 ]]; do + wait_for_one_task + done +} + +run_labeled_task() { + local label="$1" + shift + + status_line "$COLOR_BLUE" "start" "$label" + if "$@"; then + status_line "$COLOR_GREEN" "success" "$label" + return 0 + fi + + status_line "$COLOR_RED" "error" "$label" + return 1 +} + +start_task() { + local label="$1" + shift + + run_labeled_task "$label" "$@" & + ACTIVE_TASKS=$((ACTIVE_TASKS + 1)) + + if [[ "$ACTIVE_TASKS" -ge "$JOBS" ]]; then + wait_for_one_task + fi +} + +load_studies_from_global_config() { + [[ -f "$GLOBAL_CONFIG" ]] || die "global config not found: $GLOBAL_CONFIG" + + node -e ' +const fs = require("fs"); +const path = process.argv[1]; +const config = JSON.parse(fs.readFileSync(path, "utf8")); +for (const studyId of config.configsList || []) { + if (typeof studyId === "string" && studyId.length > 0) { + console.log(studyId); + } +} +' "$GLOBAL_CONFIG" +} + +parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + --project) + PROJECT_ID="${2:-}" + shift 2 + ;; + --bucket) + STORAGE_BUCKET="${2:-}" + shift 2 + ;; + --database) + DATABASE_ID="${2:-}" + shift 2 + ;; + --global-config) + GLOBAL_CONFIG="${2:-}" + shift 2 + ;; + --study) + STUDIES+=("${2:-}") + STUDY_FILTER_SET=1 + shift 2 + ;; + --prefix) + PREFIXES=("${2:-}") + shift 2 + ;; + --include-dev) + if append_unique "dev-" "${PREFIXES[@]}"; then + PREFIXES+=("dev-") + fi + shift + ;; + --collection) + EXTRA_FIRESTORE_COLLECTIONS+=("${2:-}") + shift 2 + ;; + --discover-firestore) + DISCOVER_FIRESTORE=1 + shift + ;; + --no-discover-firestore) + DISCOVER_FIRESTORE=0 + shift + ;; + --discover-storage) + DISCOVER_STORAGE=1 + shift + ;; + --no-discover-storage) + DISCOVER_STORAGE=0 + shift + ;; + --no-snapshots) + INCLUDE_SNAPSHOTS=0 + shift + ;; + --storage-backend) + STORAGE_BACKEND="${2:-}" + shift 2 + ;; + --s3-endpoint-url) + S3_ENDPOINT_URL="${2:-}" + shift 2 + ;; + --jobs) + JOBS="${2:-}" + shift 2 + ;; + --execute) + DRY_RUN=0 + shift + ;; + --force) + printf '[warn] --force is deprecated; --execute is enough for destructive cleanup\n' >&2 + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + die "unknown option: $1" + ;; + esac + done +} + +validate_args() { + [[ -n "$PROJECT_ID" ]] || die "--project is required" + [[ -n "$DATABASE_ID" ]] || die "--database is required" + + if [[ "$STORAGE_BACKEND" != "none" ]]; then + [[ -n "$STORAGE_BUCKET" ]] || die "--bucket is required unless --storage-backend none is used" + fi + + case "$STORAGE_BACKEND" in + gcloud|aws|none) + ;; + *) + die "--storage-backend must be one of: gcloud, aws, none" + ;; + esac + + if [[ ! "$JOBS" =~ ^[1-9][0-9]*$ ]]; then + die "--jobs must be a positive integer" + fi +} + +require_commands() { + command -v node >/dev/null 2>&1 || die "node is required to read $GLOBAL_CONFIG" + + if [[ "$DRY_RUN" -eq 1 ]]; then + return 0 + fi + + command -v firebase >/dev/null 2>&1 || die "firebase CLI is required" + + if [[ "$DISCOVER_FIRESTORE" -eq 1 ]]; then + command -v gcloud >/dev/null 2>&1 || die "gcloud is required for Firestore collection discovery" + fi + + case "$STORAGE_BACKEND" in + gcloud) + command -v gcloud >/dev/null 2>&1 || die "gcloud is required for storage cleanup" + ;; + aws) + command -v aws >/dev/null 2>&1 || die "aws CLI is required for S3-compatible storage cleanup" + ;; + none) + ;; + esac +} + +confirm_destructive_run() { + if [[ "$DRY_RUN" -eq 1 ]]; then + return 0 + fi + + printf 'About to delete Firebase study data from project %s.\n' "$PROJECT_ID" + printf 'Firestore user-management will be preserved.\n' + printf 'Type delete to continue: ' + + local confirmation + read -r confirmation + [[ "$confirmation" == "delete" ]] || die "confirmation did not match" +} + +discover_firestore_collections() { + local access_token + access_token="$(gcloud auth print-access-token)" + + FIRESTORE_ACCESS_TOKEN="$access_token" node -e ' +const https = require("https"); + +const [projectId, databaseId] = process.argv.slice(1); +const token = process.env.FIRESTORE_ACCESS_TOKEN; +const collectionIds = []; + +async function listCollectionIds(pageToken) { + const databasePath = encodeURIComponent(databaseId); + const body = JSON.stringify({ + pageSize: 300, + ...(pageToken ? { pageToken } : {}), + }); + + const requestOptions = { + method: "POST", + hostname: "firestore.googleapis.com", + path: `/v1/projects/${projectId}/databases/${databasePath}/documents:listCollectionIds`, + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + "Content-Length": Buffer.byteLength(body), + }, + }; + + const responseBody = await new Promise((resolve, reject) => { + const request = https.request(requestOptions, (response) => { + let data = ""; + response.setEncoding("utf8"); + response.on("data", (chunk) => { + data += chunk; + }); + response.on("end", () => { + if (response.statusCode < 200 || response.statusCode >= 300) { + reject(new Error(`Firestore collection discovery failed with HTTP ${response.statusCode}: ${data}`)); + return; + } + resolve(data); + }); + }); + + request.on("error", reject); + request.write(body); + request.end(); + }); + + const parsed = JSON.parse(responseBody); + collectionIds.push(...(parsed.collectionIds || [])); + if (parsed.nextPageToken) { + await listCollectionIds(parsed.nextPageToken); + } +} + +listCollectionIds().then(() => { + collectionIds.sort().forEach((collectionId) => console.log(collectionId)); +}).catch((error) => { + console.error(error.message); + process.exit(1); +}); +' "$PROJECT_ID" "$DATABASE_ID" +} + +should_delete_discovered_collection() { + local collection_name="$1" + local prefix + local study_id + local target + + if [[ "$STUDY_FILTER_SET" -eq 0 && "$collection_name" == "_revisit" ]]; then + return 0 + fi + + if [[ "$collection_name" == "user-management" ]]; then + return 1 + fi + + for prefix in "${PREFIXES[@]}"; do + if [[ "$STUDY_FILTER_SET" -eq 1 ]]; then + for study_id in "${STUDIES[@]}"; do + target="${prefix}${study_id}" + if [[ "$collection_name" == "$target" ]]; then + return 0 + fi + if [[ "$INCLUDE_SNAPSHOTS" -eq 1 && "$collection_name" == "$target-snapshot-"* ]]; then + return 0 + fi + done + continue + fi + + if [[ "$collection_name" == "$prefix"* ]]; then + return 0 + fi + done + + return 1 +} + +build_firestore_collections() { + local collection_name + local prefix + local study_id + local target + local collections=() + + if [[ "$STUDY_FILTER_SET" -eq 0 ]]; then + collections+=("_revisit") + fi + + for collection_name in "${EXTRA_FIRESTORE_COLLECTIONS[@]}"; do + if ! array_contains "$collection_name" "${collections[@]}"; then + collections+=("$collection_name") + fi + done + + for prefix in "${PREFIXES[@]}"; do + for study_id in "${STUDIES[@]}"; do + target="${prefix}${study_id}" + if ! array_contains "$target" "${collections[@]}"; then + collections+=("$target") + fi + done + done + + if [[ "$DRY_RUN" -eq 0 && "$DISCOVER_FIRESTORE" -eq 1 ]]; then + while IFS= read -r collection_name; do + if should_delete_discovered_collection "$collection_name" \ + && ! array_contains "$collection_name" "${collections[@]}"; then + collections+=("$collection_name") + fi + done < <(discover_firestore_collections) + elif [[ "$DRY_RUN" -eq 1 && "$DISCOVER_FIRESTORE" -eq 1 ]]; then + printf '[dry-run] skipping live Firestore collection discovery\n' >&2 + fi + + printf '%s\n' "${collections[@]}" +} + +delete_firestore_collection() { + local collection_name="$1" + + [[ "$collection_name" != "user-management" ]] || die "refusing to delete user-management" + [[ -n "$collection_name" ]] || die "empty Firestore collection name" + + run_command \ + firebase \ + --project "$PROJECT_ID" \ + firestore:delete \ + --database "$DATABASE_ID" \ + --recursive \ + --force \ + "$collection_name" +} + +gcloud_storage_url_has_matches() { + local url="$1" + + gcloud storage ls "$url" >/dev/null 2>&1 +} + +normalize_storage_prefix() { + local object_url="$1" + local object_path="${object_url#gs://$STORAGE_BUCKET/}" + + printf '%s\n' "${object_path%%/*}" +} + +should_delete_storage_prefix() { + local storage_prefix="$1" + local prefix + local study_id + local target + + [[ -n "$storage_prefix" ]] || return 1 + [[ "$storage_prefix" != "user-management" ]] || return 1 + + for prefix in "${PREFIXES[@]}"; do + if [[ "$STUDY_FILTER_SET" -eq 1 ]]; then + for study_id in "${STUDIES[@]}"; do + target="${prefix}${study_id}" + if [[ "$storage_prefix" == "$target" ]]; then + return 0 + fi + if [[ "$INCLUDE_SNAPSHOTS" -eq 1 && "$storage_prefix" == "$target-snapshot-"* ]]; then + return 0 + fi + done + continue + fi + + if [[ "$storage_prefix" == "$prefix"* ]]; then + return 0 + fi + done + + return 1 +} + +discover_gcloud_storage_prefixes() { + local prefix + local object_url + local storage_prefix + local discovered_prefixes=() + + for prefix in "${PREFIXES[@]}"; do + while IFS= read -r object_url; do + storage_prefix="$(normalize_storage_prefix "$object_url")" + if should_delete_storage_prefix "$storage_prefix" \ + && ! array_contains "$storage_prefix" "${discovered_prefixes[@]}"; then + discovered_prefixes+=("$storage_prefix") + printf '%s\n' "$storage_prefix" + fi + done < <(gcloud storage ls --recursive "gs://$STORAGE_BUCKET/$prefix*" 2>/dev/null || true) + done +} + +build_storage_prefixes() { + local prefix + local study_id + local target + local storage_prefix + local storage_prefixes=() + + for prefix in "${PREFIXES[@]}"; do + for study_id in "${STUDIES[@]}"; do + target="${prefix}${study_id}" + if ! array_contains "$target" "${storage_prefixes[@]}"; then + storage_prefixes+=("$target") + fi + + if [[ "$INCLUDE_SNAPSHOTS" -eq 1 && "$STUDY_FILTER_SET" -eq 1 ]]; then + storage_prefix="${target}-snapshot-*" + if ! array_contains "$storage_prefix" "${storage_prefixes[@]}"; then + storage_prefixes+=("$storage_prefix") + fi + fi + done + done + + if [[ "$DRY_RUN" -eq 0 && "$DISCOVER_STORAGE" -eq 1 && "$STORAGE_BACKEND" == "gcloud" ]]; then + while IFS= read -r storage_prefix; do + if ! array_contains "$storage_prefix" "${storage_prefixes[@]}"; then + storage_prefixes+=("$storage_prefix") + fi + done < <(discover_gcloud_storage_prefixes) + elif [[ "$DRY_RUN" -eq 1 && "$DISCOVER_STORAGE" -eq 1 && "$STORAGE_BACKEND" == "gcloud" ]]; then + printf '[dry-run] skipping live storage prefix discovery\n' >&2 + elif [[ "$DISCOVER_STORAGE" -eq 1 && "$STORAGE_BACKEND" != "gcloud" ]]; then + printf '[skip] storage prefix discovery requires gcloud backend\n' >&2 + fi + + printf '%s\n' "${storage_prefixes[@]}" +} + +delete_storage_prefix() { + local prefix="$1" + local storage_url + + [[ -n "$prefix" ]] || die "empty storage prefix" + [[ "$prefix" != "user-management" ]] || die "refusing to delete user-management storage prefix" + + case "$STORAGE_BACKEND" in + gcloud) + storage_url="gs://$STORAGE_BUCKET/$prefix/**" + if [[ "$DRY_RUN" -eq 0 ]] && ! gcloud_storage_url_has_matches "$storage_url"; then + printf '[skip] storage prefix %s matched no objects\n' "$prefix" + return 0 + fi + run_command gcloud storage rm --recursive "$storage_url" + ;; + aws) + if [[ "$prefix" == *'*'* ]]; then + printf '[skip] aws storage backend cannot expand wildcard prefix %s\n' "$prefix" + return 0 + fi + + if [[ -n "$S3_ENDPOINT_URL" ]]; then + run_command aws s3 rm "s3://$STORAGE_BUCKET/$prefix/" --recursive --endpoint-url "$S3_ENDPOINT_URL" + else + run_command aws s3 rm "s3://$STORAGE_BUCKET/$prefix/" --recursive + fi + ;; + none) + printf '[skip] storage prefix %s\n' "$prefix" + ;; + esac +} + +main() { + setup_colors + parse_args "$@" + validate_args + require_commands + + if [[ "${#STUDIES[@]}" -eq 0 ]]; then + while IFS= read -r study_id; do + STUDIES+=("$study_id") + done < <(load_studies_from_global_config) + fi + + printf 'Project: %s\n' "$PROJECT_ID" + printf 'Firestore database: %s\n' "$DATABASE_ID" + printf 'Storage backend: %s\n' "$STORAGE_BACKEND" + if [[ "$STORAGE_BACKEND" != "none" ]]; then + printf 'Storage bucket: %s\n' "$STORAGE_BUCKET" + fi + printf 'Mode: %s\n' "$([[ "$DRY_RUN" -eq 1 ]] && printf dry-run || printf execute)" + printf 'Parallel jobs: %s\n' "$JOBS" + printf 'Study count: %s\n' "${#STUDIES[@]}" + + confirm_destructive_run + + local prefix + local study_id + local target + local collection_name + local storage_prefix + local firestore_collections=() + local storage_prefixes=() + + while IFS= read -r collection_name; do + firestore_collections+=("$collection_name") + done < <(build_firestore_collections) + + reset_parallel_state + for collection_name in "${firestore_collections[@]}"; do + start_task "firestore $collection_name" delete_firestore_collection "$collection_name" + done + wait_for_all_tasks + + if [[ "$PARALLEL_FAILURES" -gt 0 ]]; then + die "$PARALLEL_FAILURES Firestore cleanup task(s) failed" + fi + + reset_parallel_state + while IFS= read -r storage_prefix; do + storage_prefixes+=("$storage_prefix") + done < <(build_storage_prefixes) + + for storage_prefix in "${storage_prefixes[@]}"; do + if [[ -n "$storage_prefix" ]]; then + start_task "storage $storage_prefix" delete_storage_prefix "$storage_prefix" + fi + done + wait_for_all_tasks + + if [[ "$PARALLEL_FAILURES" -gt 0 ]]; then + die "$PARALLEL_FAILURES storage cleanup task(s) failed" + fi +} + +main "$@" diff --git a/src/GlobalConfigParser.tsx b/src/GlobalConfigParser.tsx index e493b7f702..0321f30a79 100644 --- a/src/GlobalConfigParser.tsx +++ b/src/GlobalConfigParser.tsx @@ -55,7 +55,7 @@ function HomeRoute({ globalConfig }: { globalConfig: GlobalConfig }) { padding="md" header={{ height: 70 }} > - + ({ + Stack: ({ children }: { children: ReactNode }) =>
{children}
, + Group: ({ children }: { children: ReactNode }) =>
{children}
, + Card: ({ children }: { children: ReactNode }) =>
{children}
, + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Title: ({ children }: { children: ReactNode }) =>
{children}
, + Badge: ({ children }: { children: ReactNode }) => {children}, + ActionIcon: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => ( + + ), + Center: ({ children }: { children: ReactNode }) =>
{children}
, + Indicator: ({ children }: { children: ReactNode }) =>
{children}
, + Tooltip: ({ children }: { children: ReactNode }) =>
{children}
, + Button: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => , + Flex: ({ children }: { children: ReactNode }) =>
{children}
, + Grid: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { Col: ({ children }: { children: ReactNode }) =>
{children}
}, + ), + RingProgress: ({ label }: { label?: ReactNode }) =>
{label}
, + Collapse: ({ children, in: open }: { children: ReactNode; in?: boolean }) => ( + open ?
{children}
: null + ), +})); + +vi.mock('@tabler/icons-react', () => ({ + IconCheck: () => icon-check, + IconWifi: () => icon-wifi, + IconWifiOff: () => icon-wifioff, + IconRefresh: () => icon-refresh, + IconChevronDown: () => icon-chevron-down, + IconChevronRight: () => icon-chevron-right, +})); + +vi.mock('../../../../storage/engines/FirebaseStorageEngine', () => ({ + FirebaseStorageEngine: class { }, +})); + +// ── fixture helpers ─────────────────────────────────────────────────────────── + +function makeAssignment(overrides: Partial = {}): SequenceAssignment { + return makeSequenceAssignment({ + timestamp: 1_700_000_000_000, + total: 5, + createdTime: 1_700_000_000_000, + ...overrides, + }); +} + +// ── getFilteredParticipantProgress ──────────────────────────────────────────── + +describe('getFilteredParticipantProgress', () => { + test('returns empty array when no assignments', () => { + expect(getFilteredParticipantProgress([], ['inProgress'], ['ALL'])).toEqual([]); + }); + + test('maps progress as percentage of answered/total', () => { + const a = makeAssignment({ answered: ['q1', 'q2'], total: 4 }); + const [result] = getFilteredParticipantProgress([a], ['inProgress'], ['ALL']); + expect(result.progress).toBe(50); + }); + + test('progress is 0 when total is 0', () => { + const a = makeAssignment({ answered: [], total: 0 }); + const [result] = getFilteredParticipantProgress([a], ['inProgress'], ['ALL']); + expect(result.progress).toBe(0); + }); + + test('isCompleted is true when completed is non-null', () => { + const a = makeAssignment({ completed: 1_700_000_000_000 }); + const [result] = getFilteredParticipantProgress([a], ['completed'], ['ALL']); + expect(result.isCompleted).toBe(true); + }); + + test('isRejected is true when rejected is true', () => { + const a = makeAssignment({ rejected: true }); + const [result] = getFilteredParticipantProgress([a], ['rejected'], ['ALL']); + expect(result.isRejected).toBe(true); + }); + + test('filters out participants whose status is not in includedParticipants', () => { + const a = makeAssignment(); // inProgress + const result = getFilteredParticipantProgress([a], ['completed'], ['ALL']); + expect(result).toHaveLength(0); + }); + + test('selectedStages ALL passes any stage', () => { + const a = makeAssignment({ stage: 'STAGE_B' }); + const result = getFilteredParticipantProgress([a], ['inProgress'], ['ALL']); + expect(result).toHaveLength(1); + }); + + test('selectedStages filters by specific stage', () => { + const a1 = makeAssignment({ participantId: 'p1', stage: 'STAGE_A' }); + const a2 = makeAssignment({ participantId: 'p2', stage: 'STAGE_B' }); + const result = getFilteredParticipantProgress([a1, a2], ['inProgress'], ['STAGE_A']); + expect(result).toHaveLength(1); + expect(result[0].assignment.participantId).toBe('p1'); + }); + + test('sorts by createdTime descending (newest first)', () => { + const a1 = makeAssignment({ participantId: 'old', createdTime: 1_000 }); + const a2 = makeAssignment({ participantId: 'new', createdTime: 2_000 }); + const result = getFilteredParticipantProgress([a1, a2], ['inProgress'], ['ALL']); + expect(result[0].assignment.participantId).toBe('new'); + }); +}); + +// ── groupParticipantProgress ────────────────────────────────────────────────── + +describe('groupParticipantProgress', () => { + function makeProgress(overrides: Partial<{ isCompleted: boolean; isRejected: boolean }> = {}) { + return { + assignment: makeAssignment(), + progress: 50, + isCompleted: false, + isRejected: false, + ...overrides, + }; + } + + test('splits into inProgress, completed, rejected groups', () => { + const items = [ + makeProgress(), // inProgress + makeProgress({ isCompleted: true }), // completed + makeProgress({ isCompleted: true, isRejected: true }), // rejected (rejected takes precedence) + makeProgress({ isRejected: true }), // rejected + ]; + const { inProgress, completed, rejected } = groupParticipantProgress(items); + expect(inProgress).toHaveLength(1); + expect(completed).toHaveLength(1); + expect(rejected).toHaveLength(2); + }); + + test('empty input returns empty groups', () => { + const { inProgress, completed, rejected } = groupParticipantProgress([]); + expect(inProgress).toHaveLength(0); + expect(completed).toHaveLength(0); + expect(rejected).toHaveLength(0); + }); +}); + +afterEach(() => { cleanup(); vi.restoreAllMocks(); }); + +// ── LiveMonitorView ─────────────────────────────────────────────────────────── + +describe('LiveMonitorView', () => { + const baseProps = { + studyConfig: {} as Parameters[0]['studyConfig'], + includedParticipants: ['inProgress', 'completed', 'rejected'], + selectedStages: ['ALL'], + }; + + test('renders Live Monitor heading', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('Live Monitor'); + }); + + test('shows 0 counts when no storageEngine provided', () => { + const html = renderToStaticMarkup(); + // All participant counts are 0 since no assignments + expect(html).toContain('0'); + }); + + test('shows Completed, Active, Rejected badges', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('Completed'); + expect(html).toContain('Active'); + expect(html).toContain('Rejected'); + }); + + test('shows disconnected wifi icon when no storageEngine', () => { + const html = renderToStaticMarkup(); + // Without a Firebase engine, useEffect will set status to 'disconnected' + // but renderToStaticMarkup captures initial state ('connecting') — wifioff shown + expect(html).toContain('icon-wifioff'); + }); + + test('shows In Progress, Completed, Rejected section titles', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('In Progress'); + expect(html).toContain('Completed'); + expect(html).toContain('Rejected'); + }); + + test('sets connectionStatus to disconnected when no storageEngine after effect', async () => { + const { container } = await act(async () => render( + , + )); + // After effects run, status is 'disconnected' → icon-wifioff shown + expect(container.textContent).toContain('icon-wifioff'); + }); + + test('sets connectionStatus to connected when listener returns a function', async () => { + const mockUnsubscribe = vi.fn(); + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([]), + _setupSequenceAssignmentListener: vi.fn((_studyId: string, _cb: (assignments: SequenceAssignment[]) => void) => mockUnsubscribe), + }; + const { container } = await act(async () => render( + , + )); + // With a valid listener returning a function, status becomes 'connected' → icon-wifi shown + expect(container.textContent).toContain('icon-wifi'); + }); +}); + +// ── ParticipantSection ──────────────────────────────────────────────────────── + +describe('ParticipantSection', () => { + function ProgressLabel({ progress, assignment: _assignment }: { assignment: SequenceAssignment; progress: number }) { + return {Math.round(progress)}; + } + + const baseProps = { + title: 'In Progress', + titleColor: 'orange', + progressValue: (_: SequenceAssignment, progress: number) => progress, + progressColor: 'orange', + progressLabel: ProgressLabel, + }; + + test('renders section title with participant count', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('In Progress'); + expect(html).toContain('(0)'); + }); + + test('renders each participant card with participantId', () => { + const participants = [ + { + assignment: makeAssignment({ participantId: 'p-alpha', answered: ['q1'], total: 4 }), progress: 25, isCompleted: false, isRejected: false, + }, + ]; + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('p-alpha'); + }); + + test('shows DYNAMIC badge when showDynamicBadge and assignment.isDynamic', () => { + const participants = [ + { + assignment: makeAssignment({ participantId: 'p1', isDynamic: true }), progress: 50, isCompleted: false, isRejected: false, + }, + ]; + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('DYNAMIC'); + }); + + test('no DYNAMIC badge when isDynamic is false', () => { + const participants = [ + { + assignment: makeAssignment({ participantId: 'p1', isDynamic: false }), progress: 50, isCompleted: false, isRejected: false, + }, + ]; + const html = renderToStaticMarkup( + , + ); + expect(html).not.toContain('DYNAMIC'); + }); + + test('uses "#N" fallback when participantId is empty', () => { + const participants = [ + { + assignment: makeAssignment({ participantId: '' }), progress: 50, isCompleted: false, isRejected: false, + }, + ]; + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('#1'); + }); + + test('renders ProgressHeatmap when showProgressHeatmap is true', () => { + const participants = [ + { + assignment: makeAssignment({ participantId: 'p1', answered: ['q1'], total: 3 }), progress: 33, isCompleted: false, isRejected: false, + }, + ]; + const html = renderToStaticMarkup( + , + ); + // ProgressHeatmap renders an SVG + expect(html).toContain(' { + const baseProps = { + studyConfig: {} as Parameters[0]['studyConfig'], + includedParticipants: ['inProgress', 'completed', 'rejected'], + selectedStages: ['ALL'], + studyId: 'test-study', + }; + + beforeEach(() => { vi.clearAllMocks(); }); + + test('listener callback covers handleDataUpdate + InProgressLabel', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([]), + _setupSequenceAssignmentListener: vi.fn((_id: string, cb: (a: SequenceAssignment[]) => void) => { + cb([makeAssignment({ participantId: 'p-active', answered: ['q1'], total: 4 })]); + return vi.fn(); + }), + }; + const { container } = await act(async () => render( + , + )); + expect(container.textContent).toContain('p-active'); + }); + + test('CompletedLabel and RejectedLabel rendered with completed/rejected assignments', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([]), + _setupSequenceAssignmentListener: vi.fn((_id: string, cb: (a: SequenceAssignment[]) => void) => { + cb([ + makeAssignment({ + participantId: 'p-done', completed: 1_700_000_000_000, answered: ['q1', 'q2', 'q3', 'q4', 'q5'], total: 5, + }), + makeAssignment({ + participantId: 'p-rej', rejected: true, answered: ['q1'], total: 5, + }), + ]); + return vi.fn(); + }), + }; + const { container } = await act(async () => render( + , + )); + expect(container.textContent).toContain('p-done'); + expect(container.textContent).toContain('p-rej'); + }); + + test('sets connectionStatus to disconnected when listener returns undefined', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([]), + _setupSequenceAssignmentListener: vi.fn(() => undefined), + }; + const { container } = await act(async () => render( + , + )); + expect(container.textContent).toContain('icon-wifioff'); + }); + + test('Reconnect button click covers handleReconnect success path', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([makeAssignment({ participantId: 'p-new' })]), + _setupSequenceAssignmentListener: vi.fn(() => undefined), + }; + const { getAllByRole } = await act(async () => render( + , + )); + const reconnectBtn = getAllByRole('button').find((b) => b.textContent?.includes('Reconnect')); + expect(reconnectBtn).toBeDefined(); + await act(async () => { fireEvent.click(reconnectBtn!); }); + expect(mockEngine.getAllSequenceAssignments).toHaveBeenCalled(); + }); + + test('Reconnect button click covers handleReconnect error path', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockRejectedValue(new Error('conn failed')), + _setupSequenceAssignmentListener: vi.fn(() => undefined), + }; + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { }); + const { getAllByRole } = await act(async () => render( + , + )); + const reconnectBtn = getAllByRole('button').find((b) => b.textContent?.includes('Reconnect')); + expect(reconnectBtn).toBeDefined(); + await act(async () => { fireEvent.click(reconnectBtn!); }); + expect(consoleSpy).toHaveBeenCalled(); + consoleSpy.mockRestore(); + }); + + test('window offline event covers handleOffline', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([]), + _setupSequenceAssignmentListener: vi.fn((_id: string, cb: (a: SequenceAssignment[]) => void) => { + cb([]); + return vi.fn(); + }), + }; + await act(async () => render( + , + )); + act(() => { window.dispatchEvent(new Event('offline')); }); + }); + + test('window online event covers handleOnline when disconnected', async () => { + const mockEngine = { + initializeStudyDb: vi.fn(), + getAllSequenceAssignments: vi.fn().mockResolvedValue([]), + _setupSequenceAssignmentListener: vi.fn(() => undefined), + }; + await act(async () => render( + , + )); + await act(async () => { window.dispatchEvent(new Event('online')); }); + expect(mockEngine.getAllSequenceAssignments).toHaveBeenCalled(); + }); +}); + +// ── ProgressHeatmap ─────────────────────────────────────────────────────────── + +describe('ProgressHeatmap', () => { + test('returns null when total is 0', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toBe(''); + }); + + test('returns null when total is NaN', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toBe(''); + }); + + test('renders SVG with Q labels for each task', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Q1'); + expect(html).toContain('Q2'); + expect(html).toContain('Q3'); + }); + + test('answered tasks use green fill', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('green'); + }); + + test('unanswered tasks use grey fill', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('grey'); + }); + + test('dynamic mode uses teal fill and shows ? indicator', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('teal'); + expect(html).toContain('?'); + }); + + test('no ? indicator when isDynamic but answered is empty', () => { + const html = renderToStaticMarkup( + // isDynamic with no answers → totalTasks=0 → returns null + , + ); + // totalTasks = answered.length = 0, total check: total=3 > 0 so renders + // but totalTasks=0, so loop doesn't run and no ? added (isDynamic && totalTasks > 0 is false) + expect(html).not.toContain('?'); + }); +}); diff --git a/src/analysis/individualStudy/ParticipantRejectModal.tsx b/src/analysis/individualStudy/ParticipantRejectModal.tsx index 263919fb55..5efd5ac714 100644 --- a/src/analysis/individualStudy/ParticipantRejectModal.tsx +++ b/src/analysis/individualStudy/ParticipantRejectModal.tsx @@ -1,5 +1,5 @@ import { - Modal, Text, TextInput, Flex, Button, Alert, Tooltip, + Modal, Text, TextInput, Flex, Button, Alert, Tooltip, Group, } from '@mantine/core'; import { IconAlertTriangle } from '@tabler/icons-react'; import { @@ -52,6 +52,8 @@ export function ParticipantRejectModal({ const currentAndSelectedParticipants = useMemo(() => [...selectedParticipants, currentParticipantData].filter((p) => p !== null) as ParticipantData[], [selectedParticipants, currentParticipantData]); const rejectedParticipantsCount = useMemo(() => currentAndSelectedParticipants.filter((p) => p.rejected).length, [currentAndSelectedParticipants]); const nonRejectedParticipantsCount = useMemo(() => currentAndSelectedParticipants.filter((p) => !p.rejected).length, [currentAndSelectedParticipants]); + const rejectParticipantLabel = `Reject Participant${nonRejectedParticipantsCount === 1 ? '' : 's'}`; + const undoRejectParticipantLabel = `Undo Reject Participant${rejectedParticipantsCount === 1 ? '' : 's'}`; const rejectParticipant = useCallback(async (rejectParticipantId: string, reason: string) => { if (storageEngine && studyId) { @@ -106,26 +108,30 @@ export function ParticipantRejectModal({ return ( <> - {rejectedParticipantsCount > 0 && ( - - - - )} - {nonRejectedParticipantsCount > 0 && ( - - - + {(rejectedParticipantsCount > 0 || nonRejectedParticipantsCount > 0) && ( + + {rejectedParticipantsCount > 0 && ( + + + + )} + {nonRejectedParticipantsCount > 0 && ( + + + + )} + )} setModalRejectOpened(false)} - title={nonRejectedParticipantsCount > 0 ? `Reject Participants (${nonRejectedParticipantsCount})` : 'Reject Participant'} + title={footer + ? rejectParticipantLabel + : `${rejectParticipantLabel} (${nonRejectedParticipantsCount})`} > } @@ -134,25 +140,28 @@ export function ParticipantRejectModal({ mb="md" > {currentAndSelectedParticipants.length > 0 && rejectedParticipantsCount > 0 && ( - <> - {rejectedParticipantsCount} - {' '} - of your - {' '} - {currentAndSelectedParticipants.length} - {' '} - selected participant - {currentAndSelectedParticipants.length === 1 ? '' : 's'} - {' '} - {rejectedParticipantsCount === 1 ? 'has' : 'have'} - {' '} - already been rejected. Clicking reject participants will now reject the other - {' '} - {nonRejectedParticipantsCount} - . -
-
- + <> + {rejectedParticipantsCount} + {' '} + of your + {' '} + {currentAndSelectedParticipants.length} + {' '} + selected participant + {currentAndSelectedParticipants.length === 1 ? '' : 's'} + {' '} + {rejectedParticipantsCount === 1 ? 'has' : 'have'} + {' '} + already been rejected. Clicking reject participant + {nonRejectedParticipantsCount === 1 ? '' : 's'} + {' '} + will now reject + {' '} + {nonRejectedParticipantsCount === 1 ? 'this participant' : 'these participants'} + . +
+
+ )} When participants are rejected, their sequences will be reassigned to other participants.
@@ -165,7 +174,7 @@ export function ParticipantRejectModal({ Cancel
@@ -173,11 +182,9 @@ export function ParticipantRejectModal({ setModalUndoRejectOpened(false)} - title={( - - {`Undo Reject Participants (${currentAndSelectedParticipants.length})`} - - )} + title={footer + ? undoRejectParticipantLabel + : `${undoRejectParticipantLabel} (${rejectedParticipantsCount})`} > } @@ -188,7 +195,12 @@ export function ParticipantRejectModal({ When you undo participant rejections, you may end up with unbalanced latin squares. This is because the rejected sequence may have been reassigned. {currentAndSelectedParticipants.length > 0 ? ( - Are you sure you want to undo the rejection of these participants? + + Are you sure you want to undo the rejection of + {' '} + {rejectedParticipantsCount === 1 ? 'this participant' : 'these participants'} + ? + ) : ( <> @@ -206,7 +218,7 @@ export function ParticipantRejectModal({ Cancel diff --git a/src/analysis/individualStudy/StudyAnalysisTabs.tsx b/src/analysis/individualStudy/StudyAnalysisTabs.tsx index 8f4d6d2e7d..f7630182eb 100644 --- a/src/analysis/individualStudy/StudyAnalysisTabs.tsx +++ b/src/analysis/individualStudy/StudyAnalysisTabs.tsx @@ -377,7 +377,7 @@ export function StudyAnalysisTabs({ globalConfig }: { globalConfig: GlobalConfig return ( <> - + diff --git a/src/analysis/individualStudy/config/tests/ConfigView.spec.tsx b/src/analysis/individualStudy/config/tests/ConfigView.spec.tsx new file mode 100644 index 0000000000..f80d4736e9 --- /dev/null +++ b/src/analysis/individualStudy/config/tests/ConfigView.spec.tsx @@ -0,0 +1,335 @@ +import { ReactNode } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { + render, screen, act, cleanup, fireEvent, +} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { + afterEach, beforeEach, describe, expect, test, vi, +} from 'vitest'; +import { ConfigInfo } from '../utils'; +import { ConfigView } from '../ConfigView'; +import { downloadConfigFile, downloadConfigFilesZip } from '../../../../utils/handleDownloadFiles'; +import { makeParticipant } from '../../../../tests/utils'; + +// Capture what gets passed to useMantineReactTable so we can test columns / options +type CapturedTableOptions = Record & { + columns: { id?: string; header: string; accessorKey?: string; Cell: (arg: Record) => ReactNode }[]; + enableRowSelection: boolean; + enableRowVirtualization: boolean; + enablePagination: boolean; + enableDensityToggle: boolean; + onRowSelectionChange: (sel: Record) => void; + renderTopToolbarCustomActions: () => ReactNode; +}; + +let capturedTableOptions: CapturedTableOptions | null = null; + +let mockStorageEngine: { getAllConfigsFromHash: ReturnType } | undefined; + +vi.mock('../../../../storage/storageEngineHooks', () => ({ + useStorageEngine: () => ({ storageEngine: mockStorageEngine }), +})); + +vi.mock('mantine-react-table', () => ({ + useMantineReactTable: (options: CapturedTableOptions) => { + capturedTableOptions = options; + return {}; + }, + MantineReactTable: () =>
table
, +})); + +vi.mock('@mantine/core', () => ({ + Button: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => ( + + ), + Flex: ({ children }: { children: ReactNode }) =>
{children}
, + Space: () =>
, + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Tooltip: ({ label, children }: { label: string; children: ReactNode }) =>
{children}
, + Group: ({ children }: { children: ReactNode }) =>
{children}
, + Badge: ({ children }: { children: ReactNode }) => {children}, + Modal: ({ opened, children }: { opened: boolean; children: ReactNode }) => (opened ?
{children}
: null), + ActionIcon: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => ( + + ), + Loader: () =>
Loading...
, + Stack: ({ children }: { children: ReactNode }) =>
{children}
, + Paper: ({ children }: { children: ReactNode }) =>
{children}
, + Box: ({ children }: { children: ReactNode }) =>
{children}
, +})); + +vi.mock('@tabler/icons-react', () => ({ + IconInfoCircle: () => info, + IconDownload: () => download, + IconEye: () => eye, + IconArrowsLeftRight: () => compare, + IconCopy: () => copy, +})); + +vi.mock('../../../../utils/handleDownloadFiles', () => ({ + downloadConfigFile: vi.fn().mockResolvedValue(undefined), + downloadConfigFilesZip: vi.fn().mockResolvedValue(undefined), +})); + +vi.mock('../ConfigDiffModal', () => ({ + ConfigDiffModal: () =>
diff modal
, +})); + +const mockConfigInfo: ConfigInfo = { + hash: 'abcdef1234567890', + version: '1.0.0', + date: '2026-04-08', + timeFrame: 'N/A', + participantCount: 2, + config: { studyMetadata: { version: '1.0.0', date: '2026-04-08' } } as ConfigInfo['config'], +}; + +describe('ConfigView', () => { + beforeEach(() => { + capturedTableOptions = null; + mockStorageEngine = { + getAllConfigsFromHash: vi.fn().mockResolvedValue({ [mockConfigInfo.hash]: mockConfigInfo.config }), + }; + }); + + afterEach(() => { + cleanup(); + vi.restoreAllMocks(); + }); + + // ── SSR / static rendering ─────────────────────────────────────────────── + + test('shows loader in initial loading state', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Loading config data...'); + }); + + test('renders without crashing when no storageEngine is provided', () => { + mockStorageEngine = undefined; + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Loading config data...'); + }); + + test('renders without crashing when studyId is omitted', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('Loading config data...'); + }); + + test('useMantineReactTable is configured with row selection and virtual scroll', () => { + renderToStaticMarkup(); + expect(capturedTableOptions).not.toBeNull(); + expect(capturedTableOptions!.enableRowSelection).toBe(true); + expect(capturedTableOptions!.enableRowVirtualization).toBe(true); + expect(capturedTableOptions!.enablePagination).toBe(false); + expect(capturedTableOptions!.enableDensityToggle).toBe(false); + }); + + test('table columns include expected headers', () => { + renderToStaticMarkup(); + const headers = capturedTableOptions!.columns.map((c: { header: string }) => c.header); + expect(headers).toContain('#'); + expect(headers).toContain('Version'); + expect(headers).toContain('Hash'); + expect(headers).toContain('Date'); + expect(headers).toContain('Time Frame'); + expect(headers).toContain('Participants'); + expect(headers).toContain('Actions'); + }); + + test('configIndex column Cell renders row number', () => { + renderToStaticMarkup(); + const col = capturedTableOptions!.columns.find((c) => c.id === 'configIndex'); + expect(col).toBeDefined(); + if (!col) return; + expect(col.Cell({ row: { index: 0 } })).toBe(1); + expect(col.Cell({ row: { index: 4 } })).toBe(5); + }); + + test('version column Cell renders version text', () => { + renderToStaticMarkup(); + const col = capturedTableOptions!.columns.find((c) => c.accessorKey === 'version'); + expect(col).toBeDefined(); + if (!col) return; + const html = renderToStaticMarkup(col.Cell({ row: { original: { version: '2.5.0' } as ConfigInfo } })); + expect(html).toContain('2.5.0'); + }); + + test('hash column Cell renders truncated hash and copy tooltip', () => { + renderToStaticMarkup(); + const col = capturedTableOptions!.columns.find((c) => c.accessorKey === 'hash'); + expect(col).toBeDefined(); + if (!col) return; + const html = renderToStaticMarkup(col.Cell({ row: { original: { hash: 'abcdef1234567890' } as ConfigInfo } })); + expect(html).toContain('abcdef'); + expect(html).toContain('Copy hash'); + }); + + test('actions column Cell renders View and Download buttons', () => { + renderToStaticMarkup(); + const col = capturedTableOptions!.columns.find((c) => c.id === 'actions'); + expect(col).toBeDefined(); + if (!col) return; + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => 'hashA' } })); + expect(html).toContain('View'); + expect(html).toContain('Download'); + }); + + test('renderTopToolbarCustomActions renders nothing when no rows are checked', () => { + renderToStaticMarkup(); + const html = renderToStaticMarkup(capturedTableOptions!.renderTopToolbarCustomActions()); + expect(html).not.toContain('Download Configs'); + expect(html).not.toContain('Compare'); + }); + + // ── useEffect: post-mount state transitions ────────────────────────────── + + test('useEffect clears configs and stops loading when storageEngine is missing', async () => { + mockStorageEngine = undefined; + await act(async () => { + render(); + }); + expect(screen.getByText('No data available')).toBeDefined(); + }); + + test('useEffect clears configs and stops loading when studyId is missing', async () => { + await act(async () => { + render(); + }); + expect(screen.getByText('No data available')).toBeDefined(); + }); + + test('useEffect fetches configs and renders table when storageEngine and studyId are present', async () => { + const participants = [makeParticipant({ participantConfigHash: mockConfigInfo.hash })]; + await act(async () => { + render(); + }); + expect(mockStorageEngine!.getAllConfigsFromHash).toHaveBeenCalledWith( + [mockConfigInfo.hash], + 'test-study', + ); + expect(screen.getByText('table')).toBeDefined(); + }); + + test('useEffect sets empty configs and stops loading when fetch throws', async () => { + mockStorageEngine!.getAllConfigsFromHash.mockRejectedValue(new Error('network error')); + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { }); + await act(async () => { + render(); + }); + expect(consoleSpy).toHaveBeenCalledWith('Error fetching configs:', expect.any(Error)); + expect(screen.getByText('No data available')).toBeDefined(); + }); + + // ── useCallback handlers ───────────────────────────────────────────────── + + test('handleCopyHash writes to clipboard', () => { + const writeText = vi.fn().mockResolvedValue(undefined); + Object.defineProperty(window.navigator, 'clipboard', { + value: { writeText }, + configurable: true, + }); + + renderToStaticMarkup(); + const hashCol = capturedTableOptions!.columns.find( + (c) => c.accessorKey === 'hash', + ); + expect(hashCol).toBeDefined(); + if (!hashCol) return; + + const { container } = render( + hashCol.Cell({ row: { original: { hash: 'abcdef1234' } as ConfigInfo } }), + ); + fireEvent.click(container.querySelector('button')!); + + expect(writeText).toHaveBeenCalledWith('abcdef1234'); + }); + + test('handleDownloadConfig calls downloadConfigFile with correct args', async () => { + const participants = [makeParticipant({ participantConfigHash: mockConfigInfo.hash })]; + await act(async () => { + render(); + }); + + const col = capturedTableOptions!.columns.find((c) => c.id === 'actions'); + expect(col).toBeDefined(); + if (!col) return; + const user = userEvent.setup(); + const { getAllByText } = render(col.Cell({ cell: { getValue: () => mockConfigInfo.hash } })); + await user.click(getAllByText('Download')[0]); + + expect(downloadConfigFile).toHaveBeenCalledWith({ + studyId: 'test-study', + hash: mockConfigInfo.hash, + config: mockConfigInfo.config, + }); + }); + + test('handleDownloadConfigs calls downloadConfigFilesZip with selected hashes', async () => { + const participants = [makeParticipant({ participantConfigHash: mockConfigInfo.hash })]; + await act(async () => { + render(); + }); + await act(async () => { + capturedTableOptions!.onRowSelectionChange({ [mockConfigInfo.hash]: true }); + }); + + const toolbar = renderToStaticMarkup(capturedTableOptions!.renderTopToolbarCustomActions()); + expect(toolbar).toContain('Download Configs'); + + const user = userEvent.setup(); + const { getByText } = render(capturedTableOptions!.renderTopToolbarCustomActions()); + await user.click(getByText(/Download Configs/)); + + expect(downloadConfigFilesZip).toHaveBeenCalledWith(expect.objectContaining({ + studyId: 'test-study', + hashes: [mockConfigInfo.hash], + })); + }); + + test('handleCompareConfigs opens compare modal when two rows are selected', async () => { + const participants = [makeParticipant({ participantConfigHash: mockConfigInfo.hash })]; + await act(async () => { + render(); + }); + + await act(async () => { + capturedTableOptions!.onRowSelectionChange({ hashA: true, hashB: true }); + }); + + const toolbar = renderToStaticMarkup(capturedTableOptions!.renderTopToolbarCustomActions()); + expect(toolbar).toContain('Compare'); + + const user = userEvent.setup(); + const { getByText } = render(capturedTableOptions!.renderTopToolbarCustomActions()); + await user.click(getByText('Compare')); + + // Compare button should open the diff modal + expect(screen.getByText('diff modal')).toBeDefined(); + }); + + test('handleViewConfig opens view modal when View button is clicked', async () => { + await act(async () => { + render(); + }); + + const col = capturedTableOptions!.columns.find((c) => c.id === 'actions'); + expect(col).toBeDefined(); + if (!col) return; + const user = userEvent.setup(); + const { getAllByText } = render(col.Cell({ cell: { getValue: () => mockConfigInfo.hash } })); + + await act(async () => { + await user.click(getAllByText('View')[0]); + }); + + const body = document.body.textContent || ''; + expect(body).toContain('studyMetadata'); + expect(body).toContain('1.0.0'); + expect(body).toContain('2026-04-08'); + }); +}); diff --git a/src/analysis/individualStudy/management/DataManagementItem.tsx b/src/analysis/individualStudy/management/DataManagementItem.tsx index 34b18afbf4..e8327ddff6 100644 --- a/src/analysis/individualStudy/management/DataManagementItem.tsx +++ b/src/analysis/individualStudy/management/DataManagementItem.tsx @@ -1,7 +1,9 @@ import { Text, LoadingOverlay, Box, Title, Flex, Modal, TextInput, Button, Tooltip, Space, Table, } from '@mantine/core'; -import { useCallback, useEffect, useState } from 'react'; +import { + useCallback, useEffect, useRef, useState, +} from 'react'; import { IconTrashX, IconRefresh, IconPencil } from '@tabler/icons-react'; import { openConfirmModal } from '@mantine/modals'; import { useStorageEngine } from '../../../storage/storageEngineHooks'; @@ -9,6 +11,10 @@ import { showNotification, RevisitNotification } from '../../../utils/notificati import { DownloadButtons } from '../../../components/downloader/DownloadButtons'; import { ActionResponse, SnapshotDocContent } from '../../../storage/engines/types'; import { ParticipantDataWithStatus } from '../../../storage/types'; +import { + SnapshotParticipantCounts, + calculateSnapshotParticipantCounts, +} from '../../../storage/engines/utils/snapshotParticipantCounts'; type SnapshotAction = | { type: 'create', archive: boolean } @@ -17,6 +23,41 @@ type SnapshotAction = | { type: 'deleteSnapshot', snapshot: string } | { type: 'deleteLive' }; +function getSnapshotStudyId(snapshotKey: string) { + return snapshotKey.slice(snapshotKey.indexOf('-') + 1); +} + +function getSnapshotDateKey(snapshotName: string): string | null { + const regex = /-snapshot-(.+)$/; + const match = snapshotName.match(regex); + + return match?.[1] ?? null; +} + +function getDateFromSnapshotName(snapshotName: string): string | null { + return getSnapshotDateKey(snapshotName)?.replace('T', ' ') ?? null; +} + +function compareSnapshotsByDate( + [leftKey]: [string, SnapshotDocContent[string]], + [rightKey]: [string, SnapshotDocContent[string]], +) { + const leftDate = getSnapshotDateKey(leftKey); + const rightDate = getSnapshotDateKey(rightKey); + + if (!leftDate && !rightDate) { + return leftKey.localeCompare(rightKey); + } + if (!leftDate) { + return 1; + } + if (!rightDate) { + return -1; + } + + return rightDate.localeCompare(leftDate); +} + export function DataManagementItem({ studyId, refresh }: { studyId: string, refresh: () => Promise }) { const [modalArchiveOpened, setModalArchiveOpened] = useState(false); const [modalDeleteSnapshotOpened, setModalDeleteSnapshotOpened] = useState(false); @@ -32,6 +73,10 @@ export function DataManagementItem({ studyId, refresh }: { studyId: string, refr const [loading, setLoading] = useState(false); const [snapshotListLoading, setSnapshotListLoading] = useState(false); + const [snapshotCountStatus, setSnapshotCountStatus] = useState>({}); + const snapshotCountBackfills = useRef(new Set()); + const snapshotCountBackfillQueue = useRef(Promise.resolve()); + const snapshotCountBackfillGeneration = useRef(0); const { storageEngine } = useStorageEngine(); @@ -50,6 +95,83 @@ export function DataManagementItem({ studyId, refresh }: { studyId: string, refr refreshSnapshots(); }, [refreshSnapshots]); + useEffect(() => () => { + snapshotCountBackfillGeneration.current += 1; + }, []); + + useEffect(() => { + snapshotCountBackfillGeneration.current += 1; + snapshotCountBackfills.current.clear(); + setSnapshotCountStatus({}); + }, [storageEngine, studyId]); + + useEffect(() => { + if (!storageEngine) { + return undefined; + } + + const backfillGeneration = snapshotCountBackfillGeneration.current; + + Object.entries(snapshots).forEach(([snapshotKey, snapshotItem]) => { + if (snapshotItem.participantCounts || snapshotCountBackfills.current.has(snapshotKey)) { + return; + } + + snapshotCountBackfills.current.add(snapshotKey); + setSnapshotCountStatus((previous) => ({ ...previous, [snapshotKey]: 'loading' })); + + snapshotCountBackfillQueue.current = snapshotCountBackfillQueue.current + .catch(() => undefined) + .then(async () => { + if (snapshotCountBackfillGeneration.current !== backfillGeneration) { + return; + } + + const participants = await storageEngine.getAllParticipantsData(getSnapshotStudyId(snapshotKey)); + const participantCounts = calculateSnapshotParticipantCounts(participants); + + if (snapshotCountBackfillGeneration.current !== backfillGeneration) { + return; + } + + await storageEngine.updateSnapshotParticipantCounts(studyId, snapshotKey, participantCounts); + + if (snapshotCountBackfillGeneration.current !== backfillGeneration) { + return; + } + + setSnapshots((previousSnapshots) => { + if (!previousSnapshots[snapshotKey]) { + return previousSnapshots; + } + + return { + ...previousSnapshots, + [snapshotKey]: { + ...previousSnapshots[snapshotKey], + participantCounts, + }, + }; + }); + setSnapshotCountStatus((previous) => { + const remaining = { ...previous }; + delete remaining[snapshotKey]; + return remaining; + }); + }) + .catch((error) => { + console.error(`Failed to backfill participant counts for snapshot ${snapshotKey}:`, error); + if (snapshotCountBackfillGeneration.current !== backfillGeneration) { + return; + } + snapshotCountBackfills.current.delete(snapshotKey); + setSnapshotCountStatus((previous) => ({ ...previous, [snapshotKey]: 'failed' })); + }); + }); + + return undefined; + }, [snapshots, storageEngine, studyId]); + if (!storageEngine) { return null; } @@ -123,20 +245,24 @@ export function DataManagementItem({ studyId, refresh }: { studyId: string, refr onConfirm: () => handleRestoreSnapshot(snapshot), }); - const getDateFromSnapshotName = (snapshotName: string): string | null => { - const regex = /-snapshot-(.+)$/; - const match = snapshotName.match(regex); + const fetchParticipants = async (snapshotName: string) => ( + await storageEngine.getAllParticipantsData(getSnapshotStudyId(snapshotName)) + ); - if (match && match[1]) { - const dateStuff = match[1]; - return dateStuff.replace('T', ' '); + const renderParticipantCount = ( + snapshotKey: string, + participantCounts: SnapshotParticipantCounts | undefined, + countKey: keyof SnapshotParticipantCounts, + ) => { + if (participantCounts) { + return participantCounts[countKey]; + } + + if (snapshotCountStatus[snapshotKey] === 'failed') { + return 'Unavailable'; } - return null; - }; - const fetchParticipants = async (snapshotName: string) => { - const strippedFilename = snapshotName.slice(snapshotName.indexOf('-') + 1); - return await storageEngine.getAllParticipantsData(strippedFilename); + return 'Loading...'; }; return ( @@ -230,19 +356,26 @@ export function DataManagementItem({ studyId, refresh }: { studyId: string, refr Snapshot Name Date Created + Completed + In Progress + Rejected Actions - {Object.entries(snapshots).map( + {Object.entries(snapshots).sort(compareSnapshotsByDate).map( ([key, snapshotItem]) => ( {snapshotItem.name} {getDateFromSnapshotName(key)} + {renderParticipantCount(key, snapshotItem.participantCounts, 'completed')} + {renderParticipantCount(key, snapshotItem.participantCounts, 'inProgress')} + {renderParticipantCount(key, snapshotItem.participantCounts, 'rejected')} + ), + TextInput: ({ onChange, placeholder }: { onChange?: React.ChangeEventHandler; placeholder?: string }) => ( + + ), + ColorInput: ({ value }: { value?: string }) => , + Loader: () =>
Loading...
, + LoadingOverlay: () => null, + ActionIcon: ({ + children, onClick, 'aria-label': ariaLabel, + }: { children: ReactNode; onClick?: () => void; 'aria-label'?: string }) => ( + + ), + Radio: ({ checked, onChange, 'aria-label': ariaLabel }: { checked: boolean; onChange?: () => void; 'aria-label'?: string }) => ( + + ), + Switch: ({ checked, onChange, 'aria-label': ariaLabel }: { checked?: boolean; onChange?: React.ChangeEventHandler; 'aria-label'?: string }) => ( + + ), + Flex: ({ children }: { children: ReactNode }) =>
{children}
, + Modal: ({ opened, children }: { opened: boolean; children: ReactNode }) => (opened ?
{children}
: null), + Tooltip: ({ children }: { children: ReactNode }) =>
{children}
, + Space: () =>
, + Box: ({ children }: { children: ReactNode }) =>
{children}
, + Table: Object.assign( + ({ children }: { children: ReactNode }) => {children}
, + { + Thead: ({ children }: { children: ReactNode }) => {children}, + Tbody: ({ children }: { children: ReactNode }) => {children}, + Tr: ({ children }: { children: ReactNode }) => {children}, + Th: ({ children }: { children: ReactNode }) => {children}, + Td: ({ children }: { children: ReactNode }) => {children}, + }, + ), +})); + +vi.mock('@tabler/icons-react', () => ({ + IconEdit: () => edit, + IconCheck: () => check, + IconX: () => x, + IconTrashX: () => trash, + IconRefresh: () => refresh, + IconPencil: () => pencil, +})); + +vi.mock('@mantine/modals', () => ({ + openConfirmModal: vi.fn(), +})); + +vi.mock('../../../../utils/notifications', () => ({ + showNotification: vi.fn(), +})); + +vi.mock('../../../../components/downloader/DownloadButtons', () => ({ + DownloadButtons: () =>
DownloadButtons
, +})); + +const successResponse = { status: 'SUCCESS', notifications: [] }; +const DEFAULT_STAGE_COLOR = '#F05A30'; + +const makeEngine = () => ({ + getModes: vi.fn().mockResolvedValue({ + dataCollectionEnabled: true, + developmentModeEnabled: false, + dataSharingEnabled: false, + }), + setMode: vi.fn().mockResolvedValue(undefined), + getStageData: vi.fn().mockResolvedValue({ + currentStage: { stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }, + allStages: [{ stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }], + }), + setCurrentStage: vi.fn().mockResolvedValue(undefined), + updateStageColor: vi.fn().mockResolvedValue(undefined), + getSnapshots: vi.fn().mockResolvedValue({}), + createSnapshot: vi.fn().mockResolvedValue(successResponse), + renameSnapshot: vi.fn().mockResolvedValue(successResponse), + restoreSnapshot: vi.fn().mockResolvedValue(successResponse), + removeSnapshotOrLive: vi.fn().mockResolvedValue(successResponse), + getAllParticipantsData: vi.fn().mockResolvedValue([]), + updateSnapshotParticipantCounts: vi.fn().mockResolvedValue(undefined), +}); + +describe('ManageView', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockStorageEngine = makeEngine(); + }); + + afterEach(() => { + cleanup(); + vi.restoreAllMocks(); + }); + + // ── ManageView layout ──────────────────────────────────────────────────── + + test('renders all three management sections', async () => { + await act(async () => { + render( []} />); + }); + expect(screen.getByText('ReVISit Modes')).toBeDefined(); + expect(screen.getByText('Stage Management')).toBeDefined(); + expect(screen.getByText('Data Management')).toBeDefined(); + }); + + // ── RevisitModesItem ───────────────────────────────────────────────────── + + test('RevisitModesItem renders nothing before fetch completes', () => { + const html = renderToStaticMarkup(); + expect(html).toBe(''); + }); + + test('RevisitModesItem renders mode section titles after fetch', async () => { + await act(async () => { + render(); + }); + expect(screen.getByText('ReVISit Modes')).toBeDefined(); + expect(screen.getByText('Data Collection')).toBeDefined(); + expect(screen.getByText('Development Mode')).toBeDefined(); + expect(screen.getByText('Share Data and Make Analytics Interface Public')).toBeDefined(); + }); + + test('RevisitModesItem calls getModes with the provided studyId', async () => { + await act(async () => { + render(); + }); + expect(mockStorageEngine!.getModes).toHaveBeenCalledWith('my-study'); + }); + + test('RevisitModesItem renders nothing when storageEngine is undefined', () => { + mockStorageEngine = undefined; + const html = renderToStaticMarkup(); + expect(html).toBe(''); + }); + + test('RevisitModesItem handleSwitch calls setMode and updates state', async () => { + await act(async () => { + render(); + }); + const dataCollectionSwitch = screen.getByRole('checkbox', { name: 'Data Collection' }); + await act(async () => { + fireEvent.click(dataCollectionSwitch); + }); + expect(mockStorageEngine!.setMode).toHaveBeenCalledWith('test-study', 'dataCollectionEnabled', false); + }); + + test('RevisitModesItem handleSwitch covers developmentMode and dataSharing branches', async () => { + await act(async () => { + render(); + }); + const devModeSwitch = screen.getByRole('checkbox', { name: 'Development Mode' }); + const dataSharingSwitch = screen.getByRole('checkbox', { name: 'Share Data and Make Analytics Interface Public' }); + await act(async () => { fireEvent.click(devModeSwitch); }); + expect(mockStorageEngine!.setMode).toHaveBeenCalledWith('test-study', 'developmentModeEnabled', true); + await act(async () => { fireEvent.click(dataSharingSwitch); }); + expect(mockStorageEngine!.setMode).toHaveBeenCalledWith('test-study', 'dataSharingEnabled', true); + }); + + // ── StageManagementItem ────────────────────────────────────────────────── + + test('StageManagementItem shows loader before data loads', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('Loading stage data...'); + }); + + test('StageManagementItem renders table and Add New Stage button after data loads', async () => { + await act(async () => { + render(); + }); + expect(screen.getByText('Stage Management')).toBeDefined(); + expect(screen.getByText('DEFAULT')).toBeDefined(); + expect(screen.getByText('Add New Stage')).toBeDefined(); + }); + + test('StageManagementItem calls getStageData with the provided studyId', async () => { + await act(async () => { + render(); + }); + expect(mockStorageEngine!.getStageData).toHaveBeenCalledWith('my-study'); + }); + + test('StageManagementItem shows defaults and sets asyncStatus on getStageData error', async () => { + mockStorageEngine!.getStageData.mockRejectedValue(new Error('db error')); + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { }); + await act(async () => { + render(); + }); + expect(consoleSpy).toHaveBeenCalledWith('Failed to load stage data:', expect.any(Error)); + expect(screen.getByText('DEFAULT')).toBeDefined(); + }); + + test('StageManagementItem handleSetCurrentStage calls setCurrentStage when radio clicked', async () => { + mockStorageEngine!.getStageData.mockResolvedValue({ + currentStage: { stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }, + allStages: [ + { stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }, + { stageName: 'REVIEW', color: '#00AAFF' }, + ], + }); + await act(async () => { + render(); + }); + const reviewRadio = screen.getByRole('radio', { name: 'Set current stage to REVIEW' }); + await act(async () => { + fireEvent.click(reviewRadio); + }); + expect(mockStorageEngine!.setCurrentStage).toHaveBeenCalledWith('test-study', 'REVIEW', '#00AAFF'); + }); + + test('StageManagementItem handleEditStage shows edit inputs, handleCancelEdit resets', async () => { + await act(async () => { + render(); + }); + const editBtn = screen.getByRole('button', { name: 'Edit stage DEFAULT' }); + await act(async () => { fireEvent.click(editBtn); }); + const cancelBtn = screen.getByRole('button', { name: 'Cancel editing stage DEFAULT' }); + await act(async () => { fireEvent.click(cancelBtn); }); + expect(screen.getByRole('button', { name: 'Edit stage DEFAULT' })).toBeDefined(); + }); + + test('StageManagementItem handleSaveEdit calls updateStageColor then refreshes', async () => { + mockStorageEngine!.updateStageColor = vi.fn().mockResolvedValue(undefined); + await act(async () => { + render(); + }); + const editBtn = screen.getByRole('button', { name: 'Edit stage DEFAULT' }); + await act(async () => { fireEvent.click(editBtn); }); + const saveBtn = screen.getByRole('button', { name: 'Save stage DEFAULT' }); + await act(async () => { fireEvent.click(saveBtn); }); + expect(mockStorageEngine!.updateStageColor).toHaveBeenCalledWith('test-study', 'DEFAULT', DEFAULT_STAGE_COLOR); + expect(mockStorageEngine!.getStageData).toHaveBeenCalledTimes(2); + }); + + test('StageManagementItem handleAddNewStage shows new row, handleCancelAddNewStage hides it', async () => { + await act(async () => { + render(); + }); + await act(async () => { fireEvent.click(screen.getByText('Add New Stage')); }); + expect(screen.getByPlaceholderText('Enter stage name')).toBeDefined(); + await act(async () => { fireEvent.click(screen.getByRole('button', { name: 'Cancel new stage' })); }); + expect(screen.getByText('Add New Stage')).toBeDefined(); + }); + + test('StageManagementItem handleSaveNewStage shows error for invalid name', async () => { + await act(async () => { + render(); + }); + await act(async () => { fireEvent.click(screen.getByText('Add New Stage')); }); + await act(async () => { fireEvent.click(screen.getByRole('button', { name: 'Save new stage' })); }); + expect(mockStorageEngine!.setCurrentStage).not.toHaveBeenCalled(); + }); + + test('StageManagementItem handleSaveNewStage success calls setCurrentStage and refreshes', async () => { + mockStorageEngine!.getStageData + .mockResolvedValueOnce({ + currentStage: { stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }, + allStages: [{ stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }], + }) + .mockResolvedValueOnce({ + currentStage: { stageName: 'NEWSTAGE', color: DEFAULT_STAGE_COLOR }, + allStages: [ + { stageName: 'DEFAULT', color: DEFAULT_STAGE_COLOR }, + { stageName: 'NEWSTAGE', color: DEFAULT_STAGE_COLOR }, + ], + }); + await act(async () => { + render(); + }); + await act(async () => { fireEvent.click(screen.getByText('Add New Stage')); }); + fireEvent.change(screen.getByPlaceholderText('Enter stage name'), { target: { value: 'NEWSTAGE' } }); + await act(async () => { fireEvent.click(screen.getByRole('button', { name: 'Save new stage' })); }); + expect(mockStorageEngine!.setCurrentStage).toHaveBeenCalledWith('test-study', 'NEWSTAGE', DEFAULT_STAGE_COLOR); + expect(mockStorageEngine!.getStageData).toHaveBeenCalledTimes(2); + }); + + // ── DataManagementItem ─────────────────────────────────────────────────── + + test('DataManagementItem returns null when storageEngine is undefined', async () => { + mockStorageEngine = undefined; + let container: HTMLElement; + await act(async () => { + ({ container } = render( []} />)); + }); + expect(container!.firstChild).toBeNull(); + }); + + test('DataManagementItem renders main actions and "No snapshots" when snapshots empty', async () => { + await act(async () => { + render( []} />); + }); + expect(screen.getByText('Data Management')).toBeDefined(); + expect(screen.getByText('No snapshots.')).toBeDefined(); + }); + + test('DataManagementItem renders snapshot table rows when snapshots exist', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'test-study-snapshot-2026T01:00': { + name: 'my-snapshot', + participantCounts: { completed: 4, inProgress: 2, rejected: 1 }, + }, + }); + await act(async () => { + render( []} />); + }); + expect(screen.getByText('my-snapshot')).toBeDefined(); + expect(screen.getByText('Completed')).toBeDefined(); + expect(screen.getByText('In Progress')).toBeDefined(); + expect(screen.getByText('Rejected')).toBeDefined(); + expect(screen.getByText('4')).toBeDefined(); + expect(screen.getByText('2')).toBeDefined(); + expect(screen.getByText('1')).toBeDefined(); + expect(screen.getByText('DownloadButtons')).toBeDefined(); + }); + + test('DataManagementItem sorts snapshots by newest creation date first', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'test-study-snapshot-2026-06-09T01:00:00': { + name: 'older-snapshot', + participantCounts: { completed: 1, inProgress: 0, rejected: 0 }, + }, + 'test-study-snapshot-2026-06-10T01:00:00': { + name: 'newer-snapshot', + participantCounts: { completed: 2, inProgress: 0, rejected: 0 }, + }, + }); + + await act(async () => { + render( []} />); + }); + + expect(screen.getAllByText(/-snapshot$/).map((element) => element.textContent)).toEqual([ + 'newer-snapshot', + 'older-snapshot', + ]); + }); + + test('DataManagementItem backfills missing snapshot participant counts', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'dev-test-study-snapshot-2026T01:00': { name: 'my-snapshot' }, + }); + mockStorageEngine!.getAllParticipantsData.mockResolvedValue([ + { completed: true, rejected: false }, + { completed: true, rejected: { reason: 'quality', timestamp: 1 } }, + { completed: false, rejected: false }, + { completed: false, rejected: false }, + { completed: false, rejected: { reason: 'duplicate', timestamp: 2 } }, + ]); + + await act(async () => { + render( []} />); + }); + + await waitFor(() => { + expect(mockStorageEngine!.updateSnapshotParticipantCounts).toHaveBeenCalledWith( + 'test-study', + 'dev-test-study-snapshot-2026T01:00', + { completed: 1, inProgress: 2, rejected: 2 }, + ); + }); + expect(mockStorageEngine!.getAllParticipantsData).toHaveBeenCalledWith('test-study-snapshot-2026T01:00'); + expect(screen.getByText('1')).toBeDefined(); + expect(screen.getAllByText('2').length).toBe(2); + }); + + test('DataManagementItem backfills missing snapshot participant counts one at a time', async () => { + let resolveFirstBackfill: (participants: unknown[]) => void = () => { }; + const firstBackfill = new Promise((resolve) => { + resolveFirstBackfill = resolve; + }); + let resolveFirstUpdate: () => void = () => { }; + const firstUpdate = new Promise((resolve) => { + resolveFirstUpdate = resolve; + }); + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'dev-test-study-snapshot-2026T01:00': { name: 'first-snapshot' }, + 'dev-test-study-snapshot-2026T02:00': { name: 'second-snapshot' }, + }); + mockStorageEngine!.getAllParticipantsData.mockImplementation((snapshotStudyId: string) => { + if (snapshotStudyId === 'test-study-snapshot-2026T01:00') { + return firstBackfill; + } + + return Promise.resolve([{ completed: false, rejected: false }]); + }); + mockStorageEngine!.updateSnapshotParticipantCounts.mockImplementation((_, snapshotName: string) => { + if (snapshotName === 'dev-test-study-snapshot-2026T01:00') { + return firstUpdate; + } + + return Promise.resolve(); + }); + + await act(async () => { + render( []} />); + }); + + await waitFor(() => { + expect(mockStorageEngine!.getAllParticipantsData).toHaveBeenCalledTimes(1); + }); + expect(mockStorageEngine!.getAllParticipantsData).toHaveBeenCalledWith('test-study-snapshot-2026T01:00'); + expect(mockStorageEngine!.updateSnapshotParticipantCounts).not.toHaveBeenCalled(); + + await act(async () => { + resolveFirstBackfill([{ completed: true, rejected: false }]); + await firstBackfill; + }); + + await waitFor(() => { + expect(mockStorageEngine!.updateSnapshotParticipantCounts).toHaveBeenCalledTimes(1); + }); + expect(mockStorageEngine!.getAllParticipantsData).toHaveBeenCalledTimes(1); + + await act(async () => { + resolveFirstUpdate(); + await firstUpdate; + }); + + await waitFor(() => { + expect(mockStorageEngine!.getAllParticipantsData).toHaveBeenCalledTimes(2); + }); + expect(mockStorageEngine!.getAllParticipantsData).toHaveBeenCalledWith('test-study-snapshot-2026T02:00'); + }); + + test('DataManagementItem keeps snapshot actions available when count backfill fails', async () => { + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { }); + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'dev-test-study-snapshot-2026T01:00': { name: 'snap-one' }, + }); + mockStorageEngine!.getAllParticipantsData.mockRejectedValue(new Error('snapshot unavailable')); + + await act(async () => { + render( []} />); + }); + + await waitFor(() => { + expect(screen.getAllByText('Unavailable').length).toBe(3); + }); + expect(screen.getByRole('button', { name: 'Rename snapshot snap-one' })).toBeDefined(); + expect(screen.getByRole('button', { name: 'Restore snapshot snap-one' })).toBeDefined(); + expect(screen.getByRole('button', { name: 'Delete snapshot snap-one' })).toBeDefined(); + expect(consoleSpy).toHaveBeenCalledWith( + 'Failed to backfill participant counts for snapshot dev-test-study-snapshot-2026T01:00:', + expect.any(Error), + ); + }); + + test('DataManagementItem getDateFromSnapshotName returns null for key without snapshot pattern', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'plain-key': { name: 'no-date-snap' }, + }); + await act(async () => { + render( []} />); + }); + // snapshot renders but date cell is null — just verify the row appears without throwing + expect(screen.getByText('no-date-snap')).toBeDefined(); + }); + + test('DataManagementItem createSnapshot called via handleCreateSnapshot', async () => { + await act(async () => { + render( []} />); + }); + fireEvent.click(screen.getByText('Snapshot')); + expect(openConfirmModal).toHaveBeenCalled(); + // invoke the onConfirm callback directly + const call = (openConfirmModal as ReturnType).mock.calls[0][0]; + await act(async () => { await call.onConfirm(); }); + expect(mockStorageEngine!.createSnapshot).toHaveBeenCalledWith('test-study', false); + }); + + test('DataManagementItem handleArchiveData calls createSnapshot with archive=true', async () => { + await act(async () => { + render( []} />); + }); + // open archive modal + fireEvent.click(screen.getByText('Archive')); + // type the study id to enable the button + const input = screen.getByPlaceholderText('test-study'); + fireEvent.change(input, { target: { value: 'test-study' } }); + // The second "Archive" text is the confirm button inside the modal + const archiveButtons = screen.getAllByText('Archive').map((el) => el.closest('button')!); + await act(async () => { fireEvent.click(archiveButtons[archiveButtons.length - 1]); }); + expect(mockStorageEngine!.createSnapshot).toHaveBeenCalledWith('test-study', true); + }); + + test('DataManagementItem handleDeleteLive calls removeSnapshotOrLive', async () => { + await act(async () => { + render( []} />); + }); + fireEvent.click(screen.getByText('Delete')); + const input = screen.getByPlaceholderText('test-study'); + fireEvent.change(input, { target: { value: 'test-study' } }); + // The second "Delete" text is the confirm button inside the modal + const deleteButtons = screen.getAllByText('Delete').map((el) => el.closest('button')!); + await act(async () => { fireEvent.click(deleteButtons[deleteButtons.length - 1]); }); + expect(mockStorageEngine!.removeSnapshotOrLive).toHaveBeenCalledWith('test-study', 'test-study'); + }); + + test('DataManagementItem rename snapshot action works from snapshot row', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'test-study-snapshot-2026T01:00': { name: 'snap-one' }, + }); + await act(async () => { + render( []} />); + }); + const pencilBtn = screen.getByRole('button', { name: 'Rename snapshot snap-one' }); + fireEvent.click(pencilBtn); + const renameInput = screen.getByPlaceholderText('test-study-snapshot-2026T01:00'); + fireEvent.change(renameInput, { target: { value: 'new-name' } }); + await act(async () => { fireEvent.click(screen.getByText('Rename')); }); + expect(mockStorageEngine!.renameSnapshot).toHaveBeenCalledWith('test-study-snapshot-2026T01:00', 'new-name', 'test-study'); + }); + + test('DataManagementItem delete snapshot modal calls removeSnapshotOrLive', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'test-study-snapshot-2026T01:00': { name: 'snap-one' }, + }); + await act(async () => { + render( []} />); + }); + const trashBtn = screen.getByRole('button', { name: 'Delete snapshot snap-one' }); + fireEvent.click(trashBtn); + const input = screen.getByPlaceholderText('test-study'); + fireEvent.change(input, { target: { value: 'test-study' } }); + // The second "Delete" text is the confirm button inside the modal + const deleteButtons = screen.getAllByText('Delete').map((el) => el.closest('button')!); + await act(async () => { fireEvent.click(deleteButtons[deleteButtons.length - 1]); }); + expect(mockStorageEngine!.removeSnapshotOrLive).toHaveBeenCalledWith('test-study-snapshot-2026T01:00', 'test-study'); + }); + + test('DataManagementItem restore snapshot modal fires via openConfirmModal', async () => { + mockStorageEngine!.getSnapshots.mockResolvedValue({ + 'test-study-snapshot-2026T01:00': { name: 'snap-one' }, + }); + await act(async () => { + render( []} />); + }); + const refreshBtn = screen.getByRole('button', { name: 'Restore snapshot snap-one' }); + fireEvent.click(refreshBtn); + expect(openConfirmModal).toHaveBeenCalled(); + const call = (openConfirmModal as ReturnType).mock.calls[0][0]; + await act(async () => { await call.onConfirm(); }); + expect(mockStorageEngine!.restoreSnapshot).toHaveBeenCalledWith('test-study', 'test-study-snapshot-2026T01:00'); + }); + + test('DataManagementItem snapshotAction shows notification on failure', async () => { + mockStorageEngine!.createSnapshot.mockResolvedValue({ + status: 'ERROR', + error: { title: 'Test error', message: 'Something went wrong' }, + }); + await act(async () => { + render( []} />); + }); + fireEvent.click(screen.getByText('Snapshot')); + const call = (openConfirmModal as ReturnType).mock.calls[0][0]; + await act(async () => { await call.onConfirm(); }); + expect(showNotification).toHaveBeenCalledWith(expect.objectContaining({ color: 'red' })); + }); +}); diff --git a/src/analysis/individualStudy/replay/AllTasksTimeline.tsx b/src/analysis/individualStudy/replay/AllTasksTimeline.tsx index bde12d1ce2..4ee3927254 100644 --- a/src/analysis/individualStudy/replay/AllTasksTimeline.tsx +++ b/src/analysis/individualStudy/replay/AllTasksTimeline.tsx @@ -1,5 +1,5 @@ import { - JSX, useMemo, + JSX, useMemo, useState, } from 'react'; import * as d3 from 'd3'; import { @@ -8,10 +8,15 @@ import { import { ParticipantData } from '../../../storage/types'; import { SingleTaskLabelLines } from './SingleTaskLabelLines'; import { SingleTask } from './SingleTask'; -import { StoredAnswer, StudyConfig } from '../../../parser/types'; -import { componentAnswersAreCorrect } from '../../../utils/correctAnswer'; +import { StudyConfig } from '../../../parser/types'; +import { getComponentAnswerStatus } from '../../../utils/correctAnswer'; import { parseConditionParam } from '../../../utils/handleConditionLogic'; import { studyComponentToIndividualComponent } from '../../../utils/handleComponentInheritance'; +import { + compareReplayAnswerEntries, + orderedReplayAnswerEntries, + ReplayTaskOrder, +} from './taskOrdering'; const LABEL_GAP = 25; const CHARACTER_SIZE = 8; @@ -20,15 +25,11 @@ const margin = { left: 20, top: 20, right: 20, bottom: 20, }; -const sortedTaskNames = (a: [string, StoredAnswer], b: [string, StoredAnswer]) => { - const splitA = a[1].trialOrder.split('_'); - const splitB = b[1].trialOrder.split('_'); - return splitA[0] === splitB[0] ? +splitA[1] - +splitB[1] : +splitA[0] - +splitB[0]; -}; - export function AllTasksTimeline({ - participantData, width, studyId, studyConfig, maxLength, -}: { participantData: ParticipantData, width: number, studyId: string, studyConfig: StudyConfig | undefined, maxLength: number | undefined }) { + participantData, width, studyId, studyConfig, maxLength, taskOrder = 'sequence', +}: { participantData: ParticipantData, width: number, studyId: string, studyConfig: StudyConfig | undefined, maxLength: number | undefined, taskOrder?: ReplayTaskOrder }) { + const [hoveredTaskIdentifier, setHoveredTaskIdentifier] = useState(null); + const percentComplete = useMemo(() => { const incompleteEntries = Object.entries(participantData.answers || {}).filter((e) => e[1].startTime === 0); @@ -52,17 +53,25 @@ export function AllTasksTimeline({ }, [participantData.answers, percentComplete, width]); const maxHeight = useMemo(() => { - const sortedEntries = Object.entries(participantData.answers || {}).filter((answer) => !!(answer[1].startTime)).sort((a, b) => a[1].startTime - b[1].startTime); + const incompleteEntries = Object.entries(participantData.answers || {}).filter((e) => e[1].startTime === 0).sort(compareReplayAnswerEntries); + const incompleteEntryIndexes = new Map(incompleteEntries.map(([identifier], index) => [identifier, index])); + const sortedEntries = orderedReplayAnswerEntries(participantData.answers, taskOrder); let currentHeight = 0; let _maxHeight = 0; sortedEntries.forEach((entry, i) => { - const [_name, answer] = entry; + const [identifier, answer] = entry; + // Check if the previous entry overlaps with the current entry const prev = i > 0 ? sortedEntries[i - currentHeight - 1] : null; + const prevScale = prev && prev[1].startTime ? xScale : incompleteXScale; + const prevStart = prev ? prev[1].startTime ? prev[1].startTime : incompleteEntryIndexes.get(prev[0]) ?? 0 : 0; + const scale = answer.startTime === 0 ? incompleteXScale : xScale; + const scaleStart = answer.startTime ? answer.startTime : incompleteEntryIndexes.get(identifier) ?? 0; - if (prev && prev[0].length * (CHARACTER_SIZE + 1) + xScale(prev[1].startTime) > xScale(answer.startTime)) { + // If the previous entry overlaps with the current entry , increase the height + if (prev && prev[0].length * (CHARACTER_SIZE + 1) + prevScale(prevStart) > scale(scaleStart)) { currentHeight += 1; } else { currentHeight = 0; @@ -74,7 +83,7 @@ export function AllTasksTimeline({ }); return (_maxHeight + 1) * LABEL_GAP + margin.top + margin.bottom; - }, [participantData.answers, xScale]); + }, [incompleteXScale, participantData.answers, taskOrder, xScale]); const conditionParam = useMemo(() => { const parsedConditions = parseConditionParam(participantData.conditions ?? participantData.searchParams?.condition); @@ -82,26 +91,25 @@ export function AllTasksTimeline({ }, [participantData.conditions, participantData.searchParams?.condition]); // Creating labels for the tasks - const tasks: { line: JSX.Element, label: JSX.Element }[] = useMemo(() => { + const tasks: { identifier: string, line: JSX.Element, label: JSX.Element }[] = useMemo(() => { let currentHeight = 0; - const incompleteEntries = Object.entries(participantData.answers || {}).filter((e) => e[1].startTime === 0).sort(sortedTaskNames); - - const sortedEntries = Object.entries(participantData.answers || {}).filter((answer) => !!(answer[1].startTime)).sort((a, b) => a[1].startTime - b[1].startTime); - - const combined = [...sortedEntries, ...incompleteEntries]; + const incompleteEntries = Object.entries(participantData.answers || {}).filter((e) => e[1].startTime === 0).sort(compareReplayAnswerEntries); + const incompleteEntryIndexes = new Map(incompleteEntries.map(([identifier], index) => [identifier, index])); + const combined = orderedReplayAnswerEntries(participantData.answers, taskOrder); const allElements = combined.map((entry, i) => { const scale = entry[1].startTime === 0 ? incompleteXScale : xScale; - const [name, answer] = entry; + const [identifier, answer] = entry; const prev = i > 0 ? combined[i - currentHeight - 1] : null; const prevScale = prev && prev[1].startTime ? xScale : incompleteXScale; - const prevStart = prev ? prev[1].startTime ? prev[1].startTime : incompleteEntries.indexOf(prev) : 0; - const scaleStart = answer.startTime ? answer.startTime : incompleteEntries.indexOf(entry); - const scaleEnd = answer.endTime > 0 ? answer.endTime : incompleteEntries.indexOf(entry) + 1; + const prevStart = prev ? prev[1].startTime ? prev[1].startTime : incompleteEntryIndexes.get(prev[0]) ?? 0 : 0; + const incompleteEntryIndex = incompleteEntryIndexes.get(identifier) ?? 0; + const scaleStart = answer.startTime ? answer.startTime : incompleteEntryIndex; + const scaleEnd = answer.endTime > 0 ? answer.endTime : incompleteEntryIndex + 1; if (prev && prev[0].length * (CHARACTER_SIZE + 1) + prevScale(prevStart) > scale(scaleStart)) { currentHeight += 1; @@ -109,23 +117,23 @@ export function AllTasksTimeline({ currentHeight = 0; } - const split = name.split('_'); - const joinExceptLast = split.slice(0, split.length - 1).join('_'); - - const component = studyConfig?.components[joinExceptLast]; + const component = studyConfig?.components[answer.componentName]; const resolvedComponent = component && studyConfig ? studyComponentToIndividualComponent(component, studyConfig) : undefined; - const isCorrect = componentAnswersAreCorrect(answer.answer, answer.correctAnswer, resolvedComponent?.response); - const hasCorrect = !!((resolvedComponent && resolvedComponent.correctAnswer) || answer.correctAnswer.length > 0); + const correctAnswers = answer.correctAnswer.length > 0 + ? answer.correctAnswer + : resolvedComponent?.correctAnswer; + const answerStatus = getComponentAnswerStatus(answer, correctAnswers, resolvedComponent?.response); const hasAudio = resolvedComponent?.recordAudio ?? studyConfig?.uiConfig?.recordAudio ?? false; const hasScreenRecording = resolvedComponent?.recordScreen ?? studyConfig?.uiConfig?.recordScreen ?? false; return { - line: , + identifier, + line: , label: ( - + setHoveredTaskIdentifier(identifier)} onHoverEnd={() => setHoveredTaskIdentifier(null)} /> ), }; }); return allElements; - }, [participantData.answers, participantData.participantId, incompleteXScale, xScale, studyConfig, maxHeight, studyId, conditionParam]); + }, [participantData.answers, participantData.participantId, incompleteXScale, xScale, studyConfig, maxHeight, studyId, conditionParam, hoveredTaskIdentifier, taskOrder]); // Find entries of someone browsing away. Show them const browsedAway = useMemo(() => { const sortedEntries = Object.entries(participantData.answers || {}).sort((a, b) => a[1].startTime - b[1].startTime); return sortedEntries.map((entry) => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [name, answer] = entry; + const [, answer] = entry; const browsedAwayList: [number, number][] = []; let currentBrowsedAway: [number, number] = [-1, -1]; @@ -185,17 +192,21 @@ export function AllTasksTimeline({ } return ( - browsedAwayList.map((browse, i) => ) + browsedAwayList.map((browse, i) => ) ); }); }, [xScale, maxHeight, participantData.answers]); + const hoveredTask = tasks.find((task) => task.identifier === hoveredTaskIdentifier); + const nonHoveredTasks = tasks.filter((task) => task.identifier !== hoveredTaskIdentifier); + return (
- + setHoveredTaskIdentifier(null)} style={{ width, height: maxHeight, overflow: 'visible' }}> {tasks.map((t) => t.line)} - {tasks.map((t) => t.label)} + {nonHoveredTasks.map((t) => t.label)} + {hoveredTask?.label} {browsedAway} diff --git a/src/analysis/individualStudy/replay/SingleTask.tsx b/src/analysis/individualStudy/replay/SingleTask.tsx index 7fa6a2c976..6de5493ac2 100644 --- a/src/analysis/individualStudy/replay/SingleTask.tsx +++ b/src/analysis/individualStudy/replay/SingleTask.tsx @@ -1,4 +1,3 @@ -import { useState } from 'react'; import { Center, Group, Text } from '@mantine/core'; import * as d3 from 'd3'; @@ -7,22 +6,24 @@ import { IconCheck, IconDeviceDesktop, IconMicrophone, IconProgress, IconX, } from '@tabler/icons-react'; import { useNavigateToTrial } from '../../../utils/useNavigateToTrial'; +import type { ComponentAnswerStatus } from '../../../utils/correctAnswer'; +import { UnknownAnswerIcon } from '../../../components/interface/UnknownAnswerIcon'; const LABEL_MARGIN = 3; const TIMELINE_HEIGHT = 25; const LABEL_DISTANCE = 25; const LABEL_HEIGHT = 20; const TASK_GAP = 1; +const LABEL_MAX_WIDTH = 160; const ICON_SIZE = 14; const ICON_GAP = 2; export function SingleTask({ xScale, - name, + identifier, height, labelHeight = 0, - isCorrect, - hasCorrect, + answerStatus, hasAudio, hasScreenRecording, scaleStart, @@ -32,13 +33,16 @@ export function SingleTask({ participantId, studyId, condition, + isHovered = false, + isDimmed = false, + onHover, + onHoverEnd, }: { - name: string, + identifier: string, height: number, xScale: d3.ScaleLinear, labelHeight?: number, - isCorrect: boolean, - hasCorrect: boolean, + answerStatus: ComponentAnswerStatus | null, hasAudio: boolean, hasScreenRecording: boolean, scaleStart: number, @@ -48,22 +52,50 @@ export function SingleTask({ participantId: string, studyId: string, condition?: string + isHovered?: boolean, + isDimmed?: boolean, + onHover?: () => void, + onHoverEnd?: () => void, }) { - const [isHover, setIsHover] = useState(false); - const [ref, { width: labelWidth }] = useResizeObserver(); const navigateToTrial = useNavigateToTrial(); - const iconCount = (incomplete || hasCorrect ? 1 : 0) + (hasAudio ? 1 : 0) + (hasScreenRecording ? 1 : 0); + const iconCount = (incomplete || answerStatus ? 1 : 0) + (hasAudio ? 1 : 0) + (hasScreenRecording ? 1 : 0); const iconsWidth = iconCount * (ICON_SIZE + ICON_GAP); + const labelOpacity = isDimmed ? 0.35 : 1; + + const answerStatusIcon = answerStatus === 'correct' + ? ( + + ) + : answerStatus === 'incorrect' + ? ( + + ) + : answerStatus === 'unknown' + ? + : null; return ( - navigateToTrial(trialOrder, participantId, studyId, condition)} onMouseEnter={() => setIsHover(true)} onMouseLeave={() => setIsHover(false)} style={{ cursor: 'pointer' }}> + navigateToTrial(trialOrder, participantId, studyId, condition)} + onMouseEnter={onHover} + onMouseLeave={onHoverEnd} + style={{ cursor: 'pointer' }} + > @@ -79,6 +111,7 @@ export function SingleTask({ -
+
- - {name} + + {identifier} {hasScreenRecording && ( )} - {(incomplete ? ( + {incomplete ? ( - ) : hasCorrect ? isCorrect ? ( - - ) : ( - - ) : '')} + ) : answerStatusIcon}
diff --git a/src/analysis/individualStudy/replay/taskOrdering.ts b/src/analysis/individualStudy/replay/taskOrdering.ts new file mode 100644 index 0000000000..00b952494e --- /dev/null +++ b/src/analysis/individualStudy/replay/taskOrdering.ts @@ -0,0 +1,40 @@ +import { StoredAnswer } from '../../../parser/types'; +import { parseTrialOrder } from '../../../utils/parseTrialOrder'; + +export type ReplayAnswerEntry = [string, StoredAnswer]; +export type ReplayTaskOrder = 'sequence' | 'answer-time'; + +export function compareReplayAnswerEntries(a: ReplayAnswerEntry, b: ReplayAnswerEntry) { + const aOrder = parseTrialOrder(a[1].trialOrder); + const bOrder = parseTrialOrder(b[1].trialOrder); + + if (aOrder.step !== bOrder.step) { + return (aOrder.step ?? Number.MAX_SAFE_INTEGER) - (bOrder.step ?? Number.MAX_SAFE_INTEGER); + } + + if (aOrder.funcIndex !== bOrder.funcIndex) { + return (aOrder.funcIndex ?? -1) - (bOrder.funcIndex ?? -1); + } + + return a[0].localeCompare(b[0]); +} + +export function orderedReplayAnswerEntries( + answers: Record = {}, + taskOrder: ReplayTaskOrder = 'sequence', +) { + const entries = Object.entries(answers); + + if (taskOrder === 'answer-time') { + const completed = entries + .filter(([, answer]) => answer.startTime !== 0) + .sort((a, b) => a[1].startTime - b[1].startTime || compareReplayAnswerEntries(a, b)); + const incomplete = entries + .filter(([, answer]) => answer.startTime === 0) + .sort(compareReplayAnswerEntries); + + return [...completed, ...incomplete]; + } + + return entries.sort(compareReplayAnswerEntries); +} diff --git a/src/analysis/individualStudy/replay/tests/AllTasksTimeline.spec.tsx b/src/analysis/individualStudy/replay/tests/AllTasksTimeline.spec.tsx new file mode 100644 index 0000000000..86fd6945cc --- /dev/null +++ b/src/analysis/individualStudy/replay/tests/AllTasksTimeline.spec.tsx @@ -0,0 +1,414 @@ +import { ReactNode } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { + describe, expect, test, vi, +} from 'vitest'; +import * as d3 from 'd3'; +import { StudyConfig } from '../../../../parser/types'; +import { ParticipantData } from '../../../../storage/types'; +import type { StoredAnswer } from '../../../../store/types'; +import { createMockStudyConfig } from '../../../tests/testUtils'; +import { makeStoredAnswer, makeParticipant as _makeParticipant } from '../../../../tests/utils'; +import { AllTasksTimeline } from '../AllTasksTimeline'; +import { SingleTask } from '../SingleTask'; +import { SingleTaskLabelLines } from '../SingleTaskLabelLines'; + +// ── mocks ──────────────────────────────────────────────────────────────────── + +vi.mock('@mantine/core', () => ({ + Center: ({ children }: { children: ReactNode }) =>
{children}
, + Stack: ({ children }: { children: ReactNode }) =>
{children}
, + Tooltip: ({ children, label }: { children: ReactNode; label?: ReactNode }) => ( +
+
{label}
+ {children} +
+ ), + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Group: ({ children }: { children: ReactNode }) =>
{children}
, +})); + +vi.mock('@tabler/icons-react', () => ({ + IconCheck: ({ + 'aria-label': ariaLabel, + color, + }: { + 'aria-label'?: string; + color?: string; + }) => icon-check, + IconMicrophone: () => icon-microphone, + IconProgress: () => icon-progress, + IconX: () => icon-x, +})); + +vi.mock('@mantine/hooks', () => ({ + useResizeObserver: () => [{ current: null }, { width: 60, height: 20 }], +})); + +vi.mock('../../../../utils/useNavigateToTrial', () => ({ + useNavigateToTrial: () => vi.fn(), +})); + +vi.mock('../../../../utils/handleConditionLogic', () => ({ + parseConditionParam: vi.fn(() => []), +})); + +// ── fixtures ───────────────────────────────────────────────────────────────── + +const t0 = 1_700_000_000_000; + +function makeAnswer(overrides: Partial = {}): StoredAnswer { + return makeStoredAnswer({ + componentName: 'trial1', + trialOrder: '0_0', + startTime: t0, + endTime: t0 + 10_000, + ...overrides, + }); +} + +function makeParticipant(overrides: Partial & { answers?: Record } = {}) { + return _makeParticipant({ + participantId: 'pid-1', + participantConfigHash: 'hash-1', + answers: { trial1_0: makeAnswer() }, + ...overrides, + }); +} + +const emptyConfig: StudyConfig = createMockStudyConfig(); + +const xScale = d3.scaleLinear([0, 500]).domain([0, 1000]); + +// ── SingleTaskLabelLines ────────────────────────────────────────────────────── + +describe('SingleTaskLabelLines', () => { + test('renders a element with computed coordinates', () => { + const scale = d3.scaleLinear([0, 400]).domain([0, 100]); + const html = renderToStaticMarkup( + + + , + ); + // scaleStart=50 → scale(50)=200; x1=x2=202; y1=100-45-0=55; y2=100-25=75 + expect(html).toContain('x1="202"'); + expect(html).toContain('x2="202"'); + expect(html).toContain('y1="55"'); + expect(html).toContain('y2="75"'); + }); + + test('applies labelHeight offset to y1', () => { + const scale = d3.scaleLinear([0, 400]).domain([0, 100]); + const html = renderToStaticMarkup( + + + , + ); + // y1 = height - 45 - labelHeight = 100 - 45 - 25 = 30 + expect(html).toContain('y1="30"'); + }); +}); + +// ── SingleTask ──────────────────────────────────────────────────────────────── + +describe('SingleTask', () => { + const baseProps = { + identifier: 'trial1_0', + height: 100, + xScale, + scaleStart: 0, + scaleEnd: 100, + trialOrder: '0_0', + participantId: 'pid-1', + studyId: 'test-study', + incomplete: false, + answerStatus: null, + hasAudio: false, + hasScreenRecording: false, + }; + + test('renders task name', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('trial1_0'); + }); + + test('shows check icon for a correct response', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-check'); + }); + + test('shows x icon for an incorrect response', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-x'); + }); + + test('shows an accessible grey checkmark for an unknown response', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-check'); + expect(html).toContain('var(--mantine-color-gray-6)'); + expect(html).toContain('Response recorded; correctness not configured.'); + }); + + test('shows microphone icon when hasAudio', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-microphone'); + }); + + test('shows progress icon when incomplete', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-progress'); + }); + + test('shows no answer-status icon when status is null', () => { + const html = renderToStaticMarkup(); + expect(html).not.toContain('icon-check'); + expect(html).not.toContain('icon-x'); + expect(html).not.toContain('Response recorded; correctness not configured.'); + }); +}); + +// ── AllTasksTimeline ────────────────────────────────────────────────────────── + +describe('AllTasksTimeline', () => { + test('renders an SVG element', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain(' { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('trial1_0'); + }); + + test('shows an unknown indicator and tooltip value for an answer without configured correctness', () => { + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ startTime: t0, endTime: t0 + 5_000, answer: { q1: 'yes' } }), + }, + }); + + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('q1'); + expect(html).toContain('yes'); + expect(html).toContain('icon-check'); + expect(html).toContain('var(--mantine-color-gray-6)'); + expect(html).toContain('Response recorded; correctness not configured.'); + }); + + test('handles participant with incomplete answer (startTime === 0)', () => { + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ startTime: t0, endTime: t0 + 5_000 }), + trial2_1: makeAnswer({ + componentName: 'trial2', startTime: 0, endTime: 0, trialOrder: '1_0', + }), + }, + }); + + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('trial1_0'); + expect(html).toContain('trial2_1'); + }); + + test('handles browsed-away window events', () => { + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ + windowEvents: [ + [t0 + 1_000, 'visibility', 'hidden'], + [t0 + 3_000, 'visibility', 'visible'], + ], + }), + }, + }); + + const html = renderToStaticMarkup( + , + ); + // Browsed-away rect should be rendered inside a Tooltip + expect(html).toContain(' { + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ + endTime: t0 + 20_000, + windowEvents: [ + [t0 + 500, 'mousemove', [100, 200]], + [t0 + 1_000, 'mousedown', [150, 250]], + [t0 + 1_100, 'mouseup', [150, 250]], + [t0 + 2_000, 'keydown', 'Enter'], + [t0 + 2_100, 'keyup', 'Enter'], + [t0 + 3_000, 'scroll', [0, 300]], + [t0 + 4_000, 'focus', 'input#name'], + [t0 + 5_000, 'input', 'input#name'], + [t0 + 6_000, 'resize', [1024, 768]], + [t0 + 7_000, 'visibility', 'hidden'], + [t0 + 9_000, 'visibility', 'visible'], + ], + }), + }, + }); + + const html = renderToStaticMarkup( + , + ); + expect(html).toContain(' { + // With maxLength set, the xScale domain is [start, start + maxLength] + // — just verify the component renders without error + const html = renderToStaticMarkup( + , + ); + expect(html).toContain(' { + // parseConditionParam is mocked to return [] by default; just verify + // the component renders without error when conditions field is set + const participant = makeParticipant({ + conditions: ['condA', 'condB'], + }); + + const html = renderToStaticMarkup( + , + ); + expect(html).toContain(' { + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ startTime: t0, endTime: t0 + 5_000, answer: { q1: null } }), + }, + }); + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('N/A'); + }); + + test('tooltip JSON.stringifies object answer values', () => { + // Use an array so JSON.stringify produces no string-quoted keys (avoids HTML entity encoding) + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ startTime: t0, endTime: t0 + 5_000, answer: { q1: [1, 2] } }), + }, + }); + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('[1,2]'); + }); + + test('sortedTaskNames comparator runs with multiple incomplete answers', () => { + // Three incomplete answers: two share trialOrder prefix "0" (hits true branch), + // one has prefix "1" (hits false branch of the prefix comparison) + const participant = makeParticipant({ + answers: { + trial1_0: makeAnswer({ + componentName: 'trial1', startTime: 0, endTime: 0, trialOrder: '0_0', + }), + trial2_0: makeAnswer({ + componentName: 'trial2', startTime: 0, endTime: 0, trialOrder: '0_1', + }), + trial3_0: makeAnswer({ + componentName: 'trial3', startTime: 0, endTime: 0, trialOrder: '1_0', + }), + }, + }); + const html = renderToStaticMarkup( + , + ); + expect(html).toContain(' { + test('orders replay entries by trial order instead of recorded timestamps', () => { + const entries = orderedReplayAnswerEntries({ + task_2: answer('task_2', '2', 1000), + task_0: answer('task_0', '0', 3000), + task_1: answer('task_1', '1', 2000), + }); + + expect(entries.map(([identifier]) => identifier)).toEqual(['task_0', 'task_1', 'task_2']); + expect(entries.map(([, storedAnswer]) => storedAnswer.startTime)).toEqual([3000, 2000, 1000]); + }); + + test('orders dynamic entries by parent step and function index', () => { + const entries = orderedReplayAnswerEntries({ + task_3_2: answer('task_3_2', '3_2', 1000), + task_4: answer('task_4', '4', 2000), + task_3_0: answer('task_3_0', '3_0', 3000), + task_3: answer('task_3', '3', 4000), + task_3_1: answer('task_3_1', '3_1', 5000), + }); + + expect(entries.map(([identifier]) => identifier)).toEqual([ + 'task_3', + 'task_3_0', + 'task_3_1', + 'task_3_2', + 'task_4', + ]); + }); + + test('keeps incomplete entries in sequence order with completed entries', () => { + const entries = orderedReplayAnswerEntries({ + task_2: answer('task_2', '2', 0, 0), + task_0: answer('task_0', '0', 1000), + task_1: answer('task_1', '1', 0, 0), + task_3: answer('task_3', '3', 2000), + }); + + expect(entries.map(([identifier]) => identifier)).toEqual(['task_0', 'task_1', 'task_2', 'task_3']); + }); + + test('uses the task identifier as a stable tie-breaker', () => { + const entries = orderedReplayAnswerEntries({ + task_b: answer('task_b', '1', 1000), + task_a: answer('task_a', '1', 2000), + }); + + expect(entries.map(([identifier]) => identifier)).toEqual(['task_a', 'task_b']); + }); + + test('orders completed entries chronologically when answer-time order is selected', () => { + const entries = orderedReplayAnswerEntries({ + task_0: answer('task_0', '0', 3000), + task_2: answer('task_2', '2', 1000), + task_1: answer('task_1', '1', 2000), + }, 'answer-time'); + + expect(entries.map(([identifier]) => identifier)).toEqual(['task_2', 'task_1', 'task_0']); + }); + + test('keeps incomplete entries after chronological entries in sequence order', () => { + const entries = orderedReplayAnswerEntries({ + task_3: answer('task_3', '3', 0, 0), + task_2: answer('task_2', '2', 1000), + task_1: answer('task_1', '1', 0, 0), + task_0: answer('task_0', '0', 2000), + }, 'answer-time'); + + expect(entries.map(([identifier]) => identifier)).toEqual(['task_2', 'task_0', 'task_1', 'task_3']); + }); +}); diff --git a/src/analysis/individualStudy/stats/StatsView.tsx b/src/analysis/individualStudy/stats/StatsView.tsx index c4f118ccbd..fe6dc29aac 100644 --- a/src/analysis/individualStudy/stats/StatsView.tsx +++ b/src/analysis/individualStudy/stats/StatsView.tsx @@ -1,63 +1,63 @@ -import { - Box, Divider, Flex, Paper, Text, -} from '@mantine/core'; -import { useMemo } from 'react'; -import { useParams } from 'react-router'; -import { ParticipantDataWithStatus } from '../../../storage/types'; -import { StudyConfig } from '../../../parser/types'; -import { TrialVisualization } from './TrialVisualization'; -import { StepsPanel } from '../../../components/interface/StepsPanel'; -import { OverviewStats } from '../summary/OverviewStats'; -import { getOverviewStats } from '../summary/utils'; - -export function StatsView( - { - studyConfig, - visibleParticipants, - allConfigs, - studyId, - }: { - studyConfig: StudyConfig; - visibleParticipants: ParticipantDataWithStatus[]; - allConfigs: Record; - studyId?: string; - }, -) { - const { trialId } = useParams(); - - const overviewData = useMemo( - () => (trialId && trialId !== 'end' ? getOverviewStats(visibleParticipants, trialId, studyConfig, allConfigs) : null), - [studyConfig, visibleParticipants, trialId, allConfigs], - ); - - return ( - <> - {overviewData && ( - - )} - - { - (visibleParticipants.length === 0) - ? ( - - No data available. - - ) - : ( - - {/* Trial selection sidebar */} - - - - - - - {/* Visualization and metadata */} - - - ) - } - - - ); -} +import { + Box, Divider, Flex, Paper, Text, +} from '@mantine/core'; +import { useMemo } from 'react'; +import { useParams } from 'react-router'; +import { ParticipantDataWithStatus } from '../../../storage/types'; +import { StudyConfig } from '../../../parser/types'; +import { TrialVisualization } from './TrialVisualization'; +import { StepsPanel } from '../../../components/interface/StepsPanel'; +import { OverviewStats } from '../summary/OverviewStats'; +import { getOverviewStats } from '../summary/utils'; + +export function StatsView( + { + studyConfig, + visibleParticipants, + allConfigs = {}, + studyId, + }: { + studyConfig: StudyConfig; + visibleParticipants: ParticipantDataWithStatus[]; + allConfigs?: Record; + studyId?: string; + }, +) { + const { trialId } = useParams(); + + const overviewData = useMemo( + () => (trialId && trialId !== 'end' ? getOverviewStats(visibleParticipants, trialId, studyConfig, allConfigs) : null), + [studyConfig, visibleParticipants, trialId, allConfigs], + ); + + return ( + <> + {overviewData && ( + + )} + + { + (visibleParticipants.length === 0) + ? ( + + No data available. + + ) + : ( + + {/* Trial selection sidebar */} + + + + + + + {/* Visualization and metadata */} + + + ) + } + + + ); +} diff --git a/src/analysis/individualStudy/stats/tests/StatsView.spec.tsx b/src/analysis/individualStudy/stats/tests/StatsView.spec.tsx new file mode 100644 index 0000000000..afe11d8772 --- /dev/null +++ b/src/analysis/individualStudy/stats/tests/StatsView.spec.tsx @@ -0,0 +1,364 @@ +import { forwardRef, ReactNode } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { + beforeEach, describe, expect, test, vi, +} from 'vitest'; +import { useParams } from 'react-router'; +import { IndividualComponent, StudyConfig } from '../../../../parser/types'; +import { ParticipantData, ParticipantDataWithStatus } from '../../../../storage/types'; +import { studyComponentToIndividualComponent } from '../../../../utils/handleComponentInheritance'; +import { createMockStudyConfig } from '../../../tests/testUtils'; +import { StatsView } from '../StatsView'; +import { TrialVisualization } from '../TrialVisualization'; +import { ResponseVisualization } from '../ResponseVisualization'; + +// ── mocks ──────────────────────────────────────────────────────────────────── + +vi.mock('react-router', () => ({ + useParams: vi.fn(() => ({})), +})); + +vi.mock('@mantine/hooks', () => ({ + useDisclosure: () => [true, { toggle: vi.fn() }], + useResizeObserver: () => [{ current: null }, { width: 800, height: 400 }], +})); + +vi.mock('react-vega', () => ({ + VegaLite: () =>
VegaLite
, +})); + +vi.mock('@mantine/core', () => ({ + Box: ({ children }: { children: ReactNode }) =>
{children}
, + Divider: () =>
, + Flex: ({ children }: { children: ReactNode }) =>
{children}
, + Paper: forwardRef(function Paper({ children }, ref) { // eslint-disable-line prefer-arrow-callback + return
{children}
; + }), + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Title: ({ children }: { children: ReactNode }) =>
{children}
, + Collapse: ({ children, in: open }: { children: ReactNode; in?: boolean }) => ( + open ?
{children}
: null + ), + Code: ({ children }: { children: ReactNode }) => {children}, + ScrollArea: ({ children }: { children: ReactNode }) =>
{children}
, + SimpleGrid: ({ children }: { children: ReactNode }) =>
{children}
, +})); + +vi.mock('@tabler/icons-react', () => ({ + IconAdjustmentsHorizontal: () => icon-slider, + IconBubbleText: () => icon-text, + IconChartGridDots: () => icon-matrix-cb, + IconChevronDown: () => icon-chevron, + IconCodePlus: () => icon-metadata, + IconCopyCheck: () => icon-buttons, + IconDots: () => icon-likert, + IconDragDrop: () => icon-ranking, + IconGridDots: () => icon-matrix-r, + IconHtml: () => icon-reactive, + IconLetterCase: () => icon-textOnly, + IconNumber123: () => icon-numerical, + IconRadio: () => icon-radio, + IconSelect: () => icon-dropdown, + IconSquares: () => icon-checkbox, +})); + +vi.mock('../../../../components/interface/StepsPanel', () => ({ + StepsPanel: () =>
StepsPanel
, +})); + +vi.mock('../../summary/OverviewStats', () => ({ + OverviewStats: () =>
OverviewStats
, +})); + +vi.mock('../../summary/utils', () => ({ + getOverviewStats: vi.fn(() => ({ + participantCounts: { + total: 5, completed: 3, inProgress: 1, rejected: 1, + }, + startDate: null, + endDate: null, + avgTime: NaN, + avgCleanTime: NaN, + participantsWithInvalidCleanTimeCount: 0, + correctness: NaN, + })), +})); + +vi.mock('../../../../utils/handleComponentInheritance', () => ({ + studyComponentToIndividualComponent: vi.fn(() => ({ + type: 'questionnaire', + response: [], + + })), +})); + +// ── fixtures ───────────────────────────────────────────────────────────────── + +const emptyConfig: StudyConfig = createMockStudyConfig({ + components: { trial1: { type: 'questionnaire', response: [] } }, + sequence: { order: 'fixed', components: ['trial1'] }, +}); + +const mockParticipant: ParticipantDataWithStatus = { + participantId: 'p1', + participantConfigHash: 'hash-1', + sequence: { + id: 'root', order: 'fixed', orderPath: 'root', components: [], skip: [], + }, + participantIndex: 0, + answers: {}, + searchParams: {}, + metadata: { + userAgent: '', resolution: { width: 0, height: 0 }, language: '', ip: '', + }, + completed: true, + rejected: false, + participantTags: [], + stage: 'DEFAULT', +}; + +const mockTrialConfig: IndividualComponent = { + type: 'questionnaire', + response: [], +}; + +// ── StatsView ───────────────────────────────────────────────────────────────── + +describe('StatsView', () => { + beforeEach(() => { + vi.mocked(useParams).mockReturnValue({}); + }); + + test('shows "No data available" when visibleParticipants is empty', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('No data available.'); + }); + + test('shows StepsPanel and TrialVisualization when participants exist', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('StepsPanel'); + }); + + test('shows OverviewStats when trialId is set and not "end"', () => { + vi.mocked(useParams).mockReturnValue({ trialId: 'trial1' }); + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('OverviewStats'); + }); + + test('no OverviewStats when trialId is undefined', () => { + vi.mocked(useParams).mockReturnValue({}); + const html = renderToStaticMarkup( + , + ); + expect(html).not.toContain('OverviewStats'); + }); + + test('no OverviewStats when trialId is "end"', () => { + vi.mocked(useParams).mockReturnValue({ trialId: 'end' }); + const html = renderToStaticMarkup( + , + ); + expect(html).not.toContain('OverviewStats'); + }); +}); + +// ── TrialVisualization ─────────────────────────────────────────────────────── + +describe('TrialVisualization', () => { + test('shows "No trial selected" when trialId is undefined', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('No trial selected'); + }); + + test('shows end-component message when trialId is "end"', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('The end component has no data.'); + }); + + test('renders ResponseVisualization items when trialId matches a component', () => { + vi.mocked(studyComponentToIndividualComponent).mockReturnValue({ + type: 'questionnaire', + response: [{ + type: 'radio', id: 'q1', prompt: 'Pick one', options: [], + }], + }); + + const html = renderToStaticMarkup( + , + ); + // Config and Timing metadata block + q1 response block + expect(html).toContain('Config and Timing'); + expect(html).toContain('q1'); + }); +}); + +// ── ResponseVisualization ──────────────────────────────────────────────────── + +describe('ResponseVisualization', () => { + const baseProps = { + participantData: [] as ParticipantData[], + trialId: 'trial1', + trialConfig: mockTrialConfig, + }; + + test('metadata type: shows icon and config JSON code block', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-metadata'); + expect(html).toContain('Config and Timing'); + // JSON of trialConfig rendered in Code block (quotes are HTML-entity encoded) + expect(html).toContain('questionnaire'); + }); + + test('metadata type: renders VegaLite timing histogram in right panel', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('VegaLite'); + }); + + test('shortText type: shows text icon and Response Values section', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-text'); + expect(html).toContain('Response Values'); + }); + + test('textOnly type: shows N/A for response values', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('N/A'); + }); + + test('radio type: shows radio icon and VegaLite chart', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-radio'); + expect(html).toContain('VegaLite'); + }); + + test('numerical type: shows numerical icon and VegaLite chart', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-numerical'); + expect(html).toContain('VegaLite'); + }); + + test('slider type: shows slider icon and VegaLite chart', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-slider'); + expect(html).toContain('VegaLite'); + }); + + test('likert type: shows likert icon and VegaLite chart', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-likert'); + expect(html).toContain('VegaLite'); + }); + + test('matrix-radio type: shows matrix icon and VegaLite chart', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-matrix-r'); + expect(html).toContain('VegaLite'); + }); + + test('matrix-checkbox type: shows matrix-cb icon and VegaLite chart', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('icon-matrix-cb'); + expect(html).toContain('VegaLite'); + }); + + test('shows Response Specification JSON for non-metadata types', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Response Specification'); + }); + + test('shows Correct Answer block when trialConfig has a matching correctAnswer', () => { + const trialConfigWithAnswer: IndividualComponent = { + ...mockTrialConfig, + correctAnswer: [{ id: 'q1', answer: 'A' }], + }; + + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Correct Answer'); + }); +}); diff --git a/src/analysis/individualStudy/summary/ComponentStats.tsx b/src/analysis/individualStudy/summary/ComponentStats.tsx index 911d3c659b..cfceab7573 100644 --- a/src/analysis/individualStudy/summary/ComponentStats.tsx +++ b/src/analysis/individualStudy/summary/ComponentStats.tsx @@ -114,14 +114,14 @@ function renderConfigListCell( export function ComponentStats({ visibleParticipants, studyConfig, - allConfigs, - selectedConfigRows, + allConfigs = {}, + selectedConfigRows = [], currentConfigLabel, }: { visibleParticipants: ParticipantDataWithStatus[]; studyConfig: StudyConfig; - allConfigs: Record; - selectedConfigRows: Array<{ configHash: string; configLabel: string; studyConfig: StudyConfig }>; + allConfigs?: Record; + selectedConfigRows?: Array<{ configHash: string; configLabel: string; studyConfig: StudyConfig }>; currentConfigLabel?: string; }) { const useSelectedConfigRows = selectedConfigRows.length > 0; diff --git a/src/analysis/individualStudy/summary/ResponseStats.tsx b/src/analysis/individualStudy/summary/ResponseStats.tsx index e67f1e7794..9a73e1916a 100644 --- a/src/analysis/individualStudy/summary/ResponseStats.tsx +++ b/src/analysis/individualStudy/summary/ResponseStats.tsx @@ -114,14 +114,14 @@ function renderResponseConfigListCell( export function ResponseStats({ visibleParticipants, studyConfig, - allConfigs, - selectedConfigRows, + allConfigs = {}, + selectedConfigRows = [], currentConfigLabel, }: { visibleParticipants: ParticipantDataWithStatus[]; studyConfig: StudyConfig; - allConfigs: Record; - selectedConfigRows: Array<{ configHash: string; configLabel: string; studyConfig: StudyConfig }>; + allConfigs?: Record; + selectedConfigRows?: Array<{ configHash: string; configLabel: string; studyConfig: StudyConfig }>; currentConfigLabel?: string; }) { const useSelectedConfigRows = selectedConfigRows.length > 0; diff --git a/src/analysis/individualStudy/summary/SummaryView.tsx b/src/analysis/individualStudy/summary/SummaryView.tsx index 41eb2f1dda..909dd990b8 100644 --- a/src/analysis/individualStudy/summary/SummaryView.tsx +++ b/src/analysis/individualStudy/summary/SummaryView.tsx @@ -10,18 +10,18 @@ import { getOverviewStats } from './utils'; export function SummaryView({ visibleParticipants, studyConfig, - allConfigs, + allConfigs = {}, studyId, - showStoredCountMismatch, - includedParticipants, + showStoredCountMismatch = false, + includedParticipants = ['completed', 'inProgress', 'rejected'], currentConfigLabel, }: { visibleParticipants: ParticipantDataWithStatus[]; studyConfig: StudyConfig; - allConfigs: Record; + allConfigs?: Record; studyId?: string; - showStoredCountMismatch: boolean; - includedParticipants: string[]; + showStoredCountMismatch?: boolean; + includedParticipants?: string[]; currentConfigLabel?: string; }) { const overviewData = useMemo( diff --git a/src/analysis/individualStudy/summary/tests/SummaryView.spec.tsx b/src/analysis/individualStudy/summary/tests/SummaryView.spec.tsx new file mode 100644 index 0000000000..0fd8a37696 --- /dev/null +++ b/src/analysis/individualStudy/summary/tests/SummaryView.spec.tsx @@ -0,0 +1,249 @@ +import { ReactNode } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { + afterEach, beforeEach, describe, expect, test, vi, +} from 'vitest'; +import { cleanup } from '@testing-library/react'; +import { StudyConfig } from '../../../../parser/types'; +import { ParticipantDataWithStatus } from '../../../../storage/types'; +import { OverviewData } from '../../../types'; +import { useStorageEngine } from '../../../../storage/storageEngineHooks'; +import { useAsync } from '../../../../store/hooks/useAsync'; +import { makeStorageEngine } from '../../../../tests/utils'; +import { createMockStudyConfig } from '../../../tests/testUtils'; +import { SummaryView } from '../SummaryView'; +import { OverviewStats } from '../OverviewStats'; +import { ComponentStats } from '../ComponentStats'; +import { ResponseStats } from '../ResponseStats'; + +// ── capturedTableOptions: intercept MRT ───────────────────────────────────── + +type MrtColumn = { + accessorKey?: string; + header?: string; + Cell: ({ cell }: { cell: { getValue(): number } }) => string; +}; + +let capturedTableOptions: { columns: MrtColumn[] } | null = null; + +vi.mock('mantine-react-table', () => ({ + MantineReactTable: () =>
MantineReactTable
, + useMantineReactTable: (options: { columns: MrtColumn[] }) => { + capturedTableOptions = options; + return options; + }, +})); + +vi.mock('@mantine/core', () => ({ + Paper: ({ children }: { children: ReactNode }) =>
{children}
, + Stack: ({ children }: { children: ReactNode }) =>
{children}
, + Group: ({ children }: { children: ReactNode }) =>
{children}
, + Title: ({ children }: { children: ReactNode }) =>

{children}

, + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Flex: ({ children }: { children: ReactNode }) =>
{children}
, + Badge: ({ children }: { children: ReactNode }) => {children}, + Tooltip: ({ children, label }: { children: ReactNode; label?: string }) => ( +
{children}
+ ), +})); + +vi.mock('@tabler/icons-react', () => ({ + IconAlertTriangle: () => alert, +})); + +vi.mock('../../../../storage/storageEngineHooks', () => ({ + useStorageEngine: vi.fn(() => ({ storageEngine: undefined })), +})); + +vi.mock('../../../../store/hooks/useAsync', () => ({ + useAsync: vi.fn(() => ({ value: null, status: 'idle', error: null })), +})); + +// ── fixture helpers ────────────────────────────────────────────────────────── + +function makeOverviewData(overrides: Partial = {}): OverviewData { + return { + participantCounts: { + total: 10, completed: 7, inProgress: 2, rejected: 1, + }, + startDate: new Date('2026-01-01'), + endDate: new Date('2026-03-01'), + avgTime: 45.3, + avgCleanTime: 42.1, + participantsWithInvalidCleanTimeCount: 0, + correctness: NaN, + ...overrides, + }; +} + +const emptyConfig: StudyConfig = createMockStudyConfig({ + components: { comp1: { type: 'questionnaire', response: [] } }, + sequence: { order: 'fixed', components: ['comp1'] }, +}); + +const noParticipants: ParticipantDataWithStatus[] = []; + +// ── SummaryView ────────────────────────────────────────────────────────────── + +describe('SummaryView', () => { + test('renders OverviewStats, ComponentStats, and ResponseStats sections', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Overview Statistics'); + expect(html).toContain('Component Statistics'); + expect(html).toContain('Response Statistics'); + }); +}); + +// ── OverviewStats ──────────────────────────────────────────────────────────── + +describe('OverviewStats', () => { + afterEach(() => { + cleanup(); + vi.restoreAllMocks(); + }); + + test('renders participant counts and stat labels', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Total Participants'); + expect(html).toContain('Completed'); + expect(html).toContain('In Progress'); + expect(html).toContain('Rejected'); + expect(html).toContain('Average Time'); + expect(html).toContain('Average Clean Time'); + expect(html).toContain('Correctness'); + }); + + test('shows mismatch alert when stored counts differ from calculated counts', () => { + vi.mocked(useAsync).mockReturnValue({ + execute: vi.fn(), value: { completed: 3, inProgress: 5, rejected: 0 }, status: 'success', error: null, + } as ReturnType); + vi.mocked(useStorageEngine).mockReturnValue({ storageEngine: makeStorageEngine(), setStorageEngine: vi.fn() }); + + const html = renderToStaticMarkup( + , + ); + // Alert triangle appears for the mismatched field + expect(html).toContain('alert'); + }); + + test('no mismatch alert when stored counts match calculated counts', () => { + vi.mocked(useAsync).mockReturnValue({ + execute: vi.fn(), value: { completed: 7, inProgress: 2, rejected: 1 }, status: 'success', error: null, + } as ReturnType); + vi.mocked(useStorageEngine).mockReturnValue({ storageEngine: makeStorageEngine(), setStorageEngine: vi.fn() }); + + const html = renderToStaticMarkup( + , + ); + expect(html).not.toContain('alert'); + }); + + test('shows excluded-participants warning when participantsWithInvalidCleanTimeCount > 0', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('alert'); + }); + + test('no excluded warning when participantsWithInvalidCleanTimeCount is 0', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).not.toContain('alert'); + }); + + test('no stored counts fetched when studyId is undefined', () => { + renderToStaticMarkup( + , + ); + // useAsync should have been called with null as immediate (no fetch) + expect(vi.mocked(useAsync).mock.calls[0][1]).toBeNull(); + }); +}); + +// ── ComponentStats ─────────────────────────────────────────────────────────── + +describe('ComponentStats', () => { + beforeEach(() => { capturedTableOptions = null; }); + + test('renders Component Statistics title', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Component Statistics'); + }); + + test('avgTime Cell renders formatted seconds', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.accessorKey === 'avgTime')!; + expect(col.Cell({ cell: { getValue: () => 30 } })).toBe('30.0s'); + expect(col.Cell({ cell: { getValue: () => NaN } })).toBe('N/A'); + }); + + test('avgCleanTime Cell renders formatted seconds', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.accessorKey === 'avgCleanTime')!; + expect(col.Cell({ cell: { getValue: () => 25.5 } })).toBe('25.5s'); + }); + + test('correctness Cell renders formatted percentage', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.accessorKey === 'correctness')!; + expect(col.Cell({ cell: { getValue: () => 80 } })).toBe('80.0%'); + expect(col.Cell({ cell: { getValue: () => NaN } })).toBe('N/A'); + }); +}); + +// ── ResponseStats ──────────────────────────────────────────────────────────── + +describe('ResponseStats', () => { + beforeEach(() => { capturedTableOptions = null; }); + + test('renders Response Statistics title', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('Response Statistics'); + }); + + test('correctness Cell renders formatted percentage', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.accessorKey === 'correctness')!; + expect(col.Cell({ cell: { getValue: () => 50 } })).toBe('50.0%'); + expect(col.Cell({ cell: { getValue: () => NaN } })).toBe('N/A'); + }); +}); diff --git a/src/analysis/individualStudy/table/MetaCell.tsx b/src/analysis/individualStudy/table/MetaCell.tsx index 1a1ea885b2..9c56672552 100644 --- a/src/analysis/individualStudy/table/MetaCell.tsx +++ b/src/analysis/individualStudy/table/MetaCell.tsx @@ -1,29 +1,29 @@ -import { Spoiler, Stack, Box } from '@mantine/core'; +import { Box, Spoiler, Stack } from '@mantine/core'; import { ParticipantMetadata } from '../../../store/types'; export function MetaCell({ metaData }: { metaData: ParticipantMetadata | undefined }) { return ( - + Resolution: {' '} - {JSON.stringify(metaData?.resolution, null, 2)} + {metaData?.resolution ? JSON.stringify(metaData.resolution, null, 2) : 'null'} User Agent: {' '} - {metaData?.userAgent} + {metaData?.userAgent || 'null'} IP: {' '} - {metaData?.ip} + {metaData?.ip || 'null'} Language: {' '} - {metaData?.language} + {metaData?.language || 'null'} diff --git a/src/analysis/individualStudy/table/TableView.tsx b/src/analysis/individualStudy/table/TableView.tsx index 3e18ce49e2..1220a9329f 100644 --- a/src/analysis/individualStudy/table/TableView.tsx +++ b/src/analysis/individualStudy/table/TableView.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-unstable-nested-components */ import { - Text, Flex, Group, Space, Tooltip, Badge, RingProgress, Stack, ActionIcon, + Text, Flex, Group, Space, Tooltip, Badge, RingProgress, Stack, ActionIcon, SegmentedControl, } from '@mantine/core'; import { JSX, useCallback, useEffect, useMemo, useState, @@ -19,18 +19,19 @@ import { StoredAnswer } from '../../../store/types'; import { ParticipantRejectModal } from '../ParticipantRejectModal'; import { participantName } from '../../../utils/participantName'; import { AllTasksTimeline } from '../replay/AllTasksTimeline'; +import { ReplayTaskOrder } from '../replay/taskOrdering'; import { youtubeReadableDuration } from '../../../utils/humanReadableDuration'; import { getSequenceFlatMap } from '../../../utils/getSequenceFlatMap'; import { MetaCell } from './MetaCell'; import { componentAnswersAreCorrect } from '../../../utils/correctAnswer'; import { studyComponentToIndividualComponent } from '../../../utils/handleComponentInheritance'; -function formatDate(date: Date): string | JSX.Element { +function formatDate(date: Date): JSX.Element { if (date.valueOf() === 0 || Number.isNaN(date.valueOf())) { return None; } - return date.toLocaleDateString([], { hour: '2-digit', minute: '2-digit' }); + return {date.toLocaleDateString([], { hour: '2-digit', minute: '2-digit' })}; } export function TableView({ @@ -54,6 +55,7 @@ export function TableView({ }) { const { studyId } = useParams(); const [checked, setChecked] = useState({}); + const [taskOrder, setTaskOrder] = useState('sequence'); useEffect(() => { const newSelectedParticipants = Object.keys(checked).filter((v) => checked[v]) @@ -190,17 +192,15 @@ export function TableView({ header: 'Duration', size: 120, Cell: ({ cell }: { cell: MrtCell }) => ( - !Number.isNaN(cell.getValue()) ? ( - } - pb={1} - > - {`${youtubeReadableDuration(+cell.getValue()) || 'N/A'}`} - - ) : 'Incomplete' + } + pb={1} + > + {youtubeReadableDuration(+cell.getValue()) || 'N/A'} + ), }, @@ -277,7 +277,7 @@ export function TableView({ } return ( - + ); }, defaultColumn: { @@ -288,7 +288,19 @@ export function TableView({ enableDensityToggle: false, positionToolbarAlertBanner: 'none', renderTopToolbarCustomActions: () => ( - + + + Order + setTaskOrder(value as ReplayTaskOrder)} + data={[ + { value: 'sequence', label: 'Sequence' }, + { value: 'answer-time', label: 'Answer time' }, + ]} + /> + ), diff --git a/src/analysis/individualStudy/table/tests/TableView.spec.tsx b/src/analysis/individualStudy/table/tests/TableView.spec.tsx new file mode 100644 index 0000000000..db8cd306b1 --- /dev/null +++ b/src/analysis/individualStudy/table/tests/TableView.spec.tsx @@ -0,0 +1,337 @@ +import { ReactNode } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { + beforeEach, describe, expect, test, vi, +} from 'vitest'; +import { useParams } from 'react-router'; +import { StudyConfig } from '../../../../parser/types'; +import { ParticipantDataWithStatus } from '../../../../storage/types'; +import { createMockStudyConfig } from '../../../tests/testUtils'; +import { makeParticipant as _makeParticipant } from '../../../../tests/utils'; +import { TableView } from '../TableView'; +import { MetaCell } from '../MetaCell'; + +// ── capturedTableOptions ───────────────────────────────────────────────────── + +type MrtColumn = { + header: string; + Cell: ({ cell }: { cell: { getValue(): unknown } }) => ReactNode; +}; + +type CapturedTableOptions = { + columns: MrtColumn[]; + renderDetailPanel: ({ row }: { row: { original: ParticipantDataWithStatus } }) => ReactNode; + renderTopToolbarCustomActions: () => ReactNode; +}; + +let capturedTableOptions: CapturedTableOptions | null = null; + +vi.mock('mantine-react-table', () => ({ + MantineReactTable: () =>
MantineReactTable
, + useMantineReactTable: (opts: CapturedTableOptions) => { capturedTableOptions = opts; return opts; }, +})); + +vi.mock('react-router', () => ({ + useParams: vi.fn(() => ({ studyId: 'test-study' })), +})); + +vi.mock('@mantine/core', () => ({ + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Flex: ({ children }: { children: ReactNode }) =>
{children}
, + Group: ({ children }: { children: ReactNode }) =>
{children}
, + Space: () =>
, + Tooltip: ({ children, label }: { children: ReactNode; label?: ReactNode }) =>
{children}
, + Badge: ({ children }: { children: ReactNode }) => {children}, + RingProgress: ({ sections }: { sections: { value: number }[] }) =>
{sections[0]?.value}
, + Stack: ({ children }: { children: ReactNode }) =>
{children}
, + ActionIcon: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => , + Spoiler: ({ children }: { children: ReactNode }) =>
{children}
, + Box: ({ children }: { children: ReactNode }) =>
{children}
, + SegmentedControl: ({ data }: { data: { value: string; label: string }[] }) =>
{data.map(({ value, label }) => {label})}
, +})); + +vi.mock('@tabler/icons-react', () => ({ + IconCheck: () => check, + IconHourglassEmpty: () => hourglass, + IconX: () => x-icon, + IconCopy: () => copy, +})); + +vi.mock('../../replay/AllTasksTimeline', () => ({ + AllTasksTimeline: ({ taskOrder }: { taskOrder: string }) =>
AllTasksTimeline
, +})); + +vi.mock('../../ParticipantRejectModal', () => ({ + ParticipantRejectModal: () =>
ParticipantRejectModal
, +})); + +vi.mock('../../../../utils/getSequenceFlatMap', () => ({ + getSequenceFlatMap: vi.fn(() => ['intro', 'trial1', 'trial2', 'end']), +})); + +vi.mock('../../../../utils/participantName', () => ({ + participantName: () => 'Test User', +})); + +// ── fixtures ───────────────────────────────────────────────────────────────── + +const emptyConfig: StudyConfig = createMockStudyConfig(); + +function makeParticipant(overrides: Partial = {}) { + return _makeParticipant({ + participantId: 'pid-1', + participantIndex: 1, + participantConfigHash: 'hash1', + completed: true, + metadata: { + userAgent: 'test-agent', + resolution: { width: 1920, height: 1080 }, + language: 'en-US', + ip: '1.2.3.4', + }, + sequence: { + orderPath: 'root', order: 'fixed', components: ['trial1'], skip: [], + }, + ...overrides, + }); +} + +const defaultProps = { + studyConfig: emptyConfig, + allConfigs: {} as Record, + refresh: async () => [] as ParticipantDataWithStatus[], + width: 800, + stageColors: { DEFAULT: '#F05A30' }, + selectedParticipants: [] as ParticipantDataWithStatus[], + onSelectionChange: vi.fn<(participants: ParticipantDataWithStatus[]) => void>(), +}; + +beforeEach(() => { + capturedTableOptions = null; + vi.mocked(useParams).mockReturnValue({ studyId: 'test-study' }); + Object.defineProperty(window.navigator, 'clipboard', { + value: { writeText: vi.fn() }, + configurable: true, + }); +}); + +// ── TableView ───────────────────────────────────────────────────────────────── + +describe('TableView', () => { + test('shows "No data available" when visibleParticipants is empty', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('No data available'); + }); + + test('renders MantineReactTable and captures column options when participants exist', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('MantineReactTable'); + expect(capturedTableOptions).not.toBeNull(); + }); + + test('offers sequence and answer-time ordering beside the timeline controls', () => { + renderToStaticMarkup( + , + ); + + const html = renderToStaticMarkup(capturedTableOptions!.renderTopToolbarCustomActions()); + expect(html).toContain('Order'); + expect(html).toContain('Sequence'); + expect(html).toContain('Answer time'); + }); + + test('uses sequence ordering by default for participant timelines', () => { + const participant = makeParticipant(); + renderToStaticMarkup( + , + ); + + const html = renderToStaticMarkup(capturedTableOptions!.renderDetailPanel({ row: { original: participant } })); + expect(html).toContain('data-task-order="sequence"'); + }); + + // ── Status column ────────────────────────────────────────────────────────── + + test('Status Cell: rejected participant shows x-icon and reason', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Status')!; + const html = renderToStaticMarkup(col.Cell({ + cell: { getValue: () => ({ rejected: { reason: 'spam' }, completed: false, percent: 0 }) }, + })); + expect(html).toContain('x-icon'); + expect(html).toContain('spam'); + }); + + test('Status Cell: completed participant shows check icon', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Status')!; + const html = renderToStaticMarkup(col.Cell({ + cell: { getValue: () => ({ rejected: false, completed: true, percent: 1 }) }, + })); + expect(html).toContain('check'); + }); + + test('Status Cell: in-progress participant shows RingProgress percent', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Status')!; + const html = renderToStaticMarkup(col.Cell({ + cell: { getValue: () => ({ rejected: false, completed: false, percent: 0.5 }) }, + })); + expect(html).toContain('50'); // 0.5 * 100 + }); + + // ── Stage column ─────────────────────────────────────────────────────────── + + test('Stage Cell: empty stage shows N/A badge', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Stage')!; + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => '' } })); + expect(html).toContain('N/A'); + }); + + test('Stage Cell: named stage renders stage name', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Stage')!; + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => 'DEFAULT' } })); + expect(html).toContain('DEFAULT'); + }); + + // ── Duration column ──────────────────────────────────────────────────────── + + test('Duration Cell: valid duration shows formatted time', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Duration')!; + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => new Date(90_000) } })); + expect(html).toContain('01:30'); // 90 seconds + }); + + test('Duration Cell: NaN date shows "N/A" (youtubeReadableDuration fallback)', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Duration')!; + // new Date(NaN) is a Date object; Number.isNaN(DateObject) === false → truthy branch + // +new Date(NaN) === NaN → youtubeReadableDuration(NaN) falsy → 'N/A' shown + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => new Date(NaN) } })); + expect(html).toContain('N/A'); + }); + + // ── Start Time column ────────────────────────────────────────────────────── + + test('Start Time Cell: epoch-0 date shows "None"', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Start Time')!; + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => new Date(0) } })); + expect(html).toContain('None'); + }); + + test('Start Time Cell: valid date shows locale string', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Start Time')!; + const d = new Date(2026, 0, 15, 10, 30); + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => d } })); + expect(html).toContain(d.toLocaleDateString([], { hour: '2-digit', minute: '2-digit' })); + }); + + // ── Correct Answers column ───────────────────────────────────────────────── + + test('Correct Answers Cell: shows correct and incorrect counts', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Correct Answers')!; + // 2 correct, 1 incorrect + const html = renderToStaticMarkup(col.Cell({ cell: { getValue: () => [true, true, false] } })); + expect(html).toContain('2'); // correct count + expect(html).toContain('1'); // incorrect count + }); + + // ── Metadata column ──────────────────────────────────────────────────────── + + test('Metadata Cell: renders MetaCell with participant metadata', () => { + renderToStaticMarkup( + , + ); + const col = capturedTableOptions!.columns.find((c) => c.header === 'Metadata')!; + const html = renderToStaticMarkup(col.Cell({ + cell: { + getValue: () => ({ + userAgent: 'Mozilla/5.0', + resolution: { width: 1920, height: 1080 }, + ip: '1.2.3.4', + language: 'en-US', + }), + }, + })); + expect(html).toContain('Mozilla/5.0'); + expect(html).toContain('1.2.3.4'); + }); + + // ── Optional columns ────────────────────────────────────────────────────── + + test('includes Name column when studyConfig has participantNameField', () => { + const configWithName: StudyConfig = { + ...emptyConfig, + uiConfig: { ...emptyConfig.uiConfig, participantNameField: 'name' }, + }; + renderToStaticMarkup( + , + ); + expect(capturedTableOptions!.columns.find((c) => c.header === 'Name')).toBeDefined(); + }); + + test('includes Condition column when any participant has a condition', () => { + const participantWithCondition = makeParticipant({ searchParams: { condition: 'condA' } }); + renderToStaticMarkup( + , + ); + expect(capturedTableOptions!.columns.find((c) => c.header === 'Condition')).toBeDefined(); + }); +}); + +// ── MetaCell ───────────────────────────────────────────────────────────────── + +describe('MetaCell', () => { + test('renders all metadata fields', () => { + const html = renderToStaticMarkup( + , + ); + expect(html).toContain('TestAgent/1.0'); + expect(html).toContain('2560'); + expect(html).toContain('10.0.0.1'); + expect(html).toContain('fr-FR'); + }); + + test('renders gracefully when metaData is undefined', () => { + const html = renderToStaticMarkup(); + expect(html).toContain('Resolution'); + expect(html).toContain('User Agent'); + }); +}); diff --git a/src/analysis/individualStudy/thinkAloud/TextEditor.tsx b/src/analysis/individualStudy/thinkAloud/TextEditor.tsx index a42e855a1f..11a9193d66 100644 --- a/src/analysis/individualStudy/thinkAloud/TextEditor.tsx +++ b/src/analysis/individualStudy/thinkAloud/TextEditor.tsx @@ -41,10 +41,13 @@ export function TextEditor({ const { value: tags, execute: pullTags } = useAsync(getTags, [storageEngine]); - const setTags = useCallback((_tags: Tag[]) => { - if (storageEngine) { - storageEngine.saveTags(_tags, 'text').then(() => pullTags(storageEngine)); + const setTags = useCallback(async (_tags: Tag[]) => { + if (!storageEngine) { + return; } + + await storageEngine.saveTags(_tags, 'text'); + await pullTags(storageEngine); }, [pullTags, storageEngine]); const textRefs = useRef([]); @@ -116,7 +119,7 @@ export function TextEditor({ }, 1); }); - const editTagCallback = useCallback((oldTag: Tag, newTag: Tag) => { + const editTagCallback = useCallback(async (oldTag: Tag, newTag: Tag) => { if (!tags) { return; } @@ -125,10 +128,10 @@ export function TextEditor({ const tagsCopy = Array.from(tags); tagsCopy[tagIndex] = newTag; - setTags(tagsCopy); + await setTags(tagsCopy); }, [setTags, tags]); - const createTagCallback = useCallback((t: Tag) => { setTags([...(tags || []), t]); }, [setTags, tags]); + const createTagCallback = useCallback((t: Tag) => setTags([...(tags || []), t]), [setTags, tags]); const addTextRefCallback = useCallback((i: number, ref: HTMLTextAreaElement) => { textRefs.current[i] = ref; diff --git a/src/analysis/individualStudy/thinkAloud/ThinkAloudFooter.tsx b/src/analysis/individualStudy/thinkAloud/ThinkAloudFooter.tsx index 52d431e27b..2600c7810c 100644 --- a/src/analysis/individualStudy/thinkAloud/ThinkAloudFooter.tsx +++ b/src/analysis/individualStudy/thinkAloud/ThinkAloudFooter.tsx @@ -125,6 +125,7 @@ export function ThinkAloudFooter({ async function fetchAssetsUrl() { if (!storageEngine || !participantId || !currentTrial) { setAudioUrl(null); + setScreenRecordingUrl(null); return; } @@ -328,13 +329,20 @@ export function ThinkAloudFooter({ navigateToTask(orderedAnswers[nextIndex].identifier); }, [currentTrial, navigateToTask, orderedAnswers]); - const setTags = useCallback((_tags: Tag[], type: 'task' | 'participant') => { - if (storageEngine) { - storageEngine.saveTags(_tags, type).then(() => { type === 'task' ? pullTags(storageEngine, type) : pullAllParticipantTags(storageEngine, type); }); + const setTags = useCallback(async (_tags: Tag[], type: 'task' | 'participant') => { + if (!storageEngine) { + return; + } + + await storageEngine.saveTags(_tags, type); + if (type === 'task') { + await pullTags(storageEngine, type); + } else { + await pullAllParticipantTags(storageEngine, type); } }, [pullAllParticipantTags, pullTags, storageEngine]); - const editTaskTagCallback = useCallback((oldTag: Tag, newTag: Tag) => { + const editTaskTagCallback = useCallback(async (oldTag: Tag, newTag: Tag) => { if (!taskTags) { return; } @@ -343,10 +351,10 @@ export function ThinkAloudFooter({ const tagsCopy = Array.from(taskTags); tagsCopy[tagIndex] = newTag; - setTags(tagsCopy, 'task'); + await setTags(tagsCopy, 'task'); }, [setTags, taskTags]); - const editParticipantTagCallback = useCallback((oldTag: Tag, newTag: Tag) => { + const editParticipantTagCallback = useCallback(async (oldTag: Tag, newTag: Tag) => { if (!allParticipantTags) { return; } @@ -355,12 +363,12 @@ export function ThinkAloudFooter({ const tagsCopy = Array.from(allParticipantTags); tagsCopy[tagIndex] = newTag; - setTags(tagsCopy, 'participant'); + await setTags(tagsCopy, 'participant'); }, [setTags, allParticipantTags]); - const createTaskTagCallback = useCallback((t: Tag) => { setTags([...(taskTags || []), t], 'task'); }, [setTags, taskTags]); + const createTaskTagCallback = useCallback((t: Tag) => setTags([...(taskTags || []), t], 'task'), [setTags, taskTags]); - const createParticipantTagCallback = useCallback((t: Tag) => { setTags([...(taskTags || []), t], 'participant'); }, [setTags, taskTags]); + const createParticipantTagCallback = useCallback((t: Tag) => setTags([...(allParticipantTags || []), t], 'participant'), [allParticipantTags, setTags]); useEffect(() => { const t = transcriptLines ? transcriptLines[jumpedToLine]?.start || 0 : 0; @@ -599,7 +607,7 @@ export function ThinkAloudFooter({ )} {screenRecordingUrl && ( - + diff --git a/src/analysis/individualStudy/thinkAloud/TranscriptLine.tsx b/src/analysis/individualStudy/thinkAloud/TranscriptLine.tsx index 45b5f3d9d0..07dec0e9e4 100644 --- a/src/analysis/individualStudy/thinkAloud/TranscriptLine.tsx +++ b/src/analysis/individualStudy/thinkAloud/TranscriptLine.tsx @@ -10,7 +10,7 @@ import { TagSelector } from './tags/TagSelector'; export function TranscriptLine({ annotation, setAnnotation, start, current, end, text, tags, selectedTags, onTextChange, deleteRowCallback, addRowCallback, onSelectTags, addRef, index, editTagCallback, createTagCallback, onClickLine, -} : {annotation: string; setAnnotation: (i: number, s: string) => void; start: number, end: number, current: number, text: string, tags: Tag[], selectedTags: Tag[], onTextChange: (i: number, v: string) => void, deleteRowCallback: (i: number) => void, addRowCallback: (i: number, textIndex: number) => void, onSelectTags: (i: number, t: Tag[]) => void, addRef: (i: number, ref: HTMLTextAreaElement) => void, index: number, editTagCallback: (oldTag: Tag, newTag: Tag) => void, createTagCallback: (t: Tag) => void, onClickLine: (focusedLine: number) => void }) { +} : {annotation: string; setAnnotation: (i: number, s: string) => void; start: number, end: number, current: number, text: string, tags: Tag[], selectedTags: Tag[], onTextChange: (i: number, v: string) => void, deleteRowCallback: (i: number) => void, addRowCallback: (i: number, textIndex: number) => void, onSelectTags: (i: number, t: Tag[]) => void, addRef: (i: number, ref: HTMLTextAreaElement) => void, index: number, editTagCallback: (oldTag: Tag, newTag: Tag) => void | Promise, createTagCallback: (t: Tag) => void | Promise, onClickLine: (focusedLine: number) => void }) { const [annotationVal, setAnnotationVal] = useState(annotation); const indexRef = useRef(0); diff --git a/src/analysis/individualStudy/thinkAloud/tags/AddTagDropdown.tsx b/src/analysis/individualStudy/thinkAloud/tags/AddTagDropdown.tsx index 47d5287cc4..cc765524d3 100644 --- a/src/analysis/individualStudy/thinkAloud/tags/AddTagDropdown.tsx +++ b/src/analysis/individualStudy/thinkAloud/tags/AddTagDropdown.tsx @@ -8,32 +8,75 @@ import React, { useCallback, useState } from 'react'; import { v4 as uuidFunc } from 'uuid'; import { Tag } from '../types'; +const normalizeTagName = (tagName: string) => tagName.trim().toLowerCase(); + export function AddTagDropdown({ addTagCallback, currentNames, editTag = false, editableTag, -} : {addTagCallback : (tag: Tag) => void, currentNames: string[], editTag?: boolean, editableTag?: Tag}) { +} : {addTagCallback : (tag: Tag) => void | Promise, currentNames: string[], editTag?: boolean, editableTag?: Tag}) { const [name, setName] = useState(editTag ? editableTag!.name : ''); const [color, setColor] = useState(editTag ? editableTag!.color : '#fd7e14'); + const [isSubmitting, setIsSubmitting] = useState(false); + const [submitError, setSubmitError] = useState(null); + + const trimmedName = name.trim(); + const normalizedName = normalizeTagName(name); + const normalizedEditableName = editableTag ? normalizeTagName(editableTag.name) : null; + const duplicateName = normalizedName.length > 0 && currentNames.some((currentName) => { + const normalizedCurrentName = normalizeTagName(currentName); + return normalizedCurrentName === normalizedName + && (!editTag || normalizedCurrentName !== normalizedEditableName); + }); + const unchangedTag = editTag && editableTag + ? trimmedName === editableTag.name && color === editableTag.color + : false; + const validationError = duplicateName ? 'Tag with this name already exists' : null; + const submitDisabled = trimmedName.length === 0 || duplicateName || unchangedTag || isSubmitting; + + const createTag = useCallback(async () => { + if (submitDisabled) { + return; + } - const createTag = useCallback(() => { const uuid = uuidFunc(); - addTagCallback({ color, name, id: editTag && editableTag ? editableTag.id : uuid }); - }, [addTagCallback, color, editTag, editableTag, name]); + setIsSubmitting(true); + setSubmitError(null); + + try { + await addTagCallback({ color, name: trimmedName, id: editTag && editableTag ? editableTag.id : uuid }); + } catch { + setSubmitError('Unable to save tag. Try again.'); + } finally { + setIsSubmitting(false); + } + }, [addTagCallback, color, editTag, editableTag, submitDisabled, trimmedName]); return ( - setName(e.currentTarget.value)} error={currentNames.includes(name) && (!editTag || editableTag!.name !== name) ? 'Tag with this name already exists' : null} /> + { + setName(e.currentTarget.value); + setSubmitError(null); + }} + error={validationError || submitError} + /> setColor(e)} + onChange={(e) => { + setColor(e); + setSubmitError(null); + }} swatches={['#2e2e2e', '#868e96', '#fa5252', '#e64980', '#be4bdb', '#7950f2', '#4c6ef5', '#228be6', '#15aabf', '#12b886', '#40c057', '#82c91e', '#fab005', '#fd7e14']} /> - + ); } diff --git a/src/analysis/individualStudy/thinkAloud/tags/EditTagPopover.tsx b/src/analysis/individualStudy/thinkAloud/tags/EditTagPopover.tsx new file mode 100644 index 0000000000..7d517ae51d --- /dev/null +++ b/src/analysis/individualStudy/thinkAloud/tags/EditTagPopover.tsx @@ -0,0 +1,49 @@ +import { + ActionIcon, Box, Popover, +} from '@mantine/core'; +import { IconEdit } from '@tabler/icons-react'; +import { useState } from 'react'; +import { Tag } from '../types'; +import { AddTagDropdown } from './AddTagDropdown'; + +export function EditTagPopover({ + tag, currentNames, editTagCallback, +}: { + tag: Tag; + currentNames: string[]; + editTagCallback: (oldTag: Tag, newTag: Tag) => void | Promise; +}) { + const [editDialogOpen, setEditDialogOpen] = useState(false); + + return ( + { + event.preventDefault(); + event.stopPropagation(); + }} + > + + + setEditDialogOpen((open) => !open)} + > + + + + + { + await editTagCallback(tag, newTag); + setEditDialogOpen(false); + }} + editableTag={tag} + /> + + + + ); +} diff --git a/src/analysis/individualStudy/thinkAloud/tags/TagEditor.tsx b/src/analysis/individualStudy/thinkAloud/tags/TagEditor.tsx index a58dd4b44b..b6b914f520 100644 --- a/src/analysis/individualStudy/thinkAloud/tags/TagEditor.tsx +++ b/src/analysis/individualStudy/thinkAloud/tags/TagEditor.tsx @@ -6,14 +6,14 @@ import { useState } from 'react'; import { Tag } from '../types'; import { AddTagDropdown } from './AddTagDropdown'; -export function TagEditor({ createTagCallback, tags } : { createTagCallback : (tag: Tag) => void, tags: Tag[] }) { +export function TagEditor({ createTagCallback, tags } : { createTagCallback : (tag: Tag) => void | Promise, tags: Tag[] }) { const [addDialogOpen, setAddDialogOpen] = useState(false); return ( - + - @@ -21,7 +21,13 @@ export function TagEditor({ createTagCallback, tags } : { createTagCallback : (t {tags ? ( - t.name)} addTagCallback={(t: Tag) => { setAddDialogOpen(false); createTagCallback(t); }} /> + t.name)} + addTagCallback={async (t: Tag) => { + await createTagCallback(t); + setAddDialogOpen(false); + }} + /> ) : } diff --git a/src/analysis/individualStudy/thinkAloud/tags/TagSelector.tsx b/src/analysis/individualStudy/thinkAloud/tags/TagSelector.tsx index 297e66c250..d6efcc8cb6 100644 --- a/src/analysis/individualStudy/thinkAloud/tags/TagSelector.tsx +++ b/src/analysis/individualStudy/thinkAloud/tags/TagSelector.tsx @@ -1,23 +1,19 @@ import { Group, ColorSwatch, useCombobox, Combobox, Pill, PillsInput, Input, - Popover, - ActionIcon, - Box, CheckIcon, Text, Tooltip, } from '@mantine/core'; -import { IconEdit } from '@tabler/icons-react'; import { useCallback, useMemo } from 'react'; import { Tag } from '../types'; import { Pills } from './Pills'; import { TagEditor } from './TagEditor'; -import { AddTagDropdown } from './AddTagDropdown'; +import { EditTagPopover } from './EditTagPopover'; export function TagSelector({ tags, selectedTags, onSelectTags, disabled = false, tagsEmptyText, createTagCallback, editTagCallback, width, }: { - tags: Tag[], selectedTags: Tag[], onSelectTags: (t: Tag[]) => void, disabled?: boolean, tagsEmptyText: string, editTagCallback: (oldTag: Tag, newTag: Tag) => void, createTagCallback: (t: Tag) => void, width: number + tags: Tag[], selectedTags: Tag[], onSelectTags: (t: Tag[]) => void, disabled?: boolean, tagsEmptyText: string, editTagCallback: (oldTag: Tag, newTag: Tag) => void | Promise, createTagCallback: (t: Tag) => void | Promise, width: number }) { const combobox = useCombobox(); @@ -55,32 +51,7 @@ export function TagSelector({ {tag.name} - { - e.preventDefault(); - e.stopPropagation(); - }} - > - - - - - - - - t.id)} - addTagCallback={(newTag: Tag) => { - editTagCallback(tag, newTag); - }} - editableTag={tag} - /> - - - + t.name)} editTagCallback={editTagCallback} /> )), [editTagCallback, selectedTags, tags, width]); @@ -96,36 +67,7 @@ export function TagSelector({ {tag.name} - { - e.preventDefault(); - e.stopPropagation(); - }} - > - - - { - e.stopPropagation(); - e.preventDefault(); - }} - > - - - - - t.id)} - addTagCallback={(newTag: Tag) => { - editTagCallback(tag, newTag); - }} - editableTag={tag} - /> - - - + t.name)} editTagCallback={editTagCallback} /> )), [editTagCallback, selectedTags, tags, width]); diff --git a/src/analysis/individualStudy/thinkAloud/tags/tests/AddTagDropdown.spec.tsx b/src/analysis/individualStudy/thinkAloud/tags/tests/AddTagDropdown.spec.tsx new file mode 100644 index 0000000000..4527f12216 --- /dev/null +++ b/src/analysis/individualStudy/thinkAloud/tags/tests/AddTagDropdown.spec.tsx @@ -0,0 +1,72 @@ +import { MantineProvider } from '@mantine/core'; +import { + cleanup, fireEvent, render, screen, waitFor, +} from '@testing-library/react'; +import { + afterAll, afterEach, beforeAll, describe, expect, test, vi, +} from 'vitest'; +import { AddTagDropdown } from '../AddTagDropdown'; + +beforeAll(() => { + vi.stubGlobal('matchMedia', vi.fn().mockImplementation((query: string) => ({ + matches: false, + media: query, + onchange: null, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + addListener: vi.fn(), + removeListener: vi.fn(), + dispatchEvent: vi.fn(), + }))); +}); + +afterEach(() => { + cleanup(); +}); + +afterAll(() => { + vi.unstubAllGlobals(); +}); + +describe('AddTagDropdown', () => { + test('trims a valid tag name before creation and blocks blank names', async () => { + const addTagCallback = vi.fn(); + render(); + + const addButton = screen.getByRole('button', { name: 'Add Tag' }) as HTMLButtonElement; + expect(addButton.disabled).toBe(true); + + fireEvent.change(screen.getByPlaceholderText('Enter tag name'), { target: { value: ' New Tag ' } }); + expect(addButton.disabled).toBe(false); + fireEvent.click(addButton); + + await waitFor(() => { + expect(addTagCallback).toHaveBeenCalledWith(expect.objectContaining({ name: 'New Tag' })); + }); + }); + + test('blocks duplicate names case-insensitively within the supplied tag type', () => { + const addTagCallback = vi.fn(); + render(); + + fireEvent.change(screen.getByPlaceholderText('Enter tag name'), { target: { value: ' review ' } }); + + expect(screen.getByText('Tag with this name already exists')).toBeDefined(); + const addButton = screen.getByRole('button', { name: 'Add Tag' }) as HTMLButtonElement; + expect(addButton.disabled).toBe(true); + fireEvent.click(addButton); + expect(addTagCallback).not.toHaveBeenCalled(); + }); + + test('preserves input and shows an inline error when persistence fails', async () => { + const addTagCallback = vi.fn().mockRejectedValue(new Error('save failed')); + render(); + + const nameInput = screen.getByPlaceholderText('Enter tag name') as HTMLInputElement; + fireEvent.change(nameInput, { target: { value: 'New Tag' } }); + fireEvent.click(screen.getByRole('button', { name: 'Add Tag' })); + + expect(await screen.findByText('Unable to save tag. Try again.')).toBeDefined(); + expect(nameInput.value).toBe('New Tag'); + }); +}); diff --git a/src/analysis/individualStudy/thinkAloud/tags/tests/EditTagPopover.spec.tsx b/src/analysis/individualStudy/thinkAloud/tags/tests/EditTagPopover.spec.tsx new file mode 100644 index 0000000000..648605e1ba --- /dev/null +++ b/src/analysis/individualStudy/thinkAloud/tags/tests/EditTagPopover.spec.tsx @@ -0,0 +1,88 @@ +import { MantineProvider } from '@mantine/core'; +import { + act, cleanup, fireEvent, render, screen, waitFor, +} from '@testing-library/react'; +import { + afterAll, afterEach, beforeAll, describe, expect, test, vi, +} from 'vitest'; +import { Tag } from '../../types'; +import { EditTagPopover } from '../EditTagPopover'; + +class ResizeObserverMock { + observe() {} + + unobserve() {} + + disconnect() {} +} + +const tag: Tag = { id: 'tag-1', name: 'Original Tag', color: '#fd7e14' }; + +beforeAll(() => { + vi.stubGlobal('ResizeObserver', ResizeObserverMock); + vi.stubGlobal('matchMedia', vi.fn().mockImplementation((query: string) => ({ + matches: false, + media: query, + onchange: null, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + addListener: vi.fn(), + removeListener: vi.fn(), + dispatchEvent: vi.fn(), + }))); +}); + +afterEach(() => { + cleanup(); +}); + +afterAll(() => { + vi.unstubAllGlobals(); +}); + +describe('EditTagPopover', () => { + test('closes only after the edited tag is persisted', async () => { + let resolveSave: (() => void) | undefined; + const editTagCallback = vi.fn(() => new Promise((resolve) => { + resolveSave = resolve; + })); + render( + + + , + ); + + fireEvent.click(screen.getByRole('button', { name: 'Edit Original Tag' })); + const nameInput = await screen.findByPlaceholderText('Enter tag name'); + fireEvent.change(nameInput, { target: { value: 'Updated Tag' } }); + fireEvent.click(screen.getByRole('button', { name: 'Edit Tag' })); + + expect(screen.getByPlaceholderText('Enter tag name')).toBeDefined(); + expect(editTagCallback).toHaveBeenCalledWith(tag, expect.objectContaining({ + id: tag.id, + name: 'Updated Tag', + })); + await act(async () => { + resolveSave?.(); + }); + await waitFor(() => { + expect(screen.queryByPlaceholderText('Enter tag name')).toBeNull(); + }); + }); + + test('keeps the edit popover open when persistence fails', async () => { + const editTagCallback = vi.fn().mockRejectedValue(new Error('save failed')); + render( + + + , + ); + + fireEvent.click(screen.getByRole('button', { name: 'Edit Original Tag' })); + fireEvent.change(await screen.findByPlaceholderText('Enter tag name'), { target: { value: 'Updated Tag' } }); + fireEvent.click(screen.getByRole('button', { name: 'Edit Tag' })); + + expect(await screen.findByText('Unable to save tag. Try again.')).toBeDefined(); + expect(screen.getByPlaceholderText('Enter tag name')).toBeDefined(); + }); +}); diff --git a/src/analysis/individualStudy/thinkAloud/tags/tests/TagEditor.spec.tsx b/src/analysis/individualStudy/thinkAloud/tags/tests/TagEditor.spec.tsx new file mode 100644 index 0000000000..79e4cf6686 --- /dev/null +++ b/src/analysis/individualStudy/thinkAloud/tags/tests/TagEditor.spec.tsx @@ -0,0 +1,73 @@ +import { MantineProvider } from '@mantine/core'; +import { + act, cleanup, fireEvent, render, screen, waitFor, +} from '@testing-library/react'; +import { + afterAll, afterEach, beforeAll, describe, expect, test, vi, +} from 'vitest'; +import { TagEditor } from '../TagEditor'; + +class ResizeObserverMock { + observe() {} + + unobserve() {} + + disconnect() {} +} + +beforeAll(() => { + vi.stubGlobal('ResizeObserver', ResizeObserverMock); + vi.stubGlobal('matchMedia', vi.fn().mockImplementation((query: string) => ({ + matches: false, + media: query, + onchange: null, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + addListener: vi.fn(), + removeListener: vi.fn(), + dispatchEvent: vi.fn(), + }))); +}); + +afterEach(() => { + cleanup(); +}); + +afterAll(() => { + vi.unstubAllGlobals(); +}); + +describe('TagEditor', () => { + test('closes the creation popover only after persistence succeeds', async () => { + let resolveSave: (() => void) | undefined; + const createTagCallback = vi.fn(() => new Promise((resolve) => { + resolveSave = resolve; + })); + render(); + + fireEvent.click(screen.getByRole('button', { name: 'Create new tag' })); + const nameInput = await screen.findByPlaceholderText('Enter tag name'); + fireEvent.change(nameInput, { target: { value: 'New Tag' } }); + fireEvent.click(screen.getByRole('button', { name: 'Add Tag' })); + + expect(screen.getByPlaceholderText('Enter tag name')).toBeDefined(); + await act(async () => { + resolveSave?.(); + }); + await waitFor(() => { + expect(screen.queryByPlaceholderText('Enter tag name')).toBeNull(); + }); + }); + + test('keeps the creation popover open when persistence fails', async () => { + const createTagCallback = vi.fn().mockRejectedValue(new Error('save failed')); + render(); + + fireEvent.click(screen.getByRole('button', { name: 'Create new tag' })); + fireEvent.change(await screen.findByPlaceholderText('Enter tag name'), { target: { value: 'New Tag' } }); + fireEvent.click(screen.getByRole('button', { name: 'Add Tag' })); + + expect(await screen.findByText('Unable to save tag. Try again.')).toBeDefined(); + expect(screen.getByPlaceholderText('Enter tag name')).toBeDefined(); + }); +}); diff --git a/src/analysis/individualStudy/thinkAloud/tests/ThinkAloudAnalysis.spec.tsx b/src/analysis/individualStudy/thinkAloud/tests/ThinkAloudAnalysis.spec.tsx new file mode 100644 index 0000000000..ae2f0b17bb --- /dev/null +++ b/src/analysis/individualStudy/thinkAloud/tests/ThinkAloudAnalysis.spec.tsx @@ -0,0 +1,1109 @@ +import { forwardRef, ReactNode } from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { + render, act, cleanup, fireEvent, waitFor, +} from '@testing-library/react'; +import { + afterEach, beforeAll, beforeEach, describe, expect, test, vi, +} from 'vitest'; +import * as d3 from 'd3'; +import { useNavigate, useParams, useSearchParams } from 'react-router'; +import type { NavigateFunction } from 'react-router'; +import { EditedText, Tag, TranscribedAudio } from '../types'; +import type { ParticipantData } from '../../../../storage/types'; +import { makeStoredAnswer as makeStoredAnswerBase, makeStorageEngine } from '../../../../tests/utils'; +import type { FirebaseStorageEngine } from '../../../../storage/engines/FirebaseStorageEngine'; +import { useAsync } from '../../../../store/hooks/useAsync'; +import { useReplayContext } from '../../../../store/hooks/useReplay'; +import { Pills } from '../tags/Pills'; +import { AddTagDropdown } from '../tags/AddTagDropdown'; +import { TagEditor } from '../tags/TagEditor'; +import { ThinkAloudAnalysis } from '../ThinkAloudAnalysis'; + +// ── mock delegates (declared before vi.mock so hoisted references resolve) ──── + +const mockThinkAloudFooter = vi.fn(({ onTimeUpdate, setHasAudio }: { onTimeUpdate?: (t: number) => void; setHasAudio?: (b: boolean) => void }) => ( +
+ + +
+)); + +const mockTextEditor = vi.fn(({ onClickLine, transcriptList }: { onClickLine?: (n: number) => void; transcriptList?: EditedText[] }) => ( +
+
{transcriptList?.length ?? 0}
+ +
+)); + +const mockTranscriptLine = vi.fn(({ + text, onTextChange, deleteRowCallback, addRowCallback, setAnnotation, editTagCallback, createTagCallback, addRef, index, +}: { + text: string; onTextChange: (i: number, v: string) => void; deleteRowCallback: (i: number) => void; + addRowCallback: (i: number, pos: number) => void; setAnnotation: (i: number, s: string) => void; + editTagCallback: (oldTag: Tag, newTag: Tag) => void; createTagCallback: (t: Tag) => void; + addRef: (i: number, ref: Pick) => void; index: number; +}) => ( +
+ {text} + + + + + + + +
+)); + +const mockTagSelector = vi.fn(({ + onSelectTags, editTagCallback, createTagCallback, tags, tagsEmptyText, +}: { + onSelectTags?: (t: Tag[]) => void; + editTagCallback?: (oldTag: Tag, newTag: Tag) => void; + createTagCallback?: (tag: Tag) => void | Promise; + tags?: Tag[]; + tagsEmptyText?: string; +}) => ( +
+ + + {tags && tags.length > 0 && ( + + )} +
+)); + +const createMockNavigate = (): NavigateFunction => vi.fn() as unknown as NavigateFunction; + +// ── mocks ──────────────────────────────────────────────────────────────────── + +vi.mock('@mantine/core', () => ({ + ActionIcon: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => , + Alert: ({ children }: { children: ReactNode }) =>
{children}
, + AppShell: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { Footer: ({ children }: { children: ReactNode }) =>
{children}
}, + ), + Box: ({ children }: { children: ReactNode }) =>
{children}
, + Button: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => , + Center: ({ children }: { children: ReactNode }) =>
{children}
, + CheckIcon: () => check, + ColorPicker: ({ value }: { value?: string }) =>
, + ColorSwatch: ({ color }: { color: string }) =>
, + Combobox: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { + DropdownTarget: ({ children }: { children: ReactNode }) =>
{children}
, + Dropdown: ({ children }: { children: ReactNode }) =>
{children}
, + Options: ({ children }: { children: ReactNode }) =>
{children}
, + Option: ({ children }: { children: ReactNode }) =>
{children}
, + EventsTarget: ({ children }: { children: ReactNode }) =>
{children}
, + Empty: ({ children }: { children: ReactNode }) =>
{children}
, + }, + ), + Grid: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { + Col: forwardRef(function Col({ children, ...rest }, ref) { // eslint-disable-line prefer-arrow-callback + return
{children}
; + }), + }, + ), + Group: ({ children, style }: { children: ReactNode; style?: object }) =>
{children}
, + HoverCard: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { + Target: ({ children }: { children: ReactNode }) =>
{children}
, + Dropdown: ({ children }: { children: ReactNode }) =>
{children}
, + }, + ), + Input: { Placeholder: ({ children }: { children: ReactNode }) => {children} }, + Loader: () => loading, + Pill: Object.assign( + ({ children }: { children: ReactNode }) => {children}, + { Group: ({ children }: { children: ReactNode }) =>
{children}
}, + ), + PillsInput: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { Field: () => , Group: ({ children }: { children: ReactNode }) =>
{children}
}, + ), + Popover: Object.assign( + ({ children }: { children: ReactNode }) =>
{children}
, + { + Target: ({ children }: { children: ReactNode }) =>
{children}
, + Dropdown: ({ children }: { children: ReactNode }) =>
{children}
, + }, + ), + SegmentedControl: ({ data, onChange }: { data?: { label: string; value: string }[]; onChange?: (v: string) => void }) => ( +
{data?.map((item) => )}
+ ), + Select: ({ + leftSection, rightSection, onChange, value, data, label, + }: { leftSection?: ReactNode; rightSection?: ReactNode; onChange?: (v: string | null) => void; value?: string; data?: { label: string; value: string }[]; label?: string }) => ( +
+ {leftSection} + + {rightSection} +
+ ), + Stack: forwardRef(function Stack({ children }, ref) { // eslint-disable-line prefer-arrow-callback + return
{children}
; + }), + Text: ({ children }: { children: ReactNode }) =>

{children}

, + Textarea: forwardRef; + onKeyDown?: React.KeyboardEventHandler; onFocus?: React.FocusEventHandler; + placeholder?: string; onBlur?: React.FocusEventHandler; + }>(function Textarea({ // eslint-disable-line prefer-arrow-callback + value, onChange, onKeyDown, onFocus, placeholder, onBlur, defaultValue, + }, ref) { + return