From 986573cfc9be6c7fc86ab78180de0324c7f74e38 Mon Sep 17 00:00:00 2001 From: Bruno Bernardino Date: Fri, 26 Sep 2025 18:48:02 +0100 Subject: [PATCH] Upgrade Fresh to v2 Also upgrade all dependencies, make some unnecessary, and some other small tweaks. Because this has a big potential of unexpectedly breaking things, I'm doing a "breaking release", v3. --- .dockerignore | 1 + .dvmrc | 2 +- .github/workflows/build-docker-image.yml | 2 +- .github/workflows/deploy.yml | 2 +- .github/workflows/test.yml | 2 +- .gitignore | 3 + Dockerfile | 5 +- Makefile | 6 +- bewcloud.config.sample.ts | 2 +- client.ts | 1 + components/Header.tsx | 2 +- components/expenses/ExpenseModal.tsx | 1 - components/expenses/ListBudgets.tsx | 2 +- components/files/ListFiles.tsx | 2 +- components/files/ListPhotos.tsx | 6 +- crons/index.ts | 2 +- deno.json | 69 +- deno.lock | 1833 +++ dev.ts | 8 - docker-compose.dev.yml | 2 +- docker-compose.yml | 4 +- fresh.config.ts | 14 - fresh.gen.ts | 225 - islands/auth/MultiFactorAuthSettings.tsx | 4 +- lib/auth.ts | 12 +- lib/config.ts | 2 +- lib/feed.ts | 4 +- lib/form-utils.tsx | 2 +- lib/interfaces/database.ts | 2 +- lib/models/calendar.ts | 5 +- lib/models/contacts.ts | 3 +- lib/models/dav.js | 10891 ++++++++++++++++ lib/models/email.ts | 2 +- lib/models/files.ts | 5 +- lib/models/multi-factor-auth.ts | 2 +- lib/models/multi-factor-auth/totp.ts | 8 +- lib/models/news.ts | 4 +- lib/models/oidc.ts | 4 +- lib/types.ts | 3 +- lib/utils/calendar_test.ts | 3 +- lib/utils/contacts_test.ts | 3 +- lib/utils/files_test.ts | 3 +- lib/utils/misc_test.ts | 2 +- lib/utils/webdav.ts | 2 +- main.ts | 22 +- main_test.ts | 75 +- migrate-db.ts | 2 +- routes/.well-known/caldav.tsx | 4 +- routes/.well-known/carddav.tsx | 4 +- routes/_404.tsx | 38 - routes/_app.tsx | 6 +- routes/_error.tsx | 66 + routes/_middleware.tsx | 16 +- routes/api/auth/multi-factor/disable.ts | 8 +- routes/api/auth/multi-factor/email/setup.ts | 6 +- routes/api/auth/multi-factor/enable.ts | 8 +- routes/api/auth/multi-factor/passkey/begin.ts | 8 +- .../auth/multi-factor/passkey/setup-begin.ts | 6 +- .../multi-factor/passkey/setup-complete.ts | 8 +- .../api/auth/multi-factor/passkey/verify.ts | 8 +- routes/api/auth/multi-factor/totp/setup.ts | 6 +- routes/api/calendar/add-event.tsx | 8 +- routes/api/calendar/add.tsx | 8 +- routes/api/calendar/delete-event.tsx | 8 +- routes/api/calendar/delete.tsx | 8 +- routes/api/calendar/export-events.tsx | 8 +- routes/api/calendar/import.tsx | 8 +- routes/api/calendar/search-events.tsx | 8 +- routes/api/calendar/update.tsx | 8 +- routes/api/contacts/add-addressbook.tsx | 8 +- routes/api/contacts/add.tsx | 8 +- routes/api/contacts/delete-addressbook.tsx | 8 +- routes/api/contacts/delete.tsx | 8 +- routes/api/contacts/get-addressbooks.tsx | 8 +- routes/api/contacts/get.tsx | 8 +- routes/api/contacts/import.tsx | 8 +- routes/api/dashboard/save-links.tsx | 8 +- routes/api/dashboard/save-notes.tsx | 8 +- routes/api/expenses/add-budget.tsx | 8 +- routes/api/expenses/add-expense.tsx | 8 +- routes/api/expenses/auto-complete.tsx | 8 +- routes/api/expenses/delete-budget.tsx | 8 +- routes/api/expenses/delete-expense.tsx | 8 +- routes/api/expenses/export-expenses.tsx | 6 +- routes/api/expenses/import-expenses.tsx | 8 +- routes/api/expenses/update-budget.tsx | 8 +- routes/api/expenses/update-expense.tsx | 8 +- routes/api/files/create-directory.tsx | 8 +- routes/api/files/create-share.tsx | 8 +- routes/api/files/delete-directory.tsx | 8 +- routes/api/files/delete-share.tsx | 8 +- routes/api/files/delete.tsx | 8 +- routes/api/files/get-directories.tsx | 8 +- routes/api/files/get-share.tsx | 8 +- routes/api/files/get.tsx | 8 +- routes/api/files/move-directory.tsx | 8 +- routes/api/files/move.tsx | 8 +- routes/api/files/rename-directory.tsx | 8 +- routes/api/files/rename.tsx | 8 +- routes/api/files/search.tsx | 8 +- routes/api/files/update-share.tsx | 8 +- routes/api/files/upload.tsx | 8 +- routes/api/news/add-feed.tsx | 8 +- routes/api/news/delete-feed.tsx | 8 +- routes/api/news/import-feeds.tsx | 8 +- routes/api/news/mark-read.tsx | 8 +- routes/api/news/refresh-articles.tsx | 8 +- routes/api/notes/save.tsx | 8 +- routes/caldav.tsx | 6 +- routes/calendar.tsx | 28 +- routes/calendar/[calendarEventId].tsx | 42 +- routes/calendars.tsx | 8 +- routes/carddav.tsx | 6 +- routes/contacts.tsx | 28 +- routes/contacts/[contactId].tsx | 42 +- routes/dashboard.tsx | 8 +- routes/dav.tsx | 12 +- routes/expenses.tsx | 10 +- routes/file-share/[fileShareId].tsx | 11 +- .../[fileShareId]/open/[fileName].tsx | 11 +- routes/file-share/[fileShareId]/verify.tsx | 23 +- routes/files.tsx | 24 +- routes/files/open/[fileName].tsx | 10 +- routes/index.tsx | 6 +- routes/login.tsx | 56 +- routes/logout.tsx | 8 +- routes/mfa-verify.tsx | 40 +- routes/news.tsx | 8 +- routes/news/feeds.tsx | 8 +- routes/notes.tsx | 10 +- routes/notes/open/[fileName].tsx | 10 +- routes/oidc/callback.tsx | 15 +- routes/photos.tsx | 10 +- routes/photos/thumbnail/[fileName].tsx | 47 +- routes/settings.tsx | 80 +- routes/signup.tsx | 48 +- static/styles.css | 4 +- vite.config.ts | 36 + 138 files changed, 13638 insertions(+), 844 deletions(-) create mode 100644 client.ts create mode 100644 deno.lock delete mode 100755 dev.ts delete mode 100644 fresh.config.ts delete mode 100644 fresh.gen.ts create mode 100644 lib/models/dav.js delete mode 100644 routes/_404.tsx create mode 100644 routes/_error.tsx create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore index 1454c63..eb5ab74 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,3 +12,4 @@ node_modules _fresh data-files bewcloud.config.sample.ts +.vite diff --git a/.dvmrc b/.dvmrc index 59aa62c..73462a5 100644 --- a/.dvmrc +++ b/.dvmrc @@ -1 +1 @@ -2.4.5 +2.5.1 diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 0ab708f..f1ead8a 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Log in to the Container registry uses: docker/login-action@v3 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 60de93d..3dcb742 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -10,7 +10,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Configure SSH run: | mkdir -p ~/.ssh/ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2b3625c..4106457 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: denoland/setup-deno@v2 with: deno-version-file: .dvmrc diff --git a/.gitignore b/.gitignore index 1b9cac0..205a016 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ bewcloud.config.ts # Radicale files data-radicale/ + +# Vite files +.vite diff --git a/Dockerfile b/Dockerfile index 3d5d754..74aab20 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM denoland/deno:ubuntu-2.4.5 +FROM denoland/deno:ubuntu-2.5.1 EXPOSE 8000 @@ -22,4 +22,7 @@ USER deno # Compile the main app so that it doesn't need to be compiled each startup/entry. RUN deno cache --reload main.ts +# Allow the crons to start +ENV START_BEWCLOUD_CRONS=true + CMD ["run", "--allow-all", "main.ts"] diff --git a/Makefile b/Makefile index cd10544..cc6dc94 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +SHELL := /bin/bash + .PHONY: start start: deno task start @@ -19,10 +21,6 @@ build: migrate-db: deno run --allow-net --allow-read --allow-env migrate-db.ts -.PHONY: crons/cleanup -crons/cleanup: - deno run --allow-net --allow-read --allow-env crons/cleanup.ts - .PHONY: exec-db exec-db: docker exec -it -u postgres $(shell basename $(CURDIR))-postgresql-1 psql diff --git a/bewcloud.config.sample.ts b/bewcloud.config.sample.ts index 3c176e0..84ffba8 100644 --- a/bewcloud.config.sample.ts +++ b/bewcloud.config.sample.ts @@ -3,7 +3,7 @@ import { Config, PartialDeep } from './lib/types.ts'; /** Check the Config type for all the possible options and instructions. */ const config: PartialDeep = { auth: { - baseUrl: 'http://localhost:8000', // The base URL of the application you use to access the app, i.e. "http://localhost:8000" or "https://cloud.example.com" (SSO redirect, if enabled, will be this + /oidc/callback, so "https://cloud.example.com/oidc/callback") + baseUrl: 'http://localhost:8000', // The base URL of the application you use to access the app, i.e. "http://localhost:8000" or "https://cloud.example.com" (note authentication won't work without https:// except for localhost; SSO redirect, if enabled, will be this + /oidc/callback, so "https://cloud.example.com/oidc/callback") allowSignups: false, // If true, anyone can sign up for an account. Note that it's always possible to sign up for the first user, and they will be an admin enableEmailVerification: false, // If true, email verification will be required for signups (using SMTP settings below) enableForeverSignup: true, // If true, all signups become active for 100 years diff --git a/client.ts b/client.ts new file mode 100644 index 0000000..6c7803b --- /dev/null +++ b/client.ts @@ -0,0 +1 @@ +import './static/styles.css'; diff --git a/components/Header.tsx b/components/Header.tsx index 53bb605..4d74ae0 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -1,4 +1,4 @@ -import { Head } from 'fresh/runtime.ts'; +import { Head } from 'fresh/runtime'; import { OptionalApp, User } from '/lib/types.ts'; diff --git a/components/expenses/ExpenseModal.tsx b/components/expenses/ExpenseModal.tsx index a7dc10f..ca35c0d 100644 --- a/components/expenses/ExpenseModal.tsx +++ b/components/expenses/ExpenseModal.tsx @@ -191,7 +191,6 @@ export default function ExpenseModal( onChange={(event) => { newExpenseBudget.value = event.currentTarget.value; }} - placeholder='Misc' > {sortedBudgetNames.map((budget) => ( diff --git a/components/expenses/ListBudgets.tsx b/components/expenses/ListBudgets.tsx index 7ab9f6c..3f6a647 100644 --- a/components/expenses/ListBudgets.tsx +++ b/components/expenses/ListBudgets.tsx @@ -1,6 +1,6 @@ import { useSignal } from '@preact/signals'; import { useEffect, useRef } from 'preact/hooks'; -import { Chart } from 'chart.js'; +import { Chart } from 'chart.js/auto'; import { formatNumber } from '/lib/utils/misc.ts'; import { Budget, SupportedCurrencySymbol } from '/lib/types.ts'; diff --git a/components/files/ListFiles.tsx b/components/files/ListFiles.tsx index 18a80e4..371e526 100644 --- a/components/files/ListFiles.tsx +++ b/components/files/ListFiles.tsx @@ -1,4 +1,4 @@ -import { join } from 'std/path/join.ts'; +import { join } from '@std/path'; import { Directory, DirectoryFile } from '/lib/types.ts'; import { humanFileSize, TRASH_PATH } from '/lib/utils/files.ts'; diff --git a/components/files/ListPhotos.tsx b/components/files/ListPhotos.tsx index 0ab9660..40b00b4 100644 --- a/components/files/ListPhotos.tsx +++ b/components/files/ListPhotos.tsx @@ -1,7 +1,7 @@ import { Directory, DirectoryFile } from '/lib/types.ts'; import { humanFileSize, TRASH_PATH } from '/lib/utils/files.ts'; -interface ListFilesProps { +interface ListPhotosProps { directories: Directory[]; files: DirectoryFile[]; onClickOpenRenameDirectory?: (parentPath: string, name: string) => void; @@ -13,7 +13,7 @@ interface ListFilesProps { isShowingNotes?: boolean; } -export default function ListFiles( +export default function ListPhotos( { directories, files, @@ -24,7 +24,7 @@ export default function ListFiles( onClickDeleteDirectory, onClickDeleteFile, isShowingNotes, - }: ListFilesProps, + }: ListPhotosProps, ) { const dateFormatOptions: Intl.DateTimeFormatOptions = { year: 'numeric', diff --git a/crons/index.ts b/crons/index.ts index 5f0b162..d475efb 100644 --- a/crons/index.ts +++ b/crons/index.ts @@ -1,4 +1,4 @@ -import { Cron } from 'https://deno.land/x/croner@8.1.2/dist/croner.js'; +import { Cron } from '@hexagon/croner'; import { AppConfig } from '/lib/config.ts'; import { cleanupSessions } from './sessions.ts'; diff --git a/deno.json b/deno.json index 76419da..c791472 100644 --- a/deno.json +++ b/deno.json @@ -1,13 +1,10 @@ { - "lock": false, "tasks": { - "check": "deno fmt --check && deno lint && deno check **/*.ts && deno check **/*.tsx", - "cli": "echo \"import '\\$fresh/src/dev/cli.ts'\" | deno run --unstable -A -", - "manifest": "deno task cli manifest $(pwd)", - "start": "deno run -A --watch=static/,routes/,lib/,components/,islands/ dev.ts", - "build": "deno run -A dev.ts build", - "preview": "deno run -A main.ts", - "update": "deno run -A -r https://fresh.deno.dev/update .", + "check": "deno fmt --check && deno lint && deno check", + "start": "START_BEWCLOUD_CRONS=true vite --host localhost --port 8000", + "build": "vite build", + "preview": "START_BEWCLOUD_CRONS=true deno serve -A _fresh/server.js", + "update": "deno run -A -r jsr:@fresh/update .", "test": "deno test -A --check" }, "fmt": { @@ -16,13 +13,14 @@ "indentWidth": 2, "singleQuote": true, "proseWrap": "preserve", - "exclude": ["README.md"] + "exclude": ["README.md", "lib/models/dav.js"] }, "lint": { "rules": { "tags": ["fresh", "recommended"], "exclude": ["no-explicit-any", "no-empty-interface", "no-window", "no-unused-vars"] - } + }, + "exclude": ["lib/models/dav.js"] }, "exclude": ["./_fresh/*", "./node_modules/*", "**/_fresh/*"], "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "preact" }, @@ -30,28 +28,33 @@ "imports": { "/": "./", "./": "./", - "xml": "https://deno.land/x/xml@2.1.3/mod.ts", - "mrmime": "https://deno.land/x/mrmime@v2.0.0/mod.ts", - "fresh/": "https://deno.land/x/fresh@1.7.3/", - "$fresh/": "https://deno.land/x/fresh@1.7.3/", - "std/": "https://deno.land/std@0.224.0/", - "$std/": "https://deno.land/std@0.224.0/", - "postgres": "https://deno.land/x/postgres@v0.19.3/mod.ts", - "preact": "https://esm.sh/preact@10.23.2", - "preact/": "https://esm.sh/preact@10.23.2/", - "@preact/signals": "https://esm.sh/*@preact/signals@1.3.0", - "@preact/signals-core": "https://esm.sh/*@preact/signals-core@1.8.0", - "chart.js": "https://esm.sh/chart.js@4.4.9/auto", - "otpauth": "https://esm.sh/otpauth@9.4.0", - "qrcode": "https://esm.sh/qrcode@1.5.4", - "openid-client": "https://esm.sh/openid-client@6.6.3", - "@simplewebauthn/server": "jsr:@simplewebauthn/server@13.1.2", - "@simplewebauthn/server/helpers": "jsr:@simplewebauthn/server@13.1.2/helpers", - "@simplewebauthn/browser": "jsr:@simplewebauthn/browser@13.1.2", - "tailwindcss": "npm:tailwindcss@3.4.17", - "tailwindcss/": "npm:/tailwindcss@3.4.17/", - "tailwindcss/plugin": "npm:/tailwindcss@3.4.17/plugin.js", - "nodemailer": "npm:nodemailer@7.0.5", - "tsdav": "https://raw.githubusercontent.com/sunsama/tsdav/cc1c5a09b64c87bbee7e5f171cfcb6748e99469e/dist/tsdav.js" + + "fresh": "jsr:@fresh/core@2.1.1", + "postgres": "jsr:@db/postgres@0.19.5", + "@b-fuze/deno-dom": "jsr:@b-fuze/deno-dom@0.1.56", + "@fresh/plugin-vite": "jsr:@fresh/plugin-vite@1.0.4", + "@hexagon/croner": "jsr:@hexagon/croner@9.1.0", + "@mikaelporttila/rss": "jsr:@mikaelporttila/rss@1.1.3", + "@libs/qrcode": "jsr:@libs/qrcode@3.0.0", + "@libs/xml": "jsr:@libs/xml@7.0.2", + "@simplewebauthn/server": "jsr:@simplewebauthn/server@13.2.1", + "@simplewebauthn/browser": "jsr:@simplewebauthn/browser@13.2.0", + "@std/assert": "jsr:@std/assert@1.0.14", + "@std/dotenv": "jsr:@std/dotenv@0.225.5", + "@std/encoding": "jsr:@std/encoding@1.0.10", + "@std/http": "jsr:@std/http@1.0.20", + "@std/path": "jsr:@std/path@1.1.2", + + "chart.js": "npm:chart.js@4.5.0", + "mrmime": "npm:mrmime@2.0.1", + "nodemailer": "npm:nodemailer@7.0.6", + "openid-client": "npm:openid-client@6.8.0", + "otpauth": "npm:otpauth@9.4.1", + "preact": "npm:preact@10.27.2", + "sharp": "npm:sharp@0.34.4", + "tailwindcss": "npm:tailwindcss@4.1.13", + "vite": "npm:vite@7.1.7", + "@preact/signals": "npm:@preact/signals@2.3.1", + "@tailwindcss/vite": "npm:@tailwindcss/vite@4.1.13" } } diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..f5346d3 --- /dev/null +++ b/deno.lock @@ -0,0 +1,1833 @@ +{ + "version": "5", + "specifiers": { + "jsr:@b-fuze/deno-dom@0.1.56": "0.1.56", + "jsr:@db/postgres@0.19.5": "0.19.5", + "jsr:@deno/esbuild-plugin@^1.2.0": "1.2.0", + "jsr:@deno/loader@~0.3.2": "0.3.6", + "jsr:@deno/loader@~0.3.3": "0.3.6", + "jsr:@fresh/build-id@1": "1.0.1", + "jsr:@fresh/core@2": "2.1.1", + "jsr:@fresh/core@2.1.1": "2.1.1", + "jsr:@fresh/core@^2.1.1": "2.1.1", + "jsr:@fresh/plugin-vite@1.0.4": "1.0.4", + "jsr:@hexagon/croner@9.1.0": "9.1.0", + "jsr:@libs/qrcode@3.0.0": "3.0.0", + "jsr:@libs/xml@7.0.2": "7.0.2", + "jsr:@maxim-mazurok/sax-ts@1.2.13": "1.2.13", + "jsr:@mikaelporttila/rss@1.1.3": "1.1.3", + "jsr:@simplewebauthn/browser@13.2.0": "13.2.0", + "jsr:@simplewebauthn/server@13.2.1": "13.2.1", + "jsr:@std/assert@1.0.14": "1.0.14", + "jsr:@std/bytes@^1.0.5": "1.0.6", + "jsr:@std/bytes@^1.0.6": "1.0.6", + "jsr:@std/cli@^1.0.21": "1.0.22", + "jsr:@std/crypto@^1.0.4": "1.0.5", + "jsr:@std/dotenv@0.225.5": "0.225.5", + "jsr:@std/dotenv@~0.225.5": "0.225.5", + "jsr:@std/encoding@1": "1.0.10", + "jsr:@std/encoding@1.0.10": "1.0.10", + "jsr:@std/encoding@^1.0.10": "1.0.10", + "jsr:@std/encoding@^1.0.9": "1.0.10", + "jsr:@std/fmt@^1.0.6": "1.0.8", + "jsr:@std/fmt@^1.0.7": "1.0.8", + "jsr:@std/fmt@^1.0.8": "1.0.8", + "jsr:@std/fs@1": "1.0.19", + "jsr:@std/fs@^1.0.19": "1.0.19", + "jsr:@std/html@1": "1.0.4", + "jsr:@std/html@^1.0.4": "1.0.4", + "jsr:@std/http@1.0.20": "1.0.20", + "jsr:@std/http@^1.0.15": "1.0.20", + "jsr:@std/internal@^1.0.10": "1.0.10", + "jsr:@std/json@^1.0.2": "1.0.2", + "jsr:@std/jsonc@1": "1.0.2", + "jsr:@std/media-types@1": "1.1.0", + "jsr:@std/media-types@^1.1.0": "1.1.0", + "jsr:@std/net@^1.0.4": "1.0.6", + "jsr:@std/path@1": "1.1.2", + "jsr:@std/path@1.1.2": "1.1.2", + "jsr:@std/path@^1.0.8": "1.1.2", + "jsr:@std/path@^1.1.1": "1.1.2", + "jsr:@std/semver@1": "1.0.5", + "jsr:@std/streams@^1.0.10": "1.0.12", + "jsr:@std/uuid@^1.0.7": "1.0.9", + "npm:@babel/core@^7.28.0": "7.28.4", + "npm:@babel/preset-react@^7.27.1": "7.27.1_@babel+core@7.28.4", + "npm:@hexagon/base64@^1.1.27": "1.1.28", + "npm:@levischuck/tiny-cbor@~0.2.2": "0.2.11", + "npm:@mjackson/node-fetch-server@0.7": "0.7.0", + "npm:@opentelemetry/api@^1.9.0": "1.9.0", + "npm:@peculiar/asn1-android@^2.3.10": "2.5.0", + "npm:@peculiar/asn1-ecc@^2.3.8": "2.5.0", + "npm:@peculiar/asn1-rsa@^2.3.8": "2.5.0", + "npm:@peculiar/asn1-schema@^2.3.8": "2.5.0", + "npm:@peculiar/asn1-x509@^2.3.8": "2.5.0", + "npm:@peculiar/x509@^1.13.0": "1.14.0", + "npm:@preact/signals@2.3.1": "2.3.1_preact@10.27.2", + "npm:@preact/signals@^2.2.1": "2.3.1_preact@10.27.2", + "npm:@prefresh/vite@^2.4.8": "2.4.10_preact@10.27.2_vite@7.1.7__picomatch@4.0.3__@types+node@24.2.0_@types+node@24.2.0", + "npm:@tailwindcss/vite@4.1.13": "4.1.13_vite@7.1.7__picomatch@4.0.3_@types+node@24.2.0", + "npm:@types/node@*": "24.2.0", + "npm:chart.js@4.5.0": "4.5.0", + "npm:esbuild-wasm@0.25.7": "0.25.7", + "npm:esbuild@0.25.7": "0.25.7", + "npm:esbuild@~0.25.5": "0.25.7", + "npm:mrmime@2.0.1": "2.0.1", + "npm:nodemailer@7.0.6": "7.0.6", + "npm:openid-client@6.8.0": "6.8.0", + "npm:otpauth@9.4.1": "9.4.1", + "npm:preact-render-to-string@^6.5.11": "6.6.1_preact@10.27.2", + "npm:preact@10.27.2": "10.27.2", + "npm:preact@^10.27.0": "10.27.2", + "npm:rollup@^4.50.0": "4.52.2", + "npm:sharp@0.34.4": "0.34.4", + "npm:tailwindcss@4.1.13": "4.1.13", + "npm:vite@7.1.7": "7.1.7_picomatch@4.0.3_@types+node@24.2.0", + "npm:vite@^7.1.4": "7.1.7_picomatch@4.0.3_@types+node@24.2.0" + }, + "jsr": { + "@b-fuze/deno-dom@0.1.56": { + "integrity": "8030e2dc1d8750f1682b53462ab893d9c3470f2287feecbe22f44a88c54ab148" + }, + "@db/postgres@0.19.5": { + "integrity": "afdbe608bd066cda2ee5dba37c416d332098b9238c51aec223331108e281954c", + "dependencies": [ + "jsr:@std/bytes@^1.0.5", + "jsr:@std/crypto", + "jsr:@std/encoding@^1.0.9", + "jsr:@std/fmt@^1.0.6", + "jsr:@std/path@^1.0.8" + ] + }, + "@deno/esbuild-plugin@1.2.0": { + "integrity": "04ddd0fca9416d8a2866263928a53b9d5ed08dfca064d64504a0aaf9800c709e", + "dependencies": [ + "jsr:@deno/loader@~0.3.3", + "jsr:@std/path@^1.1.1", + "npm:esbuild@~0.25.5" + ] + }, + "@deno/loader@0.3.6": { + "integrity": "98f08d837c18ece5ba15122264fb29580967407c34e6552e152b8f453a60c2be" + }, + "@fresh/build-id@1.0.1": { + "integrity": "12a2ec25fd52ae9ec68c26848a5696cd1c9b537f7c983c7e56e4fb1e7e816c20", + "dependencies": [ + "jsr:@std/encoding@^1.0.10" + ] + }, + "@fresh/core@2.1.1": { + "integrity": "8ec49ee86c54947faf965d67e206383c79333bee2b7e891594e87bbd31b16d52", + "dependencies": [ + "jsr:@deno/esbuild-plugin", + "jsr:@fresh/build-id", + "jsr:@std/encoding@1", + "jsr:@std/fmt@^1.0.8", + "jsr:@std/fs@1", + "jsr:@std/html@1", + "jsr:@std/http@^1.0.15", + "jsr:@std/jsonc", + "jsr:@std/media-types@1", + "jsr:@std/path@1", + "jsr:@std/semver", + "jsr:@std/uuid", + "npm:@opentelemetry/api", + "npm:@preact/signals@^2.2.1", + "npm:esbuild-wasm", + "npm:esbuild@0.25.7", + "npm:preact-render-to-string", + "npm:preact@^10.27.0" + ] + }, + "@fresh/plugin-vite@1.0.4": { + "integrity": "9b9f5f645667e6f9aeb059d6dd7023cda84b8445304fcae2436a83aa0b5962fa", + "dependencies": [ + "jsr:@deno/loader@~0.3.2", + "jsr:@fresh/core@2", + "jsr:@fresh/core@^2.1.1", + "jsr:@std/dotenv@~0.225.5", + "jsr:@std/fmt@^1.0.7", + "jsr:@std/path@1", + "npm:@babel/core", + "npm:@babel/preset-react", + "npm:@mjackson/node-fetch-server", + "npm:@prefresh/vite", + "npm:rollup", + "npm:vite@^7.1.4" + ] + }, + "@hexagon/croner@9.1.0": { + "integrity": "defde0fcee33c7c7901d5d6be230a30fb326e5d31773bc991a2976468f61f9eb" + }, + "@libs/qrcode@3.0.0": { + "integrity": "f19ae517f67c33cd1c0ed3a54a46540980de45cb3327d09b21479a75d7222953" + }, + "@libs/xml@7.0.2": { + "integrity": "b0f8eb46328cdfc443e89eeb02dce2a9022c292c6342f2cbddcad8cf06cd5adf" + }, + "@maxim-mazurok/sax-ts@1.2.13": { + "integrity": "9f2f9a3ac1b142400940a4c9e916656fe63d4710a78102aeb8e08e863de2c76d" + }, + "@mikaelporttila/rss@1.1.3": { + "integrity": "2d6f09935489233fba13228c9e1670ef02aaeebffc9b1e63432eee3b34d12533", + "dependencies": [ + "jsr:@maxim-mazurok/sax-ts" + ] + }, + "@simplewebauthn/browser@13.2.0": { + "integrity": "181274e4e57506e8356d1b96db2410dfe006168d25c9c1b1fb27ad9a76ad35d8" + }, + "@simplewebauthn/server@13.2.1": { + "integrity": "9d01977bbfac70c2ca75388726161329b5a0fa7e555ddaddf4ba4bf7fdcc7adc", + "dependencies": [ + "npm:@hexagon/base64", + "npm:@levischuck/tiny-cbor", + "npm:@peculiar/asn1-android", + "npm:@peculiar/asn1-ecc", + "npm:@peculiar/asn1-rsa", + "npm:@peculiar/asn1-schema", + "npm:@peculiar/asn1-x509", + "npm:@peculiar/x509" + ] + }, + "@std/assert@1.0.14": { + "integrity": "68d0d4a43b365abc927f45a9b85c639ea18a9fab96ad92281e493e4ed84abaa4", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/bytes@1.0.6": { + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" + }, + "@std/cli@1.0.22": { + "integrity": "50d1e4f87887cb8a8afa29b88505ab5081188f5cad3985460c3b471fa49ff21a" + }, + "@std/crypto@1.0.5": { + "integrity": "0dcfbb319fe0bba1bd3af904ceb4f948cde1b92979ec1614528380ed308a3b40" + }, + "@std/dotenv@0.225.5": { + "integrity": "9ce6f9d0ec3311f74a32535aa1b8c62ed88b1ab91b7f0815797d77a6f60c922f" + }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, + "@std/fmt@1.0.8": { + "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" + }, + "@std/fs@1.0.19": { + "integrity": "051968c2b1eae4d2ea9f79a08a3845740ef6af10356aff43d3e2ef11ed09fb06", + "dependencies": [ + "jsr:@std/path@^1.1.1" + ] + }, + "@std/html@1.0.4": { + "integrity": "eff3497c08164e6ada49b7f81a28b5108087033823153d065e3f89467dd3d50e" + }, + "@std/http@1.0.20": { + "integrity": "b5cc33fc001bccce65ed4c51815668c9891c69ccd908295997e983d8f56070a1", + "dependencies": [ + "jsr:@std/cli", + "jsr:@std/encoding@^1.0.10", + "jsr:@std/fmt@^1.0.8", + "jsr:@std/fs@^1.0.19", + "jsr:@std/html@^1.0.4", + "jsr:@std/media-types@^1.1.0", + "jsr:@std/net", + "jsr:@std/path@^1.1.1", + "jsr:@std/streams" + ] + }, + "@std/internal@1.0.10": { + "integrity": "e3be62ce42cab0e177c27698e5d9800122f67b766a0bea6ca4867886cbde8cf7" + }, + "@std/json@1.0.2": { + "integrity": "d9e5497801c15fb679f55a2c01c7794ad7a5dfda4dd1bebab5e409cb5e0d34d4" + }, + "@std/jsonc@1.0.2": { + "integrity": "909605dae3af22bd75b1cbda8d64a32cf1fd2cf6efa3f9e224aba6d22c0f44c7", + "dependencies": [ + "jsr:@std/json" + ] + }, + "@std/media-types@1.1.0": { + "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" + }, + "@std/net@1.0.6": { + "integrity": "110735f93e95bb9feb95790a8b1d1bf69ec0dc74f3f97a00a76ea5efea25500c" + }, + "@std/path@1.1.2": { + "integrity": "c0b13b97dfe06546d5e16bf3966b1cadf92e1cc83e56ba5476ad8b498d9e3038", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/semver@1.0.5": { + "integrity": "529f79e83705714c105ad0ba55bec0f9da0f24d2f726b6cc1c15e505cc2c0624" + }, + "@std/streams@1.0.12": { + "integrity": "ae925fa1dc459b1abf5cbaa28cc5c7b0485853af3b2a384b0dc22d86e59dfbf4" + }, + "@std/uuid@1.0.9": { + "integrity": "44b627bf2d372fe1bd099e2ad41b2be41a777fc94e62a3151006895a037f1642", + "dependencies": [ + "jsr:@std/bytes@^1.0.6" + ] + } + }, + "npm": { + "@babel/code-frame@7.27.1": { + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": [ + "@babel/helper-validator-identifier", + "js-tokens", + "picocolors" + ] + }, + "@babel/compat-data@7.28.4": { + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==" + }, + "@babel/core@7.28.4": { + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/helper-compilation-targets", + "@babel/helper-module-transforms", + "@babel/helpers", + "@babel/parser", + "@babel/template", + "@babel/traverse", + "@babel/types", + "@jridgewell/remapping", + "convert-source-map", + "debug", + "gensync", + "json5", + "semver@6.3.1" + ] + }, + "@babel/generator@7.28.3": { + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dependencies": [ + "@babel/parser", + "@babel/types", + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping", + "jsesc" + ] + }, + "@babel/helper-annotate-as-pure@7.27.3": { + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": [ + "@babel/types" + ] + }, + "@babel/helper-compilation-targets@7.27.2": { + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dependencies": [ + "@babel/compat-data", + "@babel/helper-validator-option", + "browserslist", + "lru-cache", + "semver@6.3.1" + ] + }, + "@babel/helper-globals@7.28.0": { + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + }, + "@babel/helper-module-imports@7.27.1": { + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": [ + "@babel/traverse", + "@babel/types" + ] + }, + "@babel/helper-module-transforms@7.28.3_@babel+core@7.28.4": { + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dependencies": [ + "@babel/core", + "@babel/helper-module-imports", + "@babel/helper-validator-identifier", + "@babel/traverse" + ] + }, + "@babel/helper-plugin-utils@7.27.1": { + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" + }, + "@babel/helper-string-parser@7.27.1": { + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + }, + "@babel/helper-validator-identifier@7.27.1": { + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + }, + "@babel/helper-validator-option@7.27.1": { + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" + }, + "@babel/helpers@7.28.4": { + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dependencies": [ + "@babel/template", + "@babel/types" + ] + }, + "@babel/parser@7.28.4": { + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dependencies": [ + "@babel/types" + ], + "bin": true + }, + "@babel/plugin-syntax-jsx@7.27.1_@babel+core@7.28.4": { + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-display-name@7.28.0_@babel+core@7.28.4": { + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils" + ] + }, + "@babel/plugin-transform-react-jsx-development@7.27.1_@babel+core@7.28.4": { + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dependencies": [ + "@babel/core", + "@babel/plugin-transform-react-jsx" + ] + }, + "@babel/plugin-transform-react-jsx@7.27.1_@babel+core@7.28.4": { + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-module-imports", + "@babel/helper-plugin-utils", + "@babel/plugin-syntax-jsx", + "@babel/types" + ] + }, + "@babel/plugin-transform-react-pure-annotations@7.27.1_@babel+core@7.28.4": { + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dependencies": [ + "@babel/core", + "@babel/helper-annotate-as-pure", + "@babel/helper-plugin-utils" + ] + }, + "@babel/preset-react@7.27.1_@babel+core@7.28.4": { + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "dependencies": [ + "@babel/core", + "@babel/helper-plugin-utils", + "@babel/helper-validator-option", + "@babel/plugin-transform-react-display-name", + "@babel/plugin-transform-react-jsx", + "@babel/plugin-transform-react-jsx-development", + "@babel/plugin-transform-react-pure-annotations" + ] + }, + "@babel/template@7.27.2": { + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": [ + "@babel/code-frame", + "@babel/parser", + "@babel/types" + ] + }, + "@babel/traverse@7.28.4": { + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dependencies": [ + "@babel/code-frame", + "@babel/generator", + "@babel/helper-globals", + "@babel/parser", + "@babel/template", + "@babel/types", + "debug" + ] + }, + "@babel/types@7.28.4": { + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dependencies": [ + "@babel/helper-string-parser", + "@babel/helper-validator-identifier" + ] + }, + "@emnapi/runtime@1.5.0": { + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "dependencies": [ + "tslib@2.8.1" + ] + }, + "@esbuild/aix-ppc64@0.25.10": { + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "os": ["aix"], + "cpu": ["ppc64"] + }, + "@esbuild/aix-ppc64@0.25.7": { + "integrity": "sha512-uD0kKFHh6ETr8TqEtaAcV+dn/2qnYbH/+8wGEdY70Qf7l1l/jmBUbrmQqwiPKAQE6cOQ7dTj6Xr0HzQDGHyceQ==", + "os": ["aix"], + "cpu": ["ppc64"] + }, + "@esbuild/android-arm64@0.25.10": { + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@esbuild/android-arm64@0.25.7": { + "integrity": "sha512-p0ohDnwyIbAtztHTNUTzN5EGD/HJLs1bwysrOPgSdlIA6NDnReoVfoCyxG6W1d85jr2X80Uq5KHftyYgaK9LPQ==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@esbuild/android-arm@0.25.10": { + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "os": ["android"], + "cpu": ["arm"] + }, + "@esbuild/android-arm@0.25.7": { + "integrity": "sha512-Jhuet0g1k9rAJHrXGIh7sFknFuT4sfytYZpZpuZl7YKDhnPByVAm5oy2LEBmMbuYf3ejWVYCc2seX81Mk+madA==", + "os": ["android"], + "cpu": ["arm"] + }, + "@esbuild/android-x64@0.25.10": { + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "os": ["android"], + "cpu": ["x64"] + }, + "@esbuild/android-x64@0.25.7": { + "integrity": "sha512-mMxIJFlSgVK23HSsII3ZX9T2xKrBCDGyk0qiZnIW10LLFFtZLkFD6imZHu7gUo2wkNZwS9Yj3mOtZD3ZPcjCcw==", + "os": ["android"], + "cpu": ["x64"] + }, + "@esbuild/darwin-arm64@0.25.10": { + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@esbuild/darwin-arm64@0.25.7": { + "integrity": "sha512-jyOFLGP2WwRwxM8F1VpP6gcdIJc8jq2CUrURbbTouJoRO7XCkU8GdnTDFIHdcifVBT45cJlOYsZ1kSlfbKjYUQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@esbuild/darwin-x64@0.25.10": { + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@esbuild/darwin-x64@0.25.7": { + "integrity": "sha512-m9bVWqZCwQ1BthruifvG64hG03zzz9gE2r/vYAhztBna1/+qXiHyP9WgnyZqHgGeXoimJPhAmxfbeU+nMng6ZA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@esbuild/freebsd-arm64@0.25.10": { + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@esbuild/freebsd-arm64@0.25.7": { + "integrity": "sha512-Bss7P4r6uhr3kDzRjPNEnTm/oIBdTPRNQuwaEFWT/uvt6A1YzK/yn5kcx5ZxZ9swOga7LqeYlu7bDIpDoS01bA==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@esbuild/freebsd-x64@0.25.10": { + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@esbuild/freebsd-x64@0.25.7": { + "integrity": "sha512-S3BFyjW81LXG7Vqmr37ddbThrm3A84yE7ey/ERBlK9dIiaWgrjRlre3pbG7txh1Uaxz8N7wGGQXmC9zV+LIpBQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@esbuild/linux-arm64@0.25.10": { + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@esbuild/linux-arm64@0.25.7": { + "integrity": "sha512-HfQZQqrNOfS1Okn7PcsGUqHymL1cWGBslf78dGvtrj8q7cN3FkapFgNA4l/a5lXDwr7BqP2BSO6mz9UremNPbg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@esbuild/linux-arm@0.25.10": { + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@esbuild/linux-arm@0.25.7": { + "integrity": "sha512-JZMIci/1m5vfQuhKoFXogCKVYVfYQmoZJg8vSIMR4TUXbF+0aNlfXH3DGFEFMElT8hOTUF5hisdZhnrZO/bkDw==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@esbuild/linux-ia32@0.25.10": { + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "os": ["linux"], + "cpu": ["ia32"] + }, + "@esbuild/linux-ia32@0.25.7": { + "integrity": "sha512-9Jex4uVpdeofiDxnwHRgen+j6398JlX4/6SCbbEFEXN7oMO2p0ueLN+e+9DdsdPLUdqns607HmzEFnxwr7+5wQ==", + "os": ["linux"], + "cpu": ["ia32"] + }, + "@esbuild/linux-loong64@0.25.10": { + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@esbuild/linux-loong64@0.25.7": { + "integrity": "sha512-TG1KJqjBlN9IHQjKVUYDB0/mUGgokfhhatlay8aZ/MSORMubEvj/J1CL8YGY4EBcln4z7rKFbsH+HeAv0d471w==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@esbuild/linux-mips64el@0.25.10": { + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "os": ["linux"], + "cpu": ["mips64el"] + }, + "@esbuild/linux-mips64el@0.25.7": { + "integrity": "sha512-Ty9Hj/lx7ikTnhOfaP7ipEm/ICcBv94i/6/WDg0OZ3BPBHhChsUbQancoWYSO0WNkEiSW5Do4febTTy4x1qYQQ==", + "os": ["linux"], + "cpu": ["mips64el"] + }, + "@esbuild/linux-ppc64@0.25.10": { + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@esbuild/linux-ppc64@0.25.7": { + "integrity": "sha512-MrOjirGQWGReJl3BNQ58BLhUBPpWABnKrnq8Q/vZWWwAB1wuLXOIxS2JQ1LT3+5T+3jfPh0tyf5CpbyQHqnWIQ==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@esbuild/linux-riscv64@0.25.10": { + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@esbuild/linux-riscv64@0.25.7": { + "integrity": "sha512-9pr23/pqzyqIZEZmQXnFyqp3vpa+KBk5TotfkzGMqpw089PGm0AIowkUppHB9derQzqniGn3wVXgck19+oqiOw==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@esbuild/linux-s390x@0.25.10": { + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@esbuild/linux-s390x@0.25.7": { + "integrity": "sha512-4dP11UVGh9O6Y47m8YvW8eoA3r8qL2toVZUbBKyGta8j6zdw1cn9F/Rt59/Mhv0OgY68pHIMjGXWOUaykCnx+w==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@esbuild/linux-x64@0.25.10": { + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@esbuild/linux-x64@0.25.7": { + "integrity": "sha512-ghJMAJTdw/0uhz7e7YnpdX1xVn7VqA0GrWrAO2qKMuqbvgHT2VZiBv1BQ//VcHsPir4wsL3P2oPggfKPzTKoCA==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@esbuild/netbsd-arm64@0.25.10": { + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, + "@esbuild/netbsd-arm64@0.25.7": { + "integrity": "sha512-bwXGEU4ua45+u5Ci/a55B85KWaDSRS8NPOHtxy2e3etDjbz23wlry37Ffzapz69JAGGc4089TBo+dGzydQmydg==", + "os": ["netbsd"], + "cpu": ["arm64"] + }, + "@esbuild/netbsd-x64@0.25.10": { + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "os": ["netbsd"], + "cpu": ["x64"] + }, + "@esbuild/netbsd-x64@0.25.7": { + "integrity": "sha512-tUZRvLtgLE5OyN46sPSYlgmHoBS5bx2URSrgZdW1L1teWPYVmXh+QN/sKDqkzBo/IHGcKcHLKDhBeVVkO7teEA==", + "os": ["netbsd"], + "cpu": ["x64"] + }, + "@esbuild/openbsd-arm64@0.25.10": { + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, + "@esbuild/openbsd-arm64@0.25.7": { + "integrity": "sha512-bTJ50aoC+WDlDGBReWYiObpYvQfMjBNlKztqoNUL0iUkYtwLkBQQeEsTq/I1KyjsKA5tyov6VZaPb8UdD6ci6Q==", + "os": ["openbsd"], + "cpu": ["arm64"] + }, + "@esbuild/openbsd-x64@0.25.10": { + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@esbuild/openbsd-x64@0.25.7": { + "integrity": "sha512-TA9XfJrgzAipFUU895jd9j2SyDh9bbNkK2I0gHcvqb/o84UeQkBpi/XmYX3cO1q/9hZokdcDqQxIi6uLVrikxg==", + "os": ["openbsd"], + "cpu": ["x64"] + }, + "@esbuild/openharmony-arm64@0.25.10": { + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@esbuild/openharmony-arm64@0.25.7": { + "integrity": "sha512-5VTtExUrWwHHEUZ/N+rPlHDwVFQ5aME7vRJES8+iQ0xC/bMYckfJ0l2n3yGIfRoXcK/wq4oXSItZAz5wslTKGw==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@esbuild/sunos-x64@0.25.10": { + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "os": ["sunos"], + "cpu": ["x64"] + }, + "@esbuild/sunos-x64@0.25.7": { + "integrity": "sha512-umkbn7KTxsexhv2vuuJmj9kggd4AEtL32KodkJgfhNOHMPtQ55RexsaSrMb+0+jp9XL4I4o2y91PZauVN4cH3A==", + "os": ["sunos"], + "cpu": ["x64"] + }, + "@esbuild/win32-arm64@0.25.10": { + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@esbuild/win32-arm64@0.25.7": { + "integrity": "sha512-j20JQGP/gz8QDgzl5No5Gr4F6hurAZvtkFxAKhiv2X49yi/ih8ECK4Y35YnjlMogSKJk931iNMcd35BtZ4ghfw==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@esbuild/win32-ia32@0.25.10": { + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@esbuild/win32-ia32@0.25.7": { + "integrity": "sha512-4qZ6NUfoiiKZfLAXRsvFkA0hoWVM+1y2bSHXHkpdLAs/+r0LgwqYohmfZCi985c6JWHhiXP30mgZawn/XrqAkQ==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@esbuild/win32-x64@0.25.10": { + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@esbuild/win32-x64@0.25.7": { + "integrity": "sha512-FaPsAHTwm+1Gfvn37Eg3E5HIpfR3i6x1AIcla/MkqAIupD4BW3MrSeUqfoTzwwJhk3WE2/KqUn4/eenEJC76VA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@hexagon/base64@1.1.28": { + "integrity": "sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==" + }, + "@img/colour@1.0.0": { + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==" + }, + "@img/sharp-darwin-arm64@0.34.4": { + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "optionalDependencies": [ + "@img/sharp-libvips-darwin-arm64" + ], + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@img/sharp-darwin-x64@0.34.4": { + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "optionalDependencies": [ + "@img/sharp-libvips-darwin-x64" + ], + "os": ["darwin"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-darwin-arm64@1.2.3": { + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-darwin-x64@1.2.3": { + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-linux-arm64@1.2.3": { + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-linux-arm@1.2.3": { + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@img/sharp-libvips-linux-ppc64@1.2.3": { + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@img/sharp-libvips-linux-s390x@1.2.3": { + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@img/sharp-libvips-linux-x64@1.2.3": { + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-libvips-linuxmusl-arm64@1.2.3": { + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-libvips-linuxmusl-x64@1.2.3": { + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-linux-arm64@0.34.4": { + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-arm64" + ], + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-linux-arm@0.34.4": { + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-arm" + ], + "os": ["linux"], + "cpu": ["arm"] + }, + "@img/sharp-linux-ppc64@0.34.4": { + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-ppc64" + ], + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@img/sharp-linux-s390x@0.34.4": { + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-s390x" + ], + "os": ["linux"], + "cpu": ["s390x"] + }, + "@img/sharp-linux-x64@0.34.4": { + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "optionalDependencies": [ + "@img/sharp-libvips-linux-x64" + ], + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-linuxmusl-arm64@0.34.4": { + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "optionalDependencies": [ + "@img/sharp-libvips-linuxmusl-arm64" + ], + "os": ["linux"], + "cpu": ["arm64"] + }, + "@img/sharp-linuxmusl-x64@0.34.4": { + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "optionalDependencies": [ + "@img/sharp-libvips-linuxmusl-x64" + ], + "os": ["linux"], + "cpu": ["x64"] + }, + "@img/sharp-wasm32@0.34.4": { + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "dependencies": [ + "@emnapi/runtime" + ], + "cpu": ["wasm32"] + }, + "@img/sharp-win32-arm64@0.34.4": { + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@img/sharp-win32-ia32@0.34.4": { + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@img/sharp-win32-x64@0.34.4": { + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@isaacs/fs-minipass@4.0.1": { + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": [ + "minipass" + ] + }, + "@jridgewell/gen-mapping@0.3.13": { + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": [ + "@jridgewell/sourcemap-codec", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/remapping@2.3.5": { + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": [ + "@jridgewell/gen-mapping", + "@jridgewell/trace-mapping" + ] + }, + "@jridgewell/resolve-uri@3.1.2": { + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/sourcemap-codec@1.5.5": { + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "@jridgewell/trace-mapping@0.3.31": { + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": [ + "@jridgewell/resolve-uri", + "@jridgewell/sourcemap-codec" + ] + }, + "@kurkle/color@0.3.4": { + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" + }, + "@levischuck/tiny-cbor@0.2.11": { + "integrity": "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==" + }, + "@mjackson/node-fetch-server@0.7.0": { + "integrity": "sha512-un8diyEBKU3BTVj3GzlTPA1kIjCkGdD+AMYQy31Gf9JCkfoZzwgJ79GUtHrF2BN3XPNMLpubbzPcxys+a3uZEw==" + }, + "@noble/hashes@1.8.0": { + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==" + }, + "@opentelemetry/api@1.9.0": { + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" + }, + "@peculiar/asn1-android@2.5.0": { + "integrity": "sha512-t8A83hgghWQkcneRsgGs2ebAlRe54ns88p7ouv8PW2tzF1nAW4yHcL4uZKrFpIU+uszIRzTkcCuie37gpkId0A==", + "dependencies": [ + "@peculiar/asn1-schema", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-cms@2.5.0": { + "integrity": "sha512-p0SjJ3TuuleIvjPM4aYfvYw8Fk1Hn/zAVyPJZTtZ2eE9/MIer6/18ROxX6N/e6edVSfvuZBqhxAj3YgsmSjQ/A==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "@peculiar/asn1-x509-attr", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-csr@2.5.0": { + "integrity": "sha512-ioigvA6WSYN9h/YssMmmoIwgl3RvZlAYx4A/9jD2qaqXZwGcNlAxaw54eSx2QG1Yu7YyBC5Rku3nNoHrQ16YsQ==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-ecc@2.5.0": { + "integrity": "sha512-t4eYGNhXtLRxaP50h3sfO6aJebUCDGQACoeexcelL4roMFRRVgB20yBIu2LxsPh/tdW9I282gNgMOyg3ywg/mg==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-pfx@2.5.0": { + "integrity": "sha512-Vj0d0wxJZA+Ztqfb7W+/iu8Uasw6hhKtCdLKXLG/P3kEPIQpqGI4P4YXlROfl7gOCqFIbgsj1HzFIFwQ5s20ug==", + "dependencies": [ + "@peculiar/asn1-cms", + "@peculiar/asn1-pkcs8", + "@peculiar/asn1-rsa", + "@peculiar/asn1-schema", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-pkcs8@2.5.0": { + "integrity": "sha512-L7599HTI2SLlitlpEP8oAPaJgYssByI4eCwQq2C9eC90otFpm8MRn66PpbKviweAlhinWQ3ZjDD2KIVtx7PaVw==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-pkcs9@2.5.0": { + "integrity": "sha512-UgqSMBLNLR5TzEZ5ZzxR45Nk6VJrammxd60WMSkofyNzd3DQLSNycGWSK5Xg3UTYbXcDFyG8pA/7/y/ztVCa6A==", + "dependencies": [ + "@peculiar/asn1-cms", + "@peculiar/asn1-pfx", + "@peculiar/asn1-pkcs8", + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "@peculiar/asn1-x509-attr", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-rsa@2.5.0": { + "integrity": "sha512-qMZ/vweiTHy9syrkkqWFvbT3eLoedvamcUdnnvwyyUNv5FgFXA3KP8td+ATibnlZ0EANW5PYRm8E6MJzEB/72Q==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-schema@2.5.0": { + "integrity": "sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==", + "dependencies": [ + "asn1js", + "pvtsutils", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-x509-attr@2.5.0": { + "integrity": "sha512-9f0hPOxiJDoG/bfNLAFven+Bd4gwz/VzrCIIWc1025LEI4BXO0U5fOCTNDPbbp2ll+UzqKsZ3g61mpBp74gk9A==", + "dependencies": [ + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "asn1js", + "tslib@2.8.1" + ] + }, + "@peculiar/asn1-x509@2.5.0": { + "integrity": "sha512-CpwtMCTJvfvYTFMuiME5IH+8qmDe3yEWzKHe7OOADbGfq7ohxeLaXwQo0q4du3qs0AII3UbLCvb9NF/6q0oTKQ==", + "dependencies": [ + "@peculiar/asn1-schema", + "asn1js", + "pvtsutils", + "tslib@2.8.1" + ] + }, + "@peculiar/x509@1.14.0": { + "integrity": "sha512-Yc4PDxN3OrxUPiXgU63c+ZRXKGE8YKF2McTciYhUHFtHVB0KMnjeFSU0qpztGhsp4P0uKix4+J2xEpIEDu8oXg==", + "dependencies": [ + "@peculiar/asn1-cms", + "@peculiar/asn1-csr", + "@peculiar/asn1-ecc", + "@peculiar/asn1-pkcs9", + "@peculiar/asn1-rsa", + "@peculiar/asn1-schema", + "@peculiar/asn1-x509", + "pvtsutils", + "reflect-metadata", + "tslib@2.8.1", + "tsyringe" + ] + }, + "@preact/signals-core@1.12.1": { + "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==" + }, + "@preact/signals@2.3.1_preact@10.27.2": { + "integrity": "sha512-nyuRIGmcwM/HjvFHhN2xUWfyla9D4llHt+prWoxjQfD6b5prO7CFPlG/xjJkP31Oic4KQXfH9SIhJFP9cy4lmg==", + "dependencies": [ + "@preact/signals-core", + "preact" + ] + }, + "@prefresh/babel-plugin@0.5.2": { + "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==" + }, + "@prefresh/core@1.5.7_preact@10.27.2": { + "integrity": "sha512-AsyeitiPwG7UkT0mqgKzIDuydmYSKtBlzXEb5ymzskvxewcmVGRjQkcHDy6PCNBT7soAyHpQ0mPgXX4IeyOlUg==", + "dependencies": [ + "preact" + ] + }, + "@prefresh/utils@1.2.1": { + "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==" + }, + "@prefresh/vite@2.4.10_preact@10.27.2_vite@7.1.7__picomatch@4.0.3__@types+node@24.2.0_@types+node@24.2.0": { + "integrity": "sha512-lt+ODASOtXRWaPplp7/DlrgAaInnQYNvcpCglQBMx2OeJPyZ4IqPRaxsK77w96mWshjYwkqTsRSHoAM7aAn0ow==", + "dependencies": [ + "@babel/core", + "@prefresh/babel-plugin", + "@prefresh/core", + "@prefresh/utils", + "@rollup/pluginutils", + "preact", + "vite@7.1.7_picomatch@4.0.3_@types+node@24.2.0" + ] + }, + "@rollup/pluginutils@4.2.1": { + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dependencies": [ + "estree-walker", + "picomatch@2.3.1" + ] + }, + "@rollup/rollup-android-arm-eabi@4.52.2": { + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", + "os": ["android"], + "cpu": ["arm"] + }, + "@rollup/rollup-android-arm64@4.52.2": { + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-arm64@4.52.2": { + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@rollup/rollup-darwin-x64@4.52.2": { + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@rollup/rollup-freebsd-arm64@4.52.2": { + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", + "os": ["freebsd"], + "cpu": ["arm64"] + }, + "@rollup/rollup-freebsd-x64@4.52.2": { + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-arm-gnueabihf@4.52.2": { + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm-musleabihf@4.52.2": { + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@rollup/rollup-linux-arm64-gnu@4.52.2": { + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-arm64-musl@4.52.2": { + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@rollup/rollup-linux-loong64-gnu@4.52.2": { + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", + "os": ["linux"], + "cpu": ["loong64"] + }, + "@rollup/rollup-linux-ppc64-gnu@4.52.2": { + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rollup/rollup-linux-riscv64-gnu@4.52.2": { + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-riscv64-musl@4.52.2": { + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", + "os": ["linux"], + "cpu": ["riscv64"] + }, + "@rollup/rollup-linux-s390x-gnu@4.52.2": { + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", + "os": ["linux"], + "cpu": ["s390x"] + }, + "@rollup/rollup-linux-x64-gnu@4.52.2": { + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-linux-x64-musl@4.52.2": { + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@rollup/rollup-openharmony-arm64@4.52.2": { + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", + "os": ["openharmony"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-arm64-msvc@4.52.2": { + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@rollup/rollup-win32-ia32-msvc@4.52.2": { + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", + "os": ["win32"], + "cpu": ["ia32"] + }, + "@rollup/rollup-win32-x64-gnu@4.52.2": { + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@rollup/rollup-win32-x64-msvc@4.52.2": { + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@tailwindcss/node@4.1.13": { + "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", + "dependencies": [ + "@jridgewell/remapping", + "enhanced-resolve", + "jiti", + "lightningcss", + "magic-string", + "source-map-js", + "tailwindcss" + ] + }, + "@tailwindcss/oxide-android-arm64@4.1.13": { + "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", + "os": ["android"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-darwin-arm64@4.1.13": { + "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-darwin-x64@4.1.13": { + "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-freebsd-x64@4.1.13": { + "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13": { + "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", + "os": ["linux"], + "cpu": ["arm"] + }, + "@tailwindcss/oxide-linux-arm64-gnu@4.1.13": { + "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-linux-arm64-musl@4.1.13": { + "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-linux-x64-gnu@4.1.13": { + "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-linux-x64-musl@4.1.13": { + "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide-wasm32-wasi@4.1.13": { + "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", + "cpu": ["wasm32"] + }, + "@tailwindcss/oxide-win32-arm64-msvc@4.1.13": { + "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "@tailwindcss/oxide-win32-x64-msvc@4.1.13": { + "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", + "os": ["win32"], + "cpu": ["x64"] + }, + "@tailwindcss/oxide@4.1.13": { + "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", + "dependencies": [ + "detect-libc", + "tar" + ], + "optionalDependencies": [ + "@tailwindcss/oxide-android-arm64", + "@tailwindcss/oxide-darwin-arm64", + "@tailwindcss/oxide-darwin-x64", + "@tailwindcss/oxide-freebsd-x64", + "@tailwindcss/oxide-linux-arm-gnueabihf", + "@tailwindcss/oxide-linux-arm64-gnu", + "@tailwindcss/oxide-linux-arm64-musl", + "@tailwindcss/oxide-linux-x64-gnu", + "@tailwindcss/oxide-linux-x64-musl", + "@tailwindcss/oxide-wasm32-wasi", + "@tailwindcss/oxide-win32-arm64-msvc", + "@tailwindcss/oxide-win32-x64-msvc" + ], + "scripts": true + }, + "@tailwindcss/vite@4.1.13_vite@7.1.7__picomatch@4.0.3": { + "integrity": "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==", + "dependencies": [ + "@tailwindcss/node", + "@tailwindcss/oxide", + "tailwindcss", + "vite@7.1.7_picomatch@4.0.3" + ] + }, + "@tailwindcss/vite@4.1.13_vite@7.1.7__picomatch@4.0.3_@types+node@24.2.0": { + "integrity": "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==", + "dependencies": [ + "@tailwindcss/node", + "@tailwindcss/oxide", + "tailwindcss", + "vite@7.1.7_picomatch@4.0.3_@types+node@24.2.0" + ] + }, + "@types/estree@1.0.8": { + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "@types/node@24.2.0": { + "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", + "dependencies": [ + "undici-types" + ] + }, + "asn1js@3.0.6": { + "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", + "dependencies": [ + "pvtsutils", + "pvutils", + "tslib@2.8.1" + ] + }, + "baseline-browser-mapping@2.8.7": { + "integrity": "sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==", + "bin": true + }, + "browserslist@4.26.2": { + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "dependencies": [ + "baseline-browser-mapping", + "caniuse-lite", + "electron-to-chromium", + "node-releases", + "update-browserslist-db" + ], + "bin": true + }, + "caniuse-lite@1.0.30001745": { + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==" + }, + "chart.js@4.5.0": { + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "dependencies": [ + "@kurkle/color" + ] + }, + "chownr@3.0.0": { + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + }, + "convert-source-map@2.0.0": { + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "debug@4.4.3": { + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": [ + "ms" + ] + }, + "detect-libc@2.1.1": { + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==" + }, + "electron-to-chromium@1.5.224": { + "integrity": "sha512-kWAoUu/bwzvnhpdZSIc6KUyvkI1rbRXMT0Eq8pKReyOyaPZcctMli+EgvcN1PAvwVc7Tdo4Fxi2PsLNDU05mdg==" + }, + "enhanced-resolve@5.18.3": { + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dependencies": [ + "graceful-fs", + "tapable" + ] + }, + "esbuild-wasm@0.25.7": { + "integrity": "sha512-x3t1BlU59YOMtpwzayHxF4LPVujOvNKqm7y6jPvFKC13J8FmJRCdHPJwHq86er7ik+f7uwGcMbe+6KVzLGmsGw==", + "bin": true + }, + "esbuild@0.25.10": { + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "optionalDependencies": [ + "@esbuild/aix-ppc64@0.25.10", + "@esbuild/android-arm@0.25.10", + "@esbuild/android-arm64@0.25.10", + "@esbuild/android-x64@0.25.10", + "@esbuild/darwin-arm64@0.25.10", + "@esbuild/darwin-x64@0.25.10", + "@esbuild/freebsd-arm64@0.25.10", + "@esbuild/freebsd-x64@0.25.10", + "@esbuild/linux-arm@0.25.10", + "@esbuild/linux-arm64@0.25.10", + "@esbuild/linux-ia32@0.25.10", + "@esbuild/linux-loong64@0.25.10", + "@esbuild/linux-mips64el@0.25.10", + "@esbuild/linux-ppc64@0.25.10", + "@esbuild/linux-riscv64@0.25.10", + "@esbuild/linux-s390x@0.25.10", + "@esbuild/linux-x64@0.25.10", + "@esbuild/netbsd-arm64@0.25.10", + "@esbuild/netbsd-x64@0.25.10", + "@esbuild/openbsd-arm64@0.25.10", + "@esbuild/openbsd-x64@0.25.10", + "@esbuild/openharmony-arm64@0.25.10", + "@esbuild/sunos-x64@0.25.10", + "@esbuild/win32-arm64@0.25.10", + "@esbuild/win32-ia32@0.25.10", + "@esbuild/win32-x64@0.25.10" + ], + "scripts": true, + "bin": true + }, + "esbuild@0.25.7": { + "integrity": "sha512-daJB0q2dmTzo90L9NjRaohhRWrCzYxWNFTjEi72/h+p5DcY3yn4MacWfDakHmaBaDzDiuLJsCh0+6LK/iX+c+Q==", + "optionalDependencies": [ + "@esbuild/aix-ppc64@0.25.7", + "@esbuild/android-arm@0.25.7", + "@esbuild/android-arm64@0.25.7", + "@esbuild/android-x64@0.25.7", + "@esbuild/darwin-arm64@0.25.7", + "@esbuild/darwin-x64@0.25.7", + "@esbuild/freebsd-arm64@0.25.7", + "@esbuild/freebsd-x64@0.25.7", + "@esbuild/linux-arm@0.25.7", + "@esbuild/linux-arm64@0.25.7", + "@esbuild/linux-ia32@0.25.7", + "@esbuild/linux-loong64@0.25.7", + "@esbuild/linux-mips64el@0.25.7", + "@esbuild/linux-ppc64@0.25.7", + "@esbuild/linux-riscv64@0.25.7", + "@esbuild/linux-s390x@0.25.7", + "@esbuild/linux-x64@0.25.7", + "@esbuild/netbsd-arm64@0.25.7", + "@esbuild/netbsd-x64@0.25.7", + "@esbuild/openbsd-arm64@0.25.7", + "@esbuild/openbsd-x64@0.25.7", + "@esbuild/openharmony-arm64@0.25.7", + "@esbuild/sunos-x64@0.25.7", + "@esbuild/win32-arm64@0.25.7", + "@esbuild/win32-ia32@0.25.7", + "@esbuild/win32-x64@0.25.7" + ], + "scripts": true, + "bin": true + }, + "escalade@3.2.0": { + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + }, + "estree-walker@2.0.2": { + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "fdir@6.5.0_picomatch@4.0.3": { + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dependencies": [ + "picomatch@4.0.3" + ], + "optionalPeers": [ + "picomatch@4.0.3" + ] + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "os": ["darwin"], + "scripts": true + }, + "gensync@1.0.0-beta.2": { + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "graceful-fs@4.2.11": { + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "jiti@2.6.0": { + "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==", + "bin": true + }, + "jose@6.1.0": { + "integrity": "sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==" + }, + "js-tokens@4.0.0": { + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc@3.1.0": { + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": true + }, + "json5@2.2.3": { + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": true + }, + "lightningcss-darwin-arm64@1.30.1": { + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "os": ["darwin"], + "cpu": ["arm64"] + }, + "lightningcss-darwin-x64@1.30.1": { + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "os": ["darwin"], + "cpu": ["x64"] + }, + "lightningcss-freebsd-x64@1.30.1": { + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "os": ["freebsd"], + "cpu": ["x64"] + }, + "lightningcss-linux-arm-gnueabihf@1.30.1": { + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "os": ["linux"], + "cpu": ["arm"] + }, + "lightningcss-linux-arm64-gnu@1.30.1": { + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "lightningcss-linux-arm64-musl@1.30.1": { + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "os": ["linux"], + "cpu": ["arm64"] + }, + "lightningcss-linux-x64-gnu@1.30.1": { + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "os": ["linux"], + "cpu": ["x64"] + }, + "lightningcss-linux-x64-musl@1.30.1": { + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "os": ["linux"], + "cpu": ["x64"] + }, + "lightningcss-win32-arm64-msvc@1.30.1": { + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "os": ["win32"], + "cpu": ["arm64"] + }, + "lightningcss-win32-x64-msvc@1.30.1": { + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "os": ["win32"], + "cpu": ["x64"] + }, + "lightningcss@1.30.1": { + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dependencies": [ + "detect-libc" + ], + "optionalDependencies": [ + "lightningcss-darwin-arm64", + "lightningcss-darwin-x64", + "lightningcss-freebsd-x64", + "lightningcss-linux-arm-gnueabihf", + "lightningcss-linux-arm64-gnu", + "lightningcss-linux-arm64-musl", + "lightningcss-linux-x64-gnu", + "lightningcss-linux-x64-musl", + "lightningcss-win32-arm64-msvc", + "lightningcss-win32-x64-msvc" + ] + }, + "lru-cache@5.1.1": { + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": [ + "yallist@3.1.1" + ] + }, + "magic-string@0.30.19": { + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dependencies": [ + "@jridgewell/sourcemap-codec" + ] + }, + "minipass@7.1.2": { + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, + "minizlib@3.1.0": { + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dependencies": [ + "minipass" + ] + }, + "mrmime@2.0.1": { + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==" + }, + "ms@2.1.3": { + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nanoid@3.3.11": { + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "bin": true + }, + "node-releases@2.0.21": { + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==" + }, + "nodemailer@7.0.6": { + "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==" + }, + "oauth4webapi@3.8.1": { + "integrity": "sha512-olkZDELNycOWQf9LrsELFq8n05LwJgV8UkrS0cburk6FOwf8GvLam+YB+Uj5Qvryee+vwWOfQVeI5Vm0MVg7SA==" + }, + "openid-client@6.8.0": { + "integrity": "sha512-oG1d1nAVhIIE+JSjLS+7E9wY1QOJpZltkzlJdbZ7kEn7Hp3hqur2TEeQ8gLOHoHkhbRAGZJKoOnEQcLOQJuIyg==", + "dependencies": [ + "jose", + "oauth4webapi" + ] + }, + "otpauth@9.4.1": { + "integrity": "sha512-+iVvys36CFsyXEqfNftQm1II7SW23W1wx9RwNk0Cd97lbvorqAhBDksb/0bYry087QMxjiuBS0wokdoZ0iUeAw==", + "dependencies": [ + "@noble/hashes" + ] + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "picomatch@2.3.1": { + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "picomatch@4.0.3": { + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + }, + "postcss@8.5.6": { + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "preact-render-to-string@6.6.1_preact@10.27.2": { + "integrity": "sha512-IIMfXRjmbSP9QmG18WJLQa4Z4yx3J0VC9QN5q9z2XYlWSzFlJ+bSm/AyLyyV/YFwjof1OXFX2Mz6Ao60LXudJg==", + "dependencies": [ + "preact" + ] + }, + "preact@10.27.2": { + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==" + }, + "pvtsutils@1.3.6": { + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dependencies": [ + "tslib@2.8.1" + ] + }, + "pvutils@1.1.3": { + "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==" + }, + "reflect-metadata@0.2.2": { + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "rollup@4.52.2": { + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", + "dependencies": [ + "@types/estree" + ], + "optionalDependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loong64-gnu", + "@rollup/rollup-linux-ppc64-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-riscv64-musl", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-openharmony-arm64", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-gnu", + "@rollup/rollup-win32-x64-msvc", + "fsevents" + ], + "bin": true + }, + "semver@6.3.1": { + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": true + }, + "semver@7.7.2": { + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "bin": true + }, + "sharp@0.34.4": { + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "dependencies": [ + "@img/colour", + "detect-libc", + "semver@7.7.2" + ], + "optionalDependencies": [ + "@img/sharp-darwin-arm64", + "@img/sharp-darwin-x64", + "@img/sharp-libvips-darwin-arm64", + "@img/sharp-libvips-darwin-x64", + "@img/sharp-libvips-linux-arm", + "@img/sharp-libvips-linux-arm64", + "@img/sharp-libvips-linux-ppc64", + "@img/sharp-libvips-linux-s390x", + "@img/sharp-libvips-linux-x64", + "@img/sharp-libvips-linuxmusl-arm64", + "@img/sharp-libvips-linuxmusl-x64", + "@img/sharp-linux-arm", + "@img/sharp-linux-arm64", + "@img/sharp-linux-ppc64", + "@img/sharp-linux-s390x", + "@img/sharp-linux-x64", + "@img/sharp-linuxmusl-arm64", + "@img/sharp-linuxmusl-x64", + "@img/sharp-wasm32", + "@img/sharp-win32-arm64", + "@img/sharp-win32-ia32", + "@img/sharp-win32-x64" + ], + "scripts": true + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "tailwindcss@4.1.13": { + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==" + }, + "tapable@2.2.3": { + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==" + }, + "tar@7.5.1": { + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "dependencies": [ + "@isaacs/fs-minipass", + "chownr", + "minipass", + "minizlib", + "yallist@5.0.0" + ] + }, + "tinyglobby@0.2.15_picomatch@4.0.3": { + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dependencies": [ + "fdir", + "picomatch@4.0.3" + ] + }, + "tslib@1.14.1": { + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "tsyringe@4.10.0": { + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "dependencies": [ + "tslib@1.14.1" + ] + }, + "undici-types@7.10.0": { + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==" + }, + "update-browserslist-db@1.1.3_browserslist@4.26.2": { + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dependencies": [ + "browserslist", + "escalade", + "picocolors" + ], + "bin": true + }, + "vite@7.1.7_picomatch@4.0.3": { + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "dependencies": [ + "esbuild@0.25.10", + "fdir", + "picomatch@4.0.3", + "postcss", + "rollup", + "tinyglobby" + ], + "optionalDependencies": [ + "fsevents" + ], + "bin": true + }, + "vite@7.1.7_picomatch@4.0.3_@types+node@24.2.0": { + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "dependencies": [ + "@types/node", + "esbuild@0.25.10", + "fdir", + "picomatch@4.0.3", + "postcss", + "rollup", + "tinyglobby" + ], + "optionalDependencies": [ + "fsevents" + ], + "optionalPeers": [ + "@types/node" + ], + "bin": true + }, + "yallist@3.1.1": { + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yallist@5.0.0": { + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + } + }, + "workspace": { + "dependencies": [ + "jsr:@b-fuze/deno-dom@0.1.56", + "jsr:@db/postgres@0.19.5", + "jsr:@fresh/core@2.1.1", + "jsr:@fresh/plugin-vite@1.0.4", + "jsr:@hexagon/croner@9.1.0", + "jsr:@libs/qrcode@3.0.0", + "jsr:@libs/xml@7.0.2", + "jsr:@mikaelporttila/rss@1.1.3", + "jsr:@simplewebauthn/browser@13.2.0", + "jsr:@simplewebauthn/server@13.2.1", + "jsr:@std/assert@1.0.14", + "jsr:@std/dotenv@0.225.5", + "jsr:@std/encoding@1.0.10", + "jsr:@std/http@1.0.20", + "jsr:@std/path@1.1.2", + "npm:@preact/signals@2.3.1", + "npm:@tailwindcss/vite@4.1.13", + "npm:chart.js@4.5.0", + "npm:mrmime@2.0.1", + "npm:nodemailer@7.0.6", + "npm:openid-client@6.8.0", + "npm:otpauth@9.4.1", + "npm:preact@10.27.2", + "npm:sharp@0.34.4", + "npm:tailwindcss@4.1.13", + "npm:vite@7.1.7" + ] + } +} diff --git a/dev.ts b/dev.ts deleted file mode 100755 index 43f077b..0000000 --- a/dev.ts +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env -S deno run -A --watch=static/,routes/,lib/,components/,islands/ - -import dev from 'fresh/dev.ts'; -import config from './fresh.config.ts'; - -import 'std/dotenv/load.ts'; - -await dev(import.meta.url, './main.ts', config); diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 9384e3a..4508456 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -18,7 +18,7 @@ services: # NOTE: If you don't want to use the CardDav/CalDav servers, you can comment/remove this service. radicale: - image: tomsquest/docker-radicale:3.5.4.0 + image: tomsquest/docker-radicale:3.5.6.0 ports: - 5232:5232 init: true diff --git a/docker-compose.yml b/docker-compose.yml index afb9756..c0741ab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: website: - image: ghcr.io/bewcloud/bewcloud:v2.5.3 + image: ghcr.io/bewcloud/bewcloud:v3.0.0 restart: always ports: - 127.0.0.1:8000:8000 @@ -32,7 +32,7 @@ services: # NOTE: If you don't want to use the CardDav/CalDav servers, you can comment/remove this service. radicale: - image: tomsquest/docker-radicale:3.5.4.0 + image: tomsquest/docker-radicale:3.5.6.0 # NOTE: uncomment below only if you need to connect to the CardDav/CalDav servers from outside the container # ports: # - 127.0.0.1:5232:5232 diff --git a/fresh.config.ts b/fresh.config.ts deleted file mode 100644 index 8f0c2b0..0000000 --- a/fresh.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'fresh/server.ts'; -import tailwind from 'fresh/plugins/tailwind.ts'; - -import { startCrons } from '/crons/index.ts'; - -const isBuildMode = Deno.args.includes('build'); - -if (!isBuildMode) { - await startCrons(); -} - -export default defineConfig({ - plugins: [tailwind()], -}); diff --git a/fresh.gen.ts b/fresh.gen.ts deleted file mode 100644 index a22a133..0000000 --- a/fresh.gen.ts +++ /dev/null @@ -1,225 +0,0 @@ -// DO NOT EDIT. This file is generated by Fresh. -// This file SHOULD be checked into source version control. -// This file is automatically updated during development when running `dev.ts`. - -import * as $_well_known_caldav from './routes/.well-known/caldav.tsx'; -import * as $_well_known_carddav from './routes/.well-known/carddav.tsx'; -import * as $_404 from './routes/_404.tsx'; -import * as $_app from './routes/_app.tsx'; -import * as $_middleware from './routes/_middleware.tsx'; -import * as $api_auth_multi_factor_disable from './routes/api/auth/multi-factor/disable.ts'; -import * as $api_auth_multi_factor_email_setup from './routes/api/auth/multi-factor/email/setup.ts'; -import * as $api_auth_multi_factor_enable from './routes/api/auth/multi-factor/enable.ts'; -import * as $api_auth_multi_factor_passkey_begin from './routes/api/auth/multi-factor/passkey/begin.ts'; -import * as $api_auth_multi_factor_passkey_setup_begin from './routes/api/auth/multi-factor/passkey/setup-begin.ts'; -import * as $api_auth_multi_factor_passkey_setup_complete from './routes/api/auth/multi-factor/passkey/setup-complete.ts'; -import * as $api_auth_multi_factor_passkey_verify from './routes/api/auth/multi-factor/passkey/verify.ts'; -import * as $api_auth_multi_factor_totp_setup from './routes/api/auth/multi-factor/totp/setup.ts'; -import * as $api_calendar_add_event from './routes/api/calendar/add-event.tsx'; -import * as $api_calendar_add from './routes/api/calendar/add.tsx'; -import * as $api_calendar_delete_event from './routes/api/calendar/delete-event.tsx'; -import * as $api_calendar_delete from './routes/api/calendar/delete.tsx'; -import * as $api_calendar_export_events from './routes/api/calendar/export-events.tsx'; -import * as $api_calendar_import from './routes/api/calendar/import.tsx'; -import * as $api_calendar_search_events from './routes/api/calendar/search-events.tsx'; -import * as $api_calendar_update from './routes/api/calendar/update.tsx'; -import * as $api_contacts_add_addressbook from './routes/api/contacts/add-addressbook.tsx'; -import * as $api_contacts_add from './routes/api/contacts/add.tsx'; -import * as $api_contacts_delete_addressbook from './routes/api/contacts/delete-addressbook.tsx'; -import * as $api_contacts_delete from './routes/api/contacts/delete.tsx'; -import * as $api_contacts_get_addressbooks from './routes/api/contacts/get-addressbooks.tsx'; -import * as $api_contacts_get from './routes/api/contacts/get.tsx'; -import * as $api_contacts_import from './routes/api/contacts/import.tsx'; -import * as $api_dashboard_save_links from './routes/api/dashboard/save-links.tsx'; -import * as $api_dashboard_save_notes from './routes/api/dashboard/save-notes.tsx'; -import * as $api_expenses_add_budget from './routes/api/expenses/add-budget.tsx'; -import * as $api_expenses_add_expense from './routes/api/expenses/add-expense.tsx'; -import * as $api_expenses_auto_complete from './routes/api/expenses/auto-complete.tsx'; -import * as $api_expenses_delete_budget from './routes/api/expenses/delete-budget.tsx'; -import * as $api_expenses_delete_expense from './routes/api/expenses/delete-expense.tsx'; -import * as $api_expenses_export_expenses from './routes/api/expenses/export-expenses.tsx'; -import * as $api_expenses_import_expenses from './routes/api/expenses/import-expenses.tsx'; -import * as $api_expenses_update_budget from './routes/api/expenses/update-budget.tsx'; -import * as $api_expenses_update_expense from './routes/api/expenses/update-expense.tsx'; -import * as $api_files_create_directory from './routes/api/files/create-directory.tsx'; -import * as $api_files_create_share from './routes/api/files/create-share.tsx'; -import * as $api_files_delete_directory from './routes/api/files/delete-directory.tsx'; -import * as $api_files_delete_share from './routes/api/files/delete-share.tsx'; -import * as $api_files_delete from './routes/api/files/delete.tsx'; -import * as $api_files_get_directories from './routes/api/files/get-directories.tsx'; -import * as $api_files_get_share from './routes/api/files/get-share.tsx'; -import * as $api_files_get from './routes/api/files/get.tsx'; -import * as $api_files_move_directory from './routes/api/files/move-directory.tsx'; -import * as $api_files_move from './routes/api/files/move.tsx'; -import * as $api_files_rename_directory from './routes/api/files/rename-directory.tsx'; -import * as $api_files_rename from './routes/api/files/rename.tsx'; -import * as $api_files_search from './routes/api/files/search.tsx'; -import * as $api_files_update_share from './routes/api/files/update-share.tsx'; -import * as $api_files_upload from './routes/api/files/upload.tsx'; -import * as $api_news_add_feed from './routes/api/news/add-feed.tsx'; -import * as $api_news_delete_feed from './routes/api/news/delete-feed.tsx'; -import * as $api_news_import_feeds from './routes/api/news/import-feeds.tsx'; -import * as $api_news_mark_read from './routes/api/news/mark-read.tsx'; -import * as $api_news_refresh_articles from './routes/api/news/refresh-articles.tsx'; -import * as $api_notes_save from './routes/api/notes/save.tsx'; -import * as $caldav from './routes/caldav.tsx'; -import * as $calendar from './routes/calendar.tsx'; -import * as $calendar_calendarEventId_ from './routes/calendar/[calendarEventId].tsx'; -import * as $calendars from './routes/calendars.tsx'; -import * as $carddav from './routes/carddav.tsx'; -import * as $contacts from './routes/contacts.tsx'; -import * as $contacts_contactId_ from './routes/contacts/[contactId].tsx'; -import * as $dashboard from './routes/dashboard.tsx'; -import * as $dav from './routes/dav.tsx'; -import * as $expenses from './routes/expenses.tsx'; -import * as $file_share_fileShareId_ from './routes/file-share/[fileShareId].tsx'; -import * as $file_share_fileShareId_open_fileName_ from './routes/file-share/[fileShareId]/open/[fileName].tsx'; -import * as $file_share_fileShareId_verify from './routes/file-share/[fileShareId]/verify.tsx'; -import * as $files from './routes/files.tsx'; -import * as $files_open_fileName_ from './routes/files/open/[fileName].tsx'; -import * as $index from './routes/index.tsx'; -import * as $login from './routes/login.tsx'; -import * as $logout from './routes/logout.tsx'; -import * as $mfa_verify from './routes/mfa-verify.tsx'; -import * as $news from './routes/news.tsx'; -import * as $news_feeds from './routes/news/feeds.tsx'; -import * as $notes from './routes/notes.tsx'; -import * as $notes_open_fileName_ from './routes/notes/open/[fileName].tsx'; -import * as $oidc_callback from './routes/oidc/callback.tsx'; -import * as $photos from './routes/photos.tsx'; -import * as $photos_thumbnail_fileName_ from './routes/photos/thumbnail/[fileName].tsx'; -import * as $settings from './routes/settings.tsx'; -import * as $signup from './routes/signup.tsx'; -import * as $Settings from './islands/Settings.tsx'; -import * as $auth_MultiFactorAuthSettings from './islands/auth/MultiFactorAuthSettings.tsx'; -import * as $auth_PasswordlessPasskeyLogin from './islands/auth/PasswordlessPasskeyLogin.tsx'; -import * as $calendar_CalendarWrapper from './islands/calendar/CalendarWrapper.tsx'; -import * as $calendar_Calendars from './islands/calendar/Calendars.tsx'; -import * as $calendar_ViewCalendarEvent from './islands/calendar/ViewCalendarEvent.tsx'; -import * as $contacts_Contacts from './islands/contacts/Contacts.tsx'; -import * as $contacts_ViewContact from './islands/contacts/ViewContact.tsx'; -import * as $dashboard_Links from './islands/dashboard/Links.tsx'; -import * as $dashboard_Notes from './islands/dashboard/Notes.tsx'; -import * as $expenses_ExpensesWrapper from './islands/expenses/ExpensesWrapper.tsx'; -import * as $files_FilesWrapper from './islands/files/FilesWrapper.tsx'; -import * as $news_Articles from './islands/news/Articles.tsx'; -import * as $news_Feeds from './islands/news/Feeds.tsx'; -import * as $notes_Note from './islands/notes/Note.tsx'; -import * as $notes_NotesWrapper from './islands/notes/NotesWrapper.tsx'; -import * as $photos_PhotosWrapper from './islands/photos/PhotosWrapper.tsx'; -import type { Manifest } from '$fresh/server.ts'; - -const manifest = { - routes: { - './routes/.well-known/caldav.tsx': $_well_known_caldav, - './routes/.well-known/carddav.tsx': $_well_known_carddav, - './routes/_404.tsx': $_404, - './routes/_app.tsx': $_app, - './routes/_middleware.tsx': $_middleware, - './routes/api/auth/multi-factor/disable.ts': $api_auth_multi_factor_disable, - './routes/api/auth/multi-factor/email/setup.ts': $api_auth_multi_factor_email_setup, - './routes/api/auth/multi-factor/enable.ts': $api_auth_multi_factor_enable, - './routes/api/auth/multi-factor/passkey/begin.ts': $api_auth_multi_factor_passkey_begin, - './routes/api/auth/multi-factor/passkey/setup-begin.ts': $api_auth_multi_factor_passkey_setup_begin, - './routes/api/auth/multi-factor/passkey/setup-complete.ts': $api_auth_multi_factor_passkey_setup_complete, - './routes/api/auth/multi-factor/passkey/verify.ts': $api_auth_multi_factor_passkey_verify, - './routes/api/auth/multi-factor/totp/setup.ts': $api_auth_multi_factor_totp_setup, - './routes/api/calendar/add-event.tsx': $api_calendar_add_event, - './routes/api/calendar/add.tsx': $api_calendar_add, - './routes/api/calendar/delete-event.tsx': $api_calendar_delete_event, - './routes/api/calendar/delete.tsx': $api_calendar_delete, - './routes/api/calendar/export-events.tsx': $api_calendar_export_events, - './routes/api/calendar/import.tsx': $api_calendar_import, - './routes/api/calendar/search-events.tsx': $api_calendar_search_events, - './routes/api/calendar/update.tsx': $api_calendar_update, - './routes/api/contacts/add-addressbook.tsx': $api_contacts_add_addressbook, - './routes/api/contacts/add.tsx': $api_contacts_add, - './routes/api/contacts/delete-addressbook.tsx': $api_contacts_delete_addressbook, - './routes/api/contacts/delete.tsx': $api_contacts_delete, - './routes/api/contacts/get-addressbooks.tsx': $api_contacts_get_addressbooks, - './routes/api/contacts/get.tsx': $api_contacts_get, - './routes/api/contacts/import.tsx': $api_contacts_import, - './routes/api/dashboard/save-links.tsx': $api_dashboard_save_links, - './routes/api/dashboard/save-notes.tsx': $api_dashboard_save_notes, - './routes/api/expenses/add-budget.tsx': $api_expenses_add_budget, - './routes/api/expenses/add-expense.tsx': $api_expenses_add_expense, - './routes/api/expenses/auto-complete.tsx': $api_expenses_auto_complete, - './routes/api/expenses/delete-budget.tsx': $api_expenses_delete_budget, - './routes/api/expenses/delete-expense.tsx': $api_expenses_delete_expense, - './routes/api/expenses/export-expenses.tsx': $api_expenses_export_expenses, - './routes/api/expenses/import-expenses.tsx': $api_expenses_import_expenses, - './routes/api/expenses/update-budget.tsx': $api_expenses_update_budget, - './routes/api/expenses/update-expense.tsx': $api_expenses_update_expense, - './routes/api/files/create-directory.tsx': $api_files_create_directory, - './routes/api/files/create-share.tsx': $api_files_create_share, - './routes/api/files/delete-directory.tsx': $api_files_delete_directory, - './routes/api/files/delete-share.tsx': $api_files_delete_share, - './routes/api/files/delete.tsx': $api_files_delete, - './routes/api/files/get-directories.tsx': $api_files_get_directories, - './routes/api/files/get-share.tsx': $api_files_get_share, - './routes/api/files/get.tsx': $api_files_get, - './routes/api/files/move-directory.tsx': $api_files_move_directory, - './routes/api/files/move.tsx': $api_files_move, - './routes/api/files/rename-directory.tsx': $api_files_rename_directory, - './routes/api/files/rename.tsx': $api_files_rename, - './routes/api/files/search.tsx': $api_files_search, - './routes/api/files/update-share.tsx': $api_files_update_share, - './routes/api/files/upload.tsx': $api_files_upload, - './routes/api/news/add-feed.tsx': $api_news_add_feed, - './routes/api/news/delete-feed.tsx': $api_news_delete_feed, - './routes/api/news/import-feeds.tsx': $api_news_import_feeds, - './routes/api/news/mark-read.tsx': $api_news_mark_read, - './routes/api/news/refresh-articles.tsx': $api_news_refresh_articles, - './routes/api/notes/save.tsx': $api_notes_save, - './routes/caldav.tsx': $caldav, - './routes/calendar.tsx': $calendar, - './routes/calendar/[calendarEventId].tsx': $calendar_calendarEventId_, - './routes/calendars.tsx': $calendars, - './routes/carddav.tsx': $carddav, - './routes/contacts.tsx': $contacts, - './routes/contacts/[contactId].tsx': $contacts_contactId_, - './routes/dashboard.tsx': $dashboard, - './routes/dav.tsx': $dav, - './routes/expenses.tsx': $expenses, - './routes/file-share/[fileShareId].tsx': $file_share_fileShareId_, - './routes/file-share/[fileShareId]/open/[fileName].tsx': $file_share_fileShareId_open_fileName_, - './routes/file-share/[fileShareId]/verify.tsx': $file_share_fileShareId_verify, - './routes/files.tsx': $files, - './routes/files/open/[fileName].tsx': $files_open_fileName_, - './routes/index.tsx': $index, - './routes/login.tsx': $login, - './routes/logout.tsx': $logout, - './routes/mfa-verify.tsx': $mfa_verify, - './routes/news.tsx': $news, - './routes/news/feeds.tsx': $news_feeds, - './routes/notes.tsx': $notes, - './routes/notes/open/[fileName].tsx': $notes_open_fileName_, - './routes/oidc/callback.tsx': $oidc_callback, - './routes/photos.tsx': $photos, - './routes/photos/thumbnail/[fileName].tsx': $photos_thumbnail_fileName_, - './routes/settings.tsx': $settings, - './routes/signup.tsx': $signup, - }, - islands: { - './islands/Settings.tsx': $Settings, - './islands/auth/MultiFactorAuthSettings.tsx': $auth_MultiFactorAuthSettings, - './islands/auth/PasswordlessPasskeyLogin.tsx': $auth_PasswordlessPasskeyLogin, - './islands/calendar/CalendarWrapper.tsx': $calendar_CalendarWrapper, - './islands/calendar/Calendars.tsx': $calendar_Calendars, - './islands/calendar/ViewCalendarEvent.tsx': $calendar_ViewCalendarEvent, - './islands/contacts/Contacts.tsx': $contacts_Contacts, - './islands/contacts/ViewContact.tsx': $contacts_ViewContact, - './islands/dashboard/Links.tsx': $dashboard_Links, - './islands/dashboard/Notes.tsx': $dashboard_Notes, - './islands/expenses/ExpensesWrapper.tsx': $expenses_ExpensesWrapper, - './islands/files/FilesWrapper.tsx': $files_FilesWrapper, - './islands/news/Articles.tsx': $news_Articles, - './islands/news/Feeds.tsx': $news_Feeds, - './islands/notes/Note.tsx': $notes_Note, - './islands/notes/NotesWrapper.tsx': $notes_NotesWrapper, - './islands/photos/PhotosWrapper.tsx': $photos_PhotosWrapper, - }, - baseUrl: import.meta.url, -} satisfies Manifest; - -export default manifest; diff --git a/islands/auth/MultiFactorAuthSettings.tsx b/islands/auth/MultiFactorAuthSettings.tsx index fe19084..67336da 100644 --- a/islands/auth/MultiFactorAuthSettings.tsx +++ b/islands/auth/MultiFactorAuthSettings.tsx @@ -391,8 +391,8 @@ export default function MultiFactorAuthSettings({ methods }: MultiFactorAuthSett

