From 60d6c1cb8c70c8514503e7c5eb1cc74922847cf6 Mon Sep 17 00:00:00 2001 From: tobias Date: Mon, 21 Jul 2025 11:33:44 +0200 Subject: [PATCH] Squash commmits --- .dockerignore | 17 + .env.example | 1 + .gitignore | 23 + .npmrc | 1 + .prettierignore | 9 + .prettierrc | 16 + Dockerfile | 27 + README.md | 37 + crabfit-settings.png | Bin 0 -> 40437 bytes demo.png | Bin 0 -> 47712 bytes docker-compose.yml | 16 + eslint.config.js | 40 + package.json | 55 + pnpm-lock.yaml | 3486 ++++++++++++++++++++++++++ src/app.css | 4 + src/app.d.ts | 13 + src/app.html | 12 + src/demo.spec.ts | 7 + src/lib/components/ClickSpark.svelte | 79 + src/lib/crabfitData.ts | 17 + src/lib/index.ts | 1 + src/lib/meeting.ts | 108 + src/routes/+layout.svelte | 7 + src/routes/+page.server.ts | 38 + src/routes/+page.svelte | 206 ++ src/routes/api/members/+server.ts | 12 + src/routes/page.html | 96 + src/test/meeting.test.ts | 107 + static/favicon.svg | 1 + svelte.config.js | 20 + tsconfig.json | 19 + vite.config.ts | 20 + 32 files changed, 4495 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 crabfit-settings.png create mode 100644 demo.png create mode 100644 docker-compose.yml create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/demo.spec.ts create mode 100644 src/lib/components/ClickSpark.svelte create mode 100644 src/lib/crabfitData.ts create mode 100644 src/lib/index.ts create mode 100644 src/lib/meeting.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.server.ts create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/api/members/+server.ts create mode 100644 src/routes/page.html create mode 100644 src/test/meeting.test.ts create mode 100644 static/favicon.svg create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ffdff94 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +Dockerfile +.dockerignore +.git +.gitignore +.gitattributes +README.md +.npmrc +.prettierrc +.eslintrc.cjs +.graphqlrc +.editorconfig +.svelte-kit +.vscode +node_modules +build +package +**/.env \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d1c0a52 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +CRABFIT_API_URL=https://api.crab.fit/event/cfschedulerdemo-282854 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..c0c80ba --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=false diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7d74fe2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..8103a0b --- /dev/null +++ b/.prettierrc @@ -0,0 +1,16 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ], + "tailwindStylesheet": "./src/app.css" +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b71735d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM node:22-alpine AS builder + +WORKDIR /app + +RUN npm install -g corepack@0.24.1 && corepack enable + +# Copy deps first for caching +COPY pnpm-lock.yaml package.json ./ +RUN pnpm i --frozen-lockfile + +# Copy rest of app +COPY . . + +# Build +RUN pnpm run build +RUN pnpm prune --production + +FROM node:22-alpine +WORKDIR /app +COPY --from=builder /app/build build/ +COPY --from=builder /app/node_modules node_modules/ +COPY package.json . +EXPOSE 3000 +ENV NODE_ENV=production + +CMD [ "node", "build" ] + diff --git a/README.md b/README.md new file mode 100644 index 0000000..07da93e --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +## Completely Fairâ„¢ Scheduler Webapp +The CF scheduler helps you find time slots that you have in common with others. This is helpful when you for example have coworkers from different parts of the world. + +Originally inspired by the python-based [completely-fair-scheduler](https://git.autonomic.zone/autonomic-cooperative/completely-fair-scheduler), this webapp is more accessible as it does not require the use of a terminal. + +## How to use +### 1. Create a crabfit +Make an event on your chosen crabfit instance, in our case https://crab.fit/ + +Except the name, use these settings when creating the event: + +![crabift-settings](crabfit-settings.png) + +Get your teammates to fill it out! + +### 2. Set the CRABFIT_API_URL +Get the event ID. It's at the end of the url of the event. In the demo url it's `cfschedulerdemo-282854`. Put `https://api.crab.fit/event/` in front of it and you have the API url, like so: `https://api.crab.fit/event/cfschedulerdemo-282854` + + +### 3. Start the application +#### docker-compose (suggested) +``` +docker compose up +``` + +#### pnpm +``` +pnpm install +pnpm build +pnpm preview +``` + +### 4. You're done! +Your webapp should be running on [127.0.0.1:3000](127.0.0.1:3000). It should look something like this: +![demo](demo.png) + + diff --git a/crabfit-settings.png b/crabfit-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..40c7f2186f6c400c082929c9e5db66cf9347452d GIT binary patch literal 40437 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 EAG_GjMF0Q* literal 0 HcmV?d00001 diff --git a/demo.png b/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..a03b8d565056a1983db78349027df5e36748bae4 GIT binary patch literal 47712 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 z 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 UXSPh9K!RLP+xT+vrR$IW3(zYZwg3PC literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..327fc3e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.8' + +services: + nodejs: + restart: unless-stopped + build: + context: ./ + dockerfile: Dockerfile + environment: + - CRABFIT_API_URL=${CRABFIT_API_URL} + ports: + - '3000:3000' + deploy: + update_config: + failure_action: rollback + order: start-first diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..a962878 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,40 @@ +import prettier from 'eslint-config-prettier'; +import { includeIgnoreFile } from '@eslint/compat'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import globals from 'globals'; +import { fileURLToPath } from 'node:url'; +import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); + +export default ts.config( + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { + globals: { ...globals.browser, ...globals.node } + }, + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off' + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig + } + } + } +); diff --git a/package.json b/package.json new file mode 100644 index 0000000..b1526a7 --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "name": "completely-fair-scheduler-webapp", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview --port 3000", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "test:unit": "vitest", + "test": "npm run test:unit -- --run" + }, + "devDependencies": { + "@eslint/compat": "^1.2.5", + "@eslint/js": "^9.31.0", + "@sveltejs/adapter-node": "^5.2.12", + "@sveltejs/kit": "^2.22.0", + "@sveltejs/vite-plugin-svelte": "^6.0.0", + "@tailwindcss/vite": "^4.0.0", + "daisyui": "^5.0.46", + "eslint": "^9.18.0", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-svelte": "^3.0.0", + "globals": "^16.0.0", + "mathjs": "^14.5.3", + "node-fetch": "^3.3.2", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.0.0", + "typescript-eslint": "^8.20.0", + "vite": "^7.0.4", + "vitest": "^3.2.3" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild" + ] + }, + "packageManager": "pnpm@9.12.1+sha512.e5a7e52a4183a02d5931057f7a0dbff9d5e9ce3161e33fa68ae392125b79282a8a8a470a51dfc8a0ed86221442eb2fb57019b0990ed24fab519bf0e1bc5ccfc4", + "dependencies": { + "@lucide/svelte": "^0.525.0", + "build": "^0.1.4", + "pnpm": "^10.14.0", + "preview": "^0.1.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..6156b4b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3486 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@lucide/svelte': + specifier: ^0.525.0 + version: 0.525.0(svelte@5.36.12) + build: + specifier: ^0.1.4 + version: 0.1.4 + pnpm: + specifier: ^10.14.0 + version: 10.14.0 + preview: + specifier: ^0.1.3 + version: 0.1.3 + devDependencies: + '@eslint/compat': + specifier: ^1.2.5 + version: 1.3.1(eslint@9.31.0(jiti@2.4.2)) + '@eslint/js': + specifier: ^9.31.0 + version: 9.31.0 + '@sveltejs/adapter-node': + specifier: ^5.2.12 + version: 5.2.13(@sveltejs/kit@2.25.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1))) + '@sveltejs/kit': + specifier: ^2.22.0 + version: 2.25.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.0.0 + version: 6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@tailwindcss/vite': + specifier: ^4.0.0 + version: 4.1.11(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + daisyui: + specifier: ^5.0.46 + version: 5.0.46 + eslint: + specifier: ^9.18.0 + version: 9.31.0(jiti@2.4.2) + eslint-config-prettier: + specifier: ^10.0.1 + version: 10.1.8(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-svelte: + specifier: ^3.0.0 + version: 3.11.0(eslint@9.31.0(jiti@2.4.2))(svelte@5.36.12) + globals: + specifier: ^16.0.0 + version: 16.3.0 + mathjs: + specifier: ^14.5.3 + version: 14.5.3 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + prettier: + specifier: ^3.4.2 + version: 3.6.2 + prettier-plugin-svelte: + specifier: ^3.3.3 + version: 3.4.0(prettier@3.6.2)(svelte@5.36.12) + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.12))(prettier@3.6.2) + svelte: + specifier: ^5.0.0 + version: 5.36.12 + svelte-check: + specifier: ^4.0.0 + version: 4.3.0(picomatch@4.0.3)(svelte@5.36.12)(typescript@5.8.3) + tailwindcss: + specifier: ^4.0.0 + version: 4.1.11 + typescript: + specifier: ^5.0.0 + version: 5.8.3 + typescript-eslint: + specifier: ^8.20.0 + version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + vite: + specifier: ^7.0.4 + version: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + vitest: + specifier: ^3.2.3 + version: 3.2.4(jiti@2.4.2)(lightningcss@1.30.1) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.3.1': + resolution: {integrity: sha512-k8MHony59I5EPic6EQTCNOuPoVBnoYXkP+20xvwFjN7t0qI3ImyvyBgg+hIVPwC8JaxVjjUZld+cLfBLFDLucg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@lucide/svelte@0.525.0': + resolution: {integrity: sha512-dyUxkXzepagLUzL8jHQNdeH286nC66ClLACsg+Neu/bjkRJWPWMzkT+H0DKlE70QdkicGCfs1ZGmXCc351hmZA==} + peerDependencies: + svelte: ^5 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rollup/plugin-commonjs@28.0.6': + resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + cpu: [x64] + os: [win32] + + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-node@5.2.13': + resolution: {integrity: sha512-yS2TVFmIrxjGhYaV5/iIUrJ3mJl6zjaYn0lBD70vTLnYvJeqf3cjvLXeXCUCuYinhSBoyF4DpfGla49BnIy7sQ==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.25.1': + resolution: {integrity: sha512-8H+fxDEp7Xq6tLFdrGdS5fLu6ONDQQ9DgyjboXpChubuFdfH9QoFX09ypssBpyNkJNZFt9eW3yLmXIc9CesPCA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + + '@sveltejs/vite-plugin-svelte-inspector@5.0.0': + resolution: {integrity: sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.1.0': + resolution: {integrity: sha512-+U6lz1wvGEG/BvQyL4z/flyNdQ9xDNv5vrh+vWBWTHaebqT0c9RNggpZTo/XSPoHsSCWBlYaTlRX8pZ9GATXCw==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.11': + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@typescript-eslint/eslint-plugin@8.37.0': + resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.37.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.37.0': + resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.37.0': + resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.37.0': + resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.37.0': + resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.37.0': + resolution: {integrity: sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.37.0': + resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.37.0': + resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.37.0': + resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.37.0': + resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + build@0.1.4: + resolution: {integrity: sha512-KwbDJ/zrsU8KZRRMfoURG14cKIAStUlS8D5jBDvtrZbwO5FEkYqc3oB8HIhRiyD64A48w1lc+sOmQ+mmBw5U/Q==} + engines: {node: '>v0.4.12'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + colors@1.1.2: + resolution: {integrity: sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==} + engines: {node: '>=0.1.90'} + + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + complex.js@2.4.2: + resolution: {integrity: sha512-qtx7HRhPGSCBtGiST4/WGHuW+zeaND/6Ld+db6PbrulIB1i2Ev/2UPiqcmpQNPSyfBKraC0EOvOKCB5dGZKt3g==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssmin@0.3.2: + resolution: {integrity: sha512-bynxGIAJ8ybrnFobjsQotIjA8HFDDgPwbeUWNXXXfR+B4f9kkxdcUyagJoQCSUOfMV+ZZ6bMn8bvbozlCzUGwQ==} + hasBin: true + + daisyui@5.0.46: + resolution: {integrity: sha512-vMDZK1tI/bOb2Mc3Mk5WpquBG3ZqBz1YKZ0xDlvpOvey60dOS4/5Qhdowq1HndbQl7PgDLDYysxAjjUjwR7/eQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + + escape-latex@1.2.0: + resolution: {integrity: sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-svelte@3.11.0: + resolution: {integrity: sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.31.0: + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@5.2.2: + resolution: {integrity: sha512-uXBDv5knpYmv/2gLzWQ5mBHGBRk9wcKTeWu6GLTUEQfjCxO09uM/mHDrojlL+Q1mVGIIFo149Gba7od1XPgSzQ==} + engines: {node: '>= 12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@0.3.7: + resolution: {integrity: sha512-/7PsVDNP2tVe2Z1cF9kTEkjamIwz4aooDpRKmN1+g/9eePCgcxsv4QDvEbxO0EH+gdDD7MLyDoR6BASo3hH51g==} + engines: {node: '> 0.4.11'} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsmin@1.0.1: + resolution: {integrity: sha512-OPuL5X/bFKgVdMvEIX3hnpx3jbVpFCrEM8pKPXjFkZUqg521r41ijdyTz7vACOhW6o1neVlcLyd+wkbK5fNHRg==} + engines: {node: '>=0.1.93'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jxLoader@0.1.1: + resolution: {integrity: sha512-ClEvAj3K68y8uKhub3RgTmcRPo5DfIWvtxqrKQdDPyZ1UVHIIKvVvjrAsJFSVL5wjv0rt5iH9SMCZ0XRKNzeUA==} + engines: {node: '>v0.4.10'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + mathjs@14.5.3: + resolution: {integrity: sha512-srHhiZwFPUjHuRywRG/+5xWUNcQJsDBNMYaSu7zEN+th6BB2TkUmBkIc2cpdDqtgu40Q7DneAsFmyzo8q3ugmA==} + engines: {node: '>= 18'} + hasBin: true + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + moo-server@1.3.0: + resolution: {integrity: sha512-9A8/eor2DXwpv1+a4pZAAydqLFVrWoKoO1fzdzqLUhYVXAO1Kgd1FR2gFZi7YdHzF0s4W8cDNwCfKJQrvLqxDw==} + engines: {node: '>v0.4.10'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pnpm@10.14.0: + resolution: {integrity: sha512-rSenlkG0nD5IGhaoBbqnGBegS74Go40X5g4urug/ahRsamiBJfV5LkjdW6MOfaUqXNpMOZK5zPMz+c4iOvhHSA==} + engines: {node: '>=18.12'} + hasBin: true + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier-plugin-tailwindcss@0.6.14: + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + preview@0.1.3: + resolution: {integrity: sha512-dEgpDFuinp138SqUyuxp9T3kb93o/CuaozXm1/7An4U43NFrrhprhDMnYN/OV0KhjeQP+plfaagyI0GKkmHucQ==} + engines: {node: '>=0.8.0'} + + promised-io@0.3.6: + resolution: {integrity: sha512-bNwZusuNIW4m0SPR8jooSyndD35ggirHlxVl/UhIaZD/F0OBv9ebfc6tNmbpZts3QXHggkjIBH8lvtnzhtcz0A==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-check@4.3.0: + resolution: {integrity: sha512-Iz8dFXzBNAM7XlEIsUjUGQhbEE+Pvv9odb9+0+ITTgFWZBGeJRRYqHUUglwe2EkLD5LIsQaAc4IUJyvtKuOO5w==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-eslint-parser@1.3.0: + resolution: {integrity: sha512-VCgMHKV7UtOGcGLGNFSbmdm6kEKjtzo5nnpGU/mnx4OsFY6bZ7QwRF5DUx+Hokw5Lvdyo8dpk8B1m8mliomrNg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte@5.36.12: + resolution: {integrity: sha512-c3mWT+b0yBLl3gPGSHiy4pdSQCsPNTjLC0tVoOhrGJ6PPfCzD/RQpAmAfJtQZ304CAae2ph+L3C4aqds3R3seQ==} + engines: {node: '>=18'} + + tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + timespan@2.3.0: + resolution: {integrity: sha512-0Jq9+58T2wbOyLth0EU+AUb6JMGCLaTWIykJFa7hyAybjVH9gpVMTfUAwo5fWAvtFt2Tjh/Elg8JtgNpnMnM8g==} + engines: {node: '>= 0.2.0'} + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-function@4.2.1: + resolution: {integrity: sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==} + engines: {node: '>= 18'} + + typescript-eslint@8.37.0: + resolution: {integrity: sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@1.3.5: + resolution: {integrity: sha512-YPX1DjKtom8l9XslmPFQnqWzTBkvI4N0pbkzLuPZZ4QTyig0uQqvZz9NgUdfEV+qccJzi7fVcGWdESvRIjWptQ==} + hasBin: true + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.0.5: + resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + 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 + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrench@1.3.9: + resolution: {integrity: sha512-srTJQmLTP5YtW+F5zDuqjMEZqLLr/eJOZfDI5ibfPfRMeDh3oBUefAscuH0q5wBKE339ptH/S/0D18ZkfOfmKQ==} + engines: {node: '>=0.1.97'} + deprecated: wrench.js is deprecated! You should check out fs-extra (https://github.com/jprichardson/node-fs-extra) for any operations you were using wrench for. Thanks for all the usage over the years. + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@babel/runtime@7.27.6': {} + + '@colors/colors@1.6.0': {} + + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@esbuild/aix-ppc64@0.25.8': + optional: true + + '@esbuild/android-arm64@0.25.8': + optional: true + + '@esbuild/android-arm@0.25.8': + optional: true + + '@esbuild/android-x64@0.25.8': + optional: true + + '@esbuild/darwin-arm64@0.25.8': + optional: true + + '@esbuild/darwin-x64@0.25.8': + optional: true + + '@esbuild/freebsd-arm64@0.25.8': + optional: true + + '@esbuild/freebsd-x64@0.25.8': + optional: true + + '@esbuild/linux-arm64@0.25.8': + optional: true + + '@esbuild/linux-arm@0.25.8': + optional: true + + '@esbuild/linux-ia32@0.25.8': + optional: true + + '@esbuild/linux-loong64@0.25.8': + optional: true + + '@esbuild/linux-mips64el@0.25.8': + optional: true + + '@esbuild/linux-ppc64@0.25.8': + optional: true + + '@esbuild/linux-riscv64@0.25.8': + optional: true + + '@esbuild/linux-s390x@0.25.8': + optional: true + + '@esbuild/linux-x64@0.25.8': + optional: true + + '@esbuild/netbsd-arm64@0.25.8': + optional: true + + '@esbuild/netbsd-x64@0.25.8': + optional: true + + '@esbuild/openbsd-arm64@0.25.8': + optional: true + + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + + '@esbuild/sunos-x64@0.25.8': + optional: true + + '@esbuild/win32-arm64@0.25.8': + optional: true + + '@esbuild/win32-ia32@0.25.8': + optional: true + + '@esbuild/win32-x64@0.25.8': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))': + dependencies: + eslint: 9.31.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.3.1(eslint@9.31.0(jiti@2.4.2))': + optionalDependencies: + eslint: 9.31.0(jiti@2.4.2) + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.15.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.31.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.3': + dependencies: + '@eslint/core': 0.15.1 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@lucide/svelte@0.525.0(svelte@5.36.12)': + dependencies: + svelte: 5.36.12 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@polka/url@1.0.0-next.29': {} + + '@rollup/plugin-commonjs@28.0.6(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.6(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.17 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-json@6.1.0(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + optionalDependencies: + rollup: 4.45.1 + + '@rollup/plugin-node-resolve@16.0.1(rollup@4.45.1)': + dependencies: + '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/pluginutils@5.2.0(rollup@4.45.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.45.1 + + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true + + '@rollup/rollup-android-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.45.1': + optional: true + + '@rollup/rollup-darwin-x64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.45.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.45.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.45.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.45.1': + optional: true + + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-node@5.2.13(@sveltejs/kit@2.25.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))': + dependencies: + '@rollup/plugin-commonjs': 28.0.6(rollup@4.45.1) + '@rollup/plugin-json': 6.1.0(rollup@4.45.1) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.45.1) + '@sveltejs/kit': 2.25.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + rollup: 4.45.1 + + '@sveltejs/kit@2.25.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.1 + svelte: 5.36.12 + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + debug: 4.4.1 + svelte: 5.36.12 + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.12)(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + debug: 4.4.1 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.36.12 + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + vitefu: 1.1.1(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + transitivePeerDependencies: + - supports-color + + '@tailwindcss/node@4.1.11': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.2 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + + '@tailwindcss/oxide-android-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide@4.1.11': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/vite@4.1.11(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + tailwindcss: 4.1.11 + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/cookie@0.6.0': {} + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/resolve@1.20.2': {} + + '@types/triple-beam@1.3.5': {} + + '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.37.0 + eslint: 9.31.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.31.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.37.0': {} + + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + eslint-visitor-keys: 4.2.1 + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + assertion-error@2.0.1: {} + + async@3.2.6: {} + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + build@0.1.4: + dependencies: + cssmin: 0.3.2 + jsmin: 1.0.1 + jxLoader: 0.1.1 + moo-server: 1.3.0 + promised-io: 0.3.6 + timespan: 2.3.0 + uglify-js: 1.3.5 + walker: 1.0.8 + winston: 3.17.0 + wrench: 1.3.9 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + chai@5.2.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.4 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + clsx@2.1.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + + colors@1.1.2: {} + + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + + commondir@1.0.1: {} + + complex.js@2.4.2: {} + + concat-map@0.0.1: {} + + cookie@0.6.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + cssmin@0.3.2: {} + + daisyui@5.0.46: {} + + data-uri-to-buffer@4.0.1: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + detect-libc@2.0.4: {} + + devalue@5.1.1: {} + + enabled@2.0.0: {} + + enhanced-resolve@5.18.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + es-module-lexer@1.7.0: {} + + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + + escape-latex@1.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@10.1.8(eslint@9.31.0(jiti@2.4.2)): + dependencies: + eslint: 9.31.0(jiti@2.4.2) + + eslint-plugin-svelte@3.11.0(eslint@9.31.0(jiti@2.4.2))(svelte@5.36.12): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@jridgewell/sourcemap-codec': 1.5.4 + eslint: 9.31.0(jiti@2.4.2) + esutils: 2.0.3 + globals: 16.3.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.2 + svelte-eslint-parser: 1.3.0(svelte@5.36.12) + optionalDependencies: + svelte: 5.36.12 + transitivePeerDependencies: + - ts-node + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.31.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.15.1 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.31.0 + '@eslint/plugin-kit': 0.3.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + esm-env@1.2.2: {} + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + expect-type@1.2.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + fn.name@1.1.0: {} + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@5.2.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globals@16.3.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + is-arrayish@0.3.2: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + javascript-natural-sort@0.7.1: {} + + jiti@2.4.2: {} + + js-tokens@9.0.1: {} + + js-yaml@0.3.7: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsmin@1.0.1: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jxLoader@0.1.1: + dependencies: + js-yaml: 0.3.7 + moo-server: 1.3.0 + promised-io: 0.3.6 + walker: 1.0.8 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@4.1.5: {} + + known-css-properties@0.37.0: {} + + kuler@2.0.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lilconfig@2.1.0: {} + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + loupe@3.1.4: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + mathjs@14.5.3: + dependencies: + '@babel/runtime': 7.27.6 + complex.js: 2.4.2 + decimal.js: 10.6.0 + escape-latex: 1.2.0 + fraction.js: 5.2.2 + javascript-natural-sort: 0.7.1 + seedrandom: 3.0.5 + tiny-emitter: 2.1.0 + typed-function: 4.2.1 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + + moo-server@1.3.0: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pnpm@10.14.0: {} + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.12): + dependencies: + prettier: 3.6.2 + svelte: 5.36.12 + + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.36.12))(prettier@3.6.2): + dependencies: + prettier: 3.6.2 + optionalDependencies: + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.36.12) + + prettier@3.6.2: {} + + preview@0.1.3: + dependencies: + colors: 1.1.2 + minimist: 1.2.8 + + promised-io@0.3.6: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@4.1.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rollup@4.45.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + seedrandom@3.0.5: {} + + semver@7.7.2: {} + + set-cookie-parser@2.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sirv@3.0.1: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + std-env@3.9.0: {} + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-json-comments@3.1.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-check@4.3.0(picomatch@4.0.3)(svelte@5.36.12)(typescript@5.8.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + chokidar: 4.0.3 + fdir: 6.4.6(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.36.12 + typescript: 5.8.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@1.3.0(svelte@5.36.12): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.0 + optionalDependencies: + svelte: 5.36.12 + + svelte@5.36.12: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.4 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 + + tailwindcss@4.1.11: {} + + tapable@2.2.2: {} + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + text-hex@1.0.0: {} + + timespan@2.3.0: {} + + tiny-emitter@2.1.0: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + triple-beam@1.4.1: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-function@4.2.1: {} + + typescript-eslint@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + typescript@5.8.3: {} + + uglify-js@1.3.5: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vite-node@3.2.4(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + esbuild: 0.25.8 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.45.1 + tinyglobby: 0.2.14 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + + vitefu@1.1.1(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)): + optionalDependencies: + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + + vitest@3.2.4(jiti@2.4.2)(lightningcss@1.30.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.0.5(jiti@2.4.2)(lightningcss@1.30.1) + vite-node: 3.2.4(jiti@2.4.2)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + web-streams-polyfill@3.3.3: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.17.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} + + wrench@1.3.9: {} + + yallist@5.0.0: {} + + yaml@1.10.2: {} + + yocto-queue@0.1.0: {} + + zimmerframe@1.1.2: {} diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..db658c7 --- /dev/null +++ b/src/app.css @@ -0,0 +1,4 @@ +@import 'tailwindcss'; +@plugin "daisyui" { + themes: cmyk --default, dracula --prefersdark; +} \ No newline at end of file diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..1391f88 --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/demo.spec.ts b/src/demo.spec.ts new file mode 100644 index 0000000..e07cbbd --- /dev/null +++ b/src/demo.spec.ts @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('sum test', () => { + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); +}); diff --git a/src/lib/components/ClickSpark.svelte b/src/lib/components/ClickSpark.svelte new file mode 100644 index 0000000..ab9c261 --- /dev/null +++ b/src/lib/components/ClickSpark.svelte @@ -0,0 +1,79 @@ + + + + +
+ + {#each Array(8) as _} + + {/each} + +
+ + diff --git a/src/lib/crabfitData.ts b/src/lib/crabfitData.ts new file mode 100644 index 0000000..db9cc25 --- /dev/null +++ b/src/lib/crabfitData.ts @@ -0,0 +1,17 @@ +import type { Member } from '$lib/meeting'; +import { fetchCrabfitData } from '$lib/meeting'; +import { env } from '$env/dynamic/private'; + +export let crabfitData: Member[] | null = null; +let lastFetchTime = 0; +const TTL = 1000 * 60 * 60 * 12; // 12 hours in ms + +export async function getCrabfitData(): Promise { + const now = Date.now(); + if (!crabfitData || now - lastFetchTime > TTL) { + crabfitData = await fetchCrabfitData(env.CRABFIT_API_URL); + lastFetchTime = now; + console.log(`${now} cached new crabifit data`); + } + return crabfitData; +} diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/src/lib/meeting.ts b/src/lib/meeting.ts new file mode 100644 index 0000000..80f56a7 --- /dev/null +++ b/src/lib/meeting.ts @@ -0,0 +1,108 @@ +import fetch from 'node-fetch'; +import { env } from '$env/dynamic/private'; + +export type Member = { + name: string; + availability: string[]; +}; + +export type Options = { + members: Member[]; + days: string[]; + number: number; +}; + +const dayMap: Record = { + Monday: '1', + Tuesday: '2', + Wednesday: '3', + Thursday: '4', + Friday: '5', + Saturday: '6', + Sunday: '7' +}; + +const dayReverseMap: Record = { + '1': 'Monday', + '2': 'Tuesday', + '3': 'Wednesday', + '4': 'Thursday', + '5': 'Friday', + '6': 'Saturday', + '7': 'Sunday' +}; + +export function findMeetingOptions( + members: Member[], + { days, number }: Omit +): { [key: string]: [string, string] }[] { + const data: Record = {}; + const selectedDays = days.map((d) => dayMap[d]); + + for (const member of members) { + for (const slot of member.availability) { + const [time, day] = slot.split('-'); + if (!time.endsWith('00')) continue; + if (!selectedDays.includes(day)) continue; + if (!data[slot]) data[slot] = []; + data[slot].push(member.name); + } + } + + const membersCount = members.length; + const slots = Object.keys(data); + const combinations = getCombinations(slots, number); + const seen: Set = new Set(); + const options: { [key: string]: [string, string] }[] = []; + let counter = 1; + + for (const combo of combinations) { + const unique = new Set(combo); + if (unique.size < number) continue; + const key = [...unique].sort().join(','); + if (seen.has(key)) continue; + seen.add(key); + + const attendeesPerSlot = combo.map((slot) => data[slot] ?? []); + const attendees = new Set(attendeesPerSlot.flat()); + + if ( + attendees.size === membersCount && + attendeesPerSlot.every((s) => s.length >= Math.floor(membersCount / number)) && + attendeesPerSlot.every((s) => s.length < Math.floor(membersCount / number) + 2) + ) { + for (const slot of combo) { + const [time, day] = slot.split('-'); + options.push({ + [`Option ${counter}`]: [dayReverseMap[day], time] + }); + counter += 1; + } + } + } + + return options; +} + +function getCombinations(arr: string[], size: number): string[][] { + if (size === 0) return [[]]; + if (size > arr.length) return []; + if (size === 1) return arr.map((v) => [v]); + const combos: string[][] = []; + for (let i = 0; i < arr.length; i++) { + const rest = getCombinations(arr.slice(i + 1), size - 1); + for (const r of rest) { + combos.push([arr[i], ...r]); + } + } + return combos; +} + +export async function fetchCrabfitData(apiUrl): Promise { + const res = await fetch(`${apiUrl}/people`); + return res.json(); +} + +export async function filterMemberData(members: string[], memberData: Member[]): Promise { + return members.map((name: string) => memberData.find((m) => m.name === name)).filter(Boolean); +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..b93e9ba --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,7 @@ + + +{@render children()} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts new file mode 100644 index 0000000..3f7d4a1 --- /dev/null +++ b/src/routes/+page.server.ts @@ -0,0 +1,38 @@ +import { fail } from '@sveltejs/kit'; +// import type { Actions } from './$types'; +import { getCrabfitData } from '$lib/crabfitData'; +import { findMeetingOptions, filterMemberData } from '$lib/meeting'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ fetch }) => { + const res = await fetch('/api/members'); + const data = await res.json(); + return { members: data.names }; +}; + +export const actions: Actions = { + getMeetings: async ({ request }) => { + const form = await request.formData(); + + const selectedMembers = form.getAll('selectedMembers'); + const days = form.getAll('selectedDays'); + // const number = form.get('number'); + const number = 1; + + if (!selectedMembers) return fail(500, { success: false, error: 'Select a member' }); + if (!days) return fail(500, { success: false, error: 'Select a day' }); + + try { + const crabfit = await getCrabfitData(); + + const members = await filterMemberData(selectedMembers, crabfit); + + const options = findMeetingOptions(members, { days, number }); + + return { success: true, options }; + } catch (err) { + console.error('findMeetingOptions error:', err); + return fail(500, { success: false, error: 'Failed to fetch meetings' }); + } + } +}; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..5eedb3f --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,206 @@ + + +
+
+
{ + return async ({ result, update }) => { + if (result.type === 'success') { + meetingOptions = result.data.options; + if (meetingOptions.length === 0) noMeetings = true; + } + + if (result.type === 'error' || result.type === 'failure') { + meetingOptions = []; + } + }; + }} + > +
+ + +
+ Which days + {#each daysOfTheWeek as day} + + {/each} +
+
+ +
+ Which members + + {#each data.members as member} + + {/each} +
+
+
+ +

Possible meeting times

+ +
+ {#if meetingOptions.length > 0} + +
+ {#each Object.entries(sortByDay(meetingOptions)) as [day, times]} +
    +

    + {day} +

    + {#each times as time} +
  • + {formatTime(time)} +
  • + {/each} +
+ {/each} +
+ {:else if noMeetings} +

No meeting options found

+ {:else} +

Select days and members first

+ {/if} +
+
+ + diff --git a/src/routes/api/members/+server.ts b/src/routes/api/members/+server.ts new file mode 100644 index 0000000..a2db3bf --- /dev/null +++ b/src/routes/api/members/+server.ts @@ -0,0 +1,12 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import { getCrabfitData } from '$lib/crabfitData'; + +export const GET: RequestHandler = async () => { + const crabfitData = await getCrabfitData(); + + const names = crabfitData.map((m) => m.name); + + return new Response(JSON.stringify({ names }), { + headers: { 'Content-Type': 'application/json' } + }); +}; diff --git a/src/routes/page.html b/src/routes/page.html new file mode 100644 index 0000000..e1005fe --- /dev/null +++ b/src/routes/page.html @@ -0,0 +1,96 @@ + + +
+ { return async ({ result, update }) => { if (result.type === 'success') { meetingOptions = + result.data; } if (result.type === 'error' || result.type === 'failure') { meetingOptions = []; } + }; }} > +
+ + +
+ +
+ + {#if members.length === 0} +

Loading members...

+ {:else} + + {/if} +
+ +
+ + +
+ + + +
+ +
+

Possible meeting times:

+ {#if meetingOptions.length > 0} +
    + {#each meetingOptions as option, i} {#each Object.entries(option) as [optName, [day, time]]} +
  • {optName}: {day} at {time}
  • + {/each} {/each} +
+ {:else} +

No meeting options found.

+ {/if} +
diff --git a/src/test/meeting.test.ts b/src/test/meeting.test.ts new file mode 100644 index 0000000..8db5c18 --- /dev/null +++ b/src/test/meeting.test.ts @@ -0,0 +1,107 @@ +import { describe, it, expect, vi } from 'vitest'; +import { fetchCrabfitData, filterMemberData, findMeetingOptions } from '$lib/meeting'; + +// vi.mock('node-fetch', async () => ({ +// default: vi.fn(() => +// Promise.resolve({ +// json: () => Promise.resolve(mockData) +// }) +// ) +// })); +const mockData = [ + { + name: 'Alice', + availability: ['1100-1', '1115-1', '1130-1', '1100-2'], + created_at: 1000000000 + }, + { + name: 'Bob', + availability: ['1100-1', '1400-1', '1500-1'], + created_at: 1000000001 + }, + // Charlie has no times on Monday, but does on Tuesdays + { + name: 'Charlie', + availability: ['2000-1', '1100-2'], + created_at: 1000000002 + } +]; + +const testData = [ + { + name: 'B', + availability: ['0900-1', '0915-1', '0930-1', '0945-1', '1000-1', '1015-1', '1030-1', '1045-1'], + created_at: 1753176466 + }, + { + name: 'A', + availability: ['0800-1', '0815-1', '0830-1', '0845-1', '0900-1', '0915-1', '0930-1', '0945-1'], + created_at: 1753176450 + } +]; + +const CRABFIT_TEST_API_URL = 'https://api.crab.fit/event/schedulertestdata-850919'; + +describe('findMeetingOptions', () => { + it('returns options correctly', async () => { + const options = await findMeetingOptions([mockData[0], mockData[1]], { + days: ['Monday'], + number: 1 + }); + expect(options).toEqual([{ 'Option 1': ['Monday', '1100'] }]); + }); + + it('returns options correctly', async () => { + const options = await findMeetingOptions([mockData[0], mockData[2]], { + days: ['Tuesday'], + number: 1 + }); + expect(options).toEqual([{ 'Option 1': ['Tuesday', '1100'] }]); + }); + + it('returns no options for impossible constraints', async () => { + const options = await findMeetingOptions([mockData[0], mockData[2]], { + days: ['Monday'], + number: 1 + }); + expect(options).toEqual([]); + }); +}); + +describe('filterMemberData', () => { + it('filters member data', async () => { + const members = ['A', 'B']; + const result = await filterMemberData(members, testData); + expect(result).toEqual(expect.arrayContaining(testData)); + }); +}); + +describe('fetchCrabfitData', () => { + it('gets member data', async () => { + expect(await fetchCrabfitData(CRABFIT_TEST_API_URL)).toEqual(testData); + }); +}); + +describe('integration', () => { + it('finds meetings with fetched data', async () => { + const crabfitData = await fetchCrabfitData(CRABFIT_TEST_API_URL); + const members = ['A', 'B']; + const memberData = await filterMemberData(members, crabfitData); + + const options = await findMeetingOptions(memberData, { + days: ['Monday'], + number: 1 + }); + expect(options).toEqual([{ 'Option 1': ['Monday', '0900'] }]); + }); + it('finds meetings with test data', async () => { + const members = ['A', 'B']; + const memberData = await filterMemberData(members, testData); + + const options = await findMeetingOptions(memberData, { + days: ['Monday'], + number: 1 + }); + expect(options).toEqual([{ 'Option 1': ['Monday', '0900'] }]); + }); +}); diff --git a/static/favicon.svg b/static/favicon.svg new file mode 100644 index 0000000..cc5dc66 --- /dev/null +++ b/static/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..f68d480 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,20 @@ +import adapter from '@sveltejs/adapter-node'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ out: 'build' }), + env: { + dir: "./" + }, + alias: { + $src: "./src", + } + }, +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0b2d886 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..184d986 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,20 @@ +import tailwindcss from '@tailwindcss/vite'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()], + test: { + projects: [ + { + extends: './vite.config.ts', + test: { + name: 'server', + environment: 'node', + include: ['src/**/*.{test,spec}.{js,ts}'], + exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'] + } + } + ] + } +});