1. Scan this QR code with your authenticator app (Aegis Authenticator, Google Authenticator, etc.):

-
- TOTP QR Code +
+ TOTP QR Code

Or manually enter this secret:{' '} diff --git a/lib/auth.ts b/lib/auth.ts index 0dc8ecf..f5f4401 100644 --- a/lib/auth.ts +++ b/lib/auth.ts @@ -1,7 +1,6 @@ -import { decodeBase64Url, encodeBase64Url } from 'std/encoding/base64url.ts'; -import { decodeBase64 } from 'std/encoding/base64.ts'; -import { Cookie, getCookies, setCookie } from 'std/http/cookie.ts'; -import 'std/dotenv/load.ts'; +import { decodeBase64, decodeBase64Url, encodeBase64Url } from '@std/encoding'; +import { Cookie, getCookies, setCookie } from '@std/http'; +import '@std/dotenv/load'; import { generateHash, isRunningLocally } from './utils/misc.ts'; import { User, UserSession } from './types.ts'; @@ -46,7 +45,10 @@ export async function verifyAuthJwt(key: CryptoKey, jwt: string): P } const data = textToData(jwtParts[0] + '.' + jwtParts[1]); - if (await crypto.subtle.verify({ name: 'HMAC' }, key, decodeBase64Url(jwtParts[2]), data) === true) { + if ( + await crypto.subtle.verify({ name: 'HMAC' }, key, decodeBase64Url(jwtParts[2]) as unknown as ArrayBuffer, data) === + true + ) { return JSON.parse(dataToText(decodeBase64Url(jwtParts[1]))) as T; } diff --git a/lib/config.ts b/lib/config.ts index 1a8e87d..d9c0842 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -59,7 +59,7 @@ export class AppConfig { }; try { - const configFromFile: Config = (await import(`${Deno.cwd()}/bewcloud.config.ts`)).default; + const configFromFile: Config = (await import(/* @vite-ignore */ `${Deno.cwd()}/bewcloud.config.ts`)).default; this.config = { ...config, diff --git a/lib/feed.ts b/lib/feed.ts index b24b795..0759f8a 100644 --- a/lib/feed.ts +++ b/lib/feed.ts @@ -1,5 +1,5 @@ -import { DOMParser, initParser } from 'https://deno.land/x/deno_dom@v0.1.45/deno-dom-wasm-noinit.ts'; -import { Feed, parseFeed } from 'https://deno.land/x/rss@1.0.0/mod.ts'; +import { DOMParser, initParser } from '@b-fuze/deno-dom/wasm-noinit'; +import { Feed, parseFeed } from '@mikaelporttila/rss'; import { fetchUrl, fetchUrlAsGooglebot, fetchUrlWithProxy, fetchUrlWithRetries } from './utils/misc.ts'; import { NewsFeed, NewsFeedCrawlType, NewsFeedType } from './types.ts'; diff --git a/lib/form-utils.tsx b/lib/form-utils.tsx index da61512..e1763c5 100644 --- a/lib/form-utils.tsx +++ b/lib/form-utils.tsx @@ -124,7 +124,7 @@ function generateInputHtml( if (type === 'select') { return ( - {options?.map((option) => (