diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 000000000..1874580c2
Binary files /dev/null and b/.DS_Store differ
diff --git a/8-sprint-fe/.gitignore b/8-sprint-fe/.gitignore
new file mode 100644
index 000000000..5ef6a5207
--- /dev/null
+++ b/8-sprint-fe/.gitignore
@@ -0,0 +1,41 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/versions
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# env files (can opt-in for committing if needed)
+.env*
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/8-sprint-fe/README.md b/8-sprint-fe/README.md
new file mode 100644
index 000000000..66bb426ff
--- /dev/null
+++ b/8-sprint-fe/README.md
@@ -0,0 +1,36 @@
+This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+# or
+bun dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
+
+This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
diff --git a/8-sprint-fe/eslint.config.mjs b/8-sprint-fe/eslint.config.mjs
new file mode 100644
index 000000000..1e69deb82
--- /dev/null
+++ b/8-sprint-fe/eslint.config.mjs
@@ -0,0 +1,25 @@
+import { dirname } from "path";
+import { fileURLToPath } from "url";
+import { FlatCompat } from "@eslint/eslintrc";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const compat = new FlatCompat({
+ baseDirectory: __dirname,
+});
+
+const eslintConfig = [
+ ...compat.extends("next/core-web-vitals"),
+ {
+ ignores: [
+ "node_modules/**",
+ ".next/**",
+ "out/**",
+ "build/**",
+ "next-env.d.ts",
+ ],
+ },
+];
+
+export default eslintConfig;
diff --git a/8-sprint-fe/jsconfig.json b/8-sprint-fe/jsconfig.json
new file mode 100644
index 000000000..b8d6842d7
--- /dev/null
+++ b/8-sprint-fe/jsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/8-sprint-fe/next.config.mjs b/8-sprint-fe/next.config.mjs
new file mode 100644
index 000000000..4678774e6
--- /dev/null
+++ b/8-sprint-fe/next.config.mjs
@@ -0,0 +1,4 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {};
+
+export default nextConfig;
diff --git a/8-sprint-fe/package-lock.json b/8-sprint-fe/package-lock.json
new file mode 100644
index 000000000..4d095c357
--- /dev/null
+++ b/8-sprint-fe/package-lock.json
@@ -0,0 +1,6285 @@
+{
+ "name": "8-sprint-fe",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "8-sprint-fe",
+ "version": "0.1.0",
+ "dependencies": {
+ "@tanstack/react-query": "^5.90.2",
+ "@tanstack/react-query-devtools": "^5.90.2",
+ "next": "15.5.3",
+ "react": "19.1.0",
+ "react-dom": "19.1.0"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3",
+ "@tailwindcss/postcss": "^4",
+ "autoprefixer": "^10.4.21",
+ "eslint": "^9",
+ "eslint-config-next": "15.5.3",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.1.13"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz",
+ "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
+ "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+ "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+ "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.35.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
+ "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+ "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.15.2",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
+ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz",
+ "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz",
+ "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz",
+ "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz",
+ "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz",
+ "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz",
+ "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz",
+ "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz",
+ "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz",
+ "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz",
+ "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz",
+ "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz",
+ "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz",
+ "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz",
+ "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz",
+ "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz",
+ "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz",
+ "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz",
+ "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.3"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz",
+ "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.5.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz",
+ "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz",
+ "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz",
+ "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.3.tgz",
+ "integrity": "sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==",
+ "license": "MIT"
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.3.tgz",
+ "integrity": "sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "3.3.1"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.3.tgz",
+ "integrity": "sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.3.tgz",
+ "integrity": "sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.3.tgz",
+ "integrity": "sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.3.tgz",
+ "integrity": "sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.3.tgz",
+ "integrity": "sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.3.tgz",
+ "integrity": "sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.3.tgz",
+ "integrity": "sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.3.tgz",
+ "integrity": "sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz",
+ "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz",
+ "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.4",
+ "enhanced-resolve": "^5.18.3",
+ "jiti": "^2.5.1",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.18",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.13"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz",
+ "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.4",
+ "tar": "^7.4.3"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.13",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.13",
+ "@tailwindcss/oxide-darwin-x64": "4.1.13",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.13",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.13",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.13",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.13",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.13",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.13"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz",
+ "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz",
+ "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz",
+ "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz",
+ "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz",
+ "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz",
+ "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz",
+ "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz",
+ "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz",
+ "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz",
+ "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.5",
+ "@emnapi/runtime": "^1.4.5",
+ "@emnapi/wasi-threads": "^1.0.4",
+ "@napi-rs/wasm-runtime": "^0.2.12",
+ "@tybys/wasm-util": "^0.10.0",
+ "tslib": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz",
+ "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz",
+ "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.tgz",
+ "integrity": "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.1.13",
+ "@tailwindcss/oxide": "4.1.13",
+ "postcss": "^8.4.41",
+ "tailwindcss": "4.1.13"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.90.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.2.tgz",
+ "integrity": "sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/query-devtools": {
+ "version": "5.90.1",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.90.1.tgz",
+ "integrity": "sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.90.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.2.tgz",
+ "integrity": "sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.90.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@tanstack/react-query-devtools": {
+ "version": "5.90.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.90.2.tgz",
+ "integrity": "sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-devtools": "5.90.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "@tanstack/react-query": "^5.90.2",
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.0.tgz",
+ "integrity": "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.44.0",
+ "@typescript-eslint/type-utils": "8.44.0",
+ "@typescript-eslint/utils": "8.44.0",
+ "@typescript-eslint/visitor-keys": "8.44.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.44.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz",
+ "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.44.0",
+ "@typescript-eslint/types": "8.44.0",
+ "@typescript-eslint/typescript-estree": "8.44.0",
+ "@typescript-eslint/visitor-keys": "8.44.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz",
+ "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.44.0",
+ "@typescript-eslint/types": "^8.44.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz",
+ "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.44.0",
+ "@typescript-eslint/visitor-keys": "8.44.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz",
+ "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.0.tgz",
+ "integrity": "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.44.0",
+ "@typescript-eslint/typescript-estree": "8.44.0",
+ "@typescript-eslint/utils": "8.44.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz",
+ "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz",
+ "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.44.0",
+ "@typescript-eslint/tsconfig-utils": "8.44.0",
+ "@typescript-eslint/types": "8.44.0",
+ "@typescript-eslint/visitor-keys": "8.44.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.0.tgz",
+ "integrity": "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.44.0",
+ "@typescript-eslint/types": "8.44.0",
+ "@typescript-eslint/typescript-estree": "8.44.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz",
+ "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.44.0",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+ "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.21",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+ "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.4",
+ "caniuse-lite": "^1.0.30001702",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
+ "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz",
+ "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.26.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz",
+ "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.3",
+ "caniuse-lite": "^1.0.30001741",
+ "electron-to-chromium": "^1.5.218",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001743",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz",
+ "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz",
+ "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.222",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz",
+ "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.3",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.35.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
+ "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.0",
+ "@eslint/config-helpers": "^0.3.1",
+ "@eslint/core": "^0.15.2",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.35.0",
+ "@eslint/plugin-kit": "^0.3.5",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.3.tgz",
+ "integrity": "sha512-e6j+QhQFOr5pfsc8VJbuTD9xTXJaRvMHYjEeLPA2pFkheNlgPLCkxdvhxhfuM4KGcqSZj2qEnpHisdTVs3BxuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "15.5.3",
+ "@rushstack/eslint-patch": "^1.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.37.0",
+ "eslint-plugin-react-hooks": "^5.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
+ "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.4.0",
+ "get-tsconfig": "^4.10.0",
+ "is-bun-module": "^2.0.0",
+ "stable-hash": "^0.0.5",
+ "tinyglobby": "^0.2.13",
+ "unrs-resolver": "^1.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-resolver-typescript"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
+ "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.7.1"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
+ "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.19",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+ "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
+ "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/napi-postinstall": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz",
+ "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/next": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.5.3.tgz",
+ "integrity": "sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "15.5.3",
+ "@swc/helpers": "0.5.15",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.5.3",
+ "@next/swc-darwin-x64": "15.5.3",
+ "@next/swc-linux-arm64-gnu": "15.5.3",
+ "@next/swc-linux-arm64-musl": "15.5.3",
+ "@next/swc-linux-x64-gnu": "15.5.3",
+ "@next/swc-linux-x64-musl": "15.5.3",
+ "@next/swc-win32-arm64-msvc": "15.5.3",
+ "@next/swc-win32-x64-msvc": "15.5.3",
+ "sharp": "^0.34.3"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.21",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz",
+ "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "devOptional": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.4",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz",
+ "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.0",
+ "semver": "^7.7.2"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.4",
+ "@img/sharp-darwin-x64": "0.34.4",
+ "@img/sharp-libvips-darwin-arm64": "1.2.3",
+ "@img/sharp-libvips-darwin-x64": "1.2.3",
+ "@img/sharp-libvips-linux-arm": "1.2.3",
+ "@img/sharp-libvips-linux-arm64": "1.2.3",
+ "@img/sharp-libvips-linux-ppc64": "1.2.3",
+ "@img/sharp-libvips-linux-s390x": "1.2.3",
+ "@img/sharp-libvips-linux-x64": "1.2.3",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.3",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.3",
+ "@img/sharp-linux-arm": "0.34.4",
+ "@img/sharp-linux-arm64": "0.34.4",
+ "@img/sharp-linux-ppc64": "0.34.4",
+ "@img/sharp-linux-s390x": "0.34.4",
+ "@img/sharp-linux-x64": "0.34.4",
+ "@img/sharp-linuxmusl-arm64": "0.34.4",
+ "@img/sharp-linuxmusl-x64": "0.34.4",
+ "@img/sharp-wasm32": "0.34.4",
+ "@img/sharp-win32-arm64": "0.34.4",
+ "@img/sharp-win32-ia32": "0.34.4",
+ "@img/sharp-win32-x64": "0.34.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stable-hash": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+ "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz",
+ "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz",
+ "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+ "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
+ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/8-sprint-fe/package.json b/8-sprint-fe/package.json
new file mode 100644
index 000000000..abc997337
--- /dev/null
+++ b/8-sprint-fe/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "8-sprint-fe",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "eslint"
+ },
+ "dependencies": {
+ "@tanstack/react-query": "^5.90.2",
+ "@tanstack/react-query-devtools": "^5.90.2",
+ "next": "15.5.3",
+ "react": "19.1.0",
+ "react-dom": "19.1.0"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^3",
+ "@tailwindcss/postcss": "^4",
+ "autoprefixer": "^10.4.21",
+ "eslint": "^9",
+ "eslint-config-next": "15.5.3",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.1.13"
+ }
+}
diff --git a/8-sprint-fe/postcss.config.mjs b/8-sprint-fe/postcss.config.mjs
new file mode 100644
index 000000000..c7bcb4b1e
--- /dev/null
+++ b/8-sprint-fe/postcss.config.mjs
@@ -0,0 +1,5 @@
+const config = {
+ plugins: ["@tailwindcss/postcss"],
+};
+
+export default config;
diff --git a/8-sprint-fe/public/article_default.png b/8-sprint-fe/public/article_default.png
new file mode 100644
index 000000000..2e6b38459
Binary files /dev/null and b/8-sprint-fe/public/article_default.png differ
diff --git a/8-sprint-fe/public/file.svg b/8-sprint-fe/public/file.svg
new file mode 100644
index 000000000..004145cdd
--- /dev/null
+++ b/8-sprint-fe/public/file.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/8-sprint-fe/public/fonts/PretendardVariable.woff2 b/8-sprint-fe/public/fonts/PretendardVariable.woff2
new file mode 100644
index 000000000..49c54b515
Binary files /dev/null and b/8-sprint-fe/public/fonts/PretendardVariable.woff2 differ
diff --git a/8-sprint-fe/public/fonts/ROKAF-Sans-Bold.ttf b/8-sprint-fe/public/fonts/ROKAF-Sans-Bold.ttf
new file mode 100644
index 000000000..8889aba40
Binary files /dev/null and b/8-sprint-fe/public/fonts/ROKAF-Sans-Bold.ttf differ
diff --git a/8-sprint-fe/public/fonts/ROKAF-Sans-Medium.ttf b/8-sprint-fe/public/fonts/ROKAF-Sans-Medium.ttf
new file mode 100644
index 000000000..d27a0512c
Binary files /dev/null and b/8-sprint-fe/public/fonts/ROKAF-Sans-Medium.ttf differ
diff --git a/8-sprint-fe/public/globe.svg b/8-sprint-fe/public/globe.svg
new file mode 100644
index 000000000..567f17b0d
--- /dev/null
+++ b/8-sprint-fe/public/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/8-sprint-fe/public/ic_arrow_down.svg b/8-sprint-fe/public/ic_arrow_down.svg
new file mode 100644
index 000000000..8308690fd
--- /dev/null
+++ b/8-sprint-fe/public/ic_arrow_down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/ic_arrow_return.svg b/8-sprint-fe/public/ic_arrow_return.svg
new file mode 100644
index 000000000..956c4753e
--- /dev/null
+++ b/8-sprint-fe/public/ic_arrow_return.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/8-sprint-fe/public/ic_facebook.svg b/8-sprint-fe/public/ic_facebook.svg
new file mode 100644
index 000000000..64d76abc4
--- /dev/null
+++ b/8-sprint-fe/public/ic_facebook.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/ic_heart.svg b/8-sprint-fe/public/ic_heart.svg
new file mode 100644
index 000000000..deb45e6d4
--- /dev/null
+++ b/8-sprint-fe/public/ic_heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/ic_instagram.svg b/8-sprint-fe/public/ic_instagram.svg
new file mode 100644
index 000000000..bb6820d84
--- /dev/null
+++ b/8-sprint-fe/public/ic_instagram.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/ic_kebab.svg b/8-sprint-fe/public/ic_kebab.svg
new file mode 100644
index 000000000..51b03fba0
--- /dev/null
+++ b/8-sprint-fe/public/ic_kebab.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/8-sprint-fe/public/ic_medal.svg b/8-sprint-fe/public/ic_medal.svg
new file mode 100644
index 000000000..d650c4019
--- /dev/null
+++ b/8-sprint-fe/public/ic_medal.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/8-sprint-fe/public/ic_plus.svg b/8-sprint-fe/public/ic_plus.svg
new file mode 100644
index 000000000..5bb9abf55
--- /dev/null
+++ b/8-sprint-fe/public/ic_plus.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/8-sprint-fe/public/ic_profile.svg b/8-sprint-fe/public/ic_profile.svg
new file mode 100644
index 000000000..88bb06d7e
--- /dev/null
+++ b/8-sprint-fe/public/ic_profile.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8-sprint-fe/public/ic_search.svg b/8-sprint-fe/public/ic_search.svg
new file mode 100644
index 000000000..52241e6d8
--- /dev/null
+++ b/8-sprint-fe/public/ic_search.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/ic_twitter.svg b/8-sprint-fe/public/ic_twitter.svg
new file mode 100644
index 000000000..3d1ede5c5
--- /dev/null
+++ b/8-sprint-fe/public/ic_twitter.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/ic_youtube.svg b/8-sprint-fe/public/ic_youtube.svg
new file mode 100644
index 000000000..beffba93f
--- /dev/null
+++ b/8-sprint-fe/public/ic_youtube.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/8-sprint-fe/public/img_default.svg b/8-sprint-fe/public/img_default.svg
new file mode 100644
index 000000000..1f1557790
--- /dev/null
+++ b/8-sprint-fe/public/img_default.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8-sprint-fe/public/panda.svg b/8-sprint-fe/public/panda.svg
new file mode 100644
index 000000000..1db649552
--- /dev/null
+++ b/8-sprint-fe/public/panda.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/8-sprint-fe/src/api/fetchArticle.js b/8-sprint-fe/src/api/fetchArticle.js
new file mode 100644
index 000000000..fb3744997
--- /dev/null
+++ b/8-sprint-fe/src/api/fetchArticle.js
@@ -0,0 +1,77 @@
+import React from "react";
+
+const API_URL = `${process.env.NEXT_PUBLIC_API_URL}/articles`;
+
+// articles list get
+export const fetchArticles = async () => {
+ const response = await fetch(API_URL);
+ if (!response.ok) {
+ throw new Error("서버에서 데이터를 가져오는데 실패했습니다.");
+ }
+ return await response.json();
+};
+
+// article get
+export const fetchArticle = async (id) => {
+ const response = await fetch(`${API_URL}/${id}`);
+ if (!response.ok) {
+ throw new Error("서버에서 데이터를 가져오는데 실패했습니다.");
+ }
+ return await response.json();
+};
+
+// article post
+export const addArticle = async (article) => {
+ const newArticle = {
+ title: article.title,
+ content: article.content,
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ };
+
+ const response = await fetch(API_URL, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(newArticle),
+ });
+
+ if (!response.ok) {
+ throw new Error("게시글을 추가하는데 실패했습니다.");
+ }
+};
+
+// article patch
+export const patchArticle = async ({ id, article }) => {
+ const newArticle = {
+ title: article.title,
+ content: article.content,
+ updatedAt: new Date().toISOString(),
+ };
+
+ const response = await fetch(`${API_URL}/${id}`, {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(newArticle),
+ });
+
+ if (!response.ok) {
+ throw new Error("게시글을 추가하는데 실패했습니다.");
+ }
+};
+
+// article delete
+export const deleteArticle = async (id) => {
+ const response = await fetch(`${API_URL}/${id}`, {
+ method: "DELETE",
+ });
+
+ if (!response.ok) {
+ throw new Error("게시글을 삭제하는데 실패했습니다.");
+ }
+
+ return true;
+};
diff --git a/8-sprint-fe/src/api/fetchComment.js b/8-sprint-fe/src/api/fetchComment.js
new file mode 100644
index 000000000..78152f502
--- /dev/null
+++ b/8-sprint-fe/src/api/fetchComment.js
@@ -0,0 +1,45 @@
+const API_URL = `${process.env.NEXT_PUBLIC_API_URL}/comments`;
+
+// comments list get
+export const fetchComments = async (postId) => {
+ const response = await fetch(`${API_URL}?postId=${postId}`);
+ if (!response.ok) {
+ throw new Error("서버에서 데이터를 가져오는데 실패했습니다.");
+ }
+
+ return await response.json();
+};
+
+// comment post
+export const addComment = async ({ content, postId }) => {
+ const newComment = {
+ postId: postId,
+ content: content,
+ createdAt: new Date().toISOString(),
+ };
+
+ const response = await fetch(API_URL, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(newComment),
+ });
+
+ if (!response.ok) {
+ throw new Error("게시글을 추가하는데 실패했습니다.");
+ }
+};
+
+// comment delete
+export const deleteComment = async ({ id, postId }) => {
+ const response = await fetch(`${API_URL}/${id}?postId=${postId}`, {
+ method: "DELETE",
+ });
+
+ if (!response.ok) {
+ throw new Error("댓글 삭제하는데 실패했습니다.");
+ }
+
+ return true;
+};
diff --git a/8-sprint-fe/src/app/(components)/Footer.jsx b/8-sprint-fe/src/app/(components)/Footer.jsx
new file mode 100644
index 000000000..cdd75f5bb
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/Footer.jsx
@@ -0,0 +1,39 @@
+import React from "react";
+
+import ic_facebook from "/public/ic_facebook.svg";
+import ic_twitter from "/public/ic_twitter.svg";
+import ic_instagram from "/public/ic_instagram.svg";
+import ic_youtube from "/public/ic_youtube.svg";
+import Link from "next/link";
+import Image from "next/image";
+
+const Footer = () => {
+ const sns_style = "";
+ return (
+
+ );
+};
+
+export default Footer;
diff --git a/8-sprint-fe/src/app/(components)/Header.jsx b/8-sprint-fe/src/app/(components)/Header.jsx
new file mode 100644
index 000000000..c5f0d09c4
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/Header.jsx
@@ -0,0 +1,25 @@
+import Link from "next/link";
+import React from "react";
+import Logo from "./atoms/Logo";
+import Button from "./atoms/Button";
+
+const Header = () => {
+ return (
+
+
+
+
+
+
+ 자유게시판
+ 중고마켓
+
+
+
로그인
+
+
+
+ );
+};
+
+export default Header;
diff --git a/8-sprint-fe/src/app/(components)/atoms/Button.jsx b/8-sprint-fe/src/app/(components)/atoms/Button.jsx
new file mode 100644
index 000000000..9288af65f
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/Button.jsx
@@ -0,0 +1,17 @@
+import React from "react";
+
+const Button = ({ children, type = "button", isAble = true }) => {
+ const bgColor = isAble ? "bg-Primary-100 " : "bg-gray-400";
+ const cursor = isAble ? "cursor-pointer" : "cursor-auto"
+ return (
+
+ {children}
+
+ );
+};
+
+export default Button;
diff --git a/8-sprint-fe/src/app/(components)/atoms/CommentInput.jsx b/8-sprint-fe/src/app/(components)/atoms/CommentInput.jsx
new file mode 100644
index 000000000..e315c3362
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/CommentInput.jsx
@@ -0,0 +1,66 @@
+"use client";
+
+import React, { useEffect, useState } from "react";
+import Button from "./Button";
+import { useMutation, useQueryClient } from "@tanstack/react-query";
+import { addComment } from "@/api/fetchComment";
+
+const CommentInput = ({ postId }) => {
+ const [btnAble, setBtnAble] = useState(false);
+ const [content, setContent] = useState("");
+
+ const queryClient = useQueryClient();
+ const {
+ mutate: mutateAddComment,
+ isPending,
+ error,
+ } = useMutation({
+ mutationFn: addComment,
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ["comments", postId] });
+ },
+ onError: (error) => {
+ console.error("댓글 추가 중 오류 발생:", error);
+ alert("댓글을 추가하는데 실패했습니다.");
+ },
+ });
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ if (!content.trim()) return;
+
+ mutateAddComment({ postId, content });
+ setContent("");
+
+ alert("댓글 작성완료");
+ };
+
+ useEffect(() => {
+ if (content !== "") {
+ setBtnAble(true);
+ }
+ }, [content]);
+
+ return (
+
+ );
+};
+
+export default CommentInput;
diff --git a/8-sprint-fe/src/app/(components)/atoms/Dropdown.jsx b/8-sprint-fe/src/app/(components)/atoms/Dropdown.jsx
new file mode 100644
index 000000000..0f22f74b9
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/Dropdown.jsx
@@ -0,0 +1,48 @@
+"use client";
+import React, { useState } from "react";
+
+import Image from "next/image";
+import ic_arrow_down from "/public/ic_arrow_down.svg";
+
+const Dropdown = ({ order = "recent" }) => {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const menu = order === "recent" ? "최신순" : "좋아요순";
+
+ const toggleDropdown = () => {
+ setIsOpen((prev) => !prev);
+ };
+
+ // const handleNewestClick = () => {
+ // toggleDropdown();
+ // onNewestClick();
+ // };
+ // const handleBestClick = () => {
+ // toggleDropdown();
+ // onBestClick();
+ // };
+
+ return (
+
+
+ {menu}
+
+
+ {isOpen && (
+
+ )}
+
+ );
+};
+
+export default Dropdown;
diff --git a/8-sprint-fe/src/app/(components)/atoms/Heart.jsx b/8-sprint-fe/src/app/(components)/atoms/Heart.jsx
new file mode 100644
index 000000000..de207cc66
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/Heart.jsx
@@ -0,0 +1,15 @@
+import Image from "next/image";
+import React from "react";
+
+import ic_heart from "/public/ic_heart.svg";
+
+const Heart = ({size, fontSize, count}) => {
+ return (
+
+
+ {count}
+
+ );
+};
+
+export default Heart;
diff --git a/8-sprint-fe/src/app/(components)/atoms/KebabMenu.jsx b/8-sprint-fe/src/app/(components)/atoms/KebabMenu.jsx
new file mode 100644
index 000000000..95e2d9b5c
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/KebabMenu.jsx
@@ -0,0 +1,30 @@
+"use client";
+import React, { useState } from "react";
+
+import ic_kebab from "/public/ic_kebab.svg";
+import Image from "next/image";
+
+const KebabMenu = ({handleDelete, handlePatch}) => {
+ const [open, setOpen] = useState(false);
+
+ const handleMenuclick = () => {
+ setOpen((prev) => !prev);
+ };
+
+ return (
+
+ );
+};
+
+export default KebabMenu;
diff --git a/8-sprint-fe/src/app/(components)/atoms/Logo.jsx b/8-sprint-fe/src/app/(components)/atoms/Logo.jsx
new file mode 100644
index 000000000..35eb483aa
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/Logo.jsx
@@ -0,0 +1,14 @@
+import Image from "next/image";
+import React from "react";
+import pandaLogo from "/public/panda.svg";
+
+const Logo = () => {
+ return (
+
+
+ 판다마켓
+
+ );
+};
+
+export default Logo;
diff --git a/8-sprint-fe/src/app/(components)/atoms/ProfileIcon.jsx b/8-sprint-fe/src/app/(components)/atoms/ProfileIcon.jsx
new file mode 100644
index 000000000..5c3f738f7
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/ProfileIcon.jsx
@@ -0,0 +1,19 @@
+import Image from "next/image";
+import React from "react";
+
+import ic_profile from "/public/ic_profile.svg";
+
+const ProfileIcon = ({ img, size = "24" }) => {
+ const imgSrc = img ? img : ic_profile;
+ return (
+
+ );
+};
+
+export default ProfileIcon;
diff --git a/8-sprint-fe/src/app/(components)/atoms/Search.jsx b/8-sprint-fe/src/app/(components)/atoms/Search.jsx
new file mode 100644
index 000000000..239c0bf41
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/Search.jsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import ic_search from '/public/ic_search.svg';
+import Image from 'next/image';
+
+const Search = () => {
+ return (
+
+
+
+
+ )
+}
+
+export default Search
\ No newline at end of file
diff --git a/8-sprint-fe/src/app/(components)/atoms/TextInput.jsx b/8-sprint-fe/src/app/(components)/atoms/TextInput.jsx
new file mode 100644
index 000000000..654779f7f
--- /dev/null
+++ b/8-sprint-fe/src/app/(components)/atoms/TextInput.jsx
@@ -0,0 +1,12 @@
+import React from 'react'
+
+const TextInput = ({name, title}) => {
+ return (
+
+ {title}
+
+
+ )
+}
+
+export default TextInput
\ No newline at end of file
diff --git a/8-sprint-fe/src/app/board/[id]/page.jsx b/8-sprint-fe/src/app/board/[id]/page.jsx
new file mode 100644
index 000000000..e88e1a6db
--- /dev/null
+++ b/8-sprint-fe/src/app/board/[id]/page.jsx
@@ -0,0 +1,8 @@
+import React from "react";
+import BoardDetailPage from "../_components/BoardDetailPage";
+
+const BoardDetail = () => {
+ return ;
+};
+
+export default BoardDetail;
diff --git a/8-sprint-fe/src/app/board/[id]/patch/page.jsx b/8-sprint-fe/src/app/board/[id]/patch/page.jsx
new file mode 100644
index 000000000..609825865
--- /dev/null
+++ b/8-sprint-fe/src/app/board/[id]/patch/page.jsx
@@ -0,0 +1,8 @@
+import React from "react";
+import BoardPatchPage from "../../_components/BoardPatchPage";
+
+const BoardPatch = () => {
+ return ;
+};
+
+export default BoardPatch;
diff --git a/8-sprint-fe/src/app/board/_components/ArticleForm.jsx b/8-sprint-fe/src/app/board/_components/ArticleForm.jsx
new file mode 100644
index 000000000..ce164b2c6
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/ArticleForm.jsx
@@ -0,0 +1,69 @@
+"use client";
+import Button from "@/app/(components)/atoms/Button";
+import ic_plus from "/public/ic_plus.svg";
+import Image from "next/image";
+import React, { useEffect, useState } from "react";
+
+const ArticleForm = ({ handleSubmit, article, setArticle }) => {
+ const [btnAble, setBtnAble] = useState(false);
+
+ useEffect(() => {
+ if (article.title !== "" && article.content !== "") {
+ setBtnAble(true);
+ }
+ }, [article]);
+
+ return (
+
+ );
+};
+
+export default ArticleForm;
diff --git a/8-sprint-fe/src/app/board/_components/BoardDetailPage.jsx b/8-sprint-fe/src/app/board/_components/BoardDetailPage.jsx
new file mode 100644
index 000000000..feff078a4
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/BoardDetailPage.jsx
@@ -0,0 +1,153 @@
+"use client";
+import React, { useEffect } from "react";
+
+import KebabMenu from "@/app/(components)/atoms/KebabMenu";
+import ProfileIcon from "@/app/(components)/atoms/ProfileIcon";
+import Heart from "@/app/(components)/atoms/Heart";
+import CommentInput from "@/app/(components)/atoms/CommentInput";
+import CommentList from "./CommentList";
+import ic_return from "/public/ic_arrow_return.svg";
+import Link from "next/link";
+import Image from "next/image";
+import { useParams, useRouter } from "next/navigation";
+import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
+import { deleteArticle, fetchArticle } from "@/api/fetchArticle";
+import { fetchComments } from "@/api/fetchComment";
+
+const BoardDetailPage = () => {
+ const { id } = useParams();
+ const router = useRouter();
+
+ const {
+ data: article,
+ isPending: isLoading,
+ error,
+ } = useQuery({
+ queryKey: ["article", id],
+ queryFn: () => fetchArticle(id),
+ gcTime: 10 * 60 * 1000,
+ });
+
+ const {
+ data: comments,
+ isPending: commentLoading,
+ error: commentErr,
+ } = useQuery({
+ queryKey: ["comments", id],
+ queryFn: () => fetchComments(id),
+ gcTime: 10 * 60 * 1000,
+ });
+
+ const queryClient = useQueryClient();
+ const {
+ mutate: mutateDeleteArticle,
+ isPending: isDelete,
+ error: deleteErr,
+ } = useMutation({
+ mutationFn: deleteArticle,
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ["articles"] });
+ },
+ onError: (error) => {
+ console.error("게시글 삭제 중 오류 발생: ", error);
+ alert("게시글을 삭제하는데 실패했습니다.");
+ },
+ });
+
+ const handleDelete = () => {
+ mutateDeleteArticle(id);
+
+ alert("게시글 삭제완료");
+ router.push("/board");
+ };
+
+ const handlePatch = () => {
+ router.push(`/board/${id}/patch`);
+ };
+
+ if (isLoading) {
+ return (
+ 로딩 중...
+ );
+ }
+
+ if (error) {
+ return (
+
+ {error}
+
+ );
+ }
+
+ // 댓글 임시 데이터
+ const commentTemp = [
+ {
+ id: 1,
+ content: "혹시 사용기간이 어떻게 되실까요?",
+ name: "똑똑한판다",
+ time: "1시간 전",
+ },
+ {
+ id: 2,
+ content: "혹시 하자가 있나요?",
+ name: "총명한판다",
+ time: "2시간 전",
+ },
+ {
+ id: 3,
+ content: "혹시 사용기간이 어떻게 되실까요?",
+ name: "똑똑한판다",
+ time: "30분 전",
+ },
+ ];
+
+ return (
+
+
+
+
+
+
총명한 판다
+
2025. 06. 09
+
+
+
+
+
+
+
+ {article.content}
+
+ {!commentLoading && (
+
+ {comments.map((comnt) => {
+ return (
+
+ );
+ })}
+
+ )}
+
+
+ );
+};
+
+export default BoardDetailPage;
diff --git a/8-sprint-fe/src/app/board/_components/BoardPage.jsx b/8-sprint-fe/src/app/board/_components/BoardPage.jsx
new file mode 100644
index 000000000..86f3689fa
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/BoardPage.jsx
@@ -0,0 +1,87 @@
+"use client";
+import React, { useEffect, useState } from "react";
+import Card from "./Card";
+import Button from "@/app/(components)/atoms/Button";
+import Search from "@/app/(components)/atoms/Search";
+import Dropdown from "@/app/(components)/atoms/Dropdown";
+import ListCommunity from "./ListCommunity";
+import { fetchArticles } from "@/api/fetchArticle";
+import Link from "next/link";
+import { useQuery } from "@tanstack/react-query";
+
+const BoardPage = () => {
+ const {
+ data: articles,
+ isPending,
+ error,
+ } = useQuery({
+ queryKey: ["articles"],
+ queryFn: fetchArticles,
+ });
+
+ if (isPending) {
+ return (
+ 로딩 중...
+ );
+ }
+
+ if (error) {
+ return (
+
+ {error}
+
+ );
+ }
+
+ return (
+ <>
+
+ 베스트 게시글
+ {error ? (
+ 게시글이 없습니다.
+ ) : (
+
+ {articles.slice(0, 3).map((article) => {
+ return (
+
+ );
+ })}
+
+ )}
+
+
게시글
+
+ 글쓰기
+
+
+
+
+
+
+ {error ? (
+ 게시글이 없습니다.
+ ) : (
+
+ {articles.map((article) => {
+ return (
+
+
+
+ );
+ })}
+
+ )}
+
+ >
+ );
+};
+
+export default BoardPage;
diff --git a/8-sprint-fe/src/app/board/_components/BoardPatchPage.jsx b/8-sprint-fe/src/app/board/_components/BoardPatchPage.jsx
new file mode 100644
index 000000000..cdc1d3a31
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/BoardPatchPage.jsx
@@ -0,0 +1,74 @@
+"use client";
+
+import React, { useEffect, useState } from "react";
+import ArticleForm from "./ArticleForm";
+import { useParams, useRouter } from "next/navigation";
+import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
+import { fetchArticle, patchArticle } from "@/api/fetchArticle";
+
+const BoardPatchPage = () => {
+ const { id } = useParams();
+ const router = useRouter();
+ const {
+ data: articleData,
+ isPending: isLoading,
+ error,
+ } = useQuery({
+ queryKey: ["article", id],
+ queryFn: () => fetchArticle(id),
+ gcTime: 10 * 60 * 1000,
+ });
+
+ const [article, setArticle] = useState({ title: "", content: "" });
+
+ useEffect(() => {
+ if (articleData) {
+ setArticle(articleData);
+ }
+ }, [articleData]);
+
+ const queryClient = useQueryClient();
+ const { mutate: mutatePatchArticle, isPending: isPatch } = useMutation({
+ mutationFn: patchArticle,
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ["article", id] });
+ alert("게시글 수정완료");
+ router.push(`/board/${id}`);
+ },
+ onError: (error) => {
+ console.error("게시글 수정 중 오류 발생: ", error);
+ alert("게시글을 수정하는데 실패했습니다.");
+ },
+ });
+
+ const handlePatch = (e) => {
+ e.preventDefault();
+ mutatePatchArticle({ id, article });
+ };
+
+ if (isLoading) {
+ return (
+ 로딩 중...
+ );
+ }
+
+ if (error) {
+ return (
+
+ {error}
+
+ );
+ }
+
+ return (
+
+ );
+};
+
+export default BoardPatchPage;
diff --git a/8-sprint-fe/src/app/board/_components/BoardPostPage.jsx b/8-sprint-fe/src/app/board/_components/BoardPostPage.jsx
new file mode 100644
index 000000000..f50e2e6b6
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/BoardPostPage.jsx
@@ -0,0 +1,72 @@
+"use client";
+import React, { useEffect, useState } from "react";
+import { useMutation, useQueryClient } from "@tanstack/react-query";
+
+import { addArticle } from "@/api/fetchArticle";
+import { useRouter } from "next/navigation";
+import ArticleForm from "./ArticleForm";
+
+const BoardPostPage = () => {
+ const [article, setArticle] = useState({
+ title: "",
+ content: "",
+ });
+
+ const queryClient = useQueryClient();
+ const router = useRouter();
+
+ const {
+ mutate: mutateAddArticle,
+ isPending,
+ error,
+ } = useMutation({
+ mutationFn: addArticle,
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ["articles"] });
+ },
+ onError: (error) => {
+ console.error("게시글 추가 중 오류 발생:", error);
+ alert("게시글을 추가하는데 실패했습니다.");
+ },
+ });
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ if (!article.title.trim() || !article.content.trim()) return;
+
+ mutateAddArticle(article);
+ setArticle({
+ title: "",
+ content: "",
+ });
+
+ alert("게시글 작성완료");
+ router.push("/board");
+ };
+
+ if (isPending) {
+ return (
+ 작성 중...
+ );
+ }
+
+ if (error) {
+ return (
+
+ {error}
+
+ );
+ }
+
+ return (
+
+ );
+};
+
+export default BoardPostPage;
diff --git a/8-sprint-fe/src/app/board/_components/Card.jsx b/8-sprint-fe/src/app/board/_components/Card.jsx
new file mode 100644
index 000000000..60c03b709
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/Card.jsx
@@ -0,0 +1,41 @@
+import Image from "next/image";
+import React from "react";
+
+import ic_medal from "/public/ic_medal.svg";
+import Heart from "@/app/(components)/atoms/Heart";
+import ImageBox from "./ImageBox";
+
+const Card = ({ title, createdAt }) => {
+
+ // 작성일 포맷 변경
+ const [year, month, day] = createdAt.split("T")[0].split("-");
+ const date = `${year}. ${month}. ${day}`;
+
+ return (
+
+
+
+ Best
+
+
+
+
+
+ 총명한 판다
+
+
+
+ {date}
+
+
+
+
+ );
+};
+
+export default Card;
diff --git a/8-sprint-fe/src/app/board/_components/CommentList.jsx b/8-sprint-fe/src/app/board/_components/CommentList.jsx
new file mode 100644
index 000000000..a061eb796
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/CommentList.jsx
@@ -0,0 +1,69 @@
+"use client";
+import { deleteComment } from "@/api/fetchComment";
+import KebabMenu from "@/app/(components)/atoms/KebabMenu";
+import ProfileIcon from "@/app/(components)/atoms/ProfileIcon";
+import { useMutation, useQueryClient } from "@tanstack/react-query";
+import React from "react";
+
+const CommentList = ({ content, name, date, id, postId }) => {
+ const queryClient = useQueryClient();
+ const {
+ mutate: mutateDeleteComment,
+ isPending: isDelete,
+ error: deleteErr,
+ } = useMutation({
+ mutationFn: deleteComment,
+ onSuccess: () => {
+ queryClient.invalidateQueries({ queryKey: ["comments", postId] });
+ },
+ onError: (error) => {
+ console.error("댓글 삭제 중 오류 발생: ", error);
+ alert("댓글을 삭제하는데 실패했습니다.");
+ },
+ });
+
+ const handleDelete = () => {
+ mutateDeleteComment({ id, postId });
+
+ alert("댓글 삭제완료");
+ };
+
+ // 몇시간 전인지 계산
+ const timeAgo = (isoString) => {
+ const now = new Date();
+ const past = new Date(isoString);
+ const diff = (now - past) / 1000; // 초 단위 차이
+
+ if (diff < 60) {
+ return `${Math.floor(diff)}초 전`;
+ } else if (diff < 3600) {
+ return `${Math.floor(diff / 60)}분 전`;
+ } else if (diff < 86400) {
+ return `${Math.floor(diff / 3600)}시간 전`;
+ } else if (diff < 2592000) {
+ return `${Math.floor(diff / 86400)}일 전`;
+ } else if (diff < 31536000) {
+ return `${Math.floor(diff / 2592000)}달 전`;
+ } else {
+ return `${Math.floor(diff / 31536000)}년 전`;
+ }
+ };
+
+ return (
+
+
+
+
+
+ {name}
+ {timeAgo(date)}
+
+
+
+ );
+};
+
+export default CommentList;
diff --git a/8-sprint-fe/src/app/board/_components/ImageBox.jsx b/8-sprint-fe/src/app/board/_components/ImageBox.jsx
new file mode 100644
index 000000000..59c13db36
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/ImageBox.jsx
@@ -0,0 +1,15 @@
+import Image from "next/image";
+import React from "react";
+
+import defaultImg from "/public/article_default.png";
+
+const ImageBox = ({ src }) => {
+ const imgSrc = src ? src : defaultImg;
+ return (
+
+
+
+ );
+};
+
+export default ImageBox;
diff --git a/8-sprint-fe/src/app/board/_components/ListCommunity.jsx b/8-sprint-fe/src/app/board/_components/ListCommunity.jsx
new file mode 100644
index 000000000..bb797ba53
--- /dev/null
+++ b/8-sprint-fe/src/app/board/_components/ListCommunity.jsx
@@ -0,0 +1,31 @@
+import React from "react";
+
+import ImageBox from "@/app/board/_components/ImageBox";
+
+import Heart from "@/app/(components)/atoms/Heart";
+import ProfileIcon from "@/app/(components)/atoms/ProfileIcon";
+
+const ListCommunity = ({ title, createdAt }) => {
+ // 작성일 포맷 변경
+ const [year, month, day] = createdAt.split("T")[0].split("-");
+ const date = `${year}. ${month}. ${day}`;
+
+ return (
+
+ );
+};
+
+export default ListCommunity;
diff --git a/8-sprint-fe/src/app/board/page.jsx b/8-sprint-fe/src/app/board/page.jsx
new file mode 100644
index 000000000..1d19cc783
--- /dev/null
+++ b/8-sprint-fe/src/app/board/page.jsx
@@ -0,0 +1,8 @@
+import React from "react";
+import BoardPage from "./_components/BoardPage";
+
+const Board = () => {
+ return ;
+};
+
+export default Board;
diff --git a/8-sprint-fe/src/app/board/post/page.jsx b/8-sprint-fe/src/app/board/post/page.jsx
new file mode 100644
index 000000000..7ede679d1
--- /dev/null
+++ b/8-sprint-fe/src/app/board/post/page.jsx
@@ -0,0 +1,8 @@
+import React from "react";
+import BoardPostPage from "../_components/BoardPostPage";
+
+const BoardPost = () => {
+ return ;
+};
+
+export default BoardPost;
diff --git a/8-sprint-fe/src/app/favicon.ico b/8-sprint-fe/src/app/favicon.ico
new file mode 100644
index 000000000..718d6fea4
Binary files /dev/null and b/8-sprint-fe/src/app/favicon.ico differ
diff --git a/8-sprint-fe/src/app/globals.css b/8-sprint-fe/src/app/globals.css
new file mode 100644
index 000000000..46c6009f2
--- /dev/null
+++ b/8-sprint-fe/src/app/globals.css
@@ -0,0 +1,49 @@
+@import "tailwindcss";
+
+:root {
+ --background: #ffffff;
+ --foreground: #171717;
+}
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --font-sans: var(--font-geist-sans);
+ --font-mono: var(--font-geist-mono);
+ --font-logo: var(--font-rokaf);
+ --font-pretendard: var(--font-pretendard);
+}
+
+@theme {
+ --color-Primary-100: #3692ff;
+ --color-Primary-200: #1967d6;
+ --color-Primary-300: #1251aa;
+
+ --color-error-red: #f74747;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background: #0a0a0a;
+ --foreground: #ededed;
+ }
+}
+
+body {
+ background: var(--background);
+ color: var(--foreground);
+ font-family: var(--font-pretendard), sans-serif;
+
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+section {
+ max-width: 1200px;
+ width: 100%;
+}
+
+.basic_nav {
+ @apply text-gray-600 text-lg font-bold;
+}
\ No newline at end of file
diff --git a/8-sprint-fe/src/app/layout.jsx b/8-sprint-fe/src/app/layout.jsx
new file mode 100644
index 000000000..5320085b1
--- /dev/null
+++ b/8-sprint-fe/src/app/layout.jsx
@@ -0,0 +1,63 @@
+import { Geist, Geist_Mono } from "next/font/google";
+import localFont from "next/font/local";
+import "./globals.css";
+import Header from "./(components)/Header";
+import Footer from "./(components)/Footer";
+import TanstackProvider from "@/providers/TanstackProvider";
+
+const geistSans = Geist({
+ variable: "--font-geist-sans",
+ subsets: ["latin"],
+});
+
+const geistMono = Geist_Mono({
+ variable: "--font-geist-mono",
+ subsets: ["latin"],
+});
+
+const pretender = localFont({
+ src: [
+ {
+ path: "../../public/fonts/PretendardVariable.woff2",
+ display: "swap",
+ weight: "45 920",
+ },
+ ],
+ variable: "--font-pretendard",
+});
+
+const rokaf = localFont({
+ src: [
+ {
+ path: "../../public/fonts/ROKAF-Sans-Bold.ttf",
+ weight: "700",
+ style: "bold",
+ },
+ {
+ path: "../../public/fonts/ROKAF-Sans-Medium.ttf",
+ weight: "500",
+ style: "normal",
+ },
+ ],
+ variable: "--font-rokaf",
+});
+
+export const metadata = {
+ title: "Create Next App",
+ description: "Generated by create next app",
+};
+
+export default function RootLayout({ children }) {
+ return (
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/8-sprint-fe/src/app/page.jsx b/8-sprint-fe/src/app/page.jsx
new file mode 100644
index 000000000..f2528f1f1
--- /dev/null
+++ b/8-sprint-fe/src/app/page.jsx
@@ -0,0 +1,9 @@
+import React from 'react'
+
+const MainPage = () => {
+ return (
+ MainPage
+ )
+}
+
+export default MainPage
\ No newline at end of file
diff --git a/8-sprint-fe/src/providers/TanstackProvider.jsx b/8-sprint-fe/src/providers/TanstackProvider.jsx
new file mode 100644
index 000000000..ef9938fc1
--- /dev/null
+++ b/8-sprint-fe/src/providers/TanstackProvider.jsx
@@ -0,0 +1,22 @@
+"use client";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
+import React, { useState } from "react";
+
+const TanstackProvider = ({ children }) => {
+ const [queryClient] = useState(() => new QueryClient({
+ defaultOptions: {
+ queries: {
+ staleTime: 5 * 60 * 1000, // 5min
+ }
+ }
+ }));
+ return (
+
+
+ {children}
+
+ );
+};
+
+export default TanstackProvider;
diff --git a/README.md b/README.md
index fc259f873..3436bc4e3 100644
--- a/README.md
+++ b/README.md
@@ -1,50 +1,23 @@
-# 🐼 판다마켓 프로젝트
-
-> _이 저장소는 판다마켓 프로젝트의 프론트엔드 코드를 관리하는 곳입니다. 프로젝트를 클론하여 개발 환경을 설정하고, 각 브랜치에서 해당 스프린트 미션을 수행해 주세요!_ 🛠️
-
-## 소개
-
-안녕하세요! 판다마켓 프로젝트에 오신 것을 환영합니다! 🥳
-판다마켓은 따뜻한 중고거래를 위한 커뮤니티 플랫폼이에요. 여러분은 이곳에서 상품을 등록하고, 다른 사용자들과 소통하며, 자유롭게 이야기를 나눌 수 있어요. 매주 스프린트 미션을 통해 기능을 하나씩 만들어 가며 성장해 나가는 여정을 함께해요. 🚀
-
-
-_위 이미지는 판다마켓의 대표 이미지입니다._ 📸
-
-## 스프린트 미션이란? 🤔
-
-스프린트 미션은 **하나의 개인 프로젝트를 길게 진행하면서, 그 과정에서 주기적으로 피드백을 받을 수 있는 시스템**이에요. 각 스프린트마다 배운 이론을 적용해 보고, **멘토님께 코드 리뷰를 받아가며 실력을 쑥쑥 키워갈 수 있는 중요한 개인 과제**랍니다. 💪
-
-## 주요 기능 ✨
+# 배포 사이트
+- https://scintillating-llama-2f5f4b.netlify.app/
-1. **상품 등록**: 내가 가진 물건을 올리고, 사진과 설명을 추가해 직접 판매할 수 있어요!
-2. **문의 댓글**: 상품에 대한 궁금한 점이나 의견을 자유롭게 남길 수 있답니다. 📝
-3. **자유게시판**: 다양한 주제로 친구들과 이야기를 나누고, 정보를 공유할 수 있는 공간이에요! 🗣️
-
-## 프로젝트 브랜치 구조 🏗️
-
-프로젝트는 단계별로 나뉘어 있고, 각 스프린트 미션에 맞는 브랜치가 있어요. 각 브랜치를 통해 체계적으로 개발하며 학습할 수 있어요. 🎯
-
-### 브랜치 설명
-
-1. **basic (part1): 스프린트 미션 1 ~ 4 FE 요구사항**
-
- - 기본적인 웹 애플리케이션 기능 구현을 위한 초기 브랜치입니다. HTML, CSS, JavaScript 등을 사용해 기본을 다집니다.
- - **스프린트 미션 1부터 4까지**의 프론트엔드 내용을 포함하고 있어요.
-
-2. **react (part2): 스프린트 미션 5 ~ 7 FE 요구사항**
+# 🐼 판다마켓 프로젝트
- - React 라이브러리를 사용해 프론트엔드 기능을 구현하는 브랜치입니다. 컴포넌트 기반 아키텍처와 상태 관리를 배웁니다.
- - **스프린트 미션 5부터 7까지, 그 이후**의 프론트엔드 내용을 포함하고 있어요.
- - 만약 스프린트 미션 9부터 프론트엔드 코드를 Next가 아닌 React로 구현하고 싶다면 react 브랜치를 사용해요.
+> _이 저장소는 판다마켓 프로젝트의 프론트엔드 코드를 관리하는 곳입니다. 🛠️
-3. **next (part3,4): 스프린트 미션 8 FE 요구사항~**
+## 📁 프로젝트 폴더 구조
- - Next.js를 사용해 서버 사이드 렌더링(SSR)과 정적 사이트 생성(SSG) 등 고급 기능을 구현합니다.
- - **스프린트 미션 8부터** 시작하는 프론트엔드 내용을 포함하고 있어요.
- - 만약 스프린트 미션 9부터 프론트엔드 코드를 React가 아닌 Next로 구현하고 싶다면 next 브랜치를 사용해요.
+- 📔 index.html : 메인 페이지 html 파일
-> _스프린트 미션 내 백엔드 요구사항은 [백엔드 레포지토리](https://github.com/codeit-sprint-fullstack/2-Sprint-mission-Be)의 브랜치에서 관리해주세요_
+### 스프린트 미션
+- 2025-07-06 스프린트 미션 1 : 메인 화면 구현
+- 2025-07-20 스프린트 미션 2 : 로그인, 회원가입 화면 구현
+- 2025-07-27 스프린트 미션 3 : 로그인, 회원가입 기능 구현
+- 2025-08-03 스프린트 미션 4 : API 기능 구형
+- 2025-08-10 스프린트 미션 5 : 중고마켓 페이지 구현
+- 2025-08-31 스프린트 미션 6 : React로 마이그레이션 + 상품 등록 페이지 구현
+- 2025-09-28 스프린트 미션 8 : Next.js로 자유게시판, 게시글 상세 페이지 구현
---
본 프로젝트는 [코드잇](https://www.codeit.kr)의 소유이며, 교육 목적으로만 사용됩니다. © 2024 Codeit. All rights reserved.
diff --git a/be/db.json b/be/db.json
new file mode 100644
index 000000000..5b7597943
--- /dev/null
+++ b/be/db.json
@@ -0,0 +1,51 @@
+{
+ "articles": [
+ {
+ "id": "c673",
+ "title": "아이폰 1테라 정도 사양이면 얼마에 팔아야하나요?",
+ "content": "아이폰 1테라 정도 사양이면 얼마에 팔아야하나요?",
+ "createdAt": "2025-09-17T02:32:34.122Z",
+ "updatedAt": "2025-09-17T02:32:34.122Z"
+ },
+ {
+ "id": "fa01",
+ "title": "판매글",
+ "content": "맥북 16인치 16기가 1테라 정도 사양이면 얼마에 팔아야하나요?",
+ "createdAt": "2025-09-17T05:37:01.951Z",
+ "updatedAt": "2025-09-17T05:37:01.951Z"
+ },
+ {
+ "id": "bbaa",
+ "title": "제목",
+ "content": "내용 작성이 됨 ",
+ "createdAt": "2025-09-27T10:53:11.476Z"
+ },
+ {
+ "id": "7cf1",
+ "title": "노트북 판매합니다",
+ "content": "노트북을 판매합니다. 가격을 얼마해야할까요? 내용 수정",
+ "createdAt": "2025-09-27T10:55:29.807Z",
+ "updatedAt": "2025-09-27T12:02:43.065Z"
+ }
+ ],
+ "comments": [
+ {
+ "id": "8872",
+ "postId": "7cf1",
+ "content": "댓글 작성 예시",
+ "createdAt": "2025-09-27T16:33:09.556Z"
+ },
+ {
+ "id": "4fcd",
+ "postId": "fa01",
+ "content": "판매하시나요? ",
+ "createdAt": "2025-09-27T16:34:38.503Z"
+ },
+ {
+ "id": "4f2b",
+ "postId": "7cf1",
+ "content": "무슨 노트북인가요",
+ "createdAt": "2025-09-27T16:34:59.818Z"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/be/node_modules/.bin/json-server b/be/node_modules/.bin/json-server
new file mode 120000
index 000000000..666af441b
--- /dev/null
+++ b/be/node_modules/.bin/json-server
@@ -0,0 +1 @@
+../json-server/lib/bin.js
\ No newline at end of file
diff --git a/be/node_modules/.bin/json5 b/be/node_modules/.bin/json5
new file mode 120000
index 000000000..217f37981
--- /dev/null
+++ b/be/node_modules/.bin/json5
@@ -0,0 +1 @@
+../json5/lib/cli.js
\ No newline at end of file
diff --git a/be/node_modules/.bin/mime b/be/node_modules/.bin/mime
new file mode 120000
index 000000000..163a60a33
--- /dev/null
+++ b/be/node_modules/.bin/mime
@@ -0,0 +1 @@
+../mime/bin/cli.js
\ No newline at end of file
diff --git a/be/node_modules/.package-lock.json b/be/node_modules/.package-lock.json
new file mode 100644
index 000000000..8a6009c46
--- /dev/null
+++ b/be/node_modules/.package-lock.json
@@ -0,0 +1,539 @@
+{
+ "name": "be",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "license": "MIT"
+ },
+ "node_modules/@tinyhttp/accepts": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/accepts/-/accepts-2.2.3.tgz",
+ "integrity": "sha512-9pQN6pJAJOU3McmdJWTcyq7LLFW8Lj5q+DadyKcvp+sxMkEpktKX5sbfJgJuOvjk6+1xWl7pe0YL1US1vaO/1w==",
+ "license": "MIT",
+ "dependencies": {
+ "mime": "4.0.4",
+ "negotiator": "^0.6.3"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ }
+ },
+ "node_modules/@tinyhttp/app": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/app/-/app-2.5.2.tgz",
+ "integrity": "sha512-DcB3Y8GQppLQlO2VxRYF7LzTEAoZb+VRQXuIsErcu2fNaM1xdx6NQZDso5rlZUiaeg6KYYRfU34N4XkZbv6jSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/cookie": "2.1.1",
+ "@tinyhttp/proxy-addr": "2.2.1",
+ "@tinyhttp/req": "2.2.5",
+ "@tinyhttp/res": "2.2.5",
+ "@tinyhttp/router": "2.2.3",
+ "header-range-parser": "1.1.3",
+ "regexparam": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ }
+ },
+ "node_modules/@tinyhttp/content-disposition": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/content-disposition/-/content-disposition-2.2.2.tgz",
+ "integrity": "sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ }
+ },
+ "node_modules/@tinyhttp/content-type": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/content-type/-/content-type-0.1.4.tgz",
+ "integrity": "sha512-dl6f3SHIJPYbhsW1oXdrqOmLSQF/Ctlv3JnNfXAE22kIP7FosqJHxkz/qj2gv465prG8ODKH5KEyhBkvwrueKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4"
+ }
+ },
+ "node_modules/@tinyhttp/cookie": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/cookie/-/cookie-2.1.1.tgz",
+ "integrity": "sha512-h/kL9jY0e0Dvad+/QU3efKZww0aTvZJslaHj3JTPmIPC9Oan9+kYqmh3M6L5JUQRuTJYFK2nzgL2iJtH2S+6dA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ }
+ },
+ "node_modules/@tinyhttp/cookie-signature": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/cookie-signature/-/cookie-signature-2.1.1.tgz",
+ "integrity": "sha512-VDsSMY5OJfQJIAtUgeQYhqMPSZptehFSfvEEtxr+4nldPA8IImlp3QVcOVuK985g4AFR4Hl1sCbWCXoqBnVWnw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/cors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/cors/-/cors-2.0.1.tgz",
+ "integrity": "sha512-qrmo6WJuaiCzKWagv2yA/kw6hIISfF/hOqPWwmI6w0o8apeTMmRN3DoCFvQ/wNVuWVdU5J4KU7OX8aaSOEq51A==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/vary": "^0.1.3"
+ },
+ "engines": {
+ "node": ">=12.20 || 14.x || >=16"
+ }
+ },
+ "node_modules/@tinyhttp/encode-url": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/encode-url/-/encode-url-2.1.1.tgz",
+ "integrity": "sha512-AhY+JqdZ56qV77tzrBm0qThXORbsVjs/IOPgGCS7x/wWnsa/Bx30zDUU/jPAUcSzNOzt860x9fhdGpzdqbUeUw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/etag": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/etag/-/etag-2.1.2.tgz",
+ "integrity": "sha512-j80fPKimGqdmMh6962y+BtQsnYPVCzZfJw0HXjyH70VaJBHLKGF+iYhcKqzI3yef6QBNa8DKIPsbEYpuwApXTw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/forwarded": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/forwarded/-/forwarded-2.1.2.tgz",
+ "integrity": "sha512-9H/eulJ68ElY/+zYpTpNhZ7vxGV+cnwaR6+oQSm7bVgZMyuQfgROW/qvZuhmgDTIxnGMXst+Ba4ij6w6Krcs3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/logger": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/logger/-/logger-2.1.0.tgz",
+ "integrity": "sha512-Ma1fJ9CwUbn9r61/4HW6+nflsVoslpOnCrfQ6UeZq7GGIgwLzofms3HoSVG7M+AyRMJpxlfcDdbH5oFVroDMKA==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.20",
+ "dayjs": "^1.11.13",
+ "http-status-emojis": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=14.18 || >=16.20"
+ }
+ },
+ "node_modules/@tinyhttp/proxy-addr": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/proxy-addr/-/proxy-addr-2.2.1.tgz",
+ "integrity": "sha512-BicqMqVI91hHq2BQmnqJUh0FQUnx7DncwSGgu2ghlh+JZG2rHK2ZN/rXkfhrx1rrUw6hnd0L36O8GPMh01+dDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/forwarded": "2.1.2",
+ "ipaddr.js": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/req": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/req/-/req-2.2.5.tgz",
+ "integrity": "sha512-trfsXwtmsNjMcGKcLJ+45h912kLRqBQCQD06ams3Tq0kf4gHLxjHjoYOC1Z9yGjOn81XllRx8wqvnvr+Kbe3gw==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/accepts": "2.2.3",
+ "@tinyhttp/type-is": "2.2.4",
+ "@tinyhttp/url": "2.1.1",
+ "header-range-parser": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/res": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/res/-/res-2.2.5.tgz",
+ "integrity": "sha512-yBsqjWygpuKAVz4moWlP4hqzwiDDqfrn2mA0wviJAcgvGiyOErtlQwXY7aj3aPiCpURvxvEFO//Gdy6yV+xEpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/content-disposition": "2.2.2",
+ "@tinyhttp/cookie": "2.1.1",
+ "@tinyhttp/cookie-signature": "2.1.1",
+ "@tinyhttp/encode-url": "2.1.1",
+ "@tinyhttp/req": "2.2.5",
+ "@tinyhttp/send": "2.2.3",
+ "@tinyhttp/vary": "^0.1.3",
+ "es-escape-html": "^0.1.1",
+ "mime": "4.0.4"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/router": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/router/-/router-2.2.3.tgz",
+ "integrity": "sha512-O0MQqWV3Vpg/uXsMYg19XsIgOhwjyhTYWh51Qng7bxqXixxx2PEvZWnFjP7c84K7kU/nUX41KpkEBTLnznk9/Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/send": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/send/-/send-2.2.3.tgz",
+ "integrity": "sha512-o4cVHHGQ8WjVBS8UT0EE/2WnjoybrfXikHwsRoNlG1pfrC/Sd01u1N4Te8cOd/9aNGLr4mGxWb5qTm2RRtEi7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/content-type": "^0.1.4",
+ "@tinyhttp/etag": "2.1.2",
+ "mime": "4.0.4"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/type-is": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/type-is/-/type-is-2.2.4.tgz",
+ "integrity": "sha512-7F328NheridwjIfefBB2j1PEcKKABpADgv7aCJaE8x8EON77ZFrAkI3Rir7pGjopV7V9MBmW88xUQigBEX2rmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/content-type": "^0.1.4",
+ "mime": "4.0.4"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/url": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/url/-/url-2.1.1.tgz",
+ "integrity": "sha512-POJeq2GQ5jI7Zrdmj22JqOijB5/GeX+LEX7DUdml1hUnGbJOTWDx7zf2b5cCERj7RoXL67zTgyzVblBJC+NJWg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/@tinyhttp/vary": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@tinyhttp/vary/-/vary-0.1.3.tgz",
+ "integrity": "sha512-SoL83sQXAGiHN1jm2VwLUWQSQeDAAl1ywOm6T0b0Cg1CZhVsjoiZadmjhxF6FHCCY7OHHVaLnTgSMxTPIDLxMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.18",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz",
+ "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==",
+ "license": "MIT"
+ },
+ "node_modules/dot-prop": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz",
+ "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^4.18.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/es-escape-html": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/es-escape-html/-/es-escape-html-0.1.1.tgz",
+ "integrity": "sha512-yUx1o+8RsG7UlszmYPtks+dm6Lho2m8lgHMOsLJQsFI0R8XwUJwiMhM1M4E/S8QLeGyf6MkDV/pWgjQ0tdTSyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.x"
+ }
+ },
+ "node_modules/eta": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/eta/-/eta-3.5.0.tgz",
+ "integrity": "sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/eta-dev/eta?sponsor=1"
+ }
+ },
+ "node_modules/header-range-parser": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/header-range-parser/-/header-range-parser-1.1.3.tgz",
+ "integrity": "sha512-B9zCFt3jH8g09LR1vHL4pcAn8yMEtlSlOUdQemzHMRKMImNIhhszdeosYFfNW0WXKQtXIlWB+O4owHJKvEJYaA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22.0"
+ }
+ },
+ "node_modules/http-status-emojis": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/http-status-emojis/-/http-status-emojis-2.2.0.tgz",
+ "integrity": "sha512-ompKtgwpx8ff0hsbpIB7oE4ax1LXoHmftsHHStMELX56ivG3GhofTX8ZHWlUaFKfGjcGjw6G3rPk7dJRXMmbbg==",
+ "license": "MIT"
+ },
+ "node_modules/inflection": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/inflection/-/inflection-3.0.2.tgz",
+ "integrity": "sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/json-server": {
+ "version": "1.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/json-server/-/json-server-1.0.0-beta.3.tgz",
+ "integrity": "sha512-DwE69Ep5ccwIJZBUIWEENC30Yj8bwr4Ax9W9VoIWAYnB8Sj4ReptscO8/DRHv/nXwVlmb3Bk73Ls86+VZdYkkA==",
+ "license": "SEE LICENSE IN ./LICENSE",
+ "dependencies": {
+ "@tinyhttp/app": "^2.4.0",
+ "@tinyhttp/cors": "^2.0.1",
+ "@tinyhttp/logger": "^2.0.0",
+ "chalk": "^5.3.0",
+ "chokidar": "^4.0.1",
+ "dot-prop": "^9.0.0",
+ "eta": "^3.5.0",
+ "inflection": "^3.0.0",
+ "json5": "^2.2.3",
+ "lowdb": "^7.0.1",
+ "milliparsec": "^4.0.0",
+ "sirv": "^2.0.4",
+ "sort-on": "^6.1.0"
+ },
+ "bin": {
+ "json-server": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=18.3"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lowdb": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz",
+ "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==",
+ "license": "MIT",
+ "dependencies": {
+ "steno": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/milliparsec": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/milliparsec/-/milliparsec-4.0.0.tgz",
+ "integrity": "sha512-/wk9d4Z6/9ZvoEH/6BI4TrTCgmkpZPuSRN/6fI9aUHOfXdNTuj/VhLS7d+NqG26bi6L9YmGXutVYvWC8zQ0qtA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/mime": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.4.tgz",
+ "integrity": "sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa"
+ ],
+ "license": "MIT",
+ "bin": {
+ "mime": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/regexparam": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.2.tgz",
+ "integrity": "sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
+ "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/sort-on": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/sort-on/-/sort-on-6.1.1.tgz",
+ "integrity": "sha512-PB8pVvXAoRBijBCvuKJnmo06D8mSnQlLij0abfB2VdOpfFm29sPGYD4ft2prUPo1AZXTnkn3pP48AppRWyMkrw==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-prop": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/steno": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz",
+ "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/be/node_modules/@polka/url/build.js b/be/node_modules/@polka/url/build.js
new file mode 100644
index 000000000..a94534321
--- /dev/null
+++ b/be/node_modules/@polka/url/build.js
@@ -0,0 +1,49 @@
+const qs = require('querystring');
+
+/**
+ * @typedef ParsedURL
+ * @type {import('.').ParsedURL}
+ */
+
+/**
+ * @typedef Request
+ * @property {string} url
+ * @property {ParsedURL} _parsedUrl
+ */
+
+/**
+ * @param {Request} req
+ * @returns {ParsedURL|void}
+ */
+function parse(req) {
+ let raw = req.url;
+ if (raw == null) return;
+
+ let prev = req._parsedUrl;
+ if (prev && prev.raw === raw) return prev;
+
+ let pathname=raw, search='', query, hash;
+
+ if (raw.length > 1) {
+ let idx = raw.indexOf('#', 1);
+
+ if (idx !== -1) {
+ hash = raw.substring(idx);
+ pathname = raw.substring(0, idx);
+ }
+
+ idx = pathname.indexOf('?', 1);
+
+ if (idx !== -1) {
+ search = pathname.substring(idx);
+ pathname = pathname.substring(0, idx);
+ if (search.length > 1) {
+ query = qs.parse(search.substring(1));
+ }
+ }
+ }
+
+ return req._parsedUrl = { pathname, search, query, hash, raw };
+}
+
+exports.parse = parse;
\ No newline at end of file
diff --git a/be/node_modules/@polka/url/build.mjs b/be/node_modules/@polka/url/build.mjs
new file mode 100644
index 000000000..48ccfaae6
--- /dev/null
+++ b/be/node_modules/@polka/url/build.mjs
@@ -0,0 +1,47 @@
+import * as qs from 'node:querystring';
+
+/**
+ * @typedef ParsedURL
+ * @type {import('.').ParsedURL}
+ */
+
+/**
+ * @typedef Request
+ * @property {string} url
+ * @property {ParsedURL} _parsedUrl
+ */
+
+/**
+ * @param {Request} req
+ * @returns {ParsedURL|void}
+ */
+export function parse(req) {
+ let raw = req.url;
+ if (raw == null) return;
+
+ let prev = req._parsedUrl;
+ if (prev && prev.raw === raw) return prev;
+
+ let pathname=raw, search='', query, hash;
+
+ if (raw.length > 1) {
+ let idx = raw.indexOf('#', 1);
+
+ if (idx !== -1) {
+ hash = raw.substring(idx);
+ pathname = raw.substring(0, idx);
+ }
+
+ idx = pathname.indexOf('?', 1);
+
+ if (idx !== -1) {
+ search = pathname.substring(idx);
+ pathname = pathname.substring(0, idx);
+ if (search.length > 1) {
+ query = qs.parse(search.substring(1));
+ }
+ }
+ }
+
+ return req._parsedUrl = { pathname, search, query, hash, raw };
+}
diff --git a/be/node_modules/@polka/url/index.d.ts b/be/node_modules/@polka/url/index.d.ts
new file mode 100644
index 000000000..46ecac2bb
--- /dev/null
+++ b/be/node_modules/@polka/url/index.d.ts
@@ -0,0 +1,11 @@
+import type { IncomingMessage } from 'http';
+
+export interface ParsedURL {
+ pathname: string;
+ search: string;
+ query: Record | undefined;
+ hash: string | undefined;
+ raw: string;
+}
+
+export function parse(req: IncomingMessage): ParsedURL;
diff --git a/be/node_modules/@polka/url/package.json b/be/node_modules/@polka/url/package.json
new file mode 100644
index 000000000..d594ee779
--- /dev/null
+++ b/be/node_modules/@polka/url/package.json
@@ -0,0 +1,30 @@
+{
+ "version": "1.0.0-next.29",
+ "name": "@polka/url",
+ "repository": "lukeed/polka",
+ "description": "Super fast, memoized `req.url` parser",
+ "module": "build.mjs",
+ "types": "index.d.ts",
+ "main": "build.js",
+ "license": "MIT",
+ "exports": {
+ ".": {
+ "types": "./index.d.ts",
+ "import": "./build.mjs",
+ "require": "./build.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "build.*",
+ "index.d.*"
+ ],
+ "author": {
+ "name": "Luke Edwards",
+ "email": "luke@lukeed.com",
+ "url": "https://lukeed.com"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@polka/url/readme.md b/be/node_modules/@polka/url/readme.md
new file mode 100644
index 000000000..e47645ce4
--- /dev/null
+++ b/be/node_modules/@polka/url/readme.md
@@ -0,0 +1,68 @@
+# @polka/url [](https://npmjs.org/package/@polka/url) [](https://licenses.dev/npm/%40polka%2Furl)
+
+> Super fast, memoized `req.url` parser; _not_ limited to [Polka][polka]!
+
+Parses the `url` from a [`IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage) request. The returned object will always only contain the following keys: `search`, `query`, `pathname`, and `raw`.
+
+> **Note:** This library does not process `protocol`, `hostname`, `port`, etc. This is because the incoming `req.url` value only begins with the path information.
+
+Parsed requests will be mutated with a `_parsedUrl` key, containing the returned output. This is used for future memoization, avoiding the need to fully parse the same `url` value multiple times.
+
+## Install
+
+```
+$ npm install --save @polka/url
+```
+
+## Usage
+
+```js
+const parse = require('@polka/url');
+
+let req = {
+ url: '/foo/bar?fizz=buzz'
+};
+let output = parse(req);
+//=> {
+//=> pathname: '/foo/bar',
+//=> raw: '/foo/bar?fizz=buzz',
+//=> search: '?fizz=buzz',
+//=> query: {
+//=> fizz: 'buzz'
+//=> },
+//=> }
+
+// Attaches result for future memoization
+assert.deepEqual(output, req._parsedUrl); //=> true
+```
+
+## API
+
+### url(req)
+Returns: `Object` or `undefined`
+
+> **Important:** The `req` must have a `url` key, otherwise `undefined` will be returned. If no input is provided at all, a `TypeError` will be thrown.
+
+#### req
+Type: `IncomingMessage` or `{ url: string }`
+
+The incoming HTTP request (`req`) or a plain `Object` with a `url` key.
+
+> **Note:** In Node.js servers, the [`req.url`](https://nodejs.org/api/http.html#http_message_url) begins with a pathname & does not include a `hash`.
+
+
+## Benchmarks
+
+Check out the [`bench`](/bench) directory for in-depth benchmark results and comparisons.
+
+
+## Support
+
+Any issues or questions can be sent to the [Polka][polka] repository. However, please specify that your inquiry is about `@polka/url` specifically.
+
+
+## License
+
+MIT © [Luke Edwards](https://lukeed.com)
+
+[polka]: https://github.com/lukeed/polka
diff --git a/be/node_modules/@tinyhttp/accepts/LICENSE b/be/node_modules/@tinyhttp/accepts/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/accepts/README.md b/be/node_modules/@tinyhttp/accepts/README.md
new file mode 100644
index 000000000..21c981864
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/README.md
@@ -0,0 +1,117 @@
+# @tinyhttp/accepts
+
+> [`accepts`](https://github.com/jshttp/accepts) rewrite in TypeScript.
+
+Higher level content negotiation based on
+[negotiator](https://www.npmjs.com/package/negotiator). Extracted from
+[koa](https://www.npmjs.com/package/koa) for general use.
+
+In addition to negotiator, it allows:
+
+- Allows types as an array or arguments list, ie
+ `(['text/html', 'application/json'])` as well as
+ `('text/html', 'application/json')`.
+- Allows type shorthands such as `json`.
+- Returns `false` when no types match
+- Treats non-existent headers as `*`
+
+## Install
+
+```sh
+pnpm i @tinyhttp/accepts
+```
+
+## API
+
+```ts
+import { Accepts } from '@tinyhttp/accepts'
+```
+
+### accepts(req)
+
+Create a new `Accepts` object for the given `req`.
+
+#### `.charset(charsets)`
+
+Return the first accepted charset. If nothing in `charsets` is accepted, then
+`false` is returned.
+
+#### `.charsets()`
+
+Return the charsets that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### `.encoding(encodings)`
+
+Return the first accepted encoding. If nothing in `encodings` is accepted, then
+`false` is returned.
+
+#### `.encodings()`
+
+Return the encodings that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### `.language(languages)`
+
+Return the first accepted language. If nothing in `languages` is accepted, then
+`false` is returned.
+
+#### `.languages()`
+
+Return the languages that the request accepts, in the order of the client's
+preference (most preferred first).
+
+#### `.type(types)`
+
+Return the first accepted type (and it is returned as the same text as what
+appears in the `types` array). If nothing in `types` is accepted, then `false`
+is returned.
+
+The `types` array can contain full MIME types or file extensions. Any value that
+is not a full MIME types is passed to `require('mime-types').lookup`.
+
+#### `.types()`
+
+Return the types that the request accepts, in the order of the client's
+preference (most preferred first).
+
+## Example
+
+This simple example shows how to use `accepts` to return a different typed
+respond body based on what the client wants to accept. The server lists it's
+preferences in order and will get back the best match between the client and
+server.
+
+```ts
+import Accepts from '@tinyhttp/accepts'
+import { createServer } from 'node:http'
+
+createServer((req, res) => {
+ const accept = new Accepts(req)
+
+ // the order of this list is significant; should be server preferred order
+ switch (accept.type(['json', 'html'])) {
+ case 'json':
+ res.setHeader('Content-Type', 'application/json')
+ res.write('{"hello":"world!"}')
+ break
+ case 'html':
+ res.setHeader('Content-Type', 'text/html')
+ res.write('hello, world! ')
+ break
+ default:
+ // the fallback is text/plain, so no need to specify it above
+ res.setHeader('Content-Type', 'text/plain')
+ res.write('hello, world!')
+ break
+ }
+
+ res.end()
+}).listen(3000)
+```
+
+You can test this out with the cURL program:
+
+```sh
+curl -I -H 'Accept: text/html' http://localhost:3000/
+```
diff --git a/be/node_modules/@tinyhttp/accepts/dist/index.d.ts b/be/node_modules/@tinyhttp/accepts/dist/index.d.ts
new file mode 100644
index 000000000..78aae99c7
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/dist/index.d.ts
@@ -0,0 +1,48 @@
+import type { IncomingMessage as I, IncomingHttpHeaders } from 'node:http';
+import Negotiator from 'negotiator';
+export declare class Accepts {
+ headers: IncomingHttpHeaders;
+ negotiator: Negotiator;
+ constructor(req: Pick);
+ /**
+ * Check if the given `type(s)` is acceptable, returning the best match when true, otherwise `false`, in which case you should respond with 406 "Not Acceptable".
+ *
+ * The `type` value may be a single mime type string such as "application/json", the extension name such as "json" or an array `["json", "html", "text/plain"]`. When a list or array is given the _best_ match, if any is returned. When no types are given as arguments, returns all types accepted by the client in the preference order.
+ */
+ types(types: string | string[], ...args: string[]): string[] | string | false;
+ get type(): (types: string | string[], ...args: string[]) => string[] | string | false;
+ /**
+ * Return accepted encodings or best fit based on `encodings`.
+ *
+ * Given `Accept-Encoding: gzip, deflate`
+ * an array sorted by quality is returned:
+ *
+ * ['gzip', 'deflate']
+ */
+ encodings(encodings: string | string[], ...args: string[]): string | string[] | boolean;
+ get encoding(): (encodings: string | string[], ...args: string[]) => string | string[] | boolean;
+ /**
+ * Return accepted charsets or best fit based on `charsets`.
+ *
+ * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
+ * an array sorted by quality is returned:
+ *
+ * ['utf-8', 'utf-7', 'iso-8859-1']
+ */
+ charsets(charsets?: string | string[], ...args: string[]): string | string[] | boolean;
+ get charset(): (charsets: string | string[], ...args: string[]) => string | string[] | boolean;
+ /**
+ * Return accepted languages or best fit based on `langs`.
+ *
+ * Given `Accept-Language: en;q=0.8, es, pt`
+ * an array sorted by quality is returned:
+ *
+ * ['es', 'pt', 'en']
+ *
+ */
+ languages(languages: string | string[], ...args: string[]): string | string[] | boolean;
+ get lang(): (languages: string | string[], ...args: string[]) => string | string[] | boolean;
+ get langs(): (languages: string | string[], ...args: string[]) => string | string[] | boolean;
+ get language(): (languages: string | string[], ...args: string[]) => string | string[] | boolean;
+}
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/accepts/dist/index.d.ts.map b/be/node_modules/@tinyhttp/accepts/dist/index.d.ts.map
new file mode 100644
index 000000000..d1f95375f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,CAAC,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE1E,OAAO,UAAU,MAAM,YAAY,CAAA;AAMnC,qBAAa,OAAO;IAClB,OAAO,EAAE,mBAAmB,CAAA;IAC5B,UAAU,EAAE,UAAU,CAAA;gBACV,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC;IAInC;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK;IA0B7E,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAErF;IACD;;;;;;;OAOG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAevF,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAE/F;IACD;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAetF,IAAI,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAE7F;IACD;;;;;;;;OAQG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAevF,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAE3F;IACD,IAAI,KAAK,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAE5F;IACD,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAE/F;CACF"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/accepts/dist/index.js b/be/node_modules/@tinyhttp/accepts/dist/index.js
new file mode 100644
index 000000000..7cbaa1278
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/dist/index.js
@@ -0,0 +1,117 @@
+import mime from 'mime';
+import Negotiator from 'negotiator';
+const extToMime = (type) => (type.indexOf('/') === -1 ? mime.getType(type) : type);
+const validMime = (type) => typeof type === 'string';
+export class Accepts {
+ constructor(req) {
+ this.headers = req.headers;
+ this.negotiator = new Negotiator(req);
+ }
+ /**
+ * Check if the given `type(s)` is acceptable, returning the best match when true, otherwise `false`, in which case you should respond with 406 "Not Acceptable".
+ *
+ * The `type` value may be a single mime type string such as "application/json", the extension name such as "json" or an array `["json", "html", "text/plain"]`. When a list or array is given the _best_ match, if any is returned. When no types are given as arguments, returns all types accepted by the client in the preference order.
+ */
+ types(types, ...args) {
+ let mimeTypes = [];
+ // support flattened arguments
+ if (types && !Array.isArray(types)) {
+ mimeTypes = [types, ...args];
+ }
+ else if (types) {
+ mimeTypes = [...types, ...args];
+ }
+ // no types, return all requested types
+ if (!mimeTypes || mimeTypes.length === 0) {
+ return this.negotiator.mediaTypes();
+ }
+ // no accept header, return first given type
+ if (!this.headers.accept) {
+ return mimeTypes[0];
+ }
+ const mimes = mimeTypes.map(extToMime);
+ const accepts = this.negotiator.mediaTypes(mimes.filter(validMime));
+ const [first] = accepts;
+ return first ? mimeTypes[mimes.indexOf(first)] : false;
+ }
+ get type() {
+ return this.types;
+ }
+ /**
+ * Return accepted encodings or best fit based on `encodings`.
+ *
+ * Given `Accept-Encoding: gzip, deflate`
+ * an array sorted by quality is returned:
+ *
+ * ['gzip', 'deflate']
+ */
+ encodings(encodings, ...args) {
+ let _encodings = encodings;
+ // support flattened arguments
+ if (_encodings && !Array.isArray(_encodings)) {
+ _encodings = [_encodings, ...args];
+ }
+ // no encodings, return all requested encodings
+ if (!_encodings || _encodings.length === 0) {
+ return this.negotiator.encodings();
+ }
+ return this.negotiator.encodings(_encodings)[0] || false;
+ }
+ get encoding() {
+ return this.encodings;
+ }
+ /**
+ * Return accepted charsets or best fit based on `charsets`.
+ *
+ * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
+ * an array sorted by quality is returned:
+ *
+ * ['utf-8', 'utf-7', 'iso-8859-1']
+ */
+ charsets(charsets, ...args) {
+ let _charsets = charsets;
+ // support flattened arguments
+ if (_charsets && !Array.isArray(_charsets)) {
+ _charsets = [_charsets, ...args];
+ }
+ // no charsets, return all requested charsets
+ if (!_charsets || _charsets.length === 0) {
+ return this.negotiator.charsets();
+ }
+ return this.negotiator.charsets(_charsets)[0] || false;
+ }
+ get charset() {
+ return this.charsets;
+ }
+ /**
+ * Return accepted languages or best fit based on `langs`.
+ *
+ * Given `Accept-Language: en;q=0.8, es, pt`
+ * an array sorted by quality is returned:
+ *
+ * ['es', 'pt', 'en']
+ *
+ */
+ languages(languages, ...args) {
+ let _languages = languages;
+ // support flattened arguments
+ if (_languages && !Array.isArray(_languages)) {
+ _languages = [_languages, ...args];
+ }
+ // no languages, return all requested languages
+ if (!_languages || _languages.length === 0) {
+ return this.negotiator.languages();
+ }
+ return this.negotiator.languages(_languages)[0] || false;
+ }
+ get lang() {
+ return this.languages;
+ }
+ get langs() {
+ return this.languages;
+ }
+ get language() {
+ return this.languages;
+ }
+}
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/accepts/dist/index.js.map b/be/node_modules/@tinyhttp/accepts/dist/index.js.map
new file mode 100644
index 000000000..4e4482df0
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/accepts/package.json b/be/node_modules/@tinyhttp/accepts/package.json
new file mode 100644
index 000000000..372a073ef
--- /dev/null
+++ b/be/node_modules/@tinyhttp/accepts/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@tinyhttp/accepts",
+ "description": "accepts rewrite in TypeScript",
+ "version": "2.2.3",
+ "license": "MIT",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/cookie-signature"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "type": "module",
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "files": [
+ "dist"
+ ],
+ "devDependencies": {
+ "@types/negotiator": "^0.6.3"
+ },
+ "dependencies": {
+ "mime": "4.0.4",
+ "negotiator": "^0.6.3"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/LICENSE b/be/node_modules/@tinyhttp/app/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/app/README.md b/be/node_modules/@tinyhttp/app/README.md
new file mode 100644
index 000000000..361e1ada3
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/README.md
@@ -0,0 +1,25 @@
+# @tinyhttp/app
+
+The core of tinyhttp. Contains the `App`, `Request` and `Response`. Additionally, it provides special tinyhttp-specific types.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/app
+```
+
+## Example
+
+```ts
+import { App } from '@tinyhttp/app'
+import type { Request, Response, NextFunction } from '@tinyhttp/app'
+
+new App()
+ .use((req: Request, res: Response, next: NextFunction) => {
+ console.log('Did a request')
+ next()
+ })
+ .get('/', (_, res) => res.send('Hello World '))
+ .get('/page/:page', (req, res) => res.send(`You opened ${req.params.page}`))
+ .listen(3000)
+```
diff --git a/be/node_modules/@tinyhttp/app/dist/app.d.ts b/be/node_modules/@tinyhttp/app/dist/app.d.ts
new file mode 100644
index 000000000..4875b4bfa
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/app.d.ts
@@ -0,0 +1,55 @@
+import { type Server } from 'node:http';
+import type { Handler, Middleware, NextFunction, UseMethodParams } from '@tinyhttp/router';
+import { Router } from '@tinyhttp/router';
+import type { TemplateEngineOptions } from './index.js';
+import type { ErrorHandler } from './onError.js';
+import type { Request } from './request.js';
+import type { Response } from './response.js';
+import type { AppConstructor, AppInterface, AppRenderOptions, AppSettings, TemplateEngine } from './types.js';
+/**
+ * `App` class - the starting point of tinyhttp app.
+ *
+ * With the `App` you can:
+ * * use routing methods and `.use(...)`
+ * * set no match (404) and error (500) handlers
+ * * configure template engines
+ * * store data in locals
+ * * listen the http server on a specified port
+ *
+ * In case you use TypeScript, you can pass custom types to this class because it is also a generic class.
+ *
+ * Example:
+ *
+ * ```ts
+ * interface CoolReq extends Request {
+ * genericsAreDope: boolean
+ * }
+ *
+ * const app = App()
+ * ```
+ */
+export declare class App extends Router implements AppInterface {
+ #private;
+ middleware: Middleware[];
+ locals: Record;
+ noMatchHandler: Handler;
+ onError: ErrorHandler;
+ settings: AppSettings;
+ engines: Record;
+ applyExtensions?: Handler;
+ attach: (req: Req, res: Res, next?: NextFunction) => void;
+ cache: Record;
+ constructor(options?: AppConstructor);
+ set(setting: K, value: AppSettings[K]): this;
+ enable(setting: K): this;
+ enabled(setting: K): boolean;
+ disable(setting: K): this;
+ path(): any;
+ engine(ext: string, fn: TemplateEngine): this;
+ render(name: string, data?: Record, options?: AppRenderOptions, cb?: (err: unknown, html?: unknown) => void): void;
+ use(...args: UseMethodParams>): this;
+ route(path: string): App;
+ handler(req: Req, res: Res, next?: NextFunction): void;
+ listen(port?: number, cb?: () => void, host?: string): Server;
+}
+//# sourceMappingURL=app.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/app.d.ts.map b/be/node_modules/@tinyhttp/app/dist/app.d.ts.map
new file mode 100644
index 000000000..3325f10fe
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/app.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/app.js b/be/node_modules/@tinyhttp/app/dist/app.js
new file mode 100644
index 000000000..eb261d40d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/app.js
@@ -0,0 +1,323 @@
+var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
+};
+var _App_instances, _App_find;
+import { createServer } from 'node:http';
+import { getPathname } from '@tinyhttp/req';
+import { Router, pushMiddleware } from '@tinyhttp/router';
+import { parse as rg } from 'regexparam';
+import { extendMiddleware } from './extend.js';
+import { onErrorHandler } from './onError.js';
+import { getURLParams } from './request.js';
+import { View } from './view.js';
+/**
+ * Add leading slash if not present (e.g. path -> /path, /path -> /path)
+ * @param x
+ */
+const lead = (x) => (x.charCodeAt(0) === 47 ? x : `/${x}`);
+const trail = (x) => (x.charCodeAt(x.length - 1) === 47 ? x.substring(0, x.length - 1) : x);
+const mount = (fn) => (fn instanceof App ? fn.attach : fn);
+const applyHandler = (h) => async (req, res, next) => {
+ try {
+ if (h[Symbol.toStringTag] === 'AsyncFunction') {
+ await h(req, res, next);
+ }
+ else
+ h(req, res, next);
+ }
+ catch (e) {
+ next === null || next === void 0 ? void 0 : next(e);
+ }
+};
+/**
+ * `App` class - the starting point of tinyhttp app.
+ *
+ * With the `App` you can:
+ * * use routing methods and `.use(...)`
+ * * set no match (404) and error (500) handlers
+ * * configure template engines
+ * * store data in locals
+ * * listen the http server on a specified port
+ *
+ * In case you use TypeScript, you can pass custom types to this class because it is also a generic class.
+ *
+ * Example:
+ *
+ * ```ts
+ * interface CoolReq extends Request {
+ * genericsAreDope: boolean
+ * }
+ *
+ * const app = App()
+ * ```
+ */
+export class App extends Router {
+ constructor(options = {}) {
+ super();
+ _App_instances.add(this);
+ this.middleware = [];
+ this.locals = {};
+ this.engines = {};
+ this.onError = (options === null || options === void 0 ? void 0 : options.onError) || onErrorHandler;
+ // @ts-expect-error typescript is not smart enough to understand "this" ts(2345)
+ this.noMatchHandler = (options === null || options === void 0 ? void 0 : options.noMatchHandler) || this.onError.bind(this, { code: 404 });
+ this.settings = {
+ view: View,
+ xPoweredBy: true,
+ views: `${process.cwd()}/views`,
+ 'view cache': process.env.NODE_ENV === 'production',
+ 'trust proxy': 0,
+ ...options.settings
+ };
+ if (options.applyExtensions)
+ this.applyExtensions = options === null || options === void 0 ? void 0 : options.applyExtensions;
+ const boundHandler = this.handler.bind(this);
+ this.attach = (req, res, next) => setImmediate(boundHandler, req, res, next);
+ this.cache = {};
+ }
+ set(setting, value) {
+ this.settings[setting] = value;
+ return this;
+ }
+ enable(setting) {
+ this.settings[setting] = true;
+ return this;
+ }
+ enabled(setting) {
+ return Boolean(this.settings[setting]);
+ }
+ disable(setting) {
+ this.settings[setting] = false;
+ return this;
+ }
+ path() {
+ return this.parent ? this.parent.path() + this.mountpath : '';
+ }
+ engine(ext, fn) {
+ this.engines[ext[0] === '.' ? ext : `.${ext}`] = fn;
+ return this;
+ }
+ render(name, data = {}, options = {}, cb = () => { }) {
+ let view;
+ const { _locals, ...opts } = options;
+ let locals = this.locals;
+ if (_locals)
+ locals = { ...locals, ..._locals };
+ locals = { ...locals, ...data };
+ if (opts.cache == null)
+ opts.cache = this.enabled('view cache');
+ if (opts.cache) {
+ view = this.cache[name];
+ }
+ if (!view) {
+ const ViewClass = this.settings.view || View;
+ try {
+ view = new ViewClass(name, {
+ defaultEngine: this.settings['view engine'],
+ root: this.settings.views,
+ engines: this.engines
+ });
+ }
+ catch (err) {
+ return cb(err);
+ }
+ if (opts.cache) {
+ this.cache[name] = view;
+ }
+ }
+ try {
+ view.render(opts, locals, cb);
+ }
+ catch (err) {
+ cb(err);
+ }
+ }
+ use(...args) {
+ var _a;
+ const base = args[0];
+ const fns = args.slice(1).flat();
+ let pathArray = [];
+ if (typeof base === 'function' || base instanceof App) {
+ fns.unshift(base);
+ }
+ else {
+ // if base is not an array of paths, then convert it to an array.
+ let basePaths = [];
+ if (Array.isArray(base))
+ basePaths = base;
+ else if (typeof base === 'string')
+ basePaths = [base];
+ basePaths = basePaths.filter((element) => {
+ if (typeof element === 'string') {
+ pathArray.push(element);
+ return false;
+ }
+ return true;
+ });
+ fns.unshift(...basePaths);
+ }
+ pathArray = pathArray.length ? pathArray.map((path) => lead(path)) : ['/'];
+ const mountpath = pathArray.join(', ');
+ let regex;
+ for (const fn of fns) {
+ if (fn instanceof App) {
+ for (const path of pathArray) {
+ regex = rg(path, true);
+ fn.mountpath = mountpath;
+ this.apps[path] = fn;
+ // @ts-expect-error typescript is not smart enough to understand "this" ts(2345)
+ fn.parent = this;
+ }
+ }
+ }
+ for (const path of pathArray) {
+ const handlerPaths = [];
+ const handlerFunctions = [];
+ const handlerPathBase = path === '/' ? '' : lead(path);
+ for (const fn of fns) {
+ if (fn instanceof App && ((_a = fn.middleware) === null || _a === void 0 ? void 0 : _a.length)) {
+ for (const mw of fn.middleware) {
+ handlerPaths.push(handlerPathBase + lead(mw.path));
+ handlerFunctions.push(fn);
+ }
+ }
+ else {
+ handlerPaths.push('');
+ handlerFunctions.push(fn);
+ }
+ }
+ pushMiddleware(this.middleware)({
+ path,
+ regex,
+ type: 'mw',
+ handler: mount(handlerFunctions[0]),
+ handlers: handlerFunctions.slice(1).map(mount),
+ fullPaths: handlerPaths
+ });
+ }
+ return this;
+ }
+ route(path) {
+ const app = new App({ settings: this.settings });
+ this.use(path, app);
+ return app;
+ }
+ handler(req, res, next) {
+ /* Set X-Powered-By header */
+ const { xPoweredBy } = this.settings;
+ if (xPoweredBy)
+ res.setHeader('X-Powered-By', typeof xPoweredBy === 'string' ? xPoweredBy : 'tinyhttp');
+ // @ts-expect-error typescript is not smart enough to understand "this" ts(2345)
+ const exts = this.applyExtensions || extendMiddleware(this);
+ let mw = [
+ {
+ handler: exts,
+ type: 'mw',
+ path: '/'
+ }
+ ];
+ req.baseUrl = '';
+ const handle = (mw, pathname) => async (req, res, next) => {
+ var _a;
+ const { path, handler, regex } = mw;
+ let params;
+ try {
+ params = regex ? getURLParams(regex, pathname) : {};
+ }
+ catch (e) {
+ console.error(e);
+ if (e instanceof URIError)
+ return res.sendStatus(400);
+ throw e;
+ }
+ let prefix = path;
+ if (regex) {
+ for (const key of regex.keys) {
+ if (key === 'wild') {
+ prefix = prefix.replace('*', params.wild);
+ }
+ else {
+ prefix = prefix.replace(`:${key}`, params[key]);
+ }
+ }
+ }
+ req.params = { ...req.params, ...params };
+ if (mw.type === 'mw') {
+ req.url = lead(req.originalUrl.substring(prefix.length));
+ req.baseUrl = trail(req.originalUrl.substring(0, prefix.length));
+ }
+ if (!req.path)
+ req.path = pathname;
+ if ((_a = this.settings) === null || _a === void 0 ? void 0 : _a.enableReqRoute)
+ req.route = mw;
+ await applyHandler(handler)(req, res, next);
+ };
+ let idx = 0;
+ const loop = () => {
+ req.originalUrl = req.baseUrl + req.url;
+ const pathname = getPathname(req.url);
+ const matched = __classPrivateFieldGet(this, _App_instances, "m", _App_find).call(this, pathname).filter((x) => (req.method === 'HEAD' || (x.method ? x.method === req.method : true)) && !mw.includes(x));
+ if (matched.length && matched[0] !== null) {
+ if (idx !== 0) {
+ idx = mw.length;
+ req.params = {};
+ }
+ mw = [
+ ...mw,
+ ...matched,
+ {
+ type: 'mw',
+ handler: (req, res, next) => {
+ if (req.method === 'HEAD') {
+ res.statusCode = 204;
+ return res.end('');
+ }
+ next === null || next === void 0 ? void 0 : next();
+ },
+ path: '/'
+ }
+ ];
+ }
+ else if (this.parent == null) {
+ mw.push({
+ handler: this.noMatchHandler,
+ type: 'route',
+ path: '/'
+ });
+ }
+ void handle(mw[idx++], pathname)(req, res, next);
+ };
+ const parentNext = next;
+ next = (err) => {
+ if (err != null) {
+ // @ts-expect-error The 'this' context of type 'this' is not assignable to method's 'this' of type 'App>' ts(2345)
+ return this.onError(err, req, res);
+ }
+ if (res.writableEnded)
+ return;
+ if (idx >= mw.length) {
+ if (parentNext != null)
+ parentNext();
+ return;
+ }
+ loop();
+ };
+ loop();
+ }
+ listen(port, cb, host) {
+ return createServer().on('request', this.attach).listen(port, host, cb);
+ }
+}
+_App_instances = new WeakSet(), _App_find = function _App_find(url) {
+ return this.middleware.filter((m) => {
+ m.regex = m.regex || rg(m.path, m.type === 'mw');
+ let fullPathRegex;
+ m.fullPath && typeof m.fullPath === 'string'
+ ? (fullPathRegex = rg(m.fullPath, m.type === 'mw'))
+ : (fullPathRegex = null);
+ return m.regex.pattern.test(url) && (m.type === 'mw' && fullPathRegex ? fullPathRegex.pattern.test(url) : true);
+ });
+};
+//# sourceMappingURL=app.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/app.js.map b/be/node_modules/@tinyhttp/app/dist/app.js.map
new file mode 100644
index 000000000..d371186bc
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/app.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/extend.d.ts b/be/node_modules/@tinyhttp/app/dist/extend.d.ts
new file mode 100644
index 000000000..53ccfff2a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/extend.d.ts
@@ -0,0 +1,8 @@
+import type { App } from './app.js';
+import type { Handler } from './index.js';
+import type { TemplateEngineOptions } from './types.js';
+/**
+ * Extends Request and Response objects with custom properties and methods
+ */
+export declare const extendMiddleware: (app: App) => Handler;
+//# sourceMappingURL=extend.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/extend.d.ts.map b/be/node_modules/@tinyhttp/app/dist/extend.d.ts.map
new file mode 100644
index 000000000..6d003532f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/extend.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAKzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEvD;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,aAAa,SAAS,qBAAqB,+BAA+B,GAAG,KA+DtG,OAAO,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/extend.js b/be/node_modules/@tinyhttp/app/dist/extend.js
new file mode 100644
index 000000000..9990279d1
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/extend.js
@@ -0,0 +1,64 @@
+import { compile } from '@tinyhttp/proxy-addr';
+import { checkIfXMLHttpRequest, getAccepts, getAcceptsCharsets, getAcceptsEncodings, getAcceptsLanguages, getFreshOrStale, getQueryParams, getRangeFromHeader, getRequestHeader, reqIs } from '@tinyhttp/req';
+import { append, attachment, clearCookie, download, formatResponse, getResponseHeader, json, redirect, send, sendFile, sendStatus, setContentType, setCookie, setHeader, setLinksHeader, setLocationHeader, setVaryHeader, status } from '@tinyhttp/res';
+import { getSubdomains } from './request.js';
+import { getHost, getIP, getIPs, getProtocol } from './request.js';
+import { renderTemplate } from './response.js';
+/**
+ * Extends Request and Response objects with custom properties and methods
+ */
+export const extendMiddleware = (app) => ((req, res, next) => {
+ const { settings } = app;
+ res.get = getResponseHeader(res);
+ req.get = getRequestHeader(req);
+ if (settings === null || settings === void 0 ? void 0 : settings.bindAppToReqRes) {
+ req.app = app;
+ res.app = app;
+ }
+ if (settings === null || settings === void 0 ? void 0 : settings.networkExtensions) {
+ let trust = (settings === null || settings === void 0 ? void 0 : settings['trust proxy']) || 0;
+ if (trust && typeof trust !== 'function') {
+ trust = compile(trust);
+ settings['trust proxy'] = trust;
+ }
+ req.protocol = getProtocol(req, trust);
+ req.secure = req.protocol === 'https';
+ const host = getHost(req, trust);
+ req.hostname = host === null || host === void 0 ? void 0 : host.hostname;
+ req.port = host === null || host === void 0 ? void 0 : host.port;
+ req.subdomains = getSubdomains(req, trust, settings.subdomainOffset);
+ req.ip = getIP(req, trust);
+ req.ips = getIPs(req, trust);
+ }
+ req.query = getQueryParams(req.url);
+ req.is = reqIs(req);
+ req.range = getRangeFromHeader(req);
+ req.accepts = getAccepts(req);
+ req.acceptsCharsets = getAcceptsCharsets(req);
+ req.acceptsEncodings = getAcceptsEncodings(req);
+ req.acceptsLanguages = getAcceptsLanguages(req);
+ req.xhr = checkIfXMLHttpRequest(req);
+ res.header = res.set = setHeader(res);
+ res.send = send(req, res);
+ res.json = json(res);
+ res.status = status(res);
+ res.sendStatus = sendStatus(req, res);
+ res.sendFile = sendFile(req, res);
+ res.type = setContentType(res);
+ res.location = setLocationHeader(req, res);
+ res.links = setLinksHeader(res);
+ res.vary = setVaryHeader(res);
+ res.cookie = setCookie(req, res);
+ res.clearCookie = clearCookie(req, res);
+ res.render = renderTemplate(req, res, app);
+ res.format = formatResponse(req, res, next);
+ res.redirect = redirect(req, res, next);
+ res.attachment = attachment(res);
+ res.download = download(req, res);
+ res.append = append(res);
+ res.locals = res.locals || Object.create(null);
+ Object.defineProperty(req, 'fresh', { get: getFreshOrStale.bind(null, req, res), configurable: true });
+ req.stale = !req.fresh;
+ next();
+});
+//# sourceMappingURL=extend.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/extend.js.map b/be/node_modules/@tinyhttp/app/dist/extend.js.map
new file mode 100644
index 000000000..0ca580838
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/extend.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"extend.js","sourceRoot":"","sources":["../src/extend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EACL,qBAAqB,EACrB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACN,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,MAAM,EACN,UAAU,EACV,WAAW,EACX,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,MAAM,EACP,MAAM,eAAe,CAAA;AAItB,OAAO,EAAgB,aAAa,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9C;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAsE,GAAQ,EAAE,EAAE,CAChH,CAAC,CAAC,GAAY,EAAE,GAA4B,EAAE,IAAkB,EAAE,EAAE;IAClE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAExB,GAAG,CAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAChC,GAAG,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAE/B,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;QACb,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA;IACf,CAAC;IAED,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,iBAAiB,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,aAAa,CAAC,KAAI,CAAC,CAAA;QAC1C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YACzC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;YACtB,QAAQ,CAAC,aAAa,CAAC,GAAG,KAAK,CAAA;QACjC,CAAC;QACD,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACtC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAA;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAChC,GAAG,CAAC,QAAQ,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAA;QAC7B,GAAG,CAAC,IAAI,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAA;QACrB,GAAG,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;QACpE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC1B,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;IAED,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAEnC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,GAAG,CAAC,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACnC,GAAG,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC7B,GAAG,CAAC,eAAe,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAC7C,GAAG,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAC/C,GAAG,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAE/C,GAAG,CAAC,GAAG,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;IAEpC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,SAAS,CAAW,GAAG,CAAC,CAAA;IAC/C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IAC5C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAW,GAAG,CAAC,CAAA;IAC9B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAW,GAAG,CAAC,CAAA;IAClC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IACxD,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IACpD,GAAG,CAAC,IAAI,GAAG,cAAc,CAAW,GAAG,CAAC,CAAA;IACxC,GAAG,CAAC,QAAQ,GAAG,iBAAiB,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IAC7D,GAAG,CAAC,KAAK,GAAG,cAAc,CAAW,GAAG,CAAC,CAAA;IACzC,GAAG,CAAC,IAAI,GAAG,aAAa,CAAW,GAAG,CAAC,CAAA;IACvC,GAAG,CAAC,MAAM,GAAG,SAAS,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IACnD,GAAG,CAAC,WAAW,GAAG,WAAW,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1D,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1C,GAAG,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC3C,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IACvC,GAAG,CAAC,UAAU,GAAG,UAAU,CAAW,GAAG,CAAC,CAAA;IAC1C,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAoB,GAAG,EAAE,GAAG,CAAC,CAAA;IACpD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAW,GAAG,CAAC,CAAA;IAClC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAE9C,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;IACtG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAA;IAEtB,IAAI,EAAE,CAAA;AACR,CAAC,CAAY,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/index.d.ts b/be/node_modules/@tinyhttp/app/dist/index.d.ts
new file mode 100644
index 000000000..d43a8f9d4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/index.d.ts
@@ -0,0 +1,15 @@
+export { App } from './app.js';
+export * from './request.js';
+export * from './response.js';
+export { extendMiddleware } from './extend.js';
+export { onErrorHandler, type ErrorHandler } from './onError.js';
+export { View } from './view.js';
+export type { AppSettings, TemplateEngineOptions, TemplateEngine, AppConstructor } from './types.js';
+import type { Middleware, NextFunction, AsyncHandler as RAsyncHandler, Handler as RHandler, SyncHandler as RSyncHandler } from '@tinyhttp/router';
+import type { Request } from './request.js';
+import type { Response } from './response.js';
+export type Handler = RHandler;
+export type AsyncHandler = RAsyncHandler;
+export type SyncHandler = RSyncHandler;
+export type { NextFunction, Middleware, Request, Response };
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/index.d.ts.map b/be/node_modules/@tinyhttp/app/dist/index.d.ts.map
new file mode 100644
index 000000000..49a8d0697
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEpG,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,IAAI,aAAa,EAC7B,OAAO,IAAI,QAAQ,EACnB,WAAW,IAAI,YAAY,EAC5B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACjD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAC3D,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACzD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/index.js b/be/node_modules/@tinyhttp/app/dist/index.js
new file mode 100644
index 000000000..b355f9e9d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/index.js
@@ -0,0 +1,7 @@
+export { App } from './app.js';
+export * from './request.js';
+export * from './response.js';
+export { extendMiddleware } from './extend.js';
+export { onErrorHandler } from './onError.js';
+export { View } from './view.js';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/index.js.map b/be/node_modules/@tinyhttp/app/dist/index.js.map
new file mode 100644
index 000000000..686d4bc8f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/onError.d.ts b/be/node_modules/@tinyhttp/app/dist/onError.d.ts
new file mode 100644
index 000000000..b487b02b4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/onError.d.ts
@@ -0,0 +1,7 @@
+import type { NextFunction } from '@tinyhttp/router';
+import type { App } from './app.js';
+import type { Request } from './request.js';
+import type { Response } from './response.js';
+export type ErrorHandler = (this: App, err: any, req: Request, res: Response, next?: NextFunction) => void;
+export declare const onErrorHandler: ErrorHandler;
+//# sourceMappingURL=onError.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/onError.d.ts.map b/be/node_modules/@tinyhttp/app/dist/onError.d.ts.map
new file mode 100644
index 000000000..f0a96d53d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/onError.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"onError.d.ts","sourceRoot":"","sources":["../src/onError.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;AAE1G,eAAO,MAAM,cAAc,EAAE,YAU5B,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/onError.js b/be/node_modules/@tinyhttp/app/dist/onError.js
new file mode 100644
index 000000000..ea3993647
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/onError.js
@@ -0,0 +1,15 @@
+import { STATUS_CODES } from 'node:http';
+export const onErrorHandler = function (err, _req, res) {
+ if (this.onError === onErrorHandler && this.parent)
+ return this.parent.onError(err, _req, res);
+ if (err instanceof Error)
+ console.error(err);
+ const code = err.code in STATUS_CODES ? err.code : err.status;
+ if (typeof err === 'string' || Buffer.isBuffer(err))
+ res.writeHead(500).end(err);
+ else if (code in STATUS_CODES)
+ res.writeHead(code).end(STATUS_CODES[code]);
+ else
+ res.writeHead(500).end(err.message);
+};
+//# sourceMappingURL=onError.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/onError.js.map b/be/node_modules/@tinyhttp/app/dist/onError.js.map
new file mode 100644
index 000000000..77f5567f4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/onError.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"onError.js","sourceRoot":"","sources":["../src/onError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAQxC,MAAM,CAAC,MAAM,cAAc,GAAiB,UAAqB,GAAQ,EAAE,IAAa,EAAE,GAAa;IACrG,IAAI,IAAI,CAAC,OAAO,KAAK,cAAc,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;IAE9F,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE5C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA;IAE7D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;SAC3E,IAAI,IAAI,IAAI,YAAY;QAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;;QACrE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAC1C,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/request.d.ts b/be/node_modules/@tinyhttp/app/dist/request.d.ts
new file mode 100644
index 000000000..38cb941b4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/request.d.ts
@@ -0,0 +1,59 @@
+import type { IncomingHttpHeaders, IncomingMessage } from 'node:http';
+import type { ParsedUrlQuery } from 'node:querystring';
+import { type Trust } from '@tinyhttp/proxy-addr';
+import type { Options, Ranges } from 'header-range-parser';
+import type { Middleware } from '@tinyhttp/router';
+import type { App } from './app.js';
+import type { Socket } from 'node:net';
+import type { TLSSocket } from 'node:tls';
+import type { URLParams } from '@tinyhttp/req';
+export { getURLParams } from '@tinyhttp/req';
+export type Host = {
+ hostname: string;
+ port?: number;
+};
+export declare const getProtocol: (req: Request, trust: Trust) => Protocol;
+export declare const getHost: (req: Request, trust: Trust) => Host | undefined;
+export declare const getIP: (req: Pick, trust: Trust) => string | undefined;
+export declare const getIPs: (req: Pick, trust: Trust) => string[] | undefined;
+export declare const getSubdomains: (req: Request, trust: Trust, subdomainOffset?: number) => string[];
+export type Connection = IncomingMessage['socket'] & {
+ encrypted: boolean;
+};
+export type Protocol = 'http' | 'https' | string;
+export type { URLParams };
+type AcceptsReturns = string | boolean | string[];
+export interface Request extends IncomingMessage {
+ originalUrl: string;
+ path: string;
+ url: string;
+ baseUrl: string;
+ query: ParsedUrlQuery;
+ params: URLParams;
+ connection: Connection;
+ socket: TLSSocket | Socket;
+ route?: Middleware;
+ protocol: Protocol;
+ secure: boolean;
+ xhr: boolean;
+ hostname?: string;
+ port?: number;
+ ip?: string;
+ ips?: string[];
+ subdomains?: string[];
+ get: (header: HeaderName) => IncomingHttpHeaders[HeaderName];
+ range: (size: number, options?: Options) => -1 | -2 | -3 | Ranges | undefined;
+ accepts: (...types: string[]) => AcceptsReturns;
+ acceptsEncodings: (...encodings: string[]) => AcceptsReturns;
+ acceptsCharsets: (...charsets: string[]) => AcceptsReturns;
+ acceptsLanguages: (...languages: string[]) => AcceptsReturns;
+ is: (...types: string[]) => string | boolean;
+ cookies?: any;
+ signedCookies?: any;
+ secret?: string | string[];
+ fresh?: boolean;
+ stale?: boolean;
+ body?: any;
+ app?: App;
+}
+//# sourceMappingURL=request.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/request.d.ts.map b/be/node_modules/@tinyhttp/app/dist/request.d.ts.map
new file mode 100644
index 000000000..ce23cd2e1
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/request.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/request.js b/be/node_modules/@tinyhttp/app/dist/request.js
new file mode 100644
index 000000000..28b2b4174
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/request.js
@@ -0,0 +1,85 @@
+import { all, compile, proxyaddr as proxyAddr } from '@tinyhttp/proxy-addr';
+import { isIP } from 'node:net';
+export { getURLParams } from '@tinyhttp/req';
+const trustRemoteAddress = ({ socket }, trust) => {
+ const val = socket.remoteAddress;
+ if (typeof trust !== 'function')
+ trust = compile(trust);
+ return trust(val, 0);
+};
+export const getProtocol = (req, trust) => {
+ const proto = `http${req.secure ? 's' : ''}`;
+ if (!trustRemoteAddress(req, trust))
+ return proto;
+ const header = req.headers['X-Forwarded-Proto'] || proto;
+ const index = header.indexOf(',');
+ return index !== -1 ? header.substring(0, index).trim() : header.trim();
+};
+const normalizeHostString = (host) => decodeURIComponent(host).toLowerCase().normalize();
+const getAuthorityHeaderHostString = (req) => {
+ const authority = req.get(':authority');
+ if (Array.isArray(authority))
+ return undefined;
+ if (Array.isArray(authority) || !authority)
+ return undefined;
+ const index = authority.indexOf('@');
+ if (index === -1)
+ return normalizeHostString(authority);
+ return normalizeHostString(authority.substring(index + 1));
+};
+const getForwardedHeaderHostString = (req) => {
+ const forwardedHost = req.get('x-forwarded-host');
+ if (Array.isArray(forwardedHost))
+ return undefined;
+ if (!forwardedHost)
+ return undefined;
+ return normalizeHostString(forwardedHost);
+};
+const getDefaultHeaderHostString = (req) => {
+ const host = req.get('host');
+ if (!host || host.indexOf(',') !== -1)
+ return undefined;
+ if (host.indexOf(',') !== -1)
+ return undefined;
+ return normalizeHostString(host);
+};
+const getHostString = (req, trust) => {
+ var _a;
+ if (trustRemoteAddress(req, trust)) {
+ const forwardedHost = getForwardedHeaderHostString(req);
+ if (forwardedHost)
+ return forwardedHost;
+ }
+ const authorityHost = getAuthorityHeaderHostString(req);
+ const defaultHost = getDefaultHeaderHostString(req);
+ if (authorityHost && defaultHost) {
+ if (authorityHost !== defaultHost)
+ throw new Error('Request `:authority` pseudo-header does not agree with `Host` header');
+ return authorityHost;
+ }
+ return (_a = authorityHost !== null && authorityHost !== void 0 ? authorityHost : defaultHost) !== null && _a !== void 0 ? _a : undefined;
+};
+export const getHost = (req, trust) => {
+ const host = getHostString(req, trust);
+ if (!host)
+ return undefined;
+ // IPv6 literal support
+ const index = host.indexOf(':', host[0] === '[' ? host.indexOf(']') + 1 : 0);
+ if (index === -1)
+ return { hostname: host };
+ const hostname = host.substring(0, index);
+ const port = Number(host.substring(index + 1));
+ if (Number.isNaN(port))
+ throw new TypeError('Port number is NaN, therefore Host is malformed');
+ return { hostname, port };
+};
+export const getIP = (req, trust) => proxyAddr(req, trust).replace(/^.*:/, ''); // striping the redundant prefix addeded by OS to IPv4 address
+export const getIPs = (req, trust) => all(req, trust);
+export const getSubdomains = (req, trust, subdomainOffset = 2) => {
+ const host = getHost(req, trust);
+ if (!(host === null || host === void 0 ? void 0 : host.hostname))
+ return [];
+ const subdomains = isIP(host.hostname) ? [host.hostname] : host.hostname.split('.').reverse();
+ return subdomains.slice(subdomainOffset);
+};
+//# sourceMappingURL=request.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/request.js.map b/be/node_modules/@tinyhttp/app/dist/request.js.map
new file mode 100644
index 000000000..89ed9d189
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/request.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"request.js","sourceRoot":"","sources":["../src/request.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/response.d.ts b/be/node_modules/@tinyhttp/app/dist/response.d.ts
new file mode 100644
index 000000000..4d548c259
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/response.d.ts
@@ -0,0 +1,44 @@
+import type { OutgoingHttpHeaders, ServerResponse } from 'node:http';
+import type { SerializeOptions } from '@tinyhttp/cookie';
+import type { DownloadOptions, FormatProps, SendFileOptions } from '@tinyhttp/res';
+import type { App } from './app.js';
+import type { Request } from './request.js';
+import type { AppRenderOptions, TemplateEngineOptions } from './types.js';
+export declare const renderTemplate: (_req: Request, res: Response, app: App) => (file: string, data?: Record, options?: AppRenderOptions) => Response;
+export interface Response extends ServerResponse {
+ header(field: string | Record, val?: string | any[]): Response;
+ set(field: string | Record, val?: string | any[]): Response;
+ get(field: HeaderName): OutgoingHttpHeaders[HeaderName];
+ send(body: B): Response;
+ sendFile(path: string, options?: SendFileOptions, cb?: (err?: unknown) => void): Response;
+ json(body: B): Response;
+ status(status: number): Response;
+ sendStatus(statusCode: number): Response;
+ cookie(name: string, value: string | Record, options?: SerializeOptions & Partial<{
+ signed: boolean;
+ }>): Response;
+ clearCookie(name: string, options?: SerializeOptions): Response;
+ location(url: string): Response;
+ links(links: {
+ [key: string]: string;
+ }): Response;
+ render(file: string, data?: Record, options?: AppRenderOptions): Response;
+ vary(field: string): Response;
+ format(obj: FormatProps): Response;
+ redirect(url: string, status?: number): Response;
+ type(type: string): Response;
+ download(path: string, filename: string, options?: DownloadOptions, cb?: (err?: unknown) => void): Response;
+ attachment(filename?: string): Response;
+ app?: App;
+ locals: Record;
+ /**
+ * Send JSON response with JSONP callback support.
+ *
+ * To enable this method, install the `@tinyhttp/jsonp` package and attach the method to `res.jsonp` property.
+ *
+ * @param obj Response object
+ */
+ jsonp(obj: any): Response;
+ append(field: string, value: any): Response;
+}
+//# sourceMappingURL=response.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/response.d.ts.map b/be/node_modules/@tinyhttp/app/dist/response.d.ts.map
new file mode 100644
index 000000000..dcc960b08
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/response.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/response.js b/be/node_modules/@tinyhttp/app/dist/response.js
new file mode 100644
index 000000000..9265b3385
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/response.js
@@ -0,0 +1,9 @@
+export const renderTemplate = (_req, res, app) => (file, data, options) => {
+ app.render(file, data ? { ...res.locals, ...data } : res.locals, options, (err, html) => {
+ if (err)
+ throw err;
+ res.send(html);
+ });
+ return res;
+};
+//# sourceMappingURL=response.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/response.js.map b/be/node_modules/@tinyhttp/app/dist/response.js.map
new file mode 100644
index 000000000..06c882fed
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/response.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"response.js","sourceRoot":"","sources":["../src/response.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,cAAc,GACzB,CAA0D,IAAa,EAAE,GAAa,EAAE,GAAQ,EAAE,EAAE,CACpG,CAAC,IAAY,EAAE,IAA8B,EAAE,OAA6B,EAAY,EAAE;IACxF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAY,EAAE,IAAa,EAAE,EAAE;QACxG,IAAI,GAAG;YAAE,MAAM,GAAG,CAAA;QAClB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/types.d.ts b/be/node_modules/@tinyhttp/app/dist/types.d.ts
new file mode 100644
index 000000000..8895d7081
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/types.d.ts
@@ -0,0 +1,108 @@
+import type { Server } from 'node:http';
+import type { Trust } from '@tinyhttp/proxy-addr';
+import type { Handler, NextFunction, RouterInterface, UseMethodParams } from '@tinyhttp/router';
+import type { ErrorHandler } from './onError.js';
+import type { Request } from './request.js';
+import type { Response } from './response.js';
+import type { View } from './view.js';
+/**
+ * tinyhttp App has a few settings for toggling features
+ */
+export type AppSettings = Partial<{
+ networkExtensions: boolean;
+ subdomainOffset: number;
+ bindAppToReqRes: boolean;
+ xPoweredBy: string | boolean;
+ enableReqRoute: boolean;
+ views: string | string[];
+ view: typeof View;
+ 'view cache': boolean;
+ 'view engine': string;
+ 'trust proxy': Trust;
+}>;
+export type TemplateEngineOptions = {
+ [key: string]: unknown;
+ cache?: boolean;
+};
+/**
+ * Function that processes the template
+ */
+export type TemplateEngine = (path: string, locals: Record, opts: AppRenderOptions, cb: (err: Error | null, html: unknown) => void) => void;
+export type AppRenderOptions = O & Partial<{
+ cache: boolean;
+ ext: string;
+ viewsFolder: string;
+ _locals: Record;
+}>;
+export type AppConstructor = Partial<{
+ noMatchHandler: Handler;
+ onError: ErrorHandler;
+ settings: AppSettings;
+ applyExtensions: Handler;
+ new (options: AppConstructor): AppInterface;
+}>;
+export interface AppInterface extends RouterInterface, Req, Res> {
+ /**
+ * Set app setting
+ * @param setting setting name
+ * @param value setting value
+ */
+ set(setting: K, value: AppSettings[K]): AppInterface;
+ /**
+ * Enable app setting
+ * @param setting Setting name
+ */
+ enable(setting: K): AppInterface;
+ /**
+ * Check if setting is enabled
+ * @param setting Setting name
+ * @returns
+ */
+ enabled(setting: K): boolean;
+ /**
+ * Disable app setting
+ * @param setting Setting name
+ */
+ disable(setting: K): AppInterface;
+ /**
+ * Return the app's absolute pathname
+ * based on the parent(s) that have
+ * mounted it.
+ *
+ * For example if the application was
+ * mounted as `"/admin"`, which itself
+ * was mounted as `"/blog"` then the
+ * return value would be `"/blog/admin"`.
+ *
+ */
+ path(): string;
+ /**
+ * Register a template engine with extension
+ */
+ engine(ext: string, fn: TemplateEngine): AppInterface;
+ /**
+ * Render a template
+ * @param name What to render
+ * @param data data that is passed to a template
+ * @param options Template engine options
+ * @param cb Callback that consumes error and html
+ */
+ render(name: string, data: Record, options: AppRenderOptions, cb: (err: unknown, html?: unknown) => void): void;
+ use(...args: UseMethodParams>): AppInterface;
+ route(path: string): AppInterface;
+ /**
+ * Extends Req / Res objects, pushes 404 and 500 handlers, dispatches middleware
+ * @param req Req object
+ * @param res Res object
+ * @param next 'Next' function
+ */
+ handler(req: Req, res: Res, next?: NextFunction): void;
+ /**
+ * Creates HTTP server and dispatches middleware
+ * @param port server listening port
+ * @param cb callback to be invoked after server starts listening
+ * @param host server listening host
+ */
+ listen(port?: number, cb?: () => void, host?: string): Server;
+}
+//# sourceMappingURL=types.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/types.d.ts.map b/be/node_modules/@tinyhttp/app/dist/types.d.ts.map
new file mode 100644
index 000000000..3dfe7b853
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/types.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/types.js b/be/node_modules/@tinyhttp/app/dist/types.js
new file mode 100644
index 000000000..718fd38ae
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/types.js
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/types.js.map b/be/node_modules/@tinyhttp/app/dist/types.js.map
new file mode 100644
index 000000000..c768b7900
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/view.d.ts b/be/node_modules/@tinyhttp/app/dist/view.d.ts
new file mode 100644
index 000000000..92a8ecc51
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/view.d.ts
@@ -0,0 +1,38 @@
+/*!
+ * Ported from https://github.com/expressjs/express/blob/master/lib/view.js
+ * express
+ * Copyright(c) 2009-2013 TJ Holowaychuk
+ * Copyright(c) 2013 Roman Shtylman
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+import type { TemplateEngine, TemplateEngineOptions } from './types.js';
+/**
+ * Initialize a new `View` with the given `name`.
+ *
+ * Options:
+ *
+ * - `defaultEngine` the default template engine name
+ * - `engines` template engine require() cache
+ * - `root` root path for view lookup
+ *
+ * @param name
+ * @param options
+ * @public
+ */
+export declare class View {
+ #private;
+ ext?: string;
+ defaultEngine?: string;
+ name: string;
+ engine: TemplateEngine;
+ path: string;
+ root: string | string[];
+ constructor(name: string, opts?: Partial<{
+ defaultEngine: string;
+ root: string | string[];
+ engines: Record>;
+ }>);
+ render(options: RenderOptions, data: Record, cb: (err: Error | null, html: unknown) => void): void;
+}
+//# sourceMappingURL=view.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/view.d.ts.map b/be/node_modules/@tinyhttp/app/dist/view.d.ts.map
new file mode 100644
index 000000000..fd73217b9
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/view.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAUvE;;;;;;;;;;;;GAYG;AAEH,qBAAa,IAAI,CAAC,aAAa,SAAS,qBAAqB,GAAG,qBAAqB;;IACnF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAA;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAK;gBAE1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,OAAO,CAAC;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;QACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC,CAAA;KACvD,CAAM;IAiET,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI;CAG7G"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/view.js b/be/node_modules/@tinyhttp/app/dist/view.js
new file mode 100644
index 000000000..2138d7f91
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/view.js
@@ -0,0 +1,100 @@
+/*!
+ * Ported from https://github.com/expressjs/express/blob/master/lib/view.js
+ * express
+ * Copyright(c) 2009-2013 TJ Holowaychuk
+ * Copyright(c) 2013 Roman Shtylman
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
+};
+var _View_instances, _View_lookup, _View_resolve;
+import { statSync } from 'node:fs';
+import { basename, dirname, extname, join, resolve } from 'node:path';
+function tryStat(path) {
+ try {
+ return statSync(path);
+ }
+ catch (e) {
+ return undefined;
+ }
+}
+/**
+ * Initialize a new `View` with the given `name`.
+ *
+ * Options:
+ *
+ * - `defaultEngine` the default template engine name
+ * - `engines` template engine require() cache
+ * - `root` root path for view lookup
+ *
+ * @param name
+ * @param options
+ * @public
+ */
+export class View {
+ constructor(name, opts = {}) {
+ var _a, _b;
+ _View_instances.add(this);
+ this.root = [];
+ this.ext = extname(name);
+ this.name = name;
+ if (opts.root)
+ this.root = opts.root;
+ if (opts.defaultEngine)
+ this.defaultEngine = opts.defaultEngine;
+ if (!this.ext && !this.defaultEngine)
+ throw new Error('No default engine was specified and no extension was provided.');
+ let fileName = name;
+ if (!this.ext) {
+ // get extension from default engine name
+ this.ext = ((_a = this.defaultEngine) === null || _a === void 0 ? void 0 : _a[0]) !== '.' ? `.${this.defaultEngine}` : this.defaultEngine;
+ fileName += this.ext;
+ }
+ if (!((_b = opts.engines) === null || _b === void 0 ? void 0 : _b[this.ext]))
+ throw new Error(`No engine was found for ${this.ext}`);
+ const path = __classPrivateFieldGet(this, _View_instances, "m", _View_lookup).call(this, fileName);
+ const dirs = Array.isArray(this.root) && this.root.length > 1
+ ? `directories "${this.root.slice(0, -1).join('", "')}" or "${this.root[this.root.length - 1]}"`
+ : `directory "${this.root}"`;
+ if (!path)
+ throw new Error(`Failed to lookup view "${name}" in views ${dirs}`);
+ this.engine = opts.engines[this.ext];
+ this.path = path;
+ }
+ render(options, data, cb) {
+ this.engine(this.path, data, options, cb);
+ }
+}
+_View_instances = new WeakSet(), _View_lookup = function _View_lookup(name) {
+ let path;
+ const roots = [].concat(this.root);
+ for (let i = 0; i < roots.length && !path; i++) {
+ const root = roots[i];
+ // resolve the path
+ const loc = resolve(root, name);
+ const dir = dirname(loc);
+ const file = basename(loc);
+ // resolve the file
+ path = __classPrivateFieldGet(this, _View_instances, "m", _View_resolve).call(this, dir, file);
+ }
+ return path;
+}, _View_resolve = function _View_resolve(dir, file) {
+ const ext = this.ext;
+ // .
+ let path = join(dir, file);
+ let stat = tryStat(path);
+ if (stat === null || stat === void 0 ? void 0 : stat.isFile()) {
+ return path;
+ }
+ // /index.
+ path = join(dir, basename(file, ext), `index${ext}`);
+ stat = tryStat(path);
+ if (stat === null || stat === void 0 ? void 0 : stat.isFile()) {
+ return path;
+ }
+};
+//# sourceMappingURL=view.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/dist/view.js.map b/be/node_modules/@tinyhttp/app/dist/view.js.map
new file mode 100644
index 000000000..48131f52a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/dist/view.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/app/package.json b/be/node_modules/@tinyhttp/app/package.json
new file mode 100644
index 000000000..ee820341a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/app/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@tinyhttp/app",
+ "version": "2.5.2",
+ "description": "0-legacy, tiny & fast web framework as a replacement of Express",
+ "type": "module",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/app"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "files": [
+ "dist"
+ ],
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "keywords": [
+ "tinyhttp",
+ "router",
+ "backend",
+ "http",
+ "framework",
+ "api"
+ ],
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {
+ "header-range-parser": "1.1.3",
+ "regexparam": "^2.0.2",
+ "@tinyhttp/cookie": "2.1.1",
+ "@tinyhttp/proxy-addr": "2.2.1",
+ "@tinyhttp/req": "2.2.5",
+ "@tinyhttp/res": "2.2.5",
+ "@tinyhttp/router": "2.2.3"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/content-disposition/LICENSE b/be/node_modules/@tinyhttp/content-disposition/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/content-disposition/README.md b/be/node_modules/@tinyhttp/content-disposition/README.md
new file mode 100644
index 000000000..b90b76ee7
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/README.md
@@ -0,0 +1,107 @@
+# @tinyhttp/content-disposition
+
+> [`content-disposition`](https://github.com/jshttp/content-disposition) rewrite
+> in TypeScript.
+
+Create and parse HTTP `Content-Disposition` header
+
+## Install
+
+```sh
+pnpm i @tinyhttp/content-disposition
+```
+
+## API
+
+```ts
+import { contentDisposition, parse } from '@tinyhttp/content-disposition'
+```
+
+### `contentDisposition(filename)`
+
+Create an attachment `Content-Disposition` header value using the given file
+name, if supplied. The `filename` is optional and if no file name is desired,
+but you want to specify `options`, set `filename` to `undefined`.
+
+```js
+res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf'))
+```
+
+**note** HTTP headers are of the ISO-8859-1 character set. If you are writing
+this header through a means different from `setHeader` in Node.js, you'll want
+to specify the `'binary'` encoding in Node.js.
+
+#### Options
+
+`contentDisposition` accepts these properties in the options object.
+
+##### `fallback`
+
+If the `filename` option is outside ISO-8859-1, then the file name is actually
+stored in a supplemental field for clients that support Unicode file names and a
+ISO-8859-1 version of the file name is automatically generated.
+
+This specifies the ISO-8859-1 file name to override the automatic generation or
+disables the generation all together, defaults to `true`.
+
+- A string will specify the ISO-8859-1 file name to use in place of automatic
+ generation.
+- `false` will disable including a ISO-8859-1 file name and only include the
+ Unicode version (unless the file name is already ISO-8859-1).
+- `true` will enable automatic generation if the file name is outside
+ ISO-8859-1.
+
+If the `filename` option is ISO-8859-1 and this option is specified and has a
+different value, then the `filename` option is encoded in the extended field and
+this set as the fallback field, even though they are both ISO-8859-1.
+
+##### `type`
+
+Specifies the disposition type, defaults to `"attachment"`. This can also be
+`"inline"`, or any other value (all values except inline are treated like
+`attachment`, but can convey additional information if both parties agree to
+it). The type is normalized to lower-case.
+
+### `contentDisposition.parse(string)`
+
+```js
+contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt')
+```
+
+Parse a `Content-Disposition` header string. This automatically handles extended
+("Unicode") parameters by decoding them and providing them under the standard
+parameter name. This will return an object with the following properties
+(examples are shown for the string
+`'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`):
+
+- `type`: The disposition type (always lower case). Example: `'attachment'`
+
+- `parameters`: An object of the parameters in the disposition (name of
+ parameter always lower case and extended versions replace non-extended
+ versions). Example: `{filename: "€ rates.txt"}`
+
+## Example
+
+This simple example shows how to use `accepts` to return a different typed
+respond body based on what the client wants to accept. The server lists it's
+preferences in order and will get back the best match between the client and
+server.
+
+```ts
+import { contentDisposition } from '@tinyhttp/content-disposition'
+import destroy from 'destroy'
+import fs from 'node:fs'
+import { createServer } from 'node:http'
+import onFinished from 'on-finished'
+
+const filePath = '/path/to/public/plans.pdf'
+
+createServer((req, res) => {
+ res.setHeader('Content-Type', 'application/pdf')
+ res.setHeader('Content-Disposition', contentDisposition(filePath))
+
+ const stream = fs.createReadStream(filePath)
+ stream.pipe(res)
+ onFinished(res, () => destroy(stream))
+})
+```
diff --git a/be/node_modules/@tinyhttp/content-disposition/dist/index.d.ts b/be/node_modules/@tinyhttp/content-disposition/dist/index.d.ts
new file mode 100644
index 000000000..8fccff517
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/dist/index.d.ts
@@ -0,0 +1,21 @@
+export declare class ContentDisposition {
+ type: string;
+ parameters: Record;
+ constructor(type: string, parameters: Record);
+}
+/**
+ * Create an attachment Content-Disposition header.
+ *
+ * @param filename file name
+ * @param options
+ */
+export declare function contentDisposition(filename?: string, options?: Partial<{
+ type: string;
+ fallback: string | boolean;
+}>): string;
+/**
+ * Parse Content-Disposition header string.
+ * @param header string
+ */
+export declare function parse(header: string): ContentDisposition;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/content-disposition/dist/index.d.ts.map b/be/node_modules/@tinyhttp/content-disposition/dist/index.d.ts.map
new file mode 100644
index 000000000..5eb21e45d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA8BA,qBAAa,kBAAkB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBACvB,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;CAInF;AAoFD;;;;;GAKG;AAEH,wBAAgB,kBAAkB,CAChC,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,GAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B,CAAM,GACN,MAAM,CAGR;AA2BD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAuDxD"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/content-disposition/dist/index.js b/be/node_modules/@tinyhttp/content-disposition/dist/index.js
new file mode 100644
index 000000000..7c05eafbe
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/dist/index.js
@@ -0,0 +1,162 @@
+// biome-ignore lint/suspicious/noControlCharactersInRegex:
+const ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g;
+const HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/;
+const HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g;
+const NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g;
+// biome-ignore lint/suspicious/noControlCharactersInRegex:
+const QESC_REGEXP = /\\([\u0000-\u007f])/g;
+const QUOTE_REGEXP = /([\\"])/g;
+const PARAM_REGEXP =
+// biome-ignore lint/suspicious/noControlCharactersInRegex:
+/;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g;
+const TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/;
+const TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/;
+const EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/;
+// biome-ignore lint/suspicious/noControlCharactersInRegex:
+const DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/;
+const getlatin1 = (val) => {
+ // simple Unicode -> ISO-8859-1 transformation
+ return String(val).replace(NON_LATIN1_REGEXP, '?');
+};
+export class ContentDisposition {
+ constructor(type, parameters) {
+ this.type = type;
+ this.parameters = parameters;
+ }
+}
+const qstring = (val) => `"${String(val).replace(QUOTE_REGEXP, '\\$1')}"`;
+const pencode = (char) => `%${String(char).charCodeAt(0).toString(16).toUpperCase()}`;
+function ustring(val) {
+ const str = String(val);
+ // percent encode as UTF-8
+ const encoded = encodeURIComponent(str).replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode);
+ return `UTF-8''${encoded}`;
+}
+const basename = (str) => str.slice(str.lastIndexOf('/') + 1);
+function format({ parameters, type }) {
+ if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) {
+ throw new TypeError('invalid type');
+ }
+ // start with normalized type
+ let string = String(type).toLowerCase();
+ // append parameters
+ if (parameters && typeof parameters === 'object') {
+ const params = Object.keys(parameters).sort();
+ for (const param of params) {
+ const val = param.slice(-1) === '*' ? ustring(parameters[param]) : qstring(parameters[param]);
+ string += `; ${param}=${val}`;
+ }
+ }
+ return string;
+}
+function createParams(filename, fallback) {
+ if (filename === undefined)
+ return {};
+ const params = {};
+ // fallback defaults to true
+ if (!fallback)
+ fallback = true;
+ if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) {
+ throw new TypeError('fallback must be ISO-8859-1 string');
+ }
+ // restrict to file base name
+ const name = basename(filename);
+ // determine if name is suitable for quoted string
+ const isQuotedString = TEXT_REGEXP.test(name);
+ // generate fallback name
+ const fallbackName = typeof fallback !== 'string' ? fallback && getlatin1(name) : basename(fallback);
+ const hasFallback = typeof fallbackName === 'string' && fallbackName !== name;
+ // set extended filename parameter
+ if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) {
+ params['filename*'] = name;
+ }
+ // set filename parameter
+ if (isQuotedString || hasFallback) {
+ params.filename = hasFallback ? fallbackName : name;
+ }
+ return params;
+}
+const pdecode = (_str, hex) => String.fromCharCode(Number.parseInt(hex, 16));
+/**
+ * Create an attachment Content-Disposition header.
+ *
+ * @param filename file name
+ * @param options
+ */
+export function contentDisposition(filename, options = {}) {
+ // format into string
+ return format(new ContentDisposition(options.type || 'attachment', createParams(filename, options.fallback)));
+}
+function decodefield(str) {
+ const match = EXT_VALUE_REGEXP.exec(str);
+ if (!match)
+ throw new TypeError('invalid extended field value');
+ const charset = match[1].toLowerCase();
+ const encoded = match[2];
+ let value;
+ switch (charset) {
+ case 'iso-8859-1':
+ value = getlatin1(encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode));
+ break;
+ case 'utf-8':
+ try {
+ value = decodeURIComponent(encoded);
+ }
+ catch {
+ throw new TypeError('invalid encoded utf-8');
+ }
+ break;
+ default:
+ throw new TypeError('unsupported charset in extended field');
+ }
+ return value;
+}
+/**
+ * Parse Content-Disposition header string.
+ * @param header string
+ */
+export function parse(header) {
+ let match = DISPOSITION_TYPE_REGEXP.exec(header);
+ if (!match)
+ throw new TypeError('invalid type format');
+ // normalize type
+ let index = match[0].length;
+ const type = match[1].toLowerCase();
+ let key;
+ const names = [];
+ const params = {};
+ let value;
+ // calculate index to start at
+ index = PARAM_REGEXP.lastIndex = match[0].slice(-1) === ';' ? index - 1 : index;
+ // match parameters
+ while ((match = PARAM_REGEXP.exec(header))) {
+ if (match.index !== index)
+ throw new TypeError('invalid parameter format');
+ index += match[0].length;
+ key = match[1].toLowerCase();
+ value = match[2];
+ if (names.indexOf(key) !== -1) {
+ throw new TypeError('invalid duplicate parameter');
+ }
+ names.push(key);
+ if (key.indexOf('*') + 1 === key.length) {
+ // decode extended value
+ key = key.slice(0, -1);
+ value = decodefield(value);
+ // overwrite existing value
+ params[key] = value;
+ continue;
+ }
+ if (typeof params[key] === 'string')
+ continue;
+ if (value[0] === '"') {
+ value = value.slice(1, value.length - 1).replace(QESC_REGEXP, '$1');
+ }
+ params[key] = value;
+ }
+ if (index !== -1 && index !== header.length) {
+ throw new TypeError('invalid parameter format');
+ }
+ return new ContentDisposition(type, params);
+}
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/content-disposition/dist/index.js.map b/be/node_modules/@tinyhttp/content-disposition/dist/index.js.map
new file mode 100644
index 000000000..147d1ae74
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/content-disposition/package.json b/be/node_modules/@tinyhttp/content-disposition/package.json
new file mode 100644
index 000000000..684cd6273
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-disposition/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "@tinyhttp/content-disposition",
+ "description": "content-disposition rewrite in TypeScript",
+ "version": "2.2.2",
+ "license": "MIT",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/content-disposition"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "type": "module",
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/content-type/LICENSE b/be/node_modules/@tinyhttp/content-type/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-type/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/content-type/README.md b/be/node_modules/@tinyhttp/content-type/README.md
new file mode 100644
index 000000000..d68508c53
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-type/README.md
@@ -0,0 +1,82 @@
+# @tinyhttp/content-type
+
+[![Version][v-badge-url]][npm-url] [![Downloads][dl-badge-url]][npm-url] [![GitHub Workflow Status][gh-actions-img]][github-actions] [![Codecov][cov-badge-url]][cov-url]
+
+> [`content-type`](https://github.com/jshttp/content-type) rewrite in TypeScript and ESM.
+
+Create and parse HTTP Content-Type header according to RFC 7231
+
+## Install
+
+```sh
+pnpm i @tinyhttp/content-type
+```
+
+## API
+
+```ts
+import { parse, format } from '@tinyhttp/content-type'
+```
+
+### `parse(string: string | Request | Response)`
+
+```ts
+const obj = parse('image/svg+xml; charset=utf-8')
+```
+
+Parse a `Content-Type` header. This will return an object with the following
+properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`):
+
+- `type`: The media type (the type and subtype, always lower case).
+ Example: `'image/svg+xml'`
+
+- `parameters`: An object of the parameters in the media type (name of parameter
+ always lower case). Example: `{charset: 'utf-8'}`
+
+Throws a `TypeError` if the string is missing or invalid.
+
+```ts
+const obj = contentType.parse(req)
+```
+
+Parse the `Content-Type` header from the given `req`. Short-cut for
+`contentType.parse(req.headers['content-type'])`.
+
+Throws a `TypeError` if the `Content-Type` header is missing or invalid.
+
+```js
+const obj = contentType.parse(res)
+```
+
+Parse the `Content-Type` header set on the given `res`. Short-cut for
+`contentType.parse(res.getHeader('content-type'))`.
+
+Throws a `TypeError` if the `Content-Type` header is missing or invalid.
+
+### `format(obj)`
+
+```ts
+const str = contentType.format({
+ type: 'image/svg+xml',
+ parameters: { charset: 'utf-8' },
+})
+```
+
+Format an object into a `Content-Type` header. This will return a string of the
+content type for the given object with the following properties (examples are
+shown that produce the string `'image/svg+xml; charset=utf-8'`):
+
+- `type`: The media type (will be lower-cased). Example: `'image/svg+xml'`
+
+- `parameters`: An object of the parameters in the media type (name of the
+ parameter will be lower-cased). Example: `{charset: 'utf-8'}`
+
+Throws a `TypeError` if the object contains an invalid type or parameter names.
+
+[v-badge-url]: https://img.shields.io/npm/v/@tinyhttp/content-type.svg?style=for-the-badge&color=FF69B4&label=&logo=npm
+[npm-url]: https://www.npmjs.com/package/@tinyhttp/content-type
+[cov-badge-url]: https://img.shields.io/coveralls/github/tinyhttp/content-type?style=for-the-badge&color=FF69B4
+[cov-url]: https://coveralls.io/github/tinyhttp/@tinyhttp/content-type
+[dl-badge-url]: https://img.shields.io/npm/dt/@tinyhttp/content-type?style=for-the-badge&color=FF69B4
+[github-actions]: https://github.com/tinyhttp/content-type/actions
+[gh-actions-img]: https://img.shields.io/github/actions/workflow/status/tinyhttp/content-type/ci.yml?branch=master&style=for-the-badge&color=FF69B4&label=&logo=github
diff --git a/be/node_modules/@tinyhttp/content-type/dist/index.d.ts b/be/node_modules/@tinyhttp/content-type/dist/index.d.ts
new file mode 100644
index 000000000..5fea39e7c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-type/dist/index.d.ts
@@ -0,0 +1,24 @@
+import { IncomingHttpHeaders, ServerResponse } from 'node:http';
+
+type Request = {
+ headers: IncomingHttpHeaders;
+};
+type Response = Pick;
+/**
+ * Class to represent a content type.
+ */
+declare class ContentType {
+ parameters?: Record;
+ type: string;
+ constructor(type: string);
+}
+/**
+ * Format object to media type.
+ */
+declare function format(obj: ContentType): string;
+/**
+ * Parse media type to object.
+ */
+declare function parse(string: string | Request | Response): ContentType;
+
+export { format, parse };
diff --git a/be/node_modules/@tinyhttp/content-type/dist/index.js b/be/node_modules/@tinyhttp/content-type/dist/index.js
new file mode 100644
index 000000000..c38f0fcfb
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-type/dist/index.js
@@ -0,0 +1,89 @@
+// src/index.ts
+var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g;
+var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/;
+var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
+var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g;
+var QUOTE_REGEXP = /([\\"])/g;
+var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
+function qstring(val) {
+ const str = String(val);
+ if (TOKEN_REGEXP.test(str))
+ return str;
+ if (str.length > 0 && !TEXT_REGEXP.test(str))
+ throw new TypeError("invalid parameter value");
+ return '"' + str.replace(QUOTE_REGEXP, "\\$1") + '"';
+}
+function getcontenttype(obj) {
+ let header;
+ if ("getHeader" in obj && typeof obj.getHeader === "function") {
+ header = obj.getHeader("content-type");
+ } else if ("headers" in obj && typeof obj.headers === "object") {
+ const h = obj.headers;
+ header = h && h["content-type"];
+ }
+ if (typeof header !== "string") {
+ throw new TypeError("content-type header is missing from object");
+ }
+ return header;
+}
+var ContentType = class {
+ parameters;
+ type;
+ constructor(type) {
+ this.parameters = {};
+ this.type = type;
+ }
+};
+function format(obj) {
+ if (!obj || typeof obj !== "object")
+ throw new TypeError("argument obj is required");
+ const { parameters, type } = obj;
+ if (!type || !TYPE_REGEXP.test(type))
+ throw new TypeError("invalid type");
+ let string = type;
+ if (parameters && typeof parameters == "object") {
+ const params = Object.keys(parameters).sort();
+ for (const param of params) {
+ if (!TOKEN_REGEXP.test(param))
+ throw new TypeError("invalid parameter name");
+ string += "; " + param + "=" + qstring(parameters[param]);
+ }
+ }
+ return string;
+}
+function parse(string) {
+ if (!string)
+ throw new TypeError("argument string is required");
+ const header = typeof string == "object" ? getcontenttype(string) : string;
+ if (typeof header !== "string")
+ throw new TypeError("argument string is required to be a string");
+ let index = header.indexOf(";");
+ const type = index != -1 ? header.slice(0, index).trim() : header.trim();
+ if (!TYPE_REGEXP.test(type))
+ throw new TypeError("invalid media type");
+ const obj = new ContentType(type.toLowerCase());
+ if (index != -1) {
+ let key;
+ let match;
+ let value;
+ PARAM_REGEXP.lastIndex = index;
+ while (match = PARAM_REGEXP.exec(header)) {
+ if (match.index !== index)
+ throw new TypeError("invalid parameter format");
+ index += match[0].length;
+ key = match[1].toLowerCase();
+ value = match[2];
+ if (value[0] == '"') {
+ value = value.slice(1, value.length - 1).replace(QESC_REGEXP, "$1");
+ }
+ obj.parameters[key] = value;
+ }
+ if (index != header.length)
+ throw new TypeError("invalid parameter format");
+ }
+ return obj;
+}
+export {
+ format,
+ parse
+};
diff --git a/be/node_modules/@tinyhttp/content-type/package.json b/be/node_modules/@tinyhttp/content-type/package.json
new file mode 100644
index 000000000..a6da4b5c2
--- /dev/null
+++ b/be/node_modules/@tinyhttp/content-type/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@tinyhttp/content-type",
+ "description": "content-type rewrite in TypeScript and ESM",
+ "version": "0.1.4",
+ "repository": "https://github.com/tinyhttp/content-type.git",
+ "engines": {
+ "node": ">=12.4"
+ },
+ "files": [
+ "dist"
+ ],
+ "author": "v1rtl ",
+ "license": "MIT",
+ "type": "module",
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "devDependencies": {
+ "@types/node": "^20.6.4",
+ "@typescript-eslint/eslint-plugin": "^6.7.2",
+ "@typescript-eslint/parser": "^6.7.2",
+ "c8": "^8.0.1",
+ "eslint": "^8.50.0",
+ "tsm": "^2.3.0",
+ "tsup": "^7.2.0",
+ "typescript": "^5.2.2",
+ "uvu": "^0.5.6"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "scripts": {
+ "build": "tsup src/index.ts --format esm --dts",
+ "test": "uvu -r tsm test",
+ "test:coverage": "c8 --include=src pnpm test",
+ "test:report": "c8 report --reporter=text-lcov > coverage.lcov"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie-signature/LICENSE b/be/node_modules/@tinyhttp/cookie-signature/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/cookie-signature/README.md b/be/node_modules/@tinyhttp/cookie-signature/README.md
new file mode 100644
index 000000000..0a50801ed
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/README.md
@@ -0,0 +1,25 @@
+# @tinyhttp/cookie-signature
+
+[](https://npmjs.com/package/@tinyhttp/cookie-signature) [](https://npmjs.com/package/@tinyhttp/cookie-signature)
+
+HTTP cookie signing and unsigning. A rewrite of [cookie-signature](https://github.com/tj/node-cookie-signature) module.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/cookie-signature
+```
+
+## API
+
+```js
+import { sign, unsign } from '@tinyhttp/cookie-signature'
+```
+
+### `sign(val, secret)`
+
+Signd the given `val` with `secret`.
+
+### `unsign(val, secret)`
+
+Unsign and decode the given `val` with `secret`, returning `false` if the signature is invalid.
diff --git a/be/node_modules/@tinyhttp/cookie-signature/dist/index.d.ts b/be/node_modules/@tinyhttp/cookie-signature/dist/index.d.ts
new file mode 100644
index 000000000..4203dc7d0
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/dist/index.d.ts
@@ -0,0 +1,10 @@
+/**
+ * Sign the given `val` with `secret`.
+ */
+export declare const sign: (val: string, secret: string) => string;
+/**
+ * Unsign and decode the given `val` with `secret`,
+ * returning `false` if the signature is invalid.
+ */
+export declare const unsign: (val: string, secret: string) => string | false;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie-signature/dist/index.d.ts.map b/be/node_modules/@tinyhttp/cookie-signature/dist/index.d.ts.map
new file mode 100644
index 000000000..31673743f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,IAAI,QAAS,MAAM,UAAU,MAAM,KAAG,MACuC,CAAA;AAE1F;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAS,MAAM,UAAU,MAAM,KAAG,MAAM,GAAG,KAQ7D,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie-signature/dist/index.js b/be/node_modules/@tinyhttp/cookie-signature/dist/index.js
new file mode 100644
index 000000000..f0746f9d2
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/dist/index.js
@@ -0,0 +1,15 @@
+import { createHmac, timingSafeEqual } from "node:crypto";
+const sign = (val, secret) => `${val}.${createHmac("sha256", secret).update(val).digest("base64").replace(/=+$/, "")}`;
+const unsign = (val, secret) => {
+ const str = val.slice(0, val.lastIndexOf("."));
+ const mac = sign(str, secret);
+ const macBuffer = Buffer.from(mac);
+ const valBuffer = Buffer.alloc(macBuffer.length);
+ valBuffer.write(val);
+ return timingSafeEqual(macBuffer, valBuffer) ? str : false;
+};
+export {
+ sign,
+ unsign
+};
+//# sourceMappingURL=index.js.map
diff --git a/be/node_modules/@tinyhttp/cookie-signature/dist/index.js.map b/be/node_modules/@tinyhttp/cookie-signature/dist/index.js.map
new file mode 100644
index 000000000..686f53941
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { createHmac, timingSafeEqual } from 'node:crypto'\n\n/**\n * Sign the given `val` with `secret`.\n */\nexport const sign = (val: string, secret: string): string =>\n `${val}.${createHmac('sha256', secret).update(val).digest('base64').replace(/=+$/, '')}`\n\n/**\n * Unsign and decode the given `val` with `secret`,\n * returning `false` if the signature is invalid.\n */\nexport const unsign = (val: string, secret: string): string | false => {\n const str = val.slice(0, val.lastIndexOf('.'))\n const mac = sign(str, secret)\n const macBuffer = Buffer.from(mac)\n const valBuffer = Buffer.alloc(macBuffer.length)\n\n valBuffer.write(val)\n return timingSafeEqual(macBuffer, valBuffer) ? str : false\n}\n"],"names":[],"mappings":";AAKa,MAAA,OAAO,CAAC,KAAa,WAChC,GAAG,GAAG,IAAI,WAAW,UAAU,MAAM,EAAE,OAAO,GAAG,EAAE,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE,CAAC;AAM3E,MAAA,SAAS,CAAC,KAAa,WAAmC;AACrE,QAAM,MAAM,IAAI,MAAM,GAAG,IAAI,YAAY,GAAG,CAAC;AACvC,QAAA,MAAM,KAAK,KAAK,MAAM;AACtB,QAAA,YAAY,OAAO,KAAK,GAAG;AACjC,QAAM,YAAY,OAAO,MAAM,UAAU,MAAM;AAE/C,YAAU,MAAM,GAAG;AACnB,SAAO,gBAAgB,WAAW,SAAS,IAAI,MAAM;AACvD;"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie-signature/package.json b/be/node_modules/@tinyhttp/cookie-signature/package.json
new file mode 100644
index 000000000..07b724ba2
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie-signature/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@tinyhttp/cookie-signature",
+ "version": "2.1.1",
+ "description": "HTTP cookie signing and unsigning",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/cookie-signature"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "type": "module",
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "static",
+ "cookie"
+ ],
+ "files": [
+ "dist"
+ ],
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {},
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie/LICENSE b/be/node_modules/@tinyhttp/cookie/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/cookie/README.md b/be/node_modules/@tinyhttp/cookie/README.md
new file mode 100644
index 000000000..7b638230c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/README.md
@@ -0,0 +1,176 @@
+# @tinyhttp/cookie
+
+[](https://npmjs.com/package/@tinyhttp/cookie) [](https://npmjs.com/package/@tinyhttp/cookie)
+
+> A rewrite of [cookie](https://github.com/jshttp/cookie) module.
+
+HTTP cookie parser and serializer for Node.js.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/cookie
+```
+
+## API
+
+```js
+import { parse, serialize } from '@tinyhttp/cookie'
+```
+
+### `parse(str, options)`
+
+Parse an HTTP `Cookie` header string and returning an object of all cookie name-value pairs.
+The `str` argument is the string representing a `Cookie` header value and `options` is an
+optional object containing additional parsing options.
+
+```js
+import { parse } from '@tinyhttp/cookie'
+
+parse('foo=bar; equation=E%3Dmc%5E2')
+// { foo: 'bar', equation: 'E=mc^2' }
+```
+
+#### Options
+
+`parse` accepts these properties in the options object.
+
+##### `decode`
+
+Specifies a function that will be used to decode a cookie's value. Since the value of a cookie
+has a limited character set (and must be a simple string), this function can be used to decode
+a previously-encoded cookie value into a JavaScript string or other object.
+
+The default function is the global `decodeURIComponent`, which will decode any URL-encoded
+sequences into their byte representations.
+
+**note** if an error is thrown from this function, the original, non-decoded cookie value will
+be returned as the cookie's value.
+
+### `serialize(name, value, options)`
+
+Serialize a cookie name-value pair into a `Set-Cookie` header string. The `name` argument is the
+name for the cookie, the `value` argument is the value to set the cookie to, and the `options`
+argument is an optional object containing additional serialization options.
+
+```js
+import { serialize } from '@tinyhttp/cookie'
+
+serialize('foo', 'bar')
+// foo=bar
+```
+
+#### Options
+
+`serialize` accepts these properties in the options object.
+
+##### `domain`
+
+Specifies the value for the [`Domain` `Set-Cookie` attribute][rfc-6265-5.2.3]. By default, no
+domain is set, and most clients will consider the cookie to apply to only the current domain.
+
+##### `encode`
+
+Specifies a function that will be used to encode a cookie's value. Since value of a cookie
+has a limited character set (and must be a simple string), this function can be used to encode
+a value into a string suited for a cookie's value.
+
+The default function is the global `encodeURIComponent`, which will encode a JavaScript string
+into UTF-8 byte sequences and then URL-encode any that fall outside of the cookie range.
+
+##### `expires`
+
+Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute][rfc-6265-5.2.1].
+By default, no expiration is set, and most clients will consider this a "non-persistent cookie" and
+will delete it on a condition like exiting a web browser application.
+
+**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and
+`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this,
+so if both are set, they should point to the same date and time.
+
+##### `httpOnly`
+
+Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute][rfc-6265-5.2.6]. When truthy,
+the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly` attribute is not set.
+
+**note** be careful when setting this to `true`, as compliant clients will not allow client-side
+JavaScript to see the cookie in `document.cookie`.
+
+##### `maxAge`
+
+Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute][rfc-6265-5.2.2].
+The given number will be converted to an integer by rounding down. By default, no maximum age is set.
+
+**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and
+`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this,
+so if both are set, they should point to the same date and time.
+
+##### `path`
+
+Specifies the value for the [`Path` `Set-Cookie` attribute][rfc-6265-5.2.4]. By default, the path
+is considered the ["default path"][rfc-6265-5.1.4].
+
+##### `sameSite`
+
+Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][rfc-6265bis-03-4.1.2.7].
+
+- `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement.
+- `false` will not set the `SameSite` attribute.
+- `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement.
+- `'none'` will set the `SameSite` attribute to `None` for an explicit cross-site cookie.
+- `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement.
+
+More information about the different enforcement levels can be found in
+[the specification][rfc-6265bis-03-4.1.2.7].
+
+**note** This is an attribute that has not yet been fully standardized, and may change in the future.
+This also means many clients may ignore this attribute until they understand it.
+
+##### `secure`
+
+Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute][rfc-6265-5.2.5]. When truthy,
+the `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set.
+
+**note** be careful when setting this to `true`, as compliant clients will not send the cookie back to
+the server in the future if the browser does not have an HTTPS connection.
+
+## Example
+
+```ts
+import { App } from '@tinyhttp/app'
+import { parse, serialize } from '@tinyhttp/cookie'
+import { escapeHTML } from 'es-escape-html'
+
+new App()
+ .use((req, res) => {
+ if (req.query?.name) {
+ // Set a new cookie with the name
+ res.set(
+ 'Set-Cookie',
+ serialize('name', String(query.name), {
+ httpOnly: true,
+ maxAge: 60 * 60 * 24 * 7 // 1 week
+ })
+ )
+
+ // Redirect back after setting cookie
+ res
+ .status(302)
+ .set('Location', req.headers.referer || '/')
+ .end()
+ }
+
+ const cookie = parse(req.headers.cookie || '')
+
+ const { name } = cookie
+
+ res.set('Content-Type', 'text/html; charset=UTF-8')
+
+ res.write(name ? `Welcome back, ${escapeHTML(name)} !
` : 'Hello, new visitor!
')
+
+ res.write('')
+ res.write(' ')
+ res.end(' ')
+ })
+ .listen(3000)
+```
diff --git a/be/node_modules/@tinyhttp/cookie/dist/index.d.ts b/be/node_modules/@tinyhttp/cookie/dist/index.d.ts
new file mode 100644
index 000000000..a6cd71468
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/dist/index.d.ts
@@ -0,0 +1,22 @@
+/**
+ * Parse a cookie header.
+ *
+ * Parse the given cookie header string into an object
+ * The object has the various cookies as keys(names) => values
+ *
+ */
+export declare function parse(str: string, options?: {
+ decode: (str: string) => string;
+}): Record;
+export type SerializeOptions = Partial<{
+ encode: (str: string) => string;
+ maxAge: number;
+ domain: string;
+ path: string;
+ httpOnly: boolean;
+ secure: boolean;
+ sameSite: boolean | 'Strict' | 'strict' | 'Lax' | 'lax' | 'None' | 'none' | string;
+ expires: Date;
+}>;
+export declare function serialize(name: string, val: string, opt?: SerializeOptions): string;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie/dist/index.d.ts.map b/be/node_modules/@tinyhttp/cookie/dist/index.d.ts.map
new file mode 100644
index 000000000..c5c72da66
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA;;;;;;GAMG;AACH,wBAAgB,KAAK,CACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CAGhC,GACA,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxB;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC;IACrC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IAClF,OAAO,EAAE,IAAI,CAAA;CACd,CAAC,CAAA;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,gBAAqB,GAAG,MAAM,CAyDvF"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie/dist/index.js b/be/node_modules/@tinyhttp/cookie/dist/index.js
new file mode 100644
index 000000000..0f5b6b300
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/dist/index.js
@@ -0,0 +1,70 @@
+const pairSplitRegExp = /; */;
+const fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;
+function tryDecode(str, decode) {
+ try {
+ return decode(str);
+ } catch (e) {
+ return str;
+ }
+}
+function parse(str, options = {
+ decode: decodeURIComponent
+}) {
+ const obj = {};
+ const pairs = str.split(pairSplitRegExp);
+ for (const pair of pairs) {
+ let eqIdx = pair.indexOf("=");
+ if (eqIdx < 0) continue;
+ const key = pair.slice(0, eqIdx).trim();
+ let val = pair.slice(++eqIdx, pair.length).trim();
+ if ('"' === val[0]) val = val.slice(1, -1);
+ if (obj[key] == null) obj[key] = tryDecode(val, options.decode);
+ }
+ return obj;
+}
+function serialize(name, val, opt = {}) {
+ if (!opt.encode) opt.encode = encodeURIComponent;
+ if (!fieldContentRegExp.test(name)) throw new TypeError("argument name is invalid");
+ const value = opt.encode(val);
+ if (value && !fieldContentRegExp.test(value)) throw new TypeError("argument val is invalid");
+ let str = `${name}=${value}`;
+ if (null != opt.maxAge) {
+ const maxAge = opt.maxAge - 0;
+ if (Number.isNaN(maxAge) || !Number.isFinite(maxAge)) throw new TypeError("option maxAge is invalid");
+ str += `; Max-Age=${Math.floor(maxAge)}`;
+ }
+ if (opt.domain) {
+ if (!fieldContentRegExp.test(opt.domain)) throw new TypeError("option domain is invalid");
+ str += `; Domain=${opt.domain}`;
+ }
+ if (opt.path) {
+ if (!fieldContentRegExp.test(opt.path)) throw new TypeError("option path is invalid");
+ str += `; Path=${opt.path}`;
+ }
+ if (opt.expires) str += `; Expires=${opt.expires.toUTCString()}`;
+ if (opt.httpOnly) str += "; HttpOnly";
+ if (opt.secure) str += "; Secure";
+ if (opt.sameSite) {
+ const sameSite = typeof opt.sameSite === "string" ? opt.sameSite.toLowerCase() : opt.sameSite;
+ switch (sameSite) {
+ case true:
+ case "strict":
+ str += "; SameSite=Strict";
+ break;
+ case "lax":
+ str += "; SameSite=Lax";
+ break;
+ case "none":
+ str += "; SameSite=None";
+ break;
+ default:
+ throw new TypeError("option sameSite is invalid");
+ }
+ }
+ return str;
+}
+export {
+ parse,
+ serialize
+};
+//# sourceMappingURL=index.js.map
diff --git a/be/node_modules/@tinyhttp/cookie/dist/index.js.map b/be/node_modules/@tinyhttp/cookie/dist/index.js.map
new file mode 100644
index 000000000..456ee1805
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["const pairSplitRegExp = /; */\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF\n */\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: \nconst fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/\n\nfunction tryDecode(str: string, decode: (str: string) => string) {\n try {\n return decode(str)\n } catch (e) {\n return str\n }\n}\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n */\nexport function parse(\n str: string,\n options: {\n decode: (str: string) => string\n } = {\n decode: decodeURIComponent\n }\n): Record {\n const obj: Record = {}\n const pairs = str.split(pairSplitRegExp)\n\n for (const pair of pairs) {\n let eqIdx = pair.indexOf('=')\n\n // skip things that don't look like key=value\n if (eqIdx < 0) continue\n\n const key = pair.slice(0, eqIdx).trim()\n let val = pair.slice(++eqIdx, pair.length).trim()\n\n // quoted values\n if ('\"' === val[0]) val = val.slice(1, -1)\n\n // only assign once\n if (obj[key] == null) obj[key] = tryDecode(val, options.decode)\n }\n\n return obj\n}\n\nexport type SerializeOptions = Partial<{\n encode: (str: string) => string\n maxAge: number\n domain: string\n path: string\n httpOnly: boolean\n secure: boolean\n sameSite: boolean | 'Strict' | 'strict' | 'Lax' | 'lax' | 'None' | 'none' | string\n expires: Date\n}>\n\nexport function serialize(name: string, val: string, opt: SerializeOptions = {}): string {\n if (!opt.encode) opt.encode = encodeURIComponent\n\n if (!fieldContentRegExp.test(name)) throw new TypeError('argument name is invalid')\n\n const value = opt.encode(val)\n\n if (value && !fieldContentRegExp.test(value)) throw new TypeError('argument val is invalid')\n\n let str = `${name}=${value}`\n\n if (null != opt.maxAge) {\n const maxAge = opt.maxAge - 0\n\n if (Number.isNaN(maxAge) || !Number.isFinite(maxAge)) throw new TypeError('option maxAge is invalid')\n\n str += `; Max-Age=${Math.floor(maxAge)}`\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) throw new TypeError('option domain is invalid')\n\n str += `; Domain=${opt.domain}`\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) throw new TypeError('option path is invalid')\n\n str += `; Path=${opt.path}`\n }\n\n if (opt.expires) str += `; Expires=${opt.expires.toUTCString()}`\n\n if (opt.httpOnly) str += '; HttpOnly'\n\n if (opt.secure) str += '; Secure'\n\n if (opt.sameSite) {\n const sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite\n\n switch (sameSite) {\n case true:\n case 'strict':\n str += '; SameSite=Strict'\n break\n case 'lax':\n str += '; SameSite=Lax'\n break\n case 'none':\n str += '; SameSite=None'\n break\n default:\n throw new TypeError('option sameSite is invalid')\n }\n }\n\n return str\n}\n"],"names":[],"mappings":"AAAA,MAAM,kBAAkB;AAWxB,MAAM,qBAAqB;AAE3B,SAAS,UAAU,KAAa,QAAiC;AAC3D,MAAA;AACF,WAAO,OAAO,GAAG;AAAA,WACV,GAAG;AACH,WAAA;AAAA,EACT;AACF;AASgB,SAAA,MACd,KACA,UAEI;AAAA,EACF,QAAQ;AACV,GACwB;AACxB,QAAM,MAA8B,CAAA;AAC9B,QAAA,QAAQ,IAAI,MAAM,eAAe;AAEvC,aAAW,QAAQ,OAAO;AACpB,QAAA,QAAQ,KAAK,QAAQ,GAAG;AAG5B,QAAI,QAAQ,EAAG;AAEf,UAAM,MAAM,KAAK,MAAM,GAAG,KAAK,EAAE;AAC7B,QAAA,MAAM,KAAK,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE;AAGvC,QAAA,QAAQ,IAAI,CAAC,SAAS,IAAI,MAAM,GAAG,EAAE;AAGrC,QAAA,IAAI,GAAG,KAAK,KAAM,KAAI,GAAG,IAAI,UAAU,KAAK,QAAQ,MAAM;AAAA,EAChE;AAEO,SAAA;AACT;AAaO,SAAS,UAAU,MAAc,KAAa,MAAwB,CAAA,GAAY;AACvF,MAAI,CAAC,IAAI,OAAQ,KAAI,SAAS;AAE1B,MAAA,CAAC,mBAAmB,KAAK,IAAI,EAAS,OAAA,IAAI,UAAU,0BAA0B;AAE5E,QAAA,QAAQ,IAAI,OAAO,GAAG;AAExB,MAAA,SAAS,CAAC,mBAAmB,KAAK,KAAK,EAAG,OAAM,IAAI,UAAU,yBAAyB;AAE3F,MAAI,MAAM,GAAG,IAAI,IAAI,KAAK;AAEtB,MAAA,QAAQ,IAAI,QAAQ;AAChB,UAAA,SAAS,IAAI,SAAS;AAE5B,QAAI,OAAO,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,EAAG,OAAM,IAAI,UAAU,0BAA0B;AAEpG,WAAO,aAAa,KAAK,MAAM,MAAM,CAAC;AAAA,EACxC;AAEA,MAAI,IAAI,QAAQ;AACV,QAAA,CAAC,mBAAmB,KAAK,IAAI,MAAM,EAAG,OAAM,IAAI,UAAU,0BAA0B;AAEjF,WAAA,YAAY,IAAI,MAAM;AAAA,EAC/B;AAEA,MAAI,IAAI,MAAM;AACR,QAAA,CAAC,mBAAmB,KAAK,IAAI,IAAI,EAAG,OAAM,IAAI,UAAU,wBAAwB;AAE7E,WAAA,UAAU,IAAI,IAAI;AAAA,EAC3B;AAEA,MAAI,IAAI,QAAS,QAAO,aAAa,IAAI,QAAQ,YAAa,CAAA;AAE1D,MAAA,IAAI,SAAiB,QAAA;AAErB,MAAA,IAAI,OAAe,QAAA;AAEvB,MAAI,IAAI,UAAU;AACV,UAAA,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,SAAS,YAAY,IAAI,IAAI;AAErF,YAAQ,UAAU;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AACI,eAAA;AACP;AAAA,MACF,KAAK;AACI,eAAA;AACP;AAAA,MACF,KAAK;AACI,eAAA;AACP;AAAA,MACF;AACQ,cAAA,IAAI,UAAU,4BAA4B;AAAA,IACpD;AAAA,EACF;AAEO,SAAA;AACT;"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cookie/package.json b/be/node_modules/@tinyhttp/cookie/package.json
new file mode 100644
index 000000000..8ec8a9b95
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cookie/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "@tinyhttp/cookie",
+ "version": "2.1.1",
+ "type": "module",
+ "description": "HTTP cookie parser and serializer for Node.js",
+ "homepage": "https://github.com/tinyhttp/tinyhttp/tree/master/packages/cookie#readme",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/cookie"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "cookie"
+ ],
+ "files": [
+ "dist"
+ ],
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {},
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/cors/LICENSE b/be/node_modules/@tinyhttp/cors/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cors/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/cors/README.md b/be/node_modules/@tinyhttp/cors/README.md
new file mode 100644
index 000000000..6ff6ffda0
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cors/README.md
@@ -0,0 +1,73 @@
+
+
+# @tinyhttp/cors
+
+[![npm][npm-img]][npm-url] [![GitHub Workflow Status][gh-actions-img]][github-actions] [![Coverage][cov-img]][cov-url]
+
+
+
+> A rewrite of [expressjs/cors](https://github.com/expressjs/cors) module.
+
+HTTP cors header middleware.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/cors
+```
+
+## API
+
+```ts
+import { cors } from '@tinyhttp/cors'
+```
+
+### `cors(options)`
+
+Returns the CORS middleware with the settings specified in the parameters
+
+#### Options
+
+- `origin`: Can be a string defining the `Access-Control-Allow-Origin` value, a boolean which if set to true sets the header to `'*'`, a Regex type, an array (for multiple origins) or a function which contains the request and response as parameters and must return the value for the `Access-Control-Allow-Origin` header
+- `methods`: Array of method names which define the `Access-Control-Allow-Methods` header, default to all the most common methods (`GET`, `HEAD`, `PUT`, `PATCH`, `POST`, `DELETE`)
+- `allowedHeaders`: Configures the `Access-Control-Allow-Headers` CORS header. Expects an array (ex: [`'Content-Type'`, `'Authorization'`]).
+- `exposedHeaders`: Configures the `Access-Control-Expose-Headers` CORS header. If not specified, no custom headers are exposed
+- `credentials`: Configures the `Access-Control-Allow-Credentials` CORS header. Set to true to pass the header, otherwise it is omitted.
+- `maxAge`: Configures the `Access-Control-Max-Age` CORS header. Set to an integer to pass the header, otherwise it is omitted.
+- `optionsSuccessStatus`: Provides a status code to use for successful OPTIONS requests, since some legacy browsers (IE11, various SmartTVs) choke on 204.
+- `preflightContinue`: Set 204 and finish response if `true`, call `next` if false.
+
+The default configuration is:
+
+```json
+{
+ "origin": "*",
+ "methods": ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"],
+ "optionsSuccessStatus": 204,
+ "preflightContinue": false
+}
+```
+
+## Example
+
+```ts
+import { App } from '@tinyhttp/app'
+import { cors } from '@tinyhttp/cors'
+
+const app = new App()
+
+app
+ .use(cors({ origin: 'https://myfantastic.site/' }))
+ .options('*', cors())
+ .get('/', (req, res) => {
+ res.send('The headers contained in my response are defined in the cors middleware')
+ })
+ .listen(3000)
+```
+
+[npm-url]: https://npmjs.com/package/@tinyhttp/cors
+[github-actions]: https://github.com/tinyhttp/cors/actions
+[gh-actions-img]: https://img.shields.io/github/actions/workflow/status/tinyhttp/cors/ci.yml?style=for-the-badge&logo=github&label=&color=hotpink
+[cov-img]: https://img.shields.io/coveralls/github/tinyhttp/cors?style=for-the-badge&color=hotpink
+[cov-url]: https://coveralls.io/github/tinyhttp/cors
+[npm-img]: https://img.shields.io/npm/dt/@tinyhttp/cors?style=for-the-badge&color=hotpink
diff --git a/be/node_modules/@tinyhttp/cors/dist/index.d.ts b/be/node_modules/@tinyhttp/cors/dist/index.d.ts
new file mode 100644
index 000000000..b89e4052d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cors/dist/index.d.ts
@@ -0,0 +1,15 @@
+import type { IncomingMessage as Request, ServerResponse as Response } from 'node:http';
+export interface AccessControlOptions {
+ origin?: string | boolean | ((req: Request, res: Response) => string) | Iterable | RegExp;
+ methods?: string[];
+ allowedHeaders?: string[];
+ exposedHeaders?: string[];
+ credentials?: boolean;
+ maxAge?: number;
+ optionsSuccessStatus?: number;
+ preflightContinue?: boolean;
+}
+/**
+ * CORS Middleware
+ */
+export declare const cors: (opts?: AccessControlOptions) => (req: Request, res: Response, next?: () => void) => void;
diff --git a/be/node_modules/@tinyhttp/cors/dist/index.js b/be/node_modules/@tinyhttp/cors/dist/index.js
new file mode 100644
index 000000000..071bf9c8b
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cors/dist/index.js
@@ -0,0 +1,95 @@
+import { vary } from '@tinyhttp/vary';
+const isIterable = (obj) => typeof obj[Symbol.iterator] === 'function';
+const failOriginParam = () => {
+ throw new TypeError('No other objects allowed. Allowed types is array of strings or RegExp');
+};
+const getOriginHeaderHandler = (origin) => {
+ if (typeof origin === 'boolean') {
+ return origin
+ ? (_, res) => {
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ }
+ : () => undefined;
+ }
+ if (typeof origin === 'string') {
+ return (_, res) => {
+ res.setHeader('Access-Control-Allow-Origin', origin);
+ };
+ }
+ if (typeof origin === 'function') {
+ return (req, res) => {
+ vary(res, 'Origin');
+ res.setHeader('Access-Control-Allow-Origin', origin(req, res));
+ };
+ }
+ if (typeof origin !== 'object')
+ failOriginParam();
+ if (isIterable(origin)) {
+ const originArray = Array.from(origin);
+ if (originArray.some((element) => typeof element !== 'string'))
+ failOriginParam();
+ const originSet = new Set(origin);
+ if (originSet.has('*')) {
+ return (_, res) => {
+ res.setHeader('Access-Control-Allow-Origin', '*');
+ };
+ }
+ return (req, res) => {
+ vary(res, 'Origin');
+ if (req.headers.origin === undefined)
+ return;
+ if (!originSet.has(req.headers.origin))
+ return;
+ res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
+ };
+ }
+ if (origin instanceof RegExp) {
+ return (req, res) => {
+ vary(res, 'Origin');
+ if (req.headers.origin === undefined)
+ return;
+ if (!origin.test(req.headers.origin))
+ return;
+ res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
+ };
+ }
+ failOriginParam();
+};
+/**
+ * CORS Middleware
+ */
+export const cors = (opts = {}) => {
+ const { origin = '*', methods = ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'], allowedHeaders = ['content-type'], exposedHeaders, credentials, maxAge, optionsSuccessStatus = 204, preflightContinue = false } = opts;
+ const originHeaderHandler = getOriginHeaderHandler(origin);
+ return (req, res, next) => {
+ var _a, _b;
+ originHeaderHandler(req, res);
+ // Setting the Access-Control-Allow-Methods header from the methods array
+ res.setHeader('Access-Control-Allow-Methods', methods.join(', ').toUpperCase());
+ // Setting the Access-Control-Allow-Headers header
+ if (allowedHeaders)
+ res.setHeader('Access-Control-Allow-Headers', allowedHeaders);
+ // Setting the Access-Control-Expose-Headers header
+ if (exposedHeaders)
+ res.setHeader('Access-Control-Expose-Headers', exposedHeaders);
+ // Setting the Access-Control-Allow-Credentials header
+ if (credentials)
+ res.setHeader('Access-Control-Allow-Credentials', 'true');
+ // Setting the Access-Control-Max-Age header
+ if (maxAge)
+ res.setHeader('Access-Control-Max-Age', maxAge);
+ if (((_b = (_a = req.method) === null || _a === void 0 ? void 0 : _a.toUpperCase) === null || _b === void 0 ? void 0 : _b.call(_a)) === 'OPTIONS') {
+ if (preflightContinue) {
+ next === null || next === void 0 ? void 0 : next();
+ }
+ else {
+ res.statusCode = optionsSuccessStatus;
+ res.setHeader('Content-Length', '0');
+ res.end();
+ }
+ }
+ else {
+ next === null || next === void 0 ? void 0 : next();
+ }
+ };
+};
diff --git a/be/node_modules/@tinyhttp/cors/package.json b/be/node_modules/@tinyhttp/cors/package.json
new file mode 100644
index 000000000..65c83c19b
--- /dev/null
+++ b/be/node_modules/@tinyhttp/cors/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "@tinyhttp/cors",
+ "version": "2.0.1",
+ "type": "module",
+ "description": "CORS middleware for modern Node.js ",
+ "homepage": "https://github.com/tinyhttp/cors#readme",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/cors.git"
+ },
+ "engines": {
+ "node": ">=12.20 || 14.x || >=16"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend"
+ ],
+ "author": "v1rtl",
+ "license": "MIT",
+ "files": [
+ "dist"
+ ],
+ "devDependencies": {
+ "@biomejs/biome": "1.8.3",
+ "@commitlint/cli": "19.3.0",
+ "@commitlint/config-conventional": "19.2.2",
+ "@tinyhttp/app": "2.2.4",
+ "@types/node": "^20.14.10",
+ "c8": "^10.1.2",
+ "husky": "^9.0.11",
+ "supertest-fetch": "^2.0.0",
+ "tsx": "^4.16.2",
+ "typescript": "~5.5.3"
+ },
+ "dependencies": {
+ "@tinyhttp/vary": "^0.1.3"
+ },
+ "scripts": {
+ "build": "tsc -p tsconfig.build.json",
+ "test": "tsx --test src/*.test.ts",
+ "cov": "c8 -r lcov pnpm test",
+ "lint": "biome lint .",
+ "format": "biome format .",
+ "check": "biome check ."
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/encode-url/LICENSE b/be/node_modules/@tinyhttp/encode-url/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/encode-url/README.md b/be/node_modules/@tinyhttp/encode-url/README.md
new file mode 100644
index 000000000..58935989c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/README.md
@@ -0,0 +1,15 @@
+# @tinyhttp/encode-url
+
+> [`encode-url`](https://github.com/pillarjs/encodeurl) rewrite in TypeScript.
+
+Encode a URL to a percent-encoded form, excluding already-encoded sequences
+
+## Install
+
+```sh
+pnpm i @tinyhttp/encode-url
+```
+
+## API
+
+## Example
diff --git a/be/node_modules/@tinyhttp/encode-url/dist/index.d.ts b/be/node_modules/@tinyhttp/encode-url/dist/index.d.ts
new file mode 100644
index 000000000..6bec93d8b
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/dist/index.d.ts
@@ -0,0 +1,2 @@
+export declare const encodeUrl: (url: string) => string;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/encode-url/dist/index.d.ts.map b/be/node_modules/@tinyhttp/encode-url/dist/index.d.ts.map
new file mode 100644
index 000000000..d266b06b4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,SAAS,QAAS,MAAM,KAAG,MAIvC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/encode-url/dist/index.js b/be/node_modules/@tinyhttp/encode-url/dist/index.js
new file mode 100644
index 000000000..e3b92ccb3
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/dist/index.js
@@ -0,0 +1,10 @@
+const ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g;
+const UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g;
+const UNMATCHED_SURROGATE_PAIR_REPLACE = "$1�$2";
+const encodeUrl = (url) => {
+ return String(url).replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE).replace(ENCODE_CHARS_REGEXP, encodeURI);
+};
+export {
+ encodeUrl
+};
+//# sourceMappingURL=index.js.map
diff --git a/be/node_modules/@tinyhttp/encode-url/dist/index.js.map b/be/node_modules/@tinyhttp/encode-url/dist/index.js.map
new file mode 100644
index 000000000..9baf55d70
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["const ENCODE_CHARS_REGEXP =\n /(?:[^\\x21\\x25\\x26-\\x3B\\x3D\\x3F-\\x5B\\x5D\\x5F\\x61-\\x7A\\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g\n\nconst UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF]([^\\uDC00-\\uDFFF]|$)/g\n\nconst UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\\uFFFD$2'\n\nexport const encodeUrl = (url: string): string => {\n return String(url)\n .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)\n .replace(ENCODE_CHARS_REGEXP, encodeURI)\n}\n"],"names":[],"mappings":"AAAA,MAAM,sBACJ;AAEF,MAAM,kCAAkC;AAExC,MAAM,mCAAmC;AAE5B,MAAA,YAAY,CAAC,QAAwB;AACzC,SAAA,OAAO,GAAG,EACd,QAAQ,iCAAiC,gCAAgC,EACzE,QAAQ,qBAAqB,SAAS;AAC3C;"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/encode-url/package.json b/be/node_modules/@tinyhttp/encode-url/package.json
new file mode 100644
index 000000000..4956cb2b1
--- /dev/null
+++ b/be/node_modules/@tinyhttp/encode-url/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "@tinyhttp/encode-url",
+ "version": "2.1.1",
+ "description": "encode-url rewrite in TypeScript",
+ "type": "module",
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/cors"
+ },
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "cors"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/etag/LICENSE b/be/node_modules/@tinyhttp/etag/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/etag/README.md b/be/node_modules/@tinyhttp/etag/README.md
new file mode 100644
index 000000000..f77fe99c7
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/README.md
@@ -0,0 +1,35 @@
+# @tinyhttp/etag
+
+[](https://npmjs.com/package/@tinyhttp/etag) [](https://npmjs.com/package/@tinyhttp/etag) [](https://tinyhttp.v1rtl.site/mw/etag)
+
+> A rewrite of [etag](https://www.npmjs.com/package/etag) module.
+
+This module generates HTTP ETags (as defined in RFC 7232) for use in HTTP responses.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/etag
+```
+
+## API
+
+```ts
+import { eTag } from '@tinyhttp/etag'
+```
+
+`eTag(entity, [options])`
+
+Generate a strong ETag for the given entity. This should be the complete body of the entity. Strings, `Buffer`s, and `fs.Stats` are accepted. By default, a strong ETag is generated except for `fs.Stats`, which will generate a weak ETag (this can be overwritten by options.weak).
+
+```ts
+res.setHeader('ETag', eTag(body))
+```
+
+### Options
+
+`eTag` accepts these properties in the options object.
+
+#### `weak`
+
+Specifies if the generated ETag will include the weak validator mark (that is, the leading `W/`). The actual entity tag is the same. The default value is `false`, unless the entity is `fs.Stats`, in which case it is `true`.
diff --git a/be/node_modules/@tinyhttp/etag/dist/index.d.ts b/be/node_modules/@tinyhttp/etag/dist/index.d.ts
new file mode 100644
index 000000000..806abd038
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/dist/index.d.ts
@@ -0,0 +1,6 @@
+import { Stats } from 'node:fs';
+
+export declare const eTag: (entity: string | Buffer | Stats, options?: {
+ weak: boolean;
+}) => string;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/etag/dist/index.d.ts.map b/be/node_modules/@tinyhttp/etag/dist/index.d.ts.map
new file mode 100644
index 000000000..3ed003b5f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAsB/B,eAAO,MAAM,IAAI,WAAY,MAAM,GAAG,MAAM,GAAG,KAAK,YAAY;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,KAAG,MAUnF,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/etag/dist/index.js b/be/node_modules/@tinyhttp/etag/dist/index.js
new file mode 100644
index 000000000..77e5ceab9
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/dist/index.js
@@ -0,0 +1,23 @@
+import { createHash } from "node:crypto";
+import { Stats } from "node:fs";
+const entityTag = (entity) => {
+ if (entity.length === 0) {
+ return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"';
+ }
+ const hash = createHash("sha1").update(entity, "utf8").digest("base64").substring(0, 27);
+ const len = typeof entity === "string" ? Buffer.byteLength(entity, "utf8") : entity.length;
+ return `"${len.toString(16)}-${hash}"`;
+};
+const statTag = ({ mtime, size }) => {
+ return `"${mtime.getTime().toString(16)}-${size.toString(16)}"`;
+};
+const eTag = (entity, options) => {
+ if (entity == null) throw new TypeError("argument entity is required");
+ const weak = (options == null ? void 0 : options.weak) || entity instanceof Stats;
+ const tag = entity instanceof Stats ? statTag(entity) : entityTag(entity);
+ return weak ? `W/${tag}` : tag;
+};
+export {
+ eTag
+};
+//# sourceMappingURL=index.js.map
diff --git a/be/node_modules/@tinyhttp/etag/dist/index.js.map b/be/node_modules/@tinyhttp/etag/dist/index.js.map
new file mode 100644
index 000000000..6c4fd93ed
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["// Original module: https://github.com/jshttp/etag/blob/master/index.js\n\nimport { createHash } from 'node:crypto'\nimport { Stats } from 'node:fs'\n\nconst entityTag = (entity: string | Buffer): string => {\n if (entity.length === 0) {\n // fast-path empty\n return '\"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk\"'\n }\n // generate hash\n const hash = createHash('sha1')\n .update(entity as string, 'utf8')\n .digest('base64')\n .substring(0, 27)\n\n const len = typeof entity === 'string' ? Buffer.byteLength(entity, 'utf8') : entity.length\n\n return `\"${len.toString(16)}-${hash}\"`\n}\n\nconst statTag = ({ mtime, size }: Stats): string => {\n return `\"${mtime.getTime().toString(16)}-${size.toString(16)}\"`\n}\n\nexport const eTag = (entity: string | Buffer | Stats, options?: { weak: boolean }): string => {\n if (entity == null) throw new TypeError('argument entity is required')\n\n const weak = options?.weak || entity instanceof Stats\n\n // generate entity tag\n\n const tag = entity instanceof Stats ? statTag(entity) : entityTag(entity)\n\n return weak ? `W/${tag}` : tag\n}\n"],"names":[],"mappings":";;AAKA,MAAM,YAAY,CAAC,WAAoC;AACjD,MAAA,OAAO,WAAW,GAAG;AAEhB,WAAA;AAAA,EACT;AAEA,QAAM,OAAO,WAAW,MAAM,EAC3B,OAAO,QAAkB,MAAM,EAC/B,OAAO,QAAQ,EACf,UAAU,GAAG,EAAE;AAEZ,QAAA,MAAM,OAAO,WAAW,WAAW,OAAO,WAAW,QAAQ,MAAM,IAAI,OAAO;AAEpF,SAAO,IAAI,IAAI,SAAS,EAAE,CAAC,IAAI,IAAI;AACrC;AAEA,MAAM,UAAU,CAAC,EAAE,OAAO,WAA0B;AAC3C,SAAA,IAAI,MAAM,QAAA,EAAU,SAAS,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;AAC9D;AAEa,MAAA,OAAO,CAAC,QAAiC,YAAwC;AAC5F,MAAI,UAAU,KAAY,OAAA,IAAI,UAAU,6BAA6B;AAE/D,QAAA,QAAO,mCAAS,SAAQ,kBAAkB;AAIhD,QAAM,MAAM,kBAAkB,QAAQ,QAAQ,MAAM,IAAI,UAAU,MAAM;AAEjE,SAAA,OAAO,KAAK,GAAG,KAAK;AAC7B;"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/etag/package.json b/be/node_modules/@tinyhttp/etag/package.json
new file mode 100644
index 000000000..fd2b3316e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@tinyhttp/etag",
+ "version": "2.1.2",
+ "type": "module",
+ "description": "entity tag module",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/etag"
+ },
+ "bugs": {
+ "url": "https://github.com/tinyhttp/tinyhttp/issues"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "etag"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {},
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/etag/vite.config.ts b/be/node_modules/@tinyhttp/etag/vite.config.ts
new file mode 100644
index 000000000..62003137e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/etag/vite.config.ts
@@ -0,0 +1,4 @@
+import { build } from '../../config/build'
+import { dependencies } from './package.json'
+
+export default build(dependencies)
diff --git a/be/node_modules/@tinyhttp/forwarded/LICENSE b/be/node_modules/@tinyhttp/forwarded/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/forwarded/README.md b/be/node_modules/@tinyhttp/forwarded/README.md
new file mode 100644
index 000000000..a44d3eb53
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/README.md
@@ -0,0 +1,17 @@
+# @tinyhttp/forwarded
+
+> [`forwarded`](https://github.com/jshttp/forwarded) rewrite in TypeScript
+
+Determine address of a proxied request
+
+## Install
+
+```sh
+pnpm i @tinyhttp/forwarded
+```
+
+## API
+
+```ts
+import { forwarded } from '@tinyhttp/forwarded'
+```
diff --git a/be/node_modules/@tinyhttp/forwarded/dist/index.d.ts b/be/node_modules/@tinyhttp/forwarded/dist/index.d.ts
new file mode 100644
index 000000000..839a8489a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/dist/index.d.ts
@@ -0,0 +1,11 @@
+///
+import { IncomingMessage } from 'node:http';
+/**
+ * Get all addresses in the request, using the `X-Forwarded-For` header.
+ */
+export declare function forwarded(req: Pick): string[];
+/**
+ * Parse the X-Forwarded-For header.
+ */
+export declare function parse(header: string): string[];
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/forwarded/dist/index.d.ts.map b/be/node_modules/@tinyhttp/forwarded/dist/index.d.ts.map
new file mode 100644
index 000000000..150d8b9c8
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG,MAAM,EAAE,CAOpF;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA6B9C"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/forwarded/dist/index.js b/be/node_modules/@tinyhttp/forwarded/dist/index.js
new file mode 100644
index 000000000..cc61b4e2b
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/dist/index.js
@@ -0,0 +1,36 @@
+function forwarded(req) {
+ const proxyAddrs = parse(req.headers["x-forwarded-for"] || "");
+ const socketAddr = req.socket.remoteAddress;
+ return [socketAddr].concat(proxyAddrs);
+}
+function parse(header) {
+ let end = header.length;
+ const list = [];
+ let start = header.length;
+ for (let i = header.length - 1; i >= 0; i--) {
+ switch (header.charCodeAt(i)) {
+ case 32:
+ if (start === end) {
+ start = end = i;
+ }
+ break;
+ case 44:
+ if (start !== end) {
+ list.push(header.substring(start, end));
+ }
+ start = end = i;
+ break;
+ default:
+ start = i;
+ break;
+ }
+ }
+ if (start !== end)
+ list.push(header.substring(start, end));
+ return list;
+}
+export {
+ forwarded,
+ parse
+};
+//# sourceMappingURL=index.js.map
diff --git a/be/node_modules/@tinyhttp/forwarded/dist/index.js.map b/be/node_modules/@tinyhttp/forwarded/dist/index.js.map
new file mode 100644
index 000000000..986530e4a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { IncomingMessage } from 'node:http'\n\n/**\n * Get all addresses in the request, using the `X-Forwarded-For` header.\n */\nexport function forwarded(req: Pick): string[] {\n // simple header parsing\n const proxyAddrs = parse((req.headers['x-forwarded-for'] as string) || '')\n const socketAddr = req.socket.remoteAddress\n\n // return all addresses\n return [socketAddr].concat(proxyAddrs)\n}\n\n/**\n * Parse the X-Forwarded-For header.\n */\nexport function parse(header: string): string[] {\n let end = header.length\n const list: string[] = []\n let start = header.length\n\n // gather addresses, backwards\n for (let i = header.length - 1; i >= 0; i--) {\n switch (header.charCodeAt(i)) {\n case 0x20 /* */:\n if (start === end) {\n start = end = i\n }\n break\n case 0x2c /* , */:\n if (start !== end) {\n list.push(header.substring(start, end))\n }\n start = end = i\n break\n default:\n start = i\n break\n }\n }\n\n // final address\n if (start !== end) list.push(header.substring(start, end))\n\n return list\n}\n"],"names":[],"mappings":"AAKO,SAAS,UAAU,KAA4D;AAEpF,QAAM,aAAa,MAAO,IAAI,QAAQ,iBAAiB,KAAgB,EAAE;AACnE,QAAA,aAAa,IAAI,OAAO;AAG9B,SAAO,CAAC,UAAU,EAAE,OAAO,UAAU;AACvC;AAKO,SAAS,MAAM,QAA0B;AAC9C,MAAI,MAAM,OAAO;AACjB,QAAM,OAAiB,CAAA;AACvB,MAAI,QAAQ,OAAO;AAGnB,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AACnC,YAAA,OAAO,WAAW,CAAC,GAAG;AAAA,MAC5B,KAAK;AACH,YAAI,UAAU,KAAK;AACjB,kBAAQ,MAAM;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AACH,YAAI,UAAU,KAAK;AACjB,eAAK,KAAK,OAAO,UAAU,OAAO,GAAG,CAAC;AAAA,QACxC;AACA,gBAAQ,MAAM;AACd;AAAA,MACF;AACU,gBAAA;AACR;AAAA,IACJ;AAAA,EACF;AAGA,MAAI,UAAU;AAAK,SAAK,KAAK,OAAO,UAAU,OAAO,GAAG,CAAC;AAElD,SAAA;AACT;"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/forwarded/package.json b/be/node_modules/@tinyhttp/forwarded/package.json
new file mode 100644
index 000000000..aefdff8a6
--- /dev/null
+++ b/be/node_modules/@tinyhttp/forwarded/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@tinyhttp/forwarded",
+ "version": "2.1.2",
+ "type": "module",
+ "description": "forwarded rewrite with TypeScript and ESM support",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/forwarded"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "files": [
+ "dist"
+ ],
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "forwarded",
+ "headers",
+ "header"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/logger/LICENSE b/be/node_modules/@tinyhttp/logger/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/logger/README.md b/be/node_modules/@tinyhttp/logger/README.md
new file mode 100644
index 000000000..94bdb1962
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/README.md
@@ -0,0 +1,102 @@
+
+
+# @tinyhttp/logger
+
+[![npm][npm-img]][npm-url] [![GitHub Workflow Status][gh-actions-img]][github-actions] [![Coverage][cov-img]][cov-url]
+
+
+
+Minimal and flexible HTTP logger
+
+## Install
+
+```sh
+pnpm i @tinyhttp/logger
+```
+
+## API
+
+```ts
+import { logger } from '@tinyhttp/logger'
+```
+
+### `logger(options)`
+
+Returns the middleware for logging HTTP requests.
+
+#### Options
+
+- `methods`: a list of HTTP methods to log. Defaults to `http`'s `METHODS`.
+- `timestamp.format`: timestamp format. It is consumed by the [dayjs](https://day.js.org) library. If a string is specified, it is used as a format; otherwise just enabled.
+- `output.callback`: a function that receives the log generated by the logger.
+- `output.color`: a property that determines whether the logger will generate a message with color. Useful for logging into the console; disable if logging into a file or other colorless environments.
+- `emoji`: enable emojis for HTTP status codes. See [http-status-emojis](https://github.com/bendrucker/http-status-emojis/blob/master/index.js) for a full list.
+- `ip`: log IP address.
+
+## Example
+
+```ts
+import { App } from '@tinyhttp/app'
+import { logger } from '@tinyhttp/logger'
+
+new App()
+ .use(
+ logger({
+ methods: ['GET', 'POST'],
+ timestamp: { format: 'HH:mm:ss' },
+ output: { callback: console.log, color: false }
+ })
+ )
+ .get('/', (req, res) => res.send('Hello world'))
+ .post('/', (req, res) => res.send('Sent POST'))
+ .listen(3000)
+```
+
+To Log a level, use the enum `LogLevel`
+
+```ts
+import { App } from '@tinyhttp/app'
+import { logger, LogLevel } from '@tinyhttp/logger'
+
+new App()
+ .use(
+ logger({
+ methods: ['GET', 'POST'],
+ timestamp: { format: 'HH:mm:ss' },
+ output: { callback: console.log, color: false, level: LogLevel.warn }
+ })
+ )
+ .get('/', (req, res) => res.send('Hello world'))
+ .listen(3000)
+```
+
+This also includes a simple file logger. To stream to a file, simply supply the filename in the options. Supported file names innclude
+`./file.log` or `./log/tiny.log`
+
+```ts
+import { App } from '@tinyhttp/app'
+import { logger } from '@tinyhttp/logger'
+
+new App()
+ .use(
+ logger({
+ methods: ['GET', 'POST'],
+ timestamp: { format: 'HH:mm:ss' },
+ output: { callback: console.log, color: false, filename: './log/tiny.log' }
+ })
+ )
+ .get('/', (req, res) => res.send('Hello world'))
+ .listen(3000)
+```
+
+## Alternatives
+
+- [Pino HTTP](https://github.com/pinojs/pino-http) - high-speed HTTP logger for Node.js
+- [chrona](https://github.com/xambassador/chrona) - Simple HTTP request logger middleware for express.js inspired from koa-logger, written in typescript.
+
+[npm-url]: https://npmjs.com/package/@tinyhttp/logger
+[github-actions]: https://github.com/tinyhttp/logger/actions
+[gh-actions-img]: https://img.shields.io/github/actions/workflow/status/tinyhttp/logger/ci.yml?branch=master&style=for-the-badge&color=hotpink&label=&logo=github
+[cov-img]: https://img.shields.io/coveralls/github/tinyhttp/logger?style=for-the-badge&color=hotpink
+[cov-url]: https://coveralls.io/github/tinyhttp/logger
+[npm-img]: https://img.shields.io/npm/dt/@tinyhttp/logger?style=for-the-badge&color=hotpink
diff --git a/be/node_modules/@tinyhttp/logger/dist/filelogger.d.ts b/be/node_modules/@tinyhttp/logger/dist/filelogger.d.ts
new file mode 100644
index 000000000..0436aaec3
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/dist/filelogger.d.ts
@@ -0,0 +1,6 @@
+export declare class FileLogger {
+ #private;
+ private writableStream;
+ constructor(filename: string);
+ toFile(stringToLog: string): void;
+}
diff --git a/be/node_modules/@tinyhttp/logger/dist/filelogger.js b/be/node_modules/@tinyhttp/logger/dist/filelogger.js
new file mode 100644
index 000000000..722cb2fff
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/dist/filelogger.js
@@ -0,0 +1,59 @@
+import { accessSync, createWriteStream, mkdirSync, writeFileSync } from 'node:fs';
+import { dirname as directoryname } from 'node:path';
+export class FileLogger {
+ #filename;
+ #dirname;
+ writableStream;
+ constructor(filename) {
+ this.#dirname = directoryname(filename);
+ this.#filename = filename;
+ this.#_stat();
+ this.#_createWritableStream();
+ this.#_endStream();
+ }
+ #fsAccess(filename, mode) {
+ try {
+ accessSync(filename, mode);
+ return true;
+ }
+ catch (error) {
+ return false;
+ }
+ }
+ #_stat() {
+ //check if file exists
+ if (!this.#fsAccess(this.#filename)) {
+ // check if directory exists
+ if (!this.#fsAccess(this.#dirname)) {
+ // create the directory
+ mkdirSync(this.#dirname, { recursive: true });
+ }
+ // create the file and write an empty string to it
+ writeFileSync(this.#filename, '');
+ return;
+ }
+ }
+ #_createWritableStream() {
+ this.writableStream = createWriteStream(this.#filename, { flags: 'a' });
+ }
+ toFile(stringToLog) {
+ this.writableStream.write(`${stringToLog}\n`);
+ }
+ #_endStream() {
+ process.on('exit', () => {
+ this.writableStream.close();
+ });
+ process.on('SIGTERM', () => {
+ this.writableStream.close();
+ process.exit(0);
+ });
+ process.on('SIGINT', () => {
+ this.writableStream.close();
+ process.exit(0);
+ });
+ process.on('uncaughtException', () => {
+ this.writableStream.close();
+ process.exit(1);
+ });
+ }
+}
diff --git a/be/node_modules/@tinyhttp/logger/dist/index.d.ts b/be/node_modules/@tinyhttp/logger/dist/index.d.ts
new file mode 100644
index 000000000..6946ecc19
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/dist/index.d.ts
@@ -0,0 +1,24 @@
+import { type IncomingMessage as Request, type ServerResponse as Response } from 'node:http';
+export declare enum LogLevel {
+ error = "error",
+ warn = "warn",
+ trace = "trace",
+ info = "info",
+ log = "log"
+}
+export type LoggerOptions = Partial<{
+ methods: string[];
+ output: {
+ color: boolean;
+ filename?: string;
+ callback: (string: string) => void;
+ level?: LogLevel;
+ };
+ timestamp: boolean | {
+ format?: string;
+ };
+ emoji: boolean;
+ ip: boolean;
+ ignore: string[];
+}>;
+export declare const logger: (options?: LoggerOptions) => (req: Request, res: Response, next?: () => void) => void;
diff --git a/be/node_modules/@tinyhttp/logger/dist/index.js b/be/node_modules/@tinyhttp/logger/dist/index.js
new file mode 100644
index 000000000..603194d2c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/dist/index.js
@@ -0,0 +1,81 @@
+import { METHODS } from 'node:http';
+import { bold, cyan, magenta, red } from 'colorette';
+import dayjs from 'dayjs';
+import statusEmoji from 'http-status-emojis';
+import { FileLogger } from './filelogger.js';
+export var LogLevel;
+(function (LogLevel) {
+ LogLevel["error"] = "error";
+ LogLevel["warn"] = "warn";
+ LogLevel["trace"] = "trace";
+ LogLevel["info"] = "info";
+ LogLevel["log"] = "log";
+})(LogLevel || (LogLevel = {}));
+const compileArgs = (args, req, res, options = {}, status, msg) => {
+ const { method } = req;
+ const { statusCode } = res;
+ const url = req.originalUrl || req.url;
+ const methods = options.methods ?? METHODS;
+ const timestamp = options.timestamp ?? false;
+ const emojiEnabled = options.emoji;
+ const level = options.output?.level ? options.output.level : null;
+ if (level)
+ args.push(`[${level.toUpperCase()}]`);
+ if (methods.includes(method) && timestamp) {
+ args.push(`${dayjs()
+ .format(typeof timestamp !== 'boolean' && timestamp.format ? timestamp.format : 'HH:mm:ss')
+ .toString()} - `);
+ }
+ if (options.ip)
+ args.push(req.ip);
+ if (emojiEnabled)
+ args.push(statusEmoji[statusCode]);
+ args.push(method);
+ args.push(status || res.statusCode);
+ args.push(msg || res.statusMessage);
+ args.push(url);
+};
+export const logger = (options = {}) => {
+ const methods = options.methods ?? METHODS;
+ const ignore = options.ignore ?? [];
+ const output = options.output ?? { callback: console.log, color: true, level: null };
+ let filelogger = null;
+ if (options.output?.filename) {
+ filelogger = new FileLogger(options.output.filename);
+ }
+ return (req, res, next) => {
+ res.on('finish', () => {
+ const args = [];
+ if (methods.includes(req.method) && !ignore.some((url) => req.url.startsWith(url))) {
+ const s = res.statusCode.toString();
+ let stringToLog = '';
+ if (!output.color) {
+ compileArgs(args, req, res, options);
+ const m = args.join(' ');
+ stringToLog = m;
+ }
+ else {
+ switch (s[0]) {
+ case '2':
+ compileArgs(args, req, res, options, cyan(bold(s)), cyan(res.statusMessage));
+ stringToLog = args.join(' ');
+ break;
+ case '4':
+ compileArgs(args, req, res, options, red(bold(s)), red(res.statusMessage));
+ stringToLog = args.join(' ');
+ break;
+ case '5':
+ compileArgs(args, req, res, options, magenta(bold(s)), magenta(res.statusMessage));
+ stringToLog = args.join(' ');
+ break;
+ }
+ }
+ output.callback(stringToLog);
+ if (filelogger) {
+ filelogger.toFile(stringToLog);
+ }
+ }
+ });
+ next?.();
+ };
+};
diff --git a/be/node_modules/@tinyhttp/logger/package.json b/be/node_modules/@tinyhttp/logger/package.json
new file mode 100644
index 000000000..34b7aec0a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/logger/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "@tinyhttp/logger",
+ "version": "2.1.0",
+ "type": "module",
+ "description": "Minimal and flexible HTTP logger.",
+ "homepage": "https://github.com/tinyhttp/logger#readme",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/logger.git"
+ },
+ "engines": {
+ "node": ">=14.18 || >=16.20"
+ },
+ "types": "./dist/index.d.ts",
+ "module": "./dist/index.js",
+ "exports": {
+ ".": {
+ "import": "./dist/index.js",
+ "types": "./dist/index.d.ts"
+ },
+ "./filelogger": {
+ "import": "./dist/filelogger.js",
+ "types": "./dist/filelogger.d.ts"
+ }
+ },
+ "keywords": ["tinyhttp", "node.js", "web framework", "web", "backend"],
+ "author": "v1rtl",
+ "license": "MIT",
+ "files": ["dist"],
+ "dependencies": {
+ "colorette": "^2.0.20",
+ "dayjs": "^1.11.13",
+ "http-status-emojis": "^2.2.0"
+ },
+ "scripts": {
+ "build": "tsc",
+ "test": "vitest run --dir tests",
+ "test:coverage": "vitest run --dir tests --coverage",
+ "check": "biome check",
+ "check:fix": "biome check --write",
+ "prepare": "bunx husky"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "^1.9.4",
+ "@commitlint/cli": "^19.7.1",
+ "@commitlint/config-conventional": "^19.7.1",
+ "@tinyhttp/app": "^2.5.2",
+ "@types/node": "^20.17.22",
+ "@vitest/coverage-v8": "^3.0.7",
+ "husky": "^9.1.7",
+ "supertest-fetch": "^2.0.0",
+ "typescript": "^5.8.2",
+ "vitest": "^3.0.7"
+ }
+}
diff --git a/be/node_modules/@tinyhttp/proxy-addr/LICENSE b/be/node_modules/@tinyhttp/proxy-addr/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/proxy-addr/README.md b/be/node_modules/@tinyhttp/proxy-addr/README.md
new file mode 100644
index 000000000..d9208972a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/README.md
@@ -0,0 +1,17 @@
+# @tinyhttp/proxyaddr
+
+> [`proxy-addr`](https://github.com/jshttp/proxy-addr) rewrite in TypeScript
+
+Determine address of a proxied request
+
+## Install
+
+```sh
+pnpm i @tinyhttp/proxy-addr
+```
+
+## API
+
+```ts
+import { proxyaddr, all } from '@tinyhttp/proxy-addr'
+```
diff --git a/be/node_modules/@tinyhttp/proxy-addr/dist/index.d.ts b/be/node_modules/@tinyhttp/proxy-addr/dist/index.d.ts
new file mode 100644
index 000000000..553d702ef
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/dist/index.d.ts
@@ -0,0 +1,42 @@
+import type { IncomingMessage } from 'node:http';
+import { type IPv6, type IPv4 } from 'ipaddr.js';
+type Req = Pick;
+export type TrustParameter = string | number | string[];
+export type TrustFunction = (addr: string, i: number) => boolean;
+export type Trust = TrustFunction | TrustParameter;
+type Subnet = {
+ ip: IPv4 | IPv6;
+ range: number;
+};
+/**
+ * Get all addresses in the request, optionally stopping
+ * at the first untrusted.
+ *
+ * @param req
+ * @param trust
+ */
+declare function alladdrs(req: Req, trust?: Trust): string[];
+/**
+ * Compile argument into trust function.
+ *
+ * @param val
+ */
+declare function compile(val: string | number | string[]): (addr: string, i: number) => boolean;
+/**
+ * Parse IP notation string into range subnet.
+ *
+ * @param {String} note
+ * @private
+ */
+export declare function parseIPNotation(note: string): Subnet;
+/**
+ * Determine address of proxied request.
+ *
+ * @param req
+ * @param trust
+ * @public
+ */
+export declare function proxyaddr(req: Req, trust: Trust): string;
+export { alladdrs as all };
+export { compile };
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/proxy-addr/dist/index.d.ts.map b/be/node_modules/@tinyhttp/proxy-addr/dist/index.d.ts.map
new file mode 100644
index 000000000..b9d0d08f7
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhD,OAAe,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAA;AAExD,KAAK,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAA;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;AACvD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;AAChE,MAAM,MAAM,KAAK,GAAG,aAAa,GAAG,cAAc,CAAA;AAElD,KAAK,MAAM,GAAG;IACZ,EAAE,EAAE,IAAI,GAAG,IAAI,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAqCD;;;;;;GAMG;AACH,iBAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,CAcnD;AACD;;;;GAIG;AACH,iBAAS,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAiBtF;AA0BD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBpD;AAWD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAIxD;AAgDD,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,CAAA;AAC1B,OAAO,EAAE,OAAO,EAAE,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/proxy-addr/dist/index.js b/be/node_modules/@tinyhttp/proxy-addr/dist/index.js
new file mode 100644
index 000000000..3188af95f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/dist/index.js
@@ -0,0 +1,206 @@
+import { forwarded } from '@tinyhttp/forwarded';
+import ipaddr from 'ipaddr.js';
+const DIGIT_REGEXP = /^[0-9]+$/;
+const isip = ipaddr.isValid;
+const parseip = ipaddr.parse;
+/**
+ * Pre-defined IP ranges.
+ */
+const IP_RANGES = {
+ linklocal: ['169.254.0.0/16', 'fe80::/10'],
+ loopback: ['127.0.0.1/8', '::1/128'],
+ uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7']
+};
+/**
+ * Type-guard to determine whether a string value represents a pre-defined IP range.
+ *
+ * @param val
+ */
+function isIPRangeName(val) {
+ return Object.prototype.hasOwnProperty.call(IP_RANGES, val);
+}
+/**
+ * Type-guard to determine whether an IP address is a v4 address.
+ * @param val
+ */
+const isIPv4 = (val) => val.kind() === 'ipv4';
+/**
+ * Type-guard to determine whether an IP address is a v6 address.
+ * @param val
+ */
+const isIPv6 = (val) => val.kind() === 'ipv6';
+/**
+ * Static trust function to trust nothing.
+ */
+const trustNone = () => false;
+/**
+ * Get all addresses in the request, optionally stopping
+ * at the first untrusted.
+ *
+ * @param req
+ * @param trust
+ */
+function alladdrs(req, trust) {
+ // get addresses
+ const addrs = forwarded(req);
+ if (trust == null)
+ return addrs;
+ if (typeof trust !== 'function')
+ trust = compile(trust);
+ for (let i = 0; i < addrs.length - 1; i++) {
+ if (trust(addrs[i], i))
+ continue;
+ addrs.length = i + 1;
+ }
+ return addrs;
+}
+/**
+ * Compile argument into trust function.
+ *
+ * @param val
+ */
+function compile(val) {
+ let trust;
+ if (typeof val === 'string')
+ trust = [val];
+ else if (typeof val === 'number')
+ return compileHopsTrust(val);
+ else if (Array.isArray(val))
+ trust = val.slice();
+ else
+ throw new TypeError('unsupported trust argument');
+ for (let i = 0; i < trust.length; i++) {
+ const element = trust[i];
+ if (!isIPRangeName(element))
+ continue;
+ // Splice in pre-defined range
+ const namedRange = IP_RANGES[element];
+ trust.splice(i, 1, ...namedRange);
+ i += namedRange.length - 1;
+ }
+ return compileTrust(compileRangeSubnets(trust));
+}
+/**
+ * Compile 'hops' number into trust function.
+ *
+ * @param hops
+ */
+function compileHopsTrust(hops) {
+ return (_, i) => i < hops;
+}
+/**
+ * Compile `arr` elements into range subnets.
+ */
+function compileRangeSubnets(arr) {
+ return arr.map((ip) => parseIPNotation(ip));
+}
+/**
+ * Compile range subnet array into trust function.
+ *
+ * @param rangeSubnets
+ */
+function compileTrust(rangeSubnets) {
+ // Return optimized function based on length
+ const len = rangeSubnets.length;
+ return len === 0 ? trustNone : len === 1 ? trustSingle(rangeSubnets[0]) : trustMulti(rangeSubnets);
+}
+/**
+ * Parse IP notation string into range subnet.
+ *
+ * @param {String} note
+ * @private
+ */
+export function parseIPNotation(note) {
+ const pos = note.lastIndexOf('/');
+ const str = pos !== -1 ? note.substring(0, pos) : note;
+ if (!isip(str))
+ throw new TypeError(`invalid IP address: ${str}`);
+ let ip = parseip(str);
+ const max = ip.kind() === 'ipv6' ? 128 : 32;
+ if (pos === -1) {
+ if (isIPv6(ip) && ip.isIPv4MappedAddress())
+ ip = ip.toIPv4Address();
+ return { ip, range: max };
+ }
+ const rangeString = note.substring(pos + 1, note.length);
+ let range = null;
+ if (DIGIT_REGEXP.test(rangeString))
+ range = Number.parseInt(rangeString, 10);
+ else if (ip.kind() === 'ipv4' && isip(rangeString))
+ range = parseNetmask(rangeString);
+ if (range == null || range <= 0 || range > max)
+ throw new TypeError(`invalid range on address: ${note}`);
+ return { ip, range };
+}
+/**
+ * Parse netmask string into CIDR range.
+ *
+ * @param netmask
+ * @private
+ */
+function parseNetmask(netmask) {
+ const ip = parseip(netmask);
+ return ip.kind() === 'ipv4' ? ip.prefixLengthFromSubnetMask() : null;
+}
+/**
+ * Determine address of proxied request.
+ *
+ * @param req
+ * @param trust
+ * @public
+ */
+export function proxyaddr(req, trust) {
+ const addrs = alladdrs(req, trust);
+ return addrs[addrs.length - 1];
+}
+/**
+ * Compile trust function for multiple subnets.
+ */
+function trustMulti(subnets) {
+ return function trust(addr) {
+ if (!isip(addr))
+ return false;
+ const ip = parseip(addr);
+ let ipconv = null;
+ const kind = ip.kind();
+ for (let i = 0; i < subnets.length; i++) {
+ const subnet = subnets[i];
+ const subnetKind = subnet.ip.kind();
+ let trusted = ip;
+ if (kind !== subnetKind) {
+ if (isIPv6(ip) && !ip.isIPv4MappedAddress())
+ continue;
+ if (!ipconv)
+ ipconv = isIPv4(ip) ? ip.toIPv4MappedAddress() : ip.toIPv4Address();
+ trusted = ipconv;
+ }
+ if (trusted.match(subnet.ip, subnet.range))
+ return true;
+ }
+ return false;
+ };
+}
+/**
+ * Compile trust function for single subnet.
+ *
+ * @param subnet
+ */
+function trustSingle(subnet) {
+ const subnetKind = subnet.ip.kind();
+ const subnetIsIPv4 = subnetKind === 'ipv4';
+ return function trust(addr) {
+ if (!isip(addr))
+ return false;
+ let ip = parseip(addr);
+ const kind = ip.kind();
+ if (kind !== subnetKind) {
+ if (subnetIsIPv4 && !ip.isIPv4MappedAddress())
+ return false;
+ ip = subnetIsIPv4 ? ip.toIPv4Address() : ip.toIPv4MappedAddress();
+ }
+ return ip.match(subnet.ip, subnet.range);
+ };
+}
+export { alladdrs as all };
+export { compile };
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/proxy-addr/dist/index.js.map b/be/node_modules/@tinyhttp/proxy-addr/dist/index.js.map
new file mode 100644
index 000000000..b7f5ad553
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/proxy-addr/package.json b/be/node_modules/@tinyhttp/proxy-addr/package.json
new file mode 100644
index 000000000..2d7d1d12a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@tinyhttp/proxy-addr",
+ "version": "2.2.1",
+ "type": "module",
+ "description": "proxy-addr rewrite with TypeScript and ESM support",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/proxy-addr"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "proxy-addr",
+ "ip",
+ "net",
+ "network"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {
+ "ipaddr.js": "^2.2.0",
+ "@tinyhttp/forwarded": "2.1.2"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/proxy-addr/tsconfig.tsbuildinfo b/be/node_modules/@tinyhttp/proxy-addr/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..b9a5edbd9
--- /dev/null
+++ b/be/node_modules/@tinyhttp/proxy-addr/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"fileNames":["../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.full.d.ts","./node_modules/@tinyhttp/forwarded/dist/index.d.ts","./node_modules/ipaddr.js/lib/ipaddr.js.d.ts","./src/index.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[60,65],[60,62,65],[60,64,65],[65],[60,65,70,100],[60,65,66,71,77,78,85,97,108],[60,65,66,67,77,85],[55,56,57,60,65],[60,65,68,109],[60,65,69,70,78,86],[60,65,70,97,105],[60,65,71,73,77,85],[60,64,65,72],[60,65,73,74],[60,65,77],[60,65,75,77],[60,64,65,77],[60,65,77,78,79,97,108],[60,65,77,78,79,92,97,100],[60,65,113],[60,65,73,77,80,85,97,108],[60,65,77,78,80,81,85,97,105,108],[60,65,80,82,97,105,108],[58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114],[60,65,77,83],[60,65,84,108,113],[60,65,73,77,85,97],[60,65,86],[60,65,87],[60,64,65,88],[60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114],[60,65,90],[60,65,91],[60,65,77,92,93],[60,65,92,94,109,111],[60,65,77,97,98,99,100],[60,65,97,99],[60,65,97,98],[60,65,100],[60,65,101],[60,62,65,97],[60,65,77,103,104],[60,65,103,104],[60,65,70,85,97,105],[60,65,106],[60,65,85,107],[60,65,80,91,108],[60,65,70,109],[60,65,97,110],[60,65,84,111],[60,65,112],[60,65,70,77,79,88,97,108,111,113],[60,65,97,114],[60,65,80],[52,53,60,65,80]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"08f6861df84fba9719c14d5adc3ba40be9f0c687639e6c4df3c05b9301b8ff94","impliedFormat":1},{"version":"b29df215fe977b6beab36e2a346d1b58aebe9a380b8fb54e92197557f3d2642c","impliedFormat":99},{"version":"4f64ce354176bc42b9f9647ea28cd2452a798296fca13f281c634c32f1473e52","impliedFormat":1},{"version":"11c33434898ca60a91bc2de77b1783772908d921e44407db36e04136bd3fd7f0","signature":"0455d324a1afe70c9255df6c6b03683eab790678d646e70a22801c7f2d46e568"},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba97261afafe85aafe76d988e65e531da8e8cf791c49caf0531f5dd1689bd91b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f52e8dacc97d71dcc96af29e49584353f9c54cb916d132e3e768d8b8129c928d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9ad08a376ac84948fcca0013d6f1d4ae4f9522e26b91f87945b97c99d7cc30b","impliedFormat":1},{"version":"eaf9ee1d90a35d56264f0bf39842282c58b9219e112ac7d0c1bce98c6c5da672","impliedFormat":1},{"version":"c15c4427ae7fd1dcd7f312a8a447ac93581b0d4664ddf151ecd07de4bf2bb9d7","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"aeac7c51bde4658c192bc45819344eb20fc64743264b0465be6025201220a6b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4047ed87e765bd3bcc316a0c4c4c8b0061628460d8a5412d1c4b53a4658665a","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"3eb62baae4df08c9173e6903d3ca45942ccec8c3659b0565684a75f3292cffbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"42aaa94addeed66a04b61e433c14e829c43d1efd653cf2fda480c5fb3d722ed8","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"58832ded29e0094047596544ac391d68c799d7bd7d35936f47221857141628f1","impliedFormat":1},{"version":"553870e516f8c772b89f3820576152ebc70181d7994d96917bb943e37da7f8a7","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"9212c6e9d80cb45441a3614e95afd7235a55a18584c2ed32d6c1aca5a0c53d93","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"6bd91a2a356600dee28eb0438082d0799a18a974a6537c4410a796bab749813c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"ae25afbbf1ed5df63a177d67b9048bf7481067f1b8dc9c39212e59db94fc9fc6","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1}],"root":[54],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"module":99,"noImplicitAny":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"referencedMap":[[49,1],[50,1],[10,1],[8,1],[9,1],[14,1],[13,1],[2,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[3,1],[23,1],[24,1],[4,1],[25,1],[29,1],[26,1],[27,1],[28,1],[30,1],[31,1],[32,1],[5,1],[33,1],[34,1],[35,1],[36,1],[6,1],[51,1],[40,1],[37,1],[38,1],[39,1],[41,1],[7,1],[42,1],[47,1],[48,1],[43,1],[44,1],[45,1],[46,1],[1,1],[12,1],[11,1],[62,2],[63,2],[64,3],[60,4],[65,5],[66,6],[67,7],[55,1],[58,8],[56,1],[57,1],[68,9],[69,10],[70,11],[71,12],[72,13],[73,14],[74,14],[76,15],[75,16],[77,17],[78,18],[79,19],[61,20],[59,1],[80,21],[81,22],[82,23],[115,24],[83,25],[84,26],[85,27],[86,28],[87,29],[88,30],[89,31],[90,32],[91,33],[92,34],[93,34],[94,35],[95,1],[96,1],[97,36],[99,37],[98,38],[100,39],[101,40],[102,41],[103,42],[104,43],[105,44],[106,45],[107,46],[108,47],[109,48],[110,49],[111,50],[112,51],[113,52],[114,53],[52,54],[53,1],[54,55]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.7.3"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/LICENSE b/be/node_modules/@tinyhttp/req/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/req/README.md b/be/node_modules/@tinyhttp/req/README.md
new file mode 100644
index 000000000..01a07a944
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/README.md
@@ -0,0 +1,19 @@
+# @tinyhttp/req
+
+[![npm (scoped)][npm-badge]](https://npmjs.com/package/@tinyhttp/req) [![npm][dl-badge]](https://npmjs.com/package/@tinyhttp/req) [![][web-badge]](https://tinyhttp.v1rtl.site/mw/req)
+
+Request extensions for tinyhttp collected in one package.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/req
+```
+
+## API
+
+[tinyhttp Request docs](https://tinyhttp.v1rtl.site/docs#request).
+
+[npm-badge]: https://img.shields.io/npm/v/@tinyhttp/req?style=flat-square
+[dl-badge]: https://img.shields.io/npm/dt/@tinyhttp/req?style=flat-square
+[web-badge]: https://img.shields.io/badge/website-visit-hotpink?style=flat-square
diff --git a/be/node_modules/@tinyhttp/req/dist/accepts.d.ts b/be/node_modules/@tinyhttp/req/dist/accepts.d.ts
new file mode 100644
index 000000000..911b4d3f3
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/accepts.d.ts
@@ -0,0 +1,9 @@
+import type { IncomingMessage } from 'node:http';
+type Request = Pick;
+type AcceptReturns = string | boolean | string[];
+export declare const getAccepts: (req: Request) => (...types: string[]) => AcceptReturns;
+export declare const getAcceptsEncodings: (req: Request) => (...encodings: string[]) => AcceptReturns;
+export declare const getAcceptsCharsets: (req: Request) => (...charsets: string[]) => AcceptReturns;
+export declare const getAcceptsLanguages: (req: Request) => (...languages: string[]) => AcceptReturns;
+export {};
+//# sourceMappingURL=accepts.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/accepts.d.ts.map b/be/node_modules/@tinyhttp/req/dist/accepts.d.ts.map
new file mode 100644
index 000000000..2b9a06ebe
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/accepts.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"accepts.d.ts","sourceRoot":"","sources":["../src/accepts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAGhD,KAAK,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;AAE/C,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;AAEhD,eAAO,MAAM,UAAU,QACf,OAAO,gBACF,MAAM,EAAE,KAAG,aACS,CAAA;AAEjC,eAAO,MAAM,mBAAmB,QACxB,OAAO,oBACE,MAAM,EAAE,KAAG,aACa,CAAA;AAEzC,eAAO,MAAM,kBAAkB,QACvB,OAAO,mBACC,MAAM,EAAE,KAAG,aACY,CAAA;AAEvC,eAAO,MAAM,mBAAmB,QACxB,OAAO,oBACE,MAAM,EAAE,KAAG,aACa,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/accepts.js b/be/node_modules/@tinyhttp/req/dist/accepts.js
new file mode 100644
index 000000000..ad9ebd011
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/accepts.js
@@ -0,0 +1,6 @@
+import { Accepts } from '@tinyhttp/accepts';
+export const getAccepts = (req) => (...types) => new Accepts(req).types(types);
+export const getAcceptsEncodings = (req) => (...encodings) => new Accepts(req).encodings(encodings);
+export const getAcceptsCharsets = (req) => (...charsets) => new Accepts(req).charsets(charsets);
+export const getAcceptsLanguages = (req) => (...languages) => new Accepts(req).languages(languages);
+//# sourceMappingURL=accepts.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/accepts.js.map b/be/node_modules/@tinyhttp/req/dist/accepts.js.map
new file mode 100644
index 000000000..3b6b550a1
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/accepts.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"accepts.js","sourceRoot":"","sources":["../src/accepts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAM3C,MAAM,CAAC,MAAM,UAAU,GACrB,CAAC,GAAY,EAAE,EAAE,CACjB,CAAC,GAAG,KAAe,EAAiB,EAAE,CACpC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAEjC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,CAAC,GAAY,EAAE,EAAE,CACjB,CAAC,GAAG,SAAmB,EAAiB,EAAE,CACxC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,GAAY,EAAE,EAAE,CACjB,CAAC,GAAG,QAAkB,EAAiB,EAAE,CACvC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAEvC,MAAM,CAAC,MAAM,mBAAmB,GAC9B,CAAC,GAAY,EAAE,EAAE,CACjB,CAAC,GAAG,SAAmB,EAAiB,EAAE,CACxC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/fresh.d.ts b/be/node_modules/@tinyhttp/req/dist/fresh.d.ts
new file mode 100644
index 000000000..9d89b89fb
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/fresh.d.ts
@@ -0,0 +1,6 @@
+import type { IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http';
+/**
+ * Check freshness of the response using request and response headers.
+ */
+export declare function fresh(reqHeaders: IncomingHttpHeaders, resHeaders: OutgoingHttpHeaders): boolean;
+//# sourceMappingURL=fresh.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/fresh.d.ts.map b/be/node_modules/@tinyhttp/req/dist/fresh.d.ts.map
new file mode 100644
index 000000000..c1ef43f5c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/fresh.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"fresh.d.ts","sourceRoot":"","sources":["../src/fresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AA8BzE;;GAEG;AACH,wBAAgB,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,WAwBrF"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/fresh.js b/be/node_modules/@tinyhttp/req/dist/fresh.js
new file mode 100644
index 000000000..84960a7c8
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/fresh.js
@@ -0,0 +1,51 @@
+const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
+const compareETags = (etag, str) => str === etag || str === `W/${etag}` || `W/${str}` === etag;
+function isStale(etag, noneMatch) {
+ let start = 0;
+ let end = 0;
+ for (let i = 0, len = noneMatch.length; i < len; i++) {
+ switch (noneMatch.charCodeAt(i)) {
+ case 0x20 /* */:
+ if (start === end)
+ start = end = i + 1;
+ break;
+ case 0x2c /* , */:
+ if (compareETags(etag, noneMatch.substring(start, end)))
+ return false;
+ start = end = i + 1;
+ break;
+ default:
+ end = i + 1;
+ break;
+ }
+ }
+ if (compareETags(etag, noneMatch.substring(start, end)))
+ return false;
+ return true;
+}
+/**
+ * Check freshness of the response using request and response headers.
+ */
+export function fresh(reqHeaders, resHeaders) {
+ const modifiedSince = reqHeaders['if-modified-since'];
+ const noneMatch = reqHeaders['if-none-match'];
+ if (!modifiedSince && !noneMatch)
+ return false;
+ const cacheControl = reqHeaders['cache-control'];
+ if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
+ return false;
+ // if-none-match
+ if (noneMatch && noneMatch !== '*') {
+ const etag = resHeaders.etag;
+ if (!etag || isStale(etag, noneMatch))
+ return false;
+ }
+ // if-modified-since
+ if (modifiedSince) {
+ const lastModified = resHeaders['last-modified'];
+ if (!lastModified || !(Date.parse(lastModified) <= Date.parse(modifiedSince)))
+ return false;
+ }
+ return true;
+}
+//# sourceMappingURL=fresh.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/fresh.js.map b/be/node_modules/@tinyhttp/req/dist/fresh.js.map
new file mode 100644
index 000000000..ca6e0758b
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/fresh.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"fresh.js","sourceRoot":"","sources":["../src/fresh.ts"],"names":[],"mappings":"AAEA,MAAM,6BAA6B,GAAG,gCAAgC,CAAA;AAEtE,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI,CAAA;AAE9G,SAAS,OAAO,CAAC,IAAY,EAAE,SAAiB;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,GAAG,GAAG,CAAC,CAAA;IAEX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,QAAQ,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,OAAO;gBACf,IAAI,KAAK,KAAK,GAAG;oBAAE,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;gBACtC,MAAK;YACP,KAAK,IAAI,CAAC,OAAO;gBACf,IAAI,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACrE,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;gBACnB,MAAK;YACP;gBACE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;gBACX,MAAK;QACT,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAErE,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,UAA+B,EAAE,UAA+B;IACpF,MAAM,aAAa,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;IAE7C,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IAE9C,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;IAChD,IAAI,YAAY,IAAI,6BAA6B,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAA;IAElF,gBAAgB;IAChB,IAAI,SAAS,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,UAAU,CAAC,IAA0B,CAAA;QAElD,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;YAAE,OAAO,KAAK,CAAA;IACrD,CAAC;IAED,oBAAoB;IACpB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,CAAuB,CAAA;QAEtE,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IAC7F,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/index.d.ts b/be/node_modules/@tinyhttp/req/dist/index.d.ts
new file mode 100644
index 000000000..a3b967ae8
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/index.d.ts
@@ -0,0 +1,10 @@
+import type { IncomingHttpHeaders, IncomingMessage as Request, ServerResponse as Response } from 'node:http';
+import { type Options, type Ranges, type Result } from 'header-range-parser';
+export * from './accepts.js';
+export * from '@tinyhttp/url';
+export declare const getRequestHeader: (req: Pick) => (header: HeaderName) => IncomingHttpHeaders[HeaderName];
+export declare const getRangeFromHeader: (req: Pick) => (size: number, options?: Options) => Result | Ranges | undefined;
+export declare const getFreshOrStale: (req: Pick, res: Pick) => boolean;
+export declare const checkIfXMLHttpRequest: (req: Pick) => boolean;
+export declare const reqIs: (req: Pick) => (...types: string[]) => string | false;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/index.d.ts.map b/be/node_modules/@tinyhttp/req/dist/index.d.ts.map
new file mode 100644
index 000000000..4f109533d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,IAAI,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5G,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAc,MAAM,qBAAqB,CAAA;AAKxF,cAAc,cAAc,CAAA;AAE5B,cAAc,eAAe,CAAA;AAE7B,eAAO,MAAM,gBAAgB,QAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,MACpD,UAAU,SAAS,MAAM,UAAU,UAAU,KAAG,mBAAmB,CAAC,UAAU,CAWvF,CAAA;AAED,eAAO,MAAM,kBAAkB,QACvB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,YACvB,MAAM,YAAY,OAAO,KAAG,MAAM,GAAG,MAAM,GAAG,SAMpD,CAAA;AAEH,eAAO,MAAM,eAAe,QACrB,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC,OACnC,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CAAC,KAC9C,OAgBF,CAAA;AAED,eAAO,MAAM,qBAAqB,QAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,KAAG,OAChB,CAAA;AAEtD,eAAO,MAAM,KAAK,QACV,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,gBACnB,MAAM,EAAE,mBACsC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/index.js b/be/node_modules/@tinyhttp/req/dist/index.js
new file mode 100644
index 000000000..7527b1124
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/index.js
@@ -0,0 +1,41 @@
+import { parseRange } from 'header-range-parser';
+import { typeIs } from '@tinyhttp/type-is';
+import { fresh } from './fresh.js';
+export * from './accepts.js';
+export * from '@tinyhttp/url';
+export const getRequestHeader = (req) => {
+ return (header) => {
+ const lc = header.toLowerCase();
+ switch (lc) {
+ case 'referer':
+ case 'referrer':
+ return (req.headers.referrer || req.headers.referer);
+ default:
+ return req.headers[lc];
+ }
+ };
+};
+export const getRangeFromHeader = (req) => (size, options) => {
+ const range = getRequestHeader(req)('range');
+ if (!range)
+ return;
+ return parseRange(size, range, options);
+};
+export const getFreshOrStale = (req, res) => {
+ const method = req.method;
+ const status = res.statusCode;
+ // GET or HEAD for weak freshness validation only
+ if (method !== 'GET' && method !== 'HEAD')
+ return false;
+ // 2xx or 304 as per rfc2616 14.26
+ if ((status >= 200 && status < 300) || status === 304) {
+ return fresh(req.headers, {
+ etag: res.getHeader('ETag'),
+ 'last-modified': res.getHeader('Last-Modified')
+ });
+ }
+ return false;
+};
+export const checkIfXMLHttpRequest = (req) => req.headers['x-requested-with'] === 'XMLHttpRequest';
+export const reqIs = (req) => (...types) => typeIs(req.headers['content-type'], ...types);
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/dist/index.js.map b/be/node_modules/@tinyhttp/req/dist/index.js.map
new file mode 100644
index 000000000..377994e38
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAExF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,cAAc,cAAc,CAAA;AAE5B,cAAc,eAAe,CAAA;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAA6B,EAAE,EAAE;IAChE,OAAO,CAA4B,MAAkB,EAAmC,EAAE;QACxF,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAE/B,QAAQ,EAAE,EAAE,CAAC;YACX,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAsB,CAAA;YAC3E;gBACE,OAAO,GAAG,CAAC,OAAO,CAAC,EAAE,CAAW,CAAA;QACpC,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,GAA6B,EAAE,EAAE,CAClC,CAAC,IAAY,EAAE,OAAiB,EAA+B,EAAE;IAC/D,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;IAE5C,IAAI,CAAC,KAAK;QAAE,OAAM;IAElB,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,GAAwC,EACxC,GAA+C,EACtC,EAAE;IACX,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;IACzB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAA;IAE7B,iDAAiD;IACjD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAEvD,kCAAkC;IAClC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE;YACxB,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAW;YACrC,eAAe,EAAE,GAAG,CAAC,SAAS,CAAC,eAAe,CAAW;SAC1D,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAA6B,EAAW,EAAE,CAC9E,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,gBAAgB,CAAA;AAEtD,MAAM,CAAC,MAAM,KAAK,GAChB,CAAC,GAA6B,EAAE,EAAE,CAClC,CAAC,GAAG,KAAe,EAAE,EAAE,CACrB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAW,EAAE,GAAG,KAAK,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/package.json b/be/node_modules/@tinyhttp/req/package.json
new file mode 100644
index 000000000..4fd25a6c5
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@tinyhttp/req",
+ "version": "2.2.5",
+ "type": "module",
+ "description": "request extensions for tinyhttp",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/req"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "req",
+ "request"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {
+ "header-range-parser": "^1.1.3",
+ "@tinyhttp/accepts": "2.2.3",
+ "@tinyhttp/type-is": "2.2.4",
+ "@tinyhttp/url": "2.1.1"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/req/tsconfig.tsbuildinfo b/be/node_modules/@tinyhttp/req/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..497b829a3
--- /dev/null
+++ b/be/node_modules/@tinyhttp/req/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"fileNames":["../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.full.d.ts","./node_modules/@tinyhttp/accepts/node_modules/@types/negotiator/index.d.ts","./node_modules/@tinyhttp/accepts/dist/index.d.ts","./src/accepts.ts","./src/fresh.ts","./node_modules/header-range-parser/dist/index.d.ts","./node_modules/@tinyhttp/type-is/dist/index.d.ts","./node_modules/@tinyhttp/url/dist/index.d.ts","./src/index.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[65,70],[65,67,70],[65,69,70],[70],[65,70,75,105],[65,70,71,76,82,83,90,102,113],[65,70,71,72,82,90],[60,61,62,65,70],[65,70,73,114],[65,70,74,75,83,91],[65,70,75,102,110],[65,70,76,78,82,90],[65,69,70,77],[65,70,78,79],[65,70,82],[65,70,80,82],[65,69,70,82],[65,70,82,83,84,102,113],[65,70,82,83,84,97,102,105],[65,70,118],[65,70,78,82,85,90,102,113],[65,70,82,83,85,86,90,102,110,113],[65,70,85,87,102,110,113],[63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119],[65,70,82,88],[65,70,89,113,118],[65,70,78,82,90,102],[65,70,91],[65,70,92],[65,69,70,93],[65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119],[65,70,95],[65,70,96],[65,70,82,97,98],[65,70,97,99,114,116],[65,70,82,102,103,104,105],[65,70,102,104],[65,70,102,103],[65,70,105],[65,70,106],[65,67,70,102],[65,70,82,108,109],[65,70,108,109],[65,70,75,90,102,110],[65,70,111],[65,70,90,112],[65,70,85,96,113],[65,70,75,114],[65,70,102,115],[65,70,89,116],[65,70,117],[65,70,75,82,84,93,102,113,116,118],[65,70,102,119],[52,65,70,85],[53,65,70,85],[65,70,85],[54,55,56,57,58,65,70,85]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"08f6861df84fba9719c14d5adc3ba40be9f0c687639e6c4df3c05b9301b8ff94","impliedFormat":1},{"version":"726b49e3a411c1b819d8ec7d71b5598dd34aea9aa5c782c1b1204e71c90a07db","impliedFormat":1},{"version":"7be545cdbb8c60878f08d53324295d44848e8c9f591ae87ba15eceaec551cf5c","impliedFormat":99},{"version":"f58ad4c29a04dab4534e99191bf8c72eecd572656f68e7345405b2a1f2e8e535","signature":"2845bb386dd43e603ddc77290e5905beb11b0babe01c02b70a1674bc9f1f7633"},{"version":"659e5cd9e5f3b0dccf69cc9dff97ccee29f9faab9d2cb41b32d10f6645f55c4d","signature":"deaf48f9ee0deb97fbe868ec6b88b41c276108cc69dc27967a83daef341a3bcb"},{"version":"ef28d730af2228159dc34259f741fa0295cc6931bb241034026b5e6e008558c6","impliedFormat":99},{"version":"bac5dca8b793a75e1520e2d6951d4daa604e5fc1a4dc0e97cd6f501699425127","impliedFormat":99},{"version":"207a63ef8ddadd3d67f14dc7d5863924861c023977dfd7f721e89b1ceb2ba2cf","impliedFormat":99},{"version":"002932df84957e6d017c7a47959589a0f978ef01259b5a889ec66a099a514c14","signature":"f17de793e70909881700ae7cdbb95ef6da98093e097207118614ab168052e9f9"},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba97261afafe85aafe76d988e65e531da8e8cf791c49caf0531f5dd1689bd91b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f52e8dacc97d71dcc96af29e49584353f9c54cb916d132e3e768d8b8129c928d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9ad08a376ac84948fcca0013d6f1d4ae4f9522e26b91f87945b97c99d7cc30b","impliedFormat":1},{"version":"eaf9ee1d90a35d56264f0bf39842282c58b9219e112ac7d0c1bce98c6c5da672","impliedFormat":1},{"version":"c15c4427ae7fd1dcd7f312a8a447ac93581b0d4664ddf151ecd07de4bf2bb9d7","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"aeac7c51bde4658c192bc45819344eb20fc64743264b0465be6025201220a6b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4047ed87e765bd3bcc316a0c4c4c8b0061628460d8a5412d1c4b53a4658665a","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"3eb62baae4df08c9173e6903d3ca45942ccec8c3659b0565684a75f3292cffbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"42aaa94addeed66a04b61e433c14e829c43d1efd653cf2fda480c5fb3d722ed8","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"58832ded29e0094047596544ac391d68c799d7bd7d35936f47221857141628f1","impliedFormat":1},{"version":"553870e516f8c772b89f3820576152ebc70181d7994d96917bb943e37da7f8a7","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"9212c6e9d80cb45441a3614e95afd7235a55a18584c2ed32d6c1aca5a0c53d93","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"6bd91a2a356600dee28eb0438082d0799a18a974a6537c4410a796bab749813c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"ae25afbbf1ed5df63a177d67b9048bf7481067f1b8dc9c39212e59db94fc9fc6","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1}],"root":[54,55,59],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"module":99,"noImplicitAny":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"referencedMap":[[49,1],[50,1],[10,1],[8,1],[9,1],[14,1],[13,1],[2,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[3,1],[23,1],[24,1],[4,1],[25,1],[29,1],[26,1],[27,1],[28,1],[30,1],[31,1],[32,1],[5,1],[33,1],[34,1],[35,1],[36,1],[6,1],[51,1],[40,1],[37,1],[38,1],[39,1],[41,1],[7,1],[42,1],[47,1],[48,1],[43,1],[44,1],[45,1],[46,1],[1,1],[12,1],[11,1],[67,2],[68,2],[69,3],[65,4],[70,5],[71,6],[72,7],[60,1],[63,8],[61,1],[62,1],[73,9],[74,10],[75,11],[76,12],[77,13],[78,14],[79,14],[81,15],[80,16],[82,17],[83,18],[84,19],[66,20],[64,1],[85,21],[86,22],[87,23],[120,24],[88,25],[89,26],[90,27],[91,28],[92,29],[93,30],[94,31],[95,32],[96,33],[97,34],[98,34],[99,35],[100,1],[101,1],[102,36],[104,37],[103,38],[105,39],[106,40],[107,41],[108,42],[109,43],[110,44],[111,45],[112,46],[113,47],[114,48],[115,49],[116,50],[117,51],[118,52],[119,53],[53,54],[52,1],[57,1],[58,33],[56,1],[54,55],[55,56],[59,57]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.7.3"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/LICENSE b/be/node_modules/@tinyhttp/res/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/res/README.md b/be/node_modules/@tinyhttp/res/README.md
new file mode 100644
index 000000000..f4446acfa
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/README.md
@@ -0,0 +1,19 @@
+# @tinyhttp/res
+
+[![npm (scoped)][npm-badge]](https://npmjs.com/package/@tinyhttp/res) [![npm][dl-badge]](https://npmjs.com/package/@tinyhttp/res) [![][web-badge]](https://tinyhttp.v1rtl.site/mw/res)
+
+Response extensions for tinyhttp collected in one package. This module itself depends on other modules, such as [`@tinyhttp/send`](/packages/send).
+
+## Install
+
+```sh
+pnpm i @tinyhttp/res
+```
+
+## API
+
+[tinyhttp Response docs](https://tinyhttp.v1rtl.site/docs#response).
+
+[npm-badge]: https://img.shields.io/npm/v/@tinyhttp/res?style=flat-square
+[dl-badge]: https://img.shields.io/npm/dt/@tinyhttp/res?style=flat-square
+[web-badge]: https://img.shields.io/badge/website-visit-hotpink?style=flat-square
diff --git a/be/node_modules/@tinyhttp/res/dist/append.d.ts b/be/node_modules/@tinyhttp/res/dist/append.d.ts
new file mode 100644
index 000000000..c934e1e10
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/append.d.ts
@@ -0,0 +1,3 @@
+import type { ServerResponse as Res } from 'node:http';
+export declare const append: >(res: Response) => (field: string, value: string | number | string[]) => Response;
+//# sourceMappingURL=append.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/append.d.ts.map b/be/node_modules/@tinyhttp/res/dist/append.d.ts.map
new file mode 100644
index 000000000..5bc2bcbbf
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/append.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAGtD,eAAO,MAAM,MAAM,GAChB,QAAQ,SAAS,GAAG,6CAAa,QAAQ,aAClC,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,KAAG,QAanD,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/append.js b/be/node_modules/@tinyhttp/res/dist/append.js
new file mode 100644
index 000000000..bb90f3d1c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/append.js
@@ -0,0 +1,15 @@
+import { getResponseHeader, setHeader } from './headers.js';
+export const append = (res) => (field, value) => {
+ const prevVal = getResponseHeader(res)(field);
+ let newVal = value;
+ if (prevVal && typeof newVal !== 'number' && typeof prevVal !== 'number') {
+ newVal = Array.isArray(prevVal)
+ ? prevVal.concat(newVal)
+ : Array.isArray(newVal)
+ ? [prevVal].concat(newVal)
+ : [prevVal, newVal];
+ }
+ setHeader(res)(field, newVal);
+ return res;
+};
+//# sourceMappingURL=append.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/append.js.map b/be/node_modules/@tinyhttp/res/dist/append.js.map
new file mode 100644
index 000000000..ab3d80c18
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/append.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"append.js","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE3D,MAAM,CAAC,MAAM,MAAM,GACjB,CAA6B,GAAa,EAAE,EAAE,CAC9C,CAAC,KAAa,EAAE,KAAiC,EAAY,EAAE;IAC7D,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;IAC7C,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACrB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC1B,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACzB,CAAC;IACD,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC7B,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/cookie.d.ts b/be/node_modules/@tinyhttp/res/dist/cookie.d.ts
new file mode 100644
index 000000000..fc99c32c4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/cookie.d.ts
@@ -0,0 +1,9 @@
+import type { IncomingMessage as Req, ServerResponse as Res } from 'node:http';
+import * as cookie from '@tinyhttp/cookie';
+export declare const setCookie: >(req: Request & {
+ secret?: string | string[];
+}, res: Response) => (name: string, value: string | Record, options?: cookie.SerializeOptions & Partial<{
+ signed: boolean;
+}>) => Response;
+export declare const clearCookie: >(req: Request, res: Response) => (name: string, options?: cookie.SerializeOptions) => Response;
+//# sourceMappingURL=cookie.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/cookie.d.ts.map b/be/node_modules/@tinyhttp/res/dist/cookie.d.ts.map
new file mode 100644
index 000000000..cd2c274e2
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/cookie.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,GAAG,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAC9E,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAA;AAI1C,eAAO,MAAM,SAAS,GACnB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,kBACzC,OAAO,GAAG;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC3B,OACI,QAAQ,YAGP,MAAM,SACL,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAC9B,MAAM,CAAC,gBAAgB,GAC9B,OAAO,CAAC;IACN,MAAM,EAAE,OAAO,CAAA;CAChB,CAAC,KACH,QAqBF,CAAA;AAEH,eAAO,MAAM,WAAW,GACrB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,kBAAa,OAAO,OAAO,QAAQ,YAC5E,MAAM,YAAY,MAAM,CAAC,gBAAgB,KAAG,QAElD,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/cookie.js b/be/node_modules/@tinyhttp/res/dist/cookie.js
new file mode 100644
index 000000000..b86e514bd
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/cookie.js
@@ -0,0 +1,24 @@
+import * as cookie from '@tinyhttp/cookie';
+import { sign } from '@tinyhttp/cookie-signature';
+import { append } from './append.js';
+export const setCookie = (req, res) => (name, value, options = {}) => {
+ const secret = req.secret;
+ const signed = options.signed || false;
+ if (signed && !secret)
+ throw new Error('cookieParser("secret") required for signed cookies');
+ let val = typeof value === 'object' ? `j:${JSON.stringify(value)}` : String(value);
+ if (signed)
+ val = `s:${sign(val, secret)}`;
+ if (options.maxAge) {
+ options.expires = new Date(Date.now() + options.maxAge);
+ options.maxAge /= 1000;
+ }
+ if (options.path == null)
+ options.path = '/';
+ append(res)('Set-Cookie', `${cookie.serialize(name, String(val), options)}`);
+ return res;
+};
+export const clearCookie = (req, res) => (name, options) => {
+ return setCookie(req, res)(name, '', Object.assign({}, { expires: new Date(1), path: '/' }, options));
+};
+//# sourceMappingURL=cookie.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/cookie.js.map b/be/node_modules/@tinyhttp/res/dist/cookie.js.map
new file mode 100644
index 000000000..5ffa6b953
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/cookie.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../src/cookie.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,MAAM,SAAS,GACpB,CACE,GAEC,EACD,GAAa,EACb,EAAE,CACJ,CACE,IAAY,EACZ,KAAuC,EACvC,UAGO,EAAE,EACC,EAAE;IACZ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAgB,CAAA;IAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;IAEtC,IAAI,MAAM,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;IAE5F,IAAI,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAElF,IAAI,MAAM;QAAE,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAA;IAE1C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QACvD,OAAO,CAAC,MAAM,IAAI,IAAI,CAAA;IACxB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,GAAG,CAAA;IAE5C,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;IAE5E,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,WAAW,GACtB,CAAwD,GAAY,EAAE,GAAa,EAAE,EAAE,CACvF,CAAC,IAAY,EAAE,OAAiC,EAAY,EAAE;IAC5D,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;AACvG,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/download.d.ts b/be/node_modules/@tinyhttp/res/dist/download.d.ts
new file mode 100644
index 000000000..67fa93447
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/download.d.ts
@@ -0,0 +1,10 @@
+import type { IncomingMessage as Req, ServerResponse as Res } from 'node:http';
+import type { SendFileOptions } from '@tinyhttp/send';
+export type DownloadOptions = SendFileOptions & Partial<{
+ headers: Record;
+}>;
+type Callback = (err?: any) => void;
+export declare const download: >(req: Request, res: Response) => (path: string, filename?: string | Callback, options?: DownloadOptions | Callback, cb?: Callback) => Response;
+export declare const attachment: (res: Response) => (filename?: string) => Response;
+export {};
+//# sourceMappingURL=download.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/download.d.ts.map b/be/node_modules/@tinyhttp/res/dist/download.d.ts.map
new file mode 100644
index 000000000..461cdc445
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/download.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,GAAG,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAI9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD,MAAM,MAAM,eAAe,GAAG,eAAe,GAC3C,OAAO,CAAC;IACN,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAC,CAAA;AAEJ,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;AAEnC,eAAO,MAAM,QAAQ,GAClB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,kBAAa,OAAO,OAAO,QAAQ,YAC5E,MAAM,aAAa,MAAM,GAAG,QAAQ,YAAY,eAAe,GAAG,QAAQ,OAAO,QAAQ,KAAG,QAgClG,CAAA;AAEH,eAAO,MAAM,UAAU,GACpB,QAAQ,SAAS,GAAG,OAAO,QAAQ,iBACxB,MAAM,KAAG,QASpB,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/download.js b/be/node_modules/@tinyhttp/res/dist/download.js
new file mode 100644
index 000000000..b31db9f26
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/download.js
@@ -0,0 +1,42 @@
+import { basename, extname, resolve } from 'node:path';
+import { contentDisposition } from '@tinyhttp/content-disposition';
+import { sendFile } from '@tinyhttp/send';
+import { setContentType, setHeader } from './headers.js';
+export const download = (req, res) => (path, filename, options, cb) => {
+ let done = cb;
+ let name = filename;
+ let opts = (options || null);
+ // support function as second or third arg
+ if (typeof filename === 'function') {
+ done = filename;
+ name = null;
+ }
+ else if (typeof options === 'function') {
+ done = options;
+ opts = null;
+ }
+ // set Content-Disposition when file is sent
+ const headers = {
+ 'Content-Disposition': contentDisposition(name || basename(path))
+ };
+ // merge user-provided headers
+ if (opts === null || opts === void 0 ? void 0 : opts.headers) {
+ for (const key of Object.keys(opts.headers)) {
+ if (key.toLowerCase() !== 'content-disposition')
+ headers[key] = opts.headers[key];
+ }
+ }
+ // merge user-provided options
+ opts = { ...opts, headers };
+ // send file
+ return sendFile(req, res)(opts.root ? path : resolve(path), opts, done || (() => undefined));
+};
+export const attachment = (res) => (filename) => {
+ if (filename) {
+ setContentType(res)(extname(filename));
+ filename = basename(filename);
+ }
+ setHeader(res)('Content-Disposition', contentDisposition(filename));
+ return res;
+};
+//# sourceMappingURL=download.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/download.js.map b/be/node_modules/@tinyhttp/res/dist/download.js.map
new file mode 100644
index 000000000..f5a1d348a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/download.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AASxD,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAwD,GAAY,EAAE,GAAa,EAAE,EAAE,CACvF,CAAC,IAAY,EAAE,QAA4B,EAAE,OAAoC,EAAE,EAAa,EAAY,EAAE;IAC5G,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,IAAI,GAAG,QAAyB,CAAA;IACpC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,CAA2B,CAAA;IAEtD,0CAA0C;IAC1C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,IAAI,GAAG,QAAQ,CAAA;QACf,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;SAAM,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QACzC,IAAI,GAAG,OAAO,CAAA;QACd,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IAED,4CAA4C;IAC5C,MAAM,OAAO,GAAG;QACd,qBAAqB,EAAE,kBAAkB,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;KAClE,CAAA;IAED,8BAA8B;IAC9B,IAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,qBAAqB;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAA;IAE3B,YAAY;IAEZ,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;AAC9F,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,UAAU,GACrB,CAAuB,GAAa,EAAE,EAAE,CACxC,CAAC,QAAiB,EAAY,EAAE;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;QACtC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEnE,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/format.d.ts b/be/node_modules/@tinyhttp/res/dist/format.d.ts
new file mode 100644
index 000000000..1ee7fdf2f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/format.d.ts
@@ -0,0 +1,13 @@
+import type { IncomingMessage as Req, ServerResponse as Res } from 'node:http';
+export type FormatProps = {
+ default?: () => void;
+} & Record;
+export type FormatError = Error & {
+ status: number;
+ statusCode: number;
+ types: string[];
+};
+type next = (err?: FormatError) => void;
+export declare const formatResponse: , Next extends next = next>(req: Request, res: Response, next: Next) => (obj: FormatProps) => Response;
+export {};
+//# sourceMappingURL=format.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/format.d.ts.map b/be/node_modules/@tinyhttp/res/dist/format.d.ts.map
new file mode 100644
index 000000000..ff9df7dd2
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/format.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,GAAG,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAK9E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEvB,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;AAEvC,eAAO,MAAM,cAAc,GACxB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,aAAQ,IAAI,SAAS,IAAI,cAClE,OAAO,OACP,QAAQ,QACP,IAAI,WAEN,WAAW,KAAG,QAyBnB,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/format.js b/be/node_modules/@tinyhttp/res/dist/format.js
new file mode 100644
index 000000000..8fb4141ef
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/format.js
@@ -0,0 +1,26 @@
+import { getAccepts } from '@tinyhttp/req';
+import { setVaryHeader } from './headers.js';
+import { normalizeType, normalizeTypes } from './util.js';
+export const formatResponse = (req, res, next) => (obj) => {
+ const fn = obj.default;
+ if (fn)
+ obj.default = undefined;
+ const keys = Object.keys(obj);
+ const key = keys.length > 0 ? getAccepts(req)(...keys) : false;
+ setVaryHeader(res)('Accept');
+ if (key) {
+ res.setHeader('Content-Type', normalizeType(key).value);
+ obj[key](req, res, next);
+ }
+ else if (fn) {
+ fn();
+ }
+ else {
+ const err = new Error('Not Acceptable');
+ err.status = err.statusCode = 406;
+ err.types = normalizeTypes(keys).map((o) => o.value);
+ next(err);
+ }
+ return res;
+};
+//# sourceMappingURL=format.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/format.js.map b/be/node_modules/@tinyhttp/res/dist/format.js.map
new file mode 100644
index 000000000..376eea814
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/format.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAczD,MAAM,CAAC,MAAM,cAAc,GACzB,CACE,GAAY,EACZ,GAAa,EACb,IAAU,EACV,EAAE,CACJ,CAAC,GAAgB,EAAY,EAAE;IAC7B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAA;IAEtB,IAAI,EAAE;QAAE,GAAG,CAAC,OAAO,GAAG,SAAS,CAAA;IAE/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAY,CAAC,CAAC,CAAC,KAAK,CAAA;IAE1E,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IAE5B,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;QACvD,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,EAAE,EAAE,CAAC;QACd,EAAE,EAAE,CAAA;IACN,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAgB,CAAA;QACtD,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;QACjC,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAEpD,IAAI,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/headers.d.ts b/be/node_modules/@tinyhttp/res/dist/headers.d.ts
new file mode 100644
index 000000000..e5d037cdc
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/headers.d.ts
@@ -0,0 +1,11 @@
+import type { OutgoingHttpHeaders } from 'node:http';
+import type { IncomingMessage as Req, ServerResponse as Res } from 'node:http';
+export declare const setHeader: >(res: Response) => (field: string | Record, val?: string | number | readonly string[]) => Response;
+export declare const setLocationHeader: >(req: Request, res: Response) => (url: string) => Response;
+export declare const getResponseHeader: >(res: Response) => (field: HeaderName) => OutgoingHttpHeaders[HeaderName];
+export declare const setLinksHeader: >(res: Response) => (links: {
+ [key: string]: string;
+}) => Response;
+export declare const setVaryHeader: >(res: Response) => (field: string) => Response;
+export declare const setContentType: >(res: Response) => (type: string) => Response;
+//# sourceMappingURL=headers.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/headers.d.ts.map b/be/node_modules/@tinyhttp/res/dist/headers.d.ts.map
new file mode 100644
index 000000000..6ffe3bd3e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/headers.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../src/headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,IAAI,GAAG,EAAE,cAAc,IAAI,GAAG,EAAE,MAAM,WAAW,CAAA;AAQ9E,eAAO,MAAM,SAAS,GACnB,QAAQ,SAAS,GAAG,kBAAa,QAAQ,aAClC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,KAAG,QAwBxG,CAAA;AAEH,eAAO,MAAM,iBAAiB,GAC3B,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,kBAAa,OAAO,OAAO,QAAQ,WAC7E,MAAM,KAAG,QASd,CAAA;AAEH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,GAAG,kBAAa,QAAQ,MACjE,UAAU,SAAS,MAAM,SAAS,UAAU,KAAG,mBAAmB,CAAC,UAAU,CAGtF,CAAA;AAED,eAAO,MAAM,cAAc,GACxB,QAAQ,SAAS,GAAG,kBAAa,QAAQ,aAClC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,KAAG,QAYnC,CAAA;AAEH,eAAO,MAAM,aAAa,GACvB,QAAQ,SAAS,GAAG,kBAAa,QAAQ,aAClC,MAAM,KAAG,QAIhB,CAAA;AAEH,eAAO,MAAM,cAAc,GACxB,QAAQ,SAAS,GAAG,kBAAa,QAAQ,YACnC,MAAM,KAAG,QAMf,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/headers.js b/be/node_modules/@tinyhttp/res/dist/headers.js
new file mode 100644
index 000000000..f8e412af1
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/headers.js
@@ -0,0 +1,62 @@
+import { encodeUrl } from '@tinyhttp/encode-url';
+import { getRequestHeader } from '@tinyhttp/req';
+import { vary } from '@tinyhttp/vary';
+import mime from 'mime';
+const charsetRegExp = /;\s*charset\s*=/;
+export const setHeader = (res) => (field, val) => {
+ if (typeof field === 'string') {
+ let value = Array.isArray(val) ? val.map(String) : String(val);
+ // add charset to content-type
+ if (field.toLowerCase() === 'content-type') {
+ if (Array.isArray(value)) {
+ throw new TypeError('Content-Type cannot be set to an Array');
+ }
+ if (!charsetRegExp.test(value)) {
+ const charset = 'UTF-8'; // UTF-8 is the default charset for all types
+ if (typeof charset === 'string')
+ value += `; charset=${charset.toLowerCase()}`;
+ }
+ }
+ res.setHeader(field, value);
+ }
+ else {
+ for (const key in field) {
+ setHeader(res)(key, field[key]);
+ }
+ }
+ return res;
+};
+export const setLocationHeader = (req, res) => (url) => {
+ let loc = url;
+ // "back" is an alias for the referrer
+ if (url === 'back')
+ loc = getRequestHeader(req)('Referrer') || '/';
+ // set location
+ res.setHeader('Location', encodeUrl(loc));
+ return res;
+};
+export const getResponseHeader = (res) => {
+ return (field) => {
+ return res.getHeader(field);
+ };
+};
+export const setLinksHeader = (res) => (links) => {
+ let link = res.getHeader('Link') || '';
+ if (link)
+ link += ', ';
+ res.setHeader('Link', link +
+ Object.keys(links)
+ .map((rel) => `<${links[rel]}>; rel="${rel}"`)
+ .join(', '));
+ return res;
+};
+export const setVaryHeader = (res) => (field) => {
+ vary(res, field);
+ return res;
+};
+export const setContentType = (res) => (type) => {
+ const ct = type.indexOf('/') === -1 ? mime.getType(type) : type;
+ setHeader(res)('Content-Type', ct);
+ return res;
+};
+//# sourceMappingURL=headers.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/headers.js.map b/be/node_modules/@tinyhttp/res/dist/headers.js.map
new file mode 100644
index 000000000..0382e51c8
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/headers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"headers.js","sourceRoot":"","sources":["../src/headers.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/index.d.ts b/be/node_modules/@tinyhttp/res/dist/index.d.ts
new file mode 100644
index 000000000..c508d4288
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/index.d.ts
@@ -0,0 +1,9 @@
+export * from '@tinyhttp/send';
+export * from './cookie.js';
+export { setContentType, setHeader, setLinksHeader, setLocationHeader, setVaryHeader, getResponseHeader } from './headers.js';
+export type { FormatProps, FormatError } from './format.js';
+export { formatResponse } from './format.js';
+export { redirect } from './redirect.js';
+export * from './download.js';
+export { append } from './append.js';
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/index.d.ts.map b/be/node_modules/@tinyhttp/res/dist/index.d.ts.map
new file mode 100644
index 000000000..93c2505e5
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,OAAO,EACL,cAAc,EACd,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EAClB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/index.js b/be/node_modules/@tinyhttp/res/dist/index.js
new file mode 100644
index 000000000..c3648c716
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/index.js
@@ -0,0 +1,8 @@
+export * from '@tinyhttp/send';
+export * from './cookie.js';
+export { setContentType, setHeader, setLinksHeader, setLocationHeader, setVaryHeader, getResponseHeader } from './headers.js';
+export { formatResponse } from './format.js';
+export { redirect } from './redirect.js';
+export * from './download.js';
+export { append } from './append.js';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/index.js.map b/be/node_modules/@tinyhttp/res/dist/index.js.map
new file mode 100644
index 000000000..d28c2edd6
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,OAAO,EACL,cAAc,EACd,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EAClB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/redirect.d.ts b/be/node_modules/@tinyhttp/res/dist/redirect.d.ts
new file mode 100644
index 000000000..2b13156df
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/redirect.d.ts
@@ -0,0 +1,5 @@
+import { type IncomingMessage as Req, type ServerResponse as Res } from 'node:http';
+type next = (err?: any) => void;
+export declare const redirect: , Next extends next = next>(req: Request, res: Response, next: Next) => (url: string, status?: number) => Response;
+export {};
+//# sourceMappingURL=redirect.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/redirect.d.ts.map b/be/node_modules/@tinyhttp/res/dist/redirect.d.ts.map
new file mode 100644
index 000000000..40478511a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/redirect.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../src/redirect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,IAAI,GAAG,EAAE,KAAK,cAAc,IAAI,GAAG,EAAgB,MAAM,WAAW,CAAA;AAKjG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;AAE/B,eAAO,MAAM,QAAQ,GAClB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,aAAQ,IAAI,SAAS,IAAI,cAClE,OAAO,OACP,QAAQ,QACP,IAAI,WAEN,MAAM,WAAW,MAAM,KAAG,QAkC/B,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/redirect.js b/be/node_modules/@tinyhttp/res/dist/redirect.js
new file mode 100644
index 000000000..b69fd9c45
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/redirect.js
@@ -0,0 +1,30 @@
+import { STATUS_CODES } from 'node:http';
+import { formatResponse } from './format.js';
+import { setLocationHeader } from './headers.js';
+import { escapeHTML } from './util.js';
+export const redirect = (req, res, next) => (url, status) => {
+ let address = url;
+ status = status || 302;
+ let body = '';
+ address = setLocationHeader(req, res)(address).getHeader('Location');
+ formatResponse(req, res, next)({
+ text: () => {
+ body = `${STATUS_CODES[status]}. Redirecting to ${address}`;
+ },
+ html: () => {
+ const u = escapeHTML(address);
+ body = `${STATUS_CODES[status]}. Redirecting to ${u}
`;
+ },
+ default: () => {
+ body = '';
+ }
+ });
+ res.setHeader('Content-Length', Buffer.byteLength(body));
+ res.statusCode = status;
+ if (req.method === 'HEAD')
+ res.end();
+ else
+ res.end(body);
+ return res;
+};
+//# sourceMappingURL=redirect.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/redirect.js.map b/be/node_modules/@tinyhttp/res/dist/redirect.js.map
new file mode 100644
index 000000000..66888d566
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/redirect.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../src/redirect.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2D,YAAY,EAAE,MAAM,WAAW,CAAA;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAItC,MAAM,CAAC,MAAM,QAAQ,GACnB,CACE,GAAY,EACZ,GAAa,EACb,IAAU,EACV,EAAE,CACJ,CAAC,GAAW,EAAE,MAAe,EAAY,EAAE;IACzC,IAAI,OAAO,GAAG,GAAG,CAAA;IACjB,MAAM,GAAG,MAAM,IAAI,GAAG,CAAA;IAEtB,IAAI,IAAI,GAAG,EAAE,CAAA;IAEb,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAW,CAAA;IAE9E,cAAc,CACZ,GAAG,EACH,GAAG,EACH,IAAI,CACL,CAAC;QACA,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,oBAAoB,OAAO,EAAE,CAAA;QAC7D,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YAE7B,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,UAAU,CAAA;QACjF,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,GAAG,EAAE,CAAA;QACX,CAAC;KACF,CAAC,CAAA;IAEF,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IAExD,GAAG,CAAC,UAAU,GAAG,MAAM,CAAA;IAEvB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,GAAG,CAAC,GAAG,EAAE,CAAA;;QAC/B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAElB,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/util.d.ts b/be/node_modules/@tinyhttp/res/dist/util.d.ts
new file mode 100644
index 000000000..e3f9f5171
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/util.d.ts
@@ -0,0 +1,11 @@
+export type NormalizedType = {
+ value: string;
+ quality?: number;
+ params: Record;
+ originalIndex?: number;
+};
+export declare function acceptParams(str: string, index?: number): NormalizedType;
+export declare const normalizeType: (type: string) => NormalizedType;
+export declare function normalizeTypes(types: string[]): NormalizedType[];
+export declare function escapeHTML(str: string): string;
+//# sourceMappingURL=util.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/util.d.ts.map b/be/node_modules/@tinyhttp/res/dist/util.d.ts.map
new file mode 100644
index 000000000..1b3e5cb59
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/util.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAWxE;AAED,eAAO,MAAM,aAAa,SAAU,MAAM,KAAG,cAC4D,CAAA;AAEzG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAQhE;AAID,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAyC9C"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/util.js b/be/node_modules/@tinyhttp/res/dist/util.js
new file mode 100644
index 000000000..eb51ff8c4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/util.js
@@ -0,0 +1,60 @@
+import mime from 'mime';
+export function acceptParams(str, index) {
+ const parts = str.split(/ *; */);
+ const ret = { value: parts[0], quality: 1, params: {}, originalIndex: index };
+ for (const part of parts) {
+ const pms = part.split(/ *= */);
+ if ('q' === pms[0])
+ ret.quality = Number.parseFloat(pms[1]);
+ else
+ ret.params[pms[0]] = pms[1];
+ }
+ return ret;
+}
+export const normalizeType = (type) => ~type.indexOf('/') ? acceptParams(type) : { value: mime.getType(type), params: {} };
+export function normalizeTypes(types) {
+ const ret = [];
+ for (const type of types) {
+ ret.push(normalizeType(type));
+ }
+ return ret;
+}
+const matchHtmlRegExp = /["'&<>]/;
+export function escapeHTML(str) {
+ const match = matchHtmlRegExp.exec(str);
+ if (!match) {
+ // stringify in case input is not a string
+ return String(str);
+ }
+ let escapeChar;
+ let html = '';
+ let index = 0;
+ let lastIndex = 0;
+ for (index = match.index; index < str.length; index++) {
+ switch (str.charCodeAt(index)) {
+ case 34: // "
+ escapeChar = '"';
+ break;
+ case 38: // &
+ escapeChar = '&';
+ break;
+ case 39: // '
+ escapeChar = ''';
+ break;
+ case 60: // <
+ escapeChar = '<';
+ break;
+ case 62: // >
+ escapeChar = '>';
+ break;
+ default:
+ continue;
+ }
+ if (lastIndex !== index)
+ html += str.substring(lastIndex, index);
+ lastIndex = index + 1;
+ html += escapeChar;
+ }
+ return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
+}
+//# sourceMappingURL=util.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/dist/util.js.map b/be/node_modules/@tinyhttp/res/dist/util.js.map
new file mode 100644
index 000000000..5447c0c03
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/dist/util.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/package.json b/be/node_modules/@tinyhttp/res/package.json
new file mode 100644
index 000000000..b0285feee
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "@tinyhttp/res",
+ "version": "2.2.5",
+ "type": "module",
+ "description": "response extensions for tinyhttp",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/res"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "res"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/vary": "^0.1.3",
+ "es-escape-html": "^0.1.1",
+ "mime": "4.0.4",
+ "@tinyhttp/content-disposition": "2.2.2",
+ "@tinyhttp/cookie": "2.1.1",
+ "@tinyhttp/cookie-signature": "2.1.1",
+ "@tinyhttp/encode-url": "2.1.1",
+ "@tinyhttp/req": "2.2.5",
+ "@tinyhttp/send": "2.2.3"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/res/tsconfig.tsbuildinfo b/be/node_modules/@tinyhttp/res/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..7cfb4e0bd
--- /dev/null
+++ b/be/node_modules/@tinyhttp/res/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"fileNames":["../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.full.d.ts","./node_modules/@tinyhttp/encode-url/dist/index.d.ts","./node_modules/@tinyhttp/req/node_modules/header-range-parser/dist/index.d.ts","./node_modules/@tinyhttp/req/dist/accepts.d.ts","./node_modules/@tinyhttp/req/node_modules/@tinyhttp/url/dist/index.d.ts","./node_modules/@tinyhttp/req/dist/index.d.ts","./node_modules/@tinyhttp/vary/dist/index.d.ts","./node_modules/mime/dist/src/Mime.d.ts","./node_modules/mime/dist/src/index.d.ts","./src/headers.ts","./src/append.ts","./node_modules/@tinyhttp/cookie/dist/index.d.ts","./node_modules/@tinyhttp/cookie-signature/dist/index.d.ts","./src/cookie.ts","./node_modules/@tinyhttp/content-disposition/dist/index.d.ts","./node_modules/@tinyhttp/send/dist/json.d.ts","./node_modules/@tinyhttp/send/dist/send.d.ts","./node_modules/@tinyhttp/send/dist/sendStatus.d.ts","./node_modules/@tinyhttp/send/dist/status.d.ts","./node_modules/@tinyhttp/send/dist/sendFile.d.ts","./node_modules/@tinyhttp/send/dist/index.d.ts","./src/download.ts","./src/util.ts","./src/format.ts","./src/redirect.ts","./src/index.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[82,87],[82,84,87],[82,86,87],[87],[82,87,92,122],[82,87,88,93,99,100,107,119,130],[82,87,88,89,99,107],[77,78,79,82,87],[82,87,90,131],[82,87,91,92,100,108],[82,87,92,119,127],[82,87,93,95,99,107],[82,86,87,94],[82,87,95,96],[82,87,99],[82,87,97,99],[82,86,87,99],[82,87,99,100,101,119,130],[82,87,99,100,101,114,119,122],[82,87,135],[82,87,95,99,102,107,119,130],[82,87,99,100,102,103,107,119,127,130],[82,87,102,104,119,127,130],[80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136],[82,87,99,105],[82,87,106,130,135],[82,87,95,99,107,119],[82,87,108],[82,87,109],[82,86,87,110],[82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136],[82,87,112],[82,87,113],[82,87,99,114,115],[82,87,114,116,131,133],[82,87,99,119,120,121,122],[82,87,119,121],[82,87,119,120],[82,87,122],[82,87,123],[82,84,87,119],[82,87,99,125,126],[82,87,125,126],[82,87,92,107,119,127],[82,87,128],[82,87,107,129],[82,87,102,113,130],[82,87,92,131],[82,87,119,132],[82,87,106,133],[82,87,134],[82,87,92,99,101,110,119,130,133,135],[82,87,119,136],[82,87,102],[53,54,55,82,87,102],[66,67,68,69,70,82,87],[58,82,87],[60,82,87,102],[61,62,63,82,87,102],[60,65,71,82,87,102,109],[56,60,73,82,87,102],[52,56,57,59,82,87,102],[60,61,64,71,72,74,75,82,87],[60,73,74,82,87,102],[59,82,87]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"08f6861df84fba9719c14d5adc3ba40be9f0c687639e6c4df3c05b9301b8ff94","impliedFormat":1},{"version":"797fe2d462f887b64b00305c2ecf1bafe80547cc60f566f8e6253ab8da70f03f","impliedFormat":99},{"version":"ef28d730af2228159dc34259f741fa0295cc6931bb241034026b5e6e008558c6","impliedFormat":99},{"version":"2845bb386dd43e603ddc77290e5905beb11b0babe01c02b70a1674bc9f1f7633","impliedFormat":99},{"version":"207a63ef8ddadd3d67f14dc7d5863924861c023977dfd7f721e89b1ceb2ba2cf","impliedFormat":99},{"version":"f17de793e70909881700ae7cdbb95ef6da98093e097207118614ab168052e9f9","impliedFormat":99},{"version":"fb96bb049df62be4e9edd6fa32a57f40081e2e14f05a82190f6b2a37da497e41","impliedFormat":99},{"version":"0ae65c3e977c81f6e46ae9028ae97fc75c78c70f4d6d5f961a8af60301145af6","impliedFormat":99},{"version":"b1a6683b821c624d63d887dbdd9f34aebb9de586acf87bbf50cb16f5ec2c36c7","impliedFormat":99},{"version":"c483ed731c1a67866ef1124d0bef52b26cb3eb0deca4caef6d7e6cf69679526e","signature":"ea5f48751fb3919132af003da59a851f9cb77a6f56914f1b4d96c8a27ec41a2d"},{"version":"c7f6cc4ab40d95ff30e2e365044c52d8c807f38bdfc3814b5dc24cc133cae566","signature":"d96a62922b9d4aa5c2e6bc33dc4348f3e9711944c62a4df8d8d971406ce04756"},{"version":"c86f28fa7de4405e3b4cc73b9c4bcce579c7807f8ea3b42db08f305248f38fa1","impliedFormat":99},{"version":"af79066d70e0867083b2d71443a51c76b2fcb270460e1642a950275896161237","impliedFormat":99},{"version":"79f2cec485a27e3b2a90d781561442677478b4ecf4f6a663fe37e7c892299806","signature":"ab39e47eaa3d13a40480a18989dc35885a6482417adb70c404d1f364dc54c673"},{"version":"3f26ad44b55351188a74988b3c8c688408375e0a1a85babbfdf62974c676a472","impliedFormat":99},{"version":"d024fd1662145097aa85cb50ba1d351d73e7d94956a2dead04e0eaccbb0d6e12","impliedFormat":99},{"version":"34b3738d71281e43ac8a7b12989d93490dbc61c389e7e6d8c571afb889414b63","impliedFormat":99},{"version":"0e3e1f9f499e76fb5e1ba301cbb1c5fd4c60f07c712b03de4f65bd12977d844e","impliedFormat":99},{"version":"3f69b330ab1608bf9341cc08928a04e2b2f8d180c1f4606da594d50719a3af33","impliedFormat":99},{"version":"f69a1a89f01b427f03e246a0fb28945f0b1208874efd091a7f5274d78df5ab44","impliedFormat":99},{"version":"c437bed60d16a0f5d00eb671291090662bdc8d43afdb7b327cb8eedb247c6cbd","impliedFormat":99},{"version":"ce7e39ac29b1f85896452d3d46808405d8ee79497449d77fe0a5817b12a67af6","signature":"68d22689d50617044c44ecf74fb9d1cacd4e3f0646ec6dffde4e539c28a760f4"},{"version":"323f96c9d3db9e765ea38ce5ad65001dafa689c69ca0c8196aa88a153e8b00dd","signature":"97d41e0e4bbba71d00666d4e566d234991bec85d5e35844c81e1144d4056bf18"},{"version":"1b92488d48a931426b44cd1b0229ebb3d18d43747026cd317d5807344f5db6dc","signature":"a414568ebbc74f8b76fb43a923a99b98e8e878bf8a13d2685319199f2a7fde95"},{"version":"7253d7d31cf62c9a5adce7a3d3f9b8ca38376aa431b6bf1ba7d6de6de22d4fbd","signature":"30314d1c65af1f3cb4d3c2a445fb016f179403e7843128fc90af4c9eca9bbd7a"},{"version":"0c00dd5f2733f1adced7118e2b9e9967134810e508e3d585d2458aa07b594304","signature":"1b839ff5409347249b866334e51bd0f78038b38c4ff21599e3a1c54e6ad4de74"},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba97261afafe85aafe76d988e65e531da8e8cf791c49caf0531f5dd1689bd91b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f52e8dacc97d71dcc96af29e49584353f9c54cb916d132e3e768d8b8129c928d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"53eac70430b30089a3a1959d8306b0f9cfaf0de75224b68ef25243e0b5ad1ca3","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"86956cc2eb9dd371d6fab493d326a574afedebf76eef3fa7833b8e0d9b52d6f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"e9ad08a376ac84948fcca0013d6f1d4ae4f9522e26b91f87945b97c99d7cc30b","impliedFormat":1},{"version":"eaf9ee1d90a35d56264f0bf39842282c58b9219e112ac7d0c1bce98c6c5da672","impliedFormat":1},{"version":"c15c4427ae7fd1dcd7f312a8a447ac93581b0d4664ddf151ecd07de4bf2bb9d7","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"aeac7c51bde4658c192bc45819344eb20fc64743264b0465be6025201220a6b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4047ed87e765bd3bcc316a0c4c4c8b0061628460d8a5412d1c4b53a4658665a","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"3eb62baae4df08c9173e6903d3ca45942ccec8c3659b0565684a75f3292cffbb","affectsGlobalScope":true,"impliedFormat":1},{"version":"42aaa94addeed66a04b61e433c14e829c43d1efd653cf2fda480c5fb3d722ed8","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","impliedFormat":1},{"version":"58832ded29e0094047596544ac391d68c799d7bd7d35936f47221857141628f1","impliedFormat":1},{"version":"553870e516f8c772b89f3820576152ebc70181d7994d96917bb943e37da7f8a7","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"745c4240220559bd340c8aeb6e3c5270a709d3565e934dc22a69c304703956bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"9212c6e9d80cb45441a3614e95afd7235a55a18584c2ed32d6c1aca5a0c53d93","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"6bd91a2a356600dee28eb0438082d0799a18a974a6537c4410a796bab749813c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"ae25afbbf1ed5df63a177d67b9048bf7481067f1b8dc9c39212e59db94fc9fc6","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1}],"root":[60,61,64,[72,76]],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"module":99,"noImplicitAny":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"referencedMap":[[49,1],[50,1],[10,1],[8,1],[9,1],[14,1],[13,1],[2,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[3,1],[23,1],[24,1],[4,1],[25,1],[29,1],[26,1],[27,1],[28,1],[30,1],[31,1],[32,1],[5,1],[33,1],[34,1],[35,1],[36,1],[6,1],[51,1],[40,1],[37,1],[38,1],[39,1],[41,1],[7,1],[42,1],[47,1],[48,1],[43,1],[44,1],[45,1],[46,1],[1,1],[12,1],[11,1],[84,2],[85,2],[86,3],[82,4],[87,5],[88,6],[89,7],[77,1],[80,8],[78,1],[79,1],[90,9],[91,10],[92,11],[93,12],[94,13],[95,14],[96,14],[98,15],[97,16],[99,17],[100,18],[101,19],[83,20],[81,1],[102,21],[103,22],[104,23],[137,24],[105,25],[106,26],[107,27],[108,28],[109,29],[110,30],[111,31],[112,32],[113,33],[114,34],[115,34],[116,35],[117,1],[118,1],[119,36],[121,37],[120,38],[122,39],[123,40],[124,41],[125,42],[126,43],[127,44],[128,45],[129,46],[130,47],[131,48],[132,49],[133,50],[134,51],[135,52],[136,53],[65,1],[63,1],[62,1],[52,1],[54,54],[56,55],[55,33],[53,1],[71,56],[66,54],[67,54],[70,54],[68,54],[69,54],[57,54],[58,1],[59,57],[61,58],[64,59],[72,60],[74,61],[60,62],[76,63],[75,64],[73,65]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.7.3"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/router/LICENSE b/be/node_modules/@tinyhttp/router/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/router/README.md b/be/node_modules/@tinyhttp/router/README.md
new file mode 100644
index 000000000..410741441
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/README.md
@@ -0,0 +1,26 @@
+# @tinyhttp/router
+
+[![npm (scoped)][npm-badge]](https://npmjs.com/package/@tinyhttp/router) [![npm][dl-badge]](https://npmjs.com/package/@tinyhttp/router)
+
+Framework-agnostic HTTP router.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/router
+```
+
+## Example
+
+```js
+import { Router } from '@tinyhttp/router'
+
+const router = new Router()
+
+router.get('/', (req, res) => res.send('Hello World'))
+
+console.log(router.middleware)
+```
+
+[npm-badge]: https://img.shields.io/npm/v/@tinyhttp/router?style=flat-square
+[dl-badge]: https://img.shields.io/npm/dt/@tinyhttp/router?style=flat-square
diff --git a/be/node_modules/@tinyhttp/router/dist/index.d.ts b/be/node_modules/@tinyhttp/router/dist/index.d.ts
new file mode 100644
index 000000000..8dac39d70
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/dist/index.d.ts
@@ -0,0 +1,95 @@
+export type NextFunction = (err?: any) => void;
+export type SyncHandler = (req: Request, res: Response, next?: NextFunction) => void;
+export type AsyncHandler = (req: Request, res: Response, next?: NextFunction) => Promise;
+export type Handler = AsyncHandler | SyncHandler;
+declare const METHODS: readonly ["ACL", "BIND", "CHECKOUT", "CONNECT", "COPY", "DELETE", "GET", "HEAD", "LINK", "LOCK", "M-SEARCH", "MERGE", "MKACTIVITY", "MKCALENDAR", "MKCOL", "MOVE", "NOTIFY", "OPTIONS", "PATCH", "POST", "PRI", "PROPFIND", "PROPPATCH", "PURGE", "PUT", "REBIND", "REPORT", "SEARCH", "SOURCE", "SUBSCRIBE", "TRACE", "UNBIND", "UNLINK", "UNLOCK", "UNSUBSCRIBE"];
+export type Method = (typeof METHODS)[number];
+export type MiddlewareType = 'mw' | 'route';
+type RegexParams = {
+ keys: string[] | false;
+ pattern: RegExp;
+};
+type RIM = (...args: RouterMethodParams) => App;
+export interface Middleware {
+ method?: Method;
+ handler: Handler;
+ path?: string;
+ type: MiddlewareType;
+ regex?: RegexParams;
+ fullPath?: string;
+}
+export type MethodHandler = {
+ path?: string | string[] | Handler;
+ handler?: Handler;
+ type: MiddlewareType;
+ regex?: RegexParams;
+ fullPath?: string;
+};
+export type RouterHandler = Handler | Handler[] | string[];
+export type RouterPathOrHandler = string | RouterHandler;
+export type RouterMethod = (path: string | string[] | Handler, handler?: RouterHandler, ...handlers: RouterHandler[]) => any;
+type RouterMethodParams = Parameters>;
+export type UseMethod = (path: RouterPathOrHandler | App, handler?: RouterHandler | App, ...handlers: (RouterHandler | App)[]) => any;
+export type UseMethodParams = Parameters>;
+/**
+ * Push wares to a middleware array
+ * @param mw Middleware arrays
+ */
+export declare const pushMiddleware: (mw: Middleware[]) => ({ path, handler, method, handlers, type, fullPaths }: MethodHandler & {
+ method?: Method;
+ handlers?: RouterHandler[];
+ fullPaths?: string[];
+}) => void;
+/**
+ * tinyhttp Router. Manages middleware and has HTTP methods aliases, e.g. `app.get`, `app.put`
+ */
+export declare class Router {
+ middleware: Middleware[];
+ mountpath: string;
+ parent: App;
+ apps: Record;
+ acl: RIM;
+ bind: RIM;
+ checkout: RIM;
+ connect: RIM;
+ copy: RIM;
+ delete: RIM;
+ get: RIM;
+ head: RIM;
+ link: RIM;
+ lock: RIM;
+ merge: RIM;
+ mkactivity: RIM;
+ mkcalendar: RIM;
+ mkcol: RIM;
+ move: RIM;
+ notify: RIM;
+ options: RIM;
+ patch: RIM;
+ post: RIM;
+ pri: RIM;
+ propfind: RIM;
+ proppatch: RIM;
+ purge: RIM;
+ put: RIM;
+ rebind: RIM;
+ report: RIM;
+ search: RIM;
+ source: RIM;
+ subscribe: RIM;
+ trace: RIM;
+ unbind: RIM;
+ unlink: RIM;
+ unlock: RIM;
+ unsubscribe: RIM;
+ constructor();
+ add(method: Method): (path: string | string[] | Handler, handler?: RouterHandler | undefined, ...handlers: RouterHandler[]) => this;
+ msearch(...args: RouterMethodParams): this;
+ all(...args: RouterMethodParams): this;
+ /**
+ * Push middleware to the stack
+ */
+ use(...args: UseMethodParams): this;
+}
+export {};
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/router/dist/index.d.ts.map b/be/node_modules/@tinyhttp/router/dist/index.d.ts.map
new file mode 100644
index 000000000..d09e00a79
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/router/dist/index.js b/be/node_modules/@tinyhttp/router/dist/index.js
new file mode 100644
index 000000000..2aa87ad40
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/dist/index.js
@@ -0,0 +1,154 @@
+/* HELPER TYPES */
+const METHODS = [
+ 'ACL',
+ 'BIND',
+ 'CHECKOUT',
+ 'CONNECT',
+ 'COPY',
+ 'DELETE',
+ 'GET',
+ 'HEAD',
+ 'LINK',
+ 'LOCK',
+ 'M-SEARCH',
+ 'MERGE',
+ 'MKACTIVITY',
+ 'MKCALENDAR',
+ 'MKCOL',
+ 'MOVE',
+ 'NOTIFY',
+ 'OPTIONS',
+ 'PATCH',
+ 'POST',
+ 'PRI',
+ 'PROPFIND',
+ 'PROPPATCH',
+ 'PURGE',
+ 'PUT',
+ 'REBIND',
+ 'REPORT',
+ 'SEARCH',
+ 'SOURCE',
+ 'SUBSCRIBE',
+ 'TRACE',
+ 'UNBIND',
+ 'UNLINK',
+ 'UNLOCK',
+ 'UNSUBSCRIBE'
+];
+/** HELPER METHODS */
+const createMiddlewareFromRoute = ({ path, handler, fullPath, method }) => ({
+ method,
+ handler: handler || path,
+ path: typeof path === 'string' ? path : '/',
+ fullPath: typeof path === 'string' ? fullPath : path
+});
+/**
+ * Push wares to a middleware array
+ * @param mw Middleware arrays
+ */
+export const pushMiddleware = (mw) => ({ path, handler, method, handlers, type, fullPaths }) => {
+ const m = createMiddlewareFromRoute({ path, handler, method, type, fullPath: fullPaths === null || fullPaths === void 0 ? void 0 : fullPaths[0] });
+ let waresFromHandlers = [];
+ let idx = 1;
+ if (handlers) {
+ waresFromHandlers = handlers.flat().map((handler) => createMiddlewareFromRoute({
+ path,
+ handler: handler,
+ method,
+ type,
+ fullPath: fullPaths == null ? undefined : fullPaths[idx++]
+ }));
+ }
+ for (const mdw of [m, ...waresFromHandlers])
+ mw.push({ ...mdw, type });
+};
+/**
+ * tinyhttp Router. Manages middleware and has HTTP methods aliases, e.g. `app.get`, `app.put`
+ */
+export class Router {
+ constructor() {
+ this.middleware = [];
+ this.mountpath = '/';
+ this.apps = {};
+ for (const m of METHODS) {
+ this[m.toLowerCase()] = this.add(m);
+ }
+ }
+ add(method) {
+ return (...args) => {
+ const handlers = args.slice(1).flat();
+ if (Array.isArray(args[0])) {
+ for (const arg of Object.values(args[0])) {
+ if (typeof arg === 'string') {
+ pushMiddleware(this.middleware)({
+ path: arg,
+ handler: handlers[0],
+ handlers: handlers.slice(1),
+ method,
+ type: 'route'
+ });
+ }
+ }
+ }
+ else {
+ pushMiddleware(this.middleware)({
+ path: args[0],
+ handler: handlers[0],
+ handlers: handlers.slice(1),
+ method,
+ type: 'route'
+ });
+ }
+ return this;
+ };
+ }
+ msearch(...args) {
+ const handlers = args.slice(1).flat();
+ pushMiddleware(this.middleware)({
+ path: args[0],
+ handler: handlers[0],
+ handlers: handlers.slice(1),
+ method: 'M-SEARCH',
+ type: 'route'
+ });
+ return this;
+ }
+ all(...args) {
+ const handlers = args.slice(1).flat();
+ pushMiddleware(this.middleware)({
+ path: args[0],
+ handler: handlers[0],
+ handlers: handlers.slice(1),
+ type: 'route'
+ });
+ return this;
+ }
+ /**
+ * Push middleware to the stack
+ */
+ use(...args) {
+ const base = args[0];
+ const handlers = args.slice(1).flat();
+ if (typeof base === 'string') {
+ pushMiddleware(this.middleware)({
+ path: base,
+ handler: handlers[0],
+ handlers: handlers.slice(1),
+ type: 'mw'
+ });
+ }
+ else {
+ pushMiddleware(this.middleware)({
+ path: '/',
+ handler: Array.isArray(base) ? base[0] : base,
+ handlers: Array.isArray(base)
+ ? [...base.slice(1), ...handlers]
+ : handlers,
+ type: 'mw'
+ });
+ }
+ return this;
+ }
+}
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/router/dist/index.js.map b/be/node_modules/@tinyhttp/router/dist/index.js.map
new file mode 100644
index 000000000..0ebe21199
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/router/package.json b/be/node_modules/@tinyhttp/router/package.json
new file mode 100644
index 000000000..9038b9ded
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@tinyhttp/router",
+ "version": "2.2.3",
+ "type": "module",
+ "description": "Router for tinyhttp",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/router"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "router"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/router/tsconfig.tsbuildinfo b/be/node_modules/@tinyhttp/router/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..fc4c9cb59
--- /dev/null
+++ b/be/node_modules/@tinyhttp/router/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.full.d.ts","./src/index.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true},{"version":"0c9e4447ddca10e8097a736ce41bb37ac3389ede46e419ee78c1161a14e9e8ba","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"08f6861df84fba9719c14d5adc3ba40be9f0c687639e6c4df3c05b9301b8ff94",{"version":"66e6cb30d772a91a75c81456d8fb53fd3503dcd5d933b01eba1eaf247a6bef75","signature":"e110533b20b672bf9973057eede58d110645bdfced0400527efedd494fb58966"},"2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419",{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true},"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36",{"version":"392eadc2af403dd10b4debfbc655c089a7fa6a9750caeb770cfb30051e55e848","affectsGlobalScope":true},"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6",{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"c48c503c6b3f63baf18257e9a87559b5602a4e960107c762586d2a6a62b64a18","affectsGlobalScope":true},"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},{"version":"1493cc4d72bfaabe2ac13e987d026a5fc99a816f6289bfca7192834a396205cf","affectsGlobalScope":true},"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b",{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true},"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900",{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true},"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927",{"version":"071d4b4af5755e1a081aa3b785b5526d09276af5a50e4725dea26edd4e7deb31","affectsGlobalScope":true},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true},"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0",{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true},"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c",{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true},"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc"],"root":[52],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"module":99,"noImplicitAny":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"fileIdsList":[[53],[56],[57,62,91],[58,63,69,70,77,88,99],[58,59,69,77],[60,100],[61,62,70,78],[62,88,96],[63,65,69,77],[56,64],[65,66],[69],[67,69],[56,69],[69,70,71,88,99],[69,70,71,84,88,91],[57,104],[65,69,72,77,88,99],[69,70,72,73,77,88,96,99],[72,74,88,96,99],[53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],[69,75],[76,99,104],[65,69,77,88],[78],[79],[56,80],[77,78,81,98,104],[82],[83],[69,84,85],[84,86,100,102],[57,69,88,89,90,91],[57,88,90],[88,89],[91],[92],[56,88],[69,94,95],[94,95],[62,77,88,96],[97],[77,98],[57,72,83,99],[62,100],[88,101],[76,102],[103],[57,62,69,71,80,88,99,102,104],[88,105]],"referencedMap":[[53,1],[54,1],[56,2],[57,3],[58,4],[59,5],[60,6],[61,7],[62,8],[63,9],[64,10],[65,11],[66,11],[68,12],[67,13],[69,14],[70,15],[71,16],[55,17],[72,18],[73,19],[74,20],[107,21],[75,22],[76,23],[77,24],[78,25],[79,26],[80,27],[81,28],[82,29],[83,30],[84,31],[85,31],[86,32],[88,33],[90,34],[89,35],[91,36],[92,37],[93,38],[94,39],[95,40],[96,41],[97,42],[98,43],[99,44],[100,45],[101,46],[102,47],[103,48],[104,49],[105,50]],"latestChangedDtsFile":"./dist/index.d.ts"},"version":"5.5.4"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/LICENSE b/be/node_modules/@tinyhttp/send/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/send/README.md b/be/node_modules/@tinyhttp/send/README.md
new file mode 100644
index 000000000..596d04453
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/README.md
@@ -0,0 +1,110 @@
+# @tinyhttp/send
+
+[![npm (scoped)][npm-badge]](https://npmjs.com/package/@tinyhttp/send)
+[![npm][dl-badge]](https://npmjs.com/package/@tinyhttp/send)
+[![][web-badge]](https://tinyhttp.v1rtl.site/mw/send)
+
+Extensions for sending a response, including `send`, `sendStatus`, `status`,
+`sendFile` and `json`. Works with any backend framework.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/send
+```
+
+## API
+
+```js
+import { json, send, sendStatus, status } from '@tinyhttp/send'
+```
+
+### `send(body)` [![][doc-badge]](https://tinyhttp.v1rtl.site/docs#ressend)
+
+Sends the HTTP response.
+
+The body parameter can be a Buffer object, a string, an object, or an array.
+
+##### Example
+
+```ts
+res.send(Buffer.from('whoop'))
+res.send({ some: 'json' })
+res.send('some html
')
+res.status(404).send('Sorry, we cannot find that!')
+res.status(500).send({ error: 'something blew up' })
+```
+
+### `json(body)` [![][doc-badge]](https://tinyhttp.v1rtl.site/docs#resjson)
+
+Sends a JSON response. This method sends a response (with the correct
+content-type) that is the parameter converted to a JSON string using
+[`JSON.stringify()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
+
+The parameter can be any JSON type, including object, array, string, boolean,
+number, or null, and you can also use it to convert other values to JSON.
+
+##### Example
+
+```ts
+res.json(null)
+res.json({ user: 'tobi' })
+res.status(500).json({ error: 'message' })
+```
+
+### `status(number)` [![][doc-badge]](https://tinyhttp.v1rtl.site/docs#resstatus)
+
+Sets the HTTP status for the response. It is a chainable alias of Node’s
+`response.statusCode`.
+
+##### Example
+
+```ts
+res.status(403).end()
+res.status(400).send('Bad Request')
+```
+
+### `sendStatus` [![][doc-badge]](https://tinyhttp.v1rtl.site/docs#ressendstatus)
+
+Sets the response HTTP status code to statusCode and send its string
+representation as the response body.
+
+##### Example
+
+```ts
+res.sendStatus(200) // equivalent to res.status(200).send('OK')
+res.sendStatus(403) // equivalent to res.status(403).send('Forbidden')
+res.sendStatus(404) // equivalent to res.status(404).send('Not Found')
+res.sendStatus(500) // equivalent to res.status(500).send('Internal Server Error')
+```
+
+If an unsupported status code is specified, the HTTP status is still set to
+statusCode and the string version of the code is sent as the response body.
+
+### `sendFile` [![][doc-badge]](https://tinyhttp.v1rtl.site/docs#ressendfile)
+
+Sends a file by piping a stream to response. It also checks for extension to set
+a proper `Content-Type` header.
+
+> Path argument must be absolute. To use a relative path, specify the `root`
+> option first.
+
+##### Example
+
+```js
+res.sendFile('song.mp3', { root: process.cwd() }, (err) => console.log(err))
+```
+
+## Example
+
+```js
+import { createServer } from 'node:http'
+import { send } from '@tinyhttp/send'
+
+createServer((req, res) => send(req, res)('Hello World')).listen(3000)
+```
+
+[npm-badge]: https://img.shields.io/npm/v/@tinyhttp/send?style=flat-square
+[dl-badge]: https://img.shields.io/npm/dt/@tinyhttp/send?style=flat-square
+[web-badge]: https://img.shields.io/badge/website-visit-hotpink?style=flat-square
+[doc-badge]: https://img.shields.io/badge/-docs-hotpink?style=flat-square
diff --git a/be/node_modules/@tinyhttp/send/dist/index.d.ts b/be/node_modules/@tinyhttp/send/dist/index.d.ts
new file mode 100644
index 000000000..9149ca347
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/index.d.ts
@@ -0,0 +1,6 @@
+export * from './json.js';
+export * from './send.js';
+export * from './sendStatus.js';
+export * from './status.js';
+export * from './sendFile.js';
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/index.d.ts.map b/be/node_modules/@tinyhttp/send/dist/index.d.ts.map
new file mode 100644
index 000000000..f71d6850d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/index.js b/be/node_modules/@tinyhttp/send/dist/index.js
new file mode 100644
index 000000000..aab51fc3e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/index.js
@@ -0,0 +1,6 @@
+export * from './json.js';
+export * from './send.js';
+export * from './sendStatus.js';
+export * from './status.js';
+export * from './sendFile.js';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/index.js.map b/be/node_modules/@tinyhttp/send/dist/index.js.map
new file mode 100644
index 000000000..04cd23d23
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/json.d.ts b/be/node_modules/@tinyhttp/send/dist/json.d.ts
new file mode 100644
index 000000000..26118946e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/json.d.ts
@@ -0,0 +1,9 @@
+import type { ServerResponse as S } from 'node:http';
+type Res = Pick;
+/**
+ * Respond with stringified JSON object
+ * @param res Response
+ */
+export declare const json: (res: Response) => (body: any, ...args: any[]) => Response;
+export {};
+//# sourceMappingURL=json.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/json.d.ts.map b/be/node_modules/@tinyhttp/send/dist/json.d.ts.map
new file mode 100644
index 000000000..101f242ff
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/json.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,CAAC,EAAE,MAAM,WAAW,CAAA;AAEpD,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,cAAc,CAAC,CAAA;AAExD;;;GAGG;AACH,eAAO,MAAM,IAAI,GACd,QAAQ,SAAS,GAAG,aAAa,QAAQ,YACnC,GAAG,WAAW,GAAG,EAAE,KAAG,QAY5B,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/json.js b/be/node_modules/@tinyhttp/send/dist/json.js
new file mode 100644
index 000000000..595c6b620
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/json.js
@@ -0,0 +1,18 @@
+/**
+ * Respond with stringified JSON object
+ * @param res Response
+ */
+export const json = (res) => (body, ...args) => {
+ res.setHeader('Content-Type', 'application/json');
+ if ((typeof body === 'number' || typeof body === 'boolean' || typeof body === 'object') && body != null)
+ res.end(JSON.stringify(body, null, 2), ...args);
+ else if (typeof body === 'string')
+ res.end(body, ...args);
+ else {
+ res.removeHeader('Content-Length');
+ res.removeHeader('Transfer-Encoding');
+ res.end(null, ...args);
+ }
+ return res;
+};
+//# sourceMappingURL=json.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/json.js.map b/be/node_modules/@tinyhttp/send/dist/json.js.map
new file mode 100644
index 000000000..afa8ec5b8
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/json.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GACf,CAA6B,GAAa,EAAE,EAAE,CAC9C,CAAC,IAAS,EAAE,GAAG,IAAW,EAAY,EAAE;IACtC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAA;IACjD,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI,IAAI,IAAI;QACrG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;SAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;SACpD,CAAC;QACJ,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;QAClC,GAAG,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAA;QACrC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/send.d.ts b/be/node_modules/@tinyhttp/send/dist/send.d.ts
new file mode 100644
index 000000000..f17589666
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/send.d.ts
@@ -0,0 +1,19 @@
+import type { IncomingMessage as I, ServerResponse as S } from 'node:http';
+type Req = Pick & {
+ fresh?: boolean;
+};
+type Res = Pick;
+/**
+ * Sends the HTTP response.
+ *
+ * The body parameter can be a Buffer object, a string, an object, or an array.
+ *
+ * This method performs many useful tasks for simple non-streaming responses.
+ * For example, it automatically assigns the Content-Length HTTP response header field (unless previously defined) and provides automatic HEAD and HTTP cache freshness support.
+ *
+ * @param req Request
+ * @param res Response
+ */
+export declare const send: (req: Request, res: Response) => (body: any) => Response;
+export {};
+//# sourceMappingURL=send.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/send.d.ts.map b/be/node_modules/@tinyhttp/send/dist/send.d.ts.map
new file mode 100644
index 000000000..5da40372f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/send.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,EAAE,MAAM,WAAW,CAAA;AAI1E,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAElD,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,GAAG,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,CAAA;AAErF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI,GACd,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,aAAa,OAAO,OAAO,QAAQ,YAC5E,GAAG,KAAG,QA0DZ,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/send.js b/be/node_modules/@tinyhttp/send/dist/send.js
new file mode 100644
index 000000000..5fa9c2401
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/send.js
@@ -0,0 +1,73 @@
+import { json } from './json.js';
+import { createETag, setCharset } from './utils.js';
+/**
+ * Sends the HTTP response.
+ *
+ * The body parameter can be a Buffer object, a string, an object, or an array.
+ *
+ * This method performs many useful tasks for simple non-streaming responses.
+ * For example, it automatically assigns the Content-Length HTTP response header field (unless previously defined) and provides automatic HEAD and HTTP cache freshness support.
+ *
+ * @param req Request
+ * @param res Response
+ */
+export const send = (req, res) => (body) => {
+ let bodyToSend = body;
+ if (Buffer.isBuffer(body)) {
+ bodyToSend = body;
+ }
+ else if (typeof body === 'object' && body !== null) {
+ // in case of object - turn it to json
+ bodyToSend = JSON.stringify(body, null, 2);
+ }
+ else if (typeof body === 'string') {
+ // reflect this in content-type
+ const type = res.getHeader('Content-Type');
+ if (type && typeof type === 'string') {
+ res.setHeader('Content-Type', setCharset(type, 'utf-8'));
+ }
+ else
+ res.setHeader('Content-Type', setCharset('text/html', 'utf-8'));
+ }
+ // Set encoding
+ const encoding = 'utf8';
+ // populate ETag
+ let etag;
+ if (body && !res.getHeader('etag') && (etag = createETag(bodyToSend, encoding))) {
+ res.setHeader('etag', etag);
+ }
+ // freshness
+ if (req.fresh)
+ res.statusCode = 304;
+ // strip irrelevant headers
+ if (res.statusCode === 204 || res.statusCode === 304) {
+ res.removeHeader('Content-Type');
+ res.removeHeader('Content-Length');
+ res.removeHeader('Transfer-Encoding');
+ bodyToSend = '';
+ }
+ if (req.method === 'HEAD') {
+ res.end('');
+ return res;
+ }
+ if (typeof body === 'object') {
+ if (body == null) {
+ res.end('');
+ return res;
+ }
+ if (Buffer.isBuffer(body)) {
+ if (!res.getHeader('Content-Type'))
+ res.setHeader('content-type', 'application/octet-stream');
+ res.end(bodyToSend);
+ }
+ else
+ json(res)(bodyToSend, encoding);
+ }
+ else {
+ if (typeof bodyToSend !== 'string')
+ bodyToSend = bodyToSend.toString();
+ res.end(bodyToSend, encoding);
+ }
+ return res;
+};
+//# sourceMappingURL=send.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/send.js.map b/be/node_modules/@tinyhttp/send/dist/send.js.map
new file mode 100644
index 000000000..c66080034
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/send.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"send.js","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendFile.d.ts b/be/node_modules/@tinyhttp/send/dist/sendFile.d.ts
new file mode 100644
index 000000000..0bf67409a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendFile.d.ts
@@ -0,0 +1,39 @@
+import type { IncomingMessage as I, ServerResponse as S } from 'node:http';
+export type ReadStreamOptions = Partial<{
+ flags: string;
+ encoding: BufferEncoding;
+ fd: number;
+ mode: number;
+ autoClose: boolean;
+ emitClose: boolean;
+ start: number;
+ end: number;
+ highWaterMark: number;
+}>;
+export type SendFileOptions = ReadStreamOptions & Partial<{
+ root: string;
+ headers: Record;
+ caching: Partial<{
+ maxAge: number;
+ immutable: boolean;
+ }>;
+}>;
+export type Caching = Partial<{
+ maxAge: number;
+ immutable: boolean;
+}>;
+type Req = Pick;
+type Res = Pick & NodeJS.WritableStream;
+export declare const enableCaching: (res: Res, caching: Caching) => void;
+/**
+ * Sends a file by piping a stream to response.
+ *
+ * It also checks for extension to set a proper `Content-Type` header.
+ *
+ * Path argument must be absolute. To use a relative path, specify the `root` option first.
+ *
+ * @param res Response
+ */
+export declare const sendFile: (req: Request, res: Response) => (path: string, opts?: SendFileOptions, cb?: (err?: any) => void) => Response;
+export {};
+//# sourceMappingURL=sendFile.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendFile.d.ts.map b/be/node_modules/@tinyhttp/send/dist/sendFile.d.ts.map
new file mode 100644
index 000000000..2f0a701c9
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendFile.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"sendFile.d.ts","sourceRoot":"","sources":["../src/sendFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,EAAE,MAAM,WAAW,CAAA;AAM1E,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,cAAc,CAAA;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAC7C,OAAO,CAAC;IACN,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE,OAAO,CAAA;KACnB,CAAC,CAAA;CACH,CAAC,CAAA;AAEJ,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;CACnB,CAAC,CAAA;AAEF,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;AAE7B,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC,cAAc,CAAA;AAElG,eAAO,MAAM,aAAa,QAAS,GAAG,WAAW,OAAO,KAAG,IAM1D,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,GAClB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,aAAa,OAAO,OAAO,QAAQ,YAC5E,MAAM,SAAQ,eAAe,OAAY,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,KAAG,QAqDrE,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendFile.js b/be/node_modules/@tinyhttp/send/dist/sendFile.js
new file mode 100644
index 000000000..77073953d
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendFile.js
@@ -0,0 +1,67 @@
+import { createReadStream, statSync } from 'node:fs';
+import { extname, isAbsolute } from 'node:path';
+import { join } from 'node:path';
+import mime from 'mime';
+import { createETag } from './utils.js';
+export const enableCaching = (res, caching) => {
+ let cc = caching.maxAge != null && `public,max-age=${caching.maxAge}`;
+ if (cc && caching.immutable)
+ cc += ',immutable';
+ else if (cc && caching.maxAge === 0)
+ cc += ',must-revalidate';
+ if (cc)
+ res.setHeader('Cache-Control', cc);
+};
+/**
+ * Sends a file by piping a stream to response.
+ *
+ * It also checks for extension to set a proper `Content-Type` header.
+ *
+ * Path argument must be absolute. To use a relative path, specify the `root` option first.
+ *
+ * @param res Response
+ */
+export const sendFile = (req, res) => (path, opts = {}, cb) => {
+ const { root, headers = {}, encoding = 'utf-8', caching, ...options } = opts;
+ if (!isAbsolute(path) && !root)
+ throw new TypeError('path must be absolute');
+ if (caching)
+ enableCaching(res, caching);
+ const filePath = root ? join(root, path) : path;
+ const stats = statSync(filePath);
+ headers['Content-Encoding'] = encoding;
+ headers['Last-Modified'] = stats.mtime.toUTCString();
+ headers.ETag = createETag(stats, encoding);
+ if (!res.getHeader('Content-Type'))
+ headers['Content-Type'] = `${mime.getType(extname(path))}; charset=utf-8`;
+ let status = res.statusCode || 200;
+ if (req.headers.range) {
+ status = 206;
+ const [x, y] = req.headers.range.replace('bytes=', '').split('-');
+ const end = (options.end = Number.parseInt(y, 10) || stats.size - 1);
+ const start = (options.start = Number.parseInt(x, 10) || 0);
+ if (start >= stats.size || end >= stats.size) {
+ res
+ .writeHead(416, {
+ 'Content-Range': `bytes */${stats.size}`
+ })
+ .end();
+ return res;
+ }
+ headers['Content-Range'] = `bytes ${start}-${end}/${stats.size}`;
+ headers['Content-Length'] = end - start + 1;
+ headers['Accept-Ranges'] = 'bytes';
+ }
+ else {
+ headers['Content-Length'] = stats.size;
+ }
+ for (const [k, v] of Object.entries(headers))
+ res.setHeader(k, v);
+ res.writeHead(status, headers);
+ const stream = createReadStream(filePath, options);
+ if (cb)
+ stream.on('error', (err) => cb(err)).on('end', () => cb());
+ stream.pipe(res);
+ return res;
+};
+//# sourceMappingURL=sendFile.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendFile.js.map b/be/node_modules/@tinyhttp/send/dist/sendFile.js.map
new file mode 100644
index 000000000..379f4fa26
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendFile.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sendFile.js","sourceRoot":"","sources":["../src/sendFile.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendStatus.d.ts b/be/node_modules/@tinyhttp/send/dist/sendStatus.d.ts
new file mode 100644
index 000000000..9e2932934
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendStatus.d.ts
@@ -0,0 +1,14 @@
+import type { IncomingMessage as I, ServerResponse as S } from 'node:http';
+type Req = Pick;
+type Res = Pick;
+/**
+ * Sets the response HTTP status code to statusCode and send its string representation as the response body.
+ *
+ * If an unsupported status code is specified, the HTTP status is still set to statusCode and the string version of the code is sent as the response body.
+ *
+ * @param req Request
+ * @param res Response
+ */
+export declare const sendStatus: (req: Request, res: Response) => (statusCode: number) => Response;
+export {};
+//# sourceMappingURL=sendStatus.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendStatus.d.ts.map b/be/node_modules/@tinyhttp/send/dist/sendStatus.d.ts.map
new file mode 100644
index 000000000..b258de064
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendStatus.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"sendStatus.d.ts","sourceRoot":"","sources":["../src/sendStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,EAAE,MAAM,WAAW,CAAA;AAI1E,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;AAE5B,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,GAAG,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,CAAA;AAErF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GACpB,OAAO,SAAS,GAAG,QAAQ,QAAQ,SAAS,GAAG,aAAa,OAAO,OAAO,QAAQ,kBACtE,MAAM,KAAG,QAQrB,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendStatus.js b/be/node_modules/@tinyhttp/send/dist/sendStatus.js
new file mode 100644
index 000000000..679656f06
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendStatus.js
@@ -0,0 +1,17 @@
+import { STATUS_CODES } from 'node:http';
+import { send } from './send.js';
+/**
+ * Sets the response HTTP status code to statusCode and send its string representation as the response body.
+ *
+ * If an unsupported status code is specified, the HTTP status is still set to statusCode and the string version of the code is sent as the response body.
+ *
+ * @param req Request
+ * @param res Response
+ */
+export const sendStatus = (req, res) => (statusCode) => {
+ const body = STATUS_CODES[statusCode] || String(statusCode);
+ res.statusCode = statusCode;
+ res.setHeader('Content-Type', 'text/plain');
+ return send(req, res)(body);
+};
+//# sourceMappingURL=sendStatus.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/sendStatus.js.map b/be/node_modules/@tinyhttp/send/dist/sendStatus.js.map
new file mode 100644
index 000000000..e3f8edf4a
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/sendStatus.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sendStatus.js","sourceRoot":"","sources":["../src/sendStatus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAMhC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GACrB,CAAwD,GAAY,EAAE,GAAa,EAAE,EAAE,CACvF,CAAC,UAAkB,EAAY,EAAE;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAA;IAE3D,GAAG,CAAC,UAAU,GAAG,UAAU,CAAA;IAE3B,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;IAE3C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/status.d.ts b/be/node_modules/@tinyhttp/send/dist/status.d.ts
new file mode 100644
index 000000000..3be874512
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/status.d.ts
@@ -0,0 +1,10 @@
+import type { ServerResponse } from 'node:http';
+type Res = Pick;
+/**
+ * Sets the HTTP status for the response. It is a chainable alias of Node’s `response.statusCode`.
+ *
+ * @param res Response
+ */
+export declare const status: (res: Response) => (status: number) => Response;
+export {};
+//# sourceMappingURL=status.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/status.d.ts.map b/be/node_modules/@tinyhttp/send/dist/status.d.ts.map
new file mode 100644
index 000000000..498cccded
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/status.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/C,KAAK,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;AAE7C;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAChB,QAAQ,SAAS,GAAG,aAAa,QAAQ,cACjC,MAAM,KAAG,QAIjB,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/status.js b/be/node_modules/@tinyhttp/send/dist/status.js
new file mode 100644
index 000000000..90775cb03
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/status.js
@@ -0,0 +1,10 @@
+/**
+ * Sets the HTTP status for the response. It is a chainable alias of Node’s `response.statusCode`.
+ *
+ * @param res Response
+ */
+export const status = (res) => (status) => {
+ res.statusCode = status;
+ return res;
+};
+//# sourceMappingURL=status.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/status.js.map b/be/node_modules/@tinyhttp/send/dist/status.js.map
new file mode 100644
index 000000000..95516590c
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/status.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GACjB,CAA6B,GAAa,EAAE,EAAE,CAC9C,CAAC,MAAc,EAAY,EAAE;IAC3B,GAAG,CAAC,UAAU,GAAG,MAAM,CAAA;IAEvB,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/utils.d.ts b/be/node_modules/@tinyhttp/send/dist/utils.d.ts
new file mode 100644
index 000000000..b1e92bfbc
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/utils.d.ts
@@ -0,0 +1,4 @@
+import { Stats } from 'node:fs';
+export declare const createETag: (body: Buffer | string | Stats, encoding: BufferEncoding) => string;
+export declare function setCharset(type: string, charset: string): string;
+//# sourceMappingURL=utils.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/utils.d.ts.map b/be/node_modules/@tinyhttp/send/dist/utils.d.ts.map
new file mode 100644
index 000000000..4176974fe
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/utils.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAI/B,eAAO,MAAM,UAAU,SAAU,MAAM,GAAG,MAAM,GAAG,KAAK,YAAY,cAAc,KAAG,MAKpF,CAAA;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIhE"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/utils.js b/be/node_modules/@tinyhttp/send/dist/utils.js
new file mode 100644
index 000000000..081a8f74e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/utils.js
@@ -0,0 +1,15 @@
+import { Stats } from 'node:fs';
+import { format, parse } from '@tinyhttp/content-type';
+import { eTag } from '@tinyhttp/etag';
+export const createETag = (body, encoding) => {
+ if (body instanceof Stats) {
+ return eTag(body, { weak: true });
+ }
+ return eTag(!Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body, { weak: true });
+};
+export function setCharset(type, charset) {
+ const parsed = parse(type);
+ parsed.parameters.charset = charset;
+ return format(parsed);
+}
+//# sourceMappingURL=utils.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/dist/utils.js.map b/be/node_modules/@tinyhttp/send/dist/utils.js.map
new file mode 100644
index 000000000..052bc2e0e
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/dist/utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAErC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAA6B,EAAE,QAAwB,EAAU,EAAE;IAC5F,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AAC1F,CAAC,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CACzB;IAAC,MAAM,CAAC,UAAqC,CAAC,OAAO,GAAG,OAAO,CAAA;IAChE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/package.json b/be/node_modules/@tinyhttp/send/package.json
new file mode 100644
index 000000000..dcb564a64
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@tinyhttp/send",
+ "version": "2.2.3",
+ "type": "module",
+ "description": "json, send, sendFile, status and sendStatus methods for tinyhttp",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/res"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "res",
+ "send",
+ "send-file"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/content-type": "^0.1.4",
+ "mime": "4.0.4",
+ "@tinyhttp/etag": "2.1.2"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/send/tsconfig.tsbuildinfo b/be/node_modules/@tinyhttp/send/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..98d0db0ad
--- /dev/null
+++ b/be/node_modules/@tinyhttp/send/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.full.d.ts","./src/json.ts","./node_modules/@tinyhttp/content-type/dist/index.d.ts","./node_modules/@tinyhttp/etag/dist/index.d.ts","./src/utils.ts","./src/send.ts","./src/sendStatus.ts","./src/status.ts","./node_modules/mime/dist/src/Mime.d.ts","./node_modules/mime/dist/src/index.d.ts","./src/sendFile.ts","./src/index.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true},{"version":"0c9e4447ddca10e8097a736ce41bb37ac3389ede46e419ee78c1161a14e9e8ba","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"08f6861df84fba9719c14d5adc3ba40be9f0c687639e6c4df3c05b9301b8ff94",{"version":"90f037e06f410abfaf35ff03809ce826fcf951e2377067a8c7b69d42022b8ef6","signature":"d024fd1662145097aa85cb50ba1d351d73e7d94956a2dead04e0eaccbb0d6e12"},"1e8f2a913c86f7d7ab268eb6518442a5f96617ba618a69fc66921e5cf9d3b8f6","789ad3f91b6590c0380b8992c0302a4a8d970353bae6f1422909359c0ba507bc",{"version":"2efa3e2d8b37d77842fe9461aff969a38956878ad46f2c3cfaa13a91389b0910","signature":"bca07d8c80450386f3508fd4e1067d9104a4cb95133cbe37de0c022fd6cf9614"},{"version":"d961ab7f36df2d7c2321f7aed759c1d3903b0081b3cb4b090de0d77fe7cd8838","signature":"34b3738d71281e43ac8a7b12989d93490dbc61c389e7e6d8c571afb889414b63"},{"version":"c217a40c95f8419343bb22ee748a4b5e50b66760122e1666bb826e2028430916","signature":"0e3e1f9f499e76fb5e1ba301cbb1c5fd4c60f07c712b03de4f65bd12977d844e"},{"version":"24f422e318bf2f77c05663aa517e982bebcb9581b0203a4497f3471cf9cebd28","signature":"3f69b330ab1608bf9341cc08928a04e2b2f8d180c1f4606da594d50719a3af33"},"0ae65c3e977c81f6e46ae9028ae97fc75c78c70f4d6d5f961a8af60301145af6","b1a6683b821c624d63d887dbdd9f34aebb9de586acf87bbf50cb16f5ec2c36c7",{"version":"e39a10c35dde4fb1e802396593ade7e80d64ae7d5f85f9bec28d47963255174b","signature":"f69a1a89f01b427f03e246a0fb28945f0b1208874efd091a7f5274d78df5ab44"},{"version":"42e65843586640b20c9c9251aeb67a5cd2a598e5ddd04dd0c15b705e10b9cf08","signature":"c437bed60d16a0f5d00eb671291090662bdc8d43afdb7b327cb8eedb247c6cbd"},"2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419",{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true},"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36",{"version":"392eadc2af403dd10b4debfbc655c089a7fa6a9750caeb770cfb30051e55e848","affectsGlobalScope":true},"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6",{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"c48c503c6b3f63baf18257e9a87559b5602a4e960107c762586d2a6a62b64a18","affectsGlobalScope":true},"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},{"version":"1493cc4d72bfaabe2ac13e987d026a5fc99a816f6289bfca7192834a396205cf","affectsGlobalScope":true},"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b",{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true},"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900",{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true},"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927",{"version":"071d4b4af5755e1a081aa3b785b5526d09276af5a50e4725dea26edd4e7deb31","affectsGlobalScope":true},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true},"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0",{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true},"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c",{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true},"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc"],"root":[52,[55,58],61,62],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"module":99,"noImplicitAny":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"fileIdsList":[[63],[66],[67,72,101],[68,73,79,80,87,98,109],[68,69,79,87],[70,110],[71,72,80,88],[72,98,106],[73,75,79,87],[66,74],[75,76],[79],[77,79],[66,79],[79,80,81,98,109],[79,80,81,94,98,101],[67,114],[75,79,82,87,98,109],[79,80,82,83,87,98,106,109],[82,84,98,106,109],[63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116],[79,85],[86,109,114],[75,79,87,98],[88],[89],[66,90],[87,88,91,108,114],[92],[93],[79,94,95],[94,96,110,112],[67,79,98,99,100,101],[67,98,100],[98,99],[101],[102],[66,98],[79,104,105],[104,105],[72,87,98,106],[107],[87,108],[67,82,93,109],[72,110],[98,111],[86,112],[113],[67,72,79,81,90,98,109,112,114],[98,115],[82],[80],[59],[52,56,57,58,61],[52,55,82],[55,60,80,82,89],[56,82],[53,54,80]],"referencedMap":[[63,1],[64,1],[66,2],[67,3],[68,4],[69,5],[70,6],[71,7],[72,8],[73,9],[74,10],[75,11],[76,11],[78,12],[77,13],[79,14],[80,15],[81,16],[65,17],[82,18],[83,19],[84,20],[117,21],[85,22],[86,23],[87,24],[88,25],[89,26],[90,27],[91,28],[92,29],[93,30],[94,31],[95,31],[96,32],[98,33],[100,34],[99,35],[101,36],[102,37],[103,38],[104,39],[105,40],[106,41],[107,42],[108,43],[109,44],[110,45],[111,46],[112,47],[113,48],[114,49],[115,50],[53,51],[54,52],[60,53],[62,54],[52,51],[56,55],[61,56],[57,57],[58,51],[55,58]],"latestChangedDtsFile":"./dist/index.d.ts"},"version":"5.5.4"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/type-is/LICENSE b/be/node_modules/@tinyhttp/type-is/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/type-is/README.md b/be/node_modules/@tinyhttp/type-is/README.md
new file mode 100644
index 000000000..066efb4c6
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/README.md
@@ -0,0 +1,11 @@
+# @tinyhttp/type-is
+
+> [`type-is`](https://github.com/jshttp/type-is) rewrite in TypeScript.
+
+Infer the content-type of a request.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/type-is
+```
diff --git a/be/node_modules/@tinyhttp/type-is/dist/index.d.ts b/be/node_modules/@tinyhttp/type-is/dist/index.d.ts
new file mode 100644
index 000000000..00f0c2465
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/dist/index.d.ts
@@ -0,0 +1,8 @@
+/**
+ * Compare a `value` content-type with `types`.
+ * Each `type` can be an extension like `html`,
+ * a special shortcut like `multipart` or `urlencoded`,
+ * or a mime type.
+ */
+export declare const typeIs: (value: string, ...types: string[]) => string | false;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/type-is/dist/index.d.ts.map b/be/node_modules/@tinyhttp/type-is/dist/index.d.ts.map
new file mode 100644
index 000000000..79dd00295
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgEA;;;;;GAKG;AACH,eAAO,MAAM,MAAM,UAAW,MAAM,YAAY,MAAM,EAAE,mBAoBvD,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/type-is/dist/index.js b/be/node_modules/@tinyhttp/type-is/dist/index.js
new file mode 100644
index 000000000..06c0ce773
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/dist/index.js
@@ -0,0 +1,82 @@
+import * as typer from '@tinyhttp/content-type';
+import mime from 'mime';
+function normalizeType(value) {
+ // parse the type
+ const type = typer.parse(value);
+ type.parameters = {};
+ // reformat it
+ return typer.format(type);
+}
+function tryNormalizeType(value) {
+ if (!value)
+ return null;
+ try {
+ return normalizeType(value);
+ }
+ catch (err) {
+ return null;
+ }
+}
+function mimeMatch(expected, actual) {
+ // invalid type
+ if (expected === false)
+ return false;
+ // split types
+ const actualParts = actual.split('/');
+ const expectedParts = expected.split('/');
+ // invalid format
+ if (actualParts.length !== 2 || expectedParts.length !== 2)
+ return false;
+ // validate type
+ if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0])
+ return false;
+ // validate suffix wildcard
+ if (expectedParts[1].slice(0, 2) === '*+')
+ return (expectedParts[1].length <= actualParts[1].length + 1 &&
+ expectedParts[1].slice(1) === actualParts[1].slice(1 - expectedParts[1].length));
+ // validate subtype
+ if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1])
+ return false;
+ return true;
+}
+function normalize(type) {
+ // invalid type
+ if (typeof type !== 'string')
+ return false;
+ switch (type) {
+ case 'urlencoded':
+ return 'application/x-www-form-urlencoded';
+ case 'multipart':
+ return 'multipart/*';
+ }
+ // "+json" -> "*/*+json" expando
+ if (type[0] === '+')
+ return `*/*${type}`;
+ return type.indexOf('/') === -1 ? mime.getType(type) : type;
+}
+/**
+ * Compare a `value` content-type with `types`.
+ * Each `type` can be an extension like `html`,
+ * a special shortcut like `multipart` or `urlencoded`,
+ * or a mime type.
+ */
+export const typeIs = (value, ...types) => {
+ let i;
+ // remove parameters and normalize
+ const val = tryNormalizeType(value);
+ // no type or invalid
+ if (!val)
+ return false;
+ // no types, return the content type
+ if (!types || !types.length)
+ return val;
+ let type;
+ for (i = 0; i < types.length; i++) {
+ if (mimeMatch(normalize((type = types[i])), val)) {
+ return type[0] === '+' || type.indexOf('*') !== -1 ? val : type;
+ }
+ }
+ // no matches
+ return false;
+};
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/type-is/dist/index.js.map b/be/node_modules/@tinyhttp/type-is/dist/index.js.map
new file mode 100644
index 000000000..46b435535
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/type-is/package.json b/be/node_modules/@tinyhttp/type-is/package.json
new file mode 100644
index 000000000..4205fd2ac
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@tinyhttp/type-is",
+ "version": "2.2.4",
+ "type": "module",
+ "description": "TypeScript rewrite of type-is with CJS and ESM targets",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/type-is"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "req",
+ "request",
+ "type-is",
+ "javascript"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "dependencies": {
+ "@tinyhttp/content-type": "^0.1.4",
+ "mime": "4.0.4"
+ },
+ "scripts": {
+ "build": "tsc"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/type-is/tsconfig.tsbuildinfo b/be/node_modules/@tinyhttp/type-is/tsconfig.tsbuildinfo
new file mode 100644
index 000000000..90743b215
--- /dev/null
+++ b/be/node_modules/@tinyhttp/type-is/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"program":{"fileNames":["../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.5.4/node_modules/typescript/lib/lib.es2019.full.d.ts","./node_modules/@tinyhttp/content-type/dist/index.d.ts","./node_modules/mime/dist/src/Mime.d.ts","./node_modules/mime/dist/src/index.d.ts","./src/index.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true},{"version":"0c9e4447ddca10e8097a736ce41bb37ac3389ede46e419ee78c1161a14e9e8ba","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"08f6861df84fba9719c14d5adc3ba40be9f0c687639e6c4df3c05b9301b8ff94","1e8f2a913c86f7d7ab268eb6518442a5f96617ba618a69fc66921e5cf9d3b8f6","0ae65c3e977c81f6e46ae9028ae97fc75c78c70f4d6d5f961a8af60301145af6","b1a6683b821c624d63d887dbdd9f34aebb9de586acf87bbf50cb16f5ec2c36c7",{"version":"290cec17efb9c1ade3000e6419ccd604e6b2edf699923069ce0aae57f55a9226","signature":"bac5dca8b793a75e1520e2d6951d4daa604e5fc1a4dc0e97cd6f501699425127"},"2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419",{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true},"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36",{"version":"392eadc2af403dd10b4debfbc655c089a7fa6a9750caeb770cfb30051e55e848","affectsGlobalScope":true},"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6",{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"c48c503c6b3f63baf18257e9a87559b5602a4e960107c762586d2a6a62b64a18","affectsGlobalScope":true},"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},{"version":"1493cc4d72bfaabe2ac13e987d026a5fc99a816f6289bfca7192834a396205cf","affectsGlobalScope":true},"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b",{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true},"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900",{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true},"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927",{"version":"071d4b4af5755e1a081aa3b785b5526d09276af5a50e4725dea26edd4e7deb31","affectsGlobalScope":true},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true},"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0",{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true},"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c",{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true},"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc"],"root":[55],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"module":99,"noImplicitAny":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":6},"fileIdsList":[[56],[59],[60,65,94],[61,66,72,73,80,91,102],[61,62,72,80],[63,103],[64,65,73,81],[65,91,99],[66,68,72,80],[59,67],[68,69],[72],[70,72],[59,72],[72,73,74,91,102],[72,73,74,87,91,94],[60,107],[68,72,75,80,91,102],[72,73,75,76,80,91,99,102],[75,77,91,99,102],[56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109],[72,78],[79,102,107],[68,72,80,91],[81],[82],[59,83],[80,81,84,101,107],[85],[86],[72,87,88],[87,89,103,105],[60,72,91,92,93,94],[60,91,93],[91,92],[94],[95],[59,91],[72,97,98],[97,98],[65,80,91,99],[100],[80,101],[60,75,86,102],[65,103],[91,104],[79,105],[106],[60,65,72,74,83,91,102,105,107],[91,108],[75],[53],[52,54]],"referencedMap":[[56,1],[57,1],[59,2],[60,3],[61,4],[62,5],[63,6],[64,7],[65,8],[66,9],[67,10],[68,11],[69,11],[71,12],[70,13],[72,14],[73,15],[74,16],[58,17],[75,18],[76,19],[77,20],[110,21],[78,22],[79,23],[80,24],[81,25],[82,26],[83,27],[84,28],[85,29],[86,30],[87,31],[88,31],[89,32],[91,33],[93,34],[92,35],[94,36],[95,37],[96,38],[97,39],[98,40],[99,41],[100,42],[101,43],[102,44],[103,45],[104,46],[105,47],[106,48],[107,49],[108,50],[52,51],[54,52],[55,53]],"latestChangedDtsFile":"./dist/index.d.ts"},"version":"5.5.4"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/url/LICENSE b/be/node_modules/@tinyhttp/url/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/url/README.md b/be/node_modules/@tinyhttp/url/README.md
new file mode 100644
index 000000000..603038e11
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/README.md
@@ -0,0 +1,15 @@
+# @tinyhttp/req
+
+[![npm (scoped)][npm-badge]](https://npmjs.com/package/@tinyhttp/req) [![npm][dl-badge]](https://npmjs.com/package/@tinyhttp/req) [![][web-badge]](https://tinyhttp.v1rtl.site/mw/req)
+
+URL extensions for to parse query parameters, URL parameters, and more.
+
+## Install
+
+```sh
+pnpm i @tinyhttp/url
+```
+
+[npm-badge]: https://img.shields.io/npm/v/@tinyhttp/req?style=flat-square
+[dl-badge]: https://img.shields.io/npm/dt/@tinyhttp/req?style=flat-square
+[web-badge]: https://img.shields.io/badge/website-visit-hotpink?style=flat-square
diff --git a/be/node_modules/@tinyhttp/url/dist/index.d.ts b/be/node_modules/@tinyhttp/url/dist/index.d.ts
new file mode 100644
index 000000000..4870cda57
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/dist/index.d.ts
@@ -0,0 +1,14 @@
+///
+import { ParsedUrlQuery } from 'node:querystring';
+type Regex = {
+ keys: string[] | false;
+ pattern: RegExp;
+};
+export declare const getURLParams: ({ pattern, keys }: Regex, reqUrl?: string) => URLParams;
+export type URLParams = {
+ [key: string]: string;
+};
+export declare const getPathname: (url: string) => string;
+export declare const getQueryParams: (url?: string) => ParsedUrlQuery;
+export {};
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/url/dist/index.d.ts.map b/be/node_modules/@tinyhttp/url/dist/index.d.ts.map
new file mode 100644
index 000000000..47940c8cc
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAS,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAExD,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,YAAY,sBAAuB,KAAK,sBAAiB,SAarE,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB,CAAA;AAOD,eAAO,MAAM,WAAW,QAAS,MAAM,KAAG,MAA0C,CAAA;AAEpF,eAAO,MAAM,cAAc,oBAAgB,cAA0D,CAAA"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/url/dist/index.js b/be/node_modules/@tinyhttp/url/dist/index.js
new file mode 100644
index 000000000..e67409a27
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/dist/index.js
@@ -0,0 +1,24 @@
+import { parse } from "node:querystring";
+const getURLParams = ({ pattern, keys }, reqUrl = "/") => {
+ const matches = pattern.exec(reqUrl);
+ const params = {};
+ if (matches && typeof keys !== "boolean")
+ for (let i = 0; i < keys.length; i++) {
+ if (matches[i + 1]) {
+ params[keys[i]] = decodeURIComponent(matches[i + 1]);
+ }
+ }
+ return params;
+};
+const getQueryIndex = (url) => {
+ const index = url.indexOf("?");
+ return index === -1 ? url.length : index;
+};
+const getPathname = (url) => url.slice(0, getQueryIndex(url));
+const getQueryParams = (url = "/") => parse(url.slice(getQueryIndex(url) + 1));
+export {
+ getPathname,
+ getQueryParams,
+ getURLParams
+};
+//# sourceMappingURL=index.js.map
diff --git a/be/node_modules/@tinyhttp/url/dist/index.js.map b/be/node_modules/@tinyhttp/url/dist/index.js.map
new file mode 100644
index 000000000..24d8c8bf9
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { parse, ParsedUrlQuery } from 'node:querystring'\n\ntype Regex = {\n keys: string[] | false\n pattern: RegExp\n}\n\nexport const getURLParams = ({ pattern, keys }: Regex, reqUrl = '/'): URLParams => {\n const matches = pattern.exec(reqUrl)\n\n const params = {}\n\n if (matches && typeof keys !== 'boolean')\n for (let i = 0; i < keys.length; i++) {\n if (matches[i + 1]) {\n params[keys[i]] = decodeURIComponent(matches[i + 1])\n }\n }\n\n return params\n}\n\nexport type URLParams = {\n [key: string]: string\n}\n\nconst getQueryIndex = (url: string): number => {\n const index = url.indexOf('?')\n return index === -1 ? url.length : index\n}\n\nexport const getPathname = (url: string): string => url.slice(0, getQueryIndex(url))\n\nexport const getQueryParams = (url = '/'): ParsedUrlQuery => parse(url.slice(getQueryIndex(url) + 1))\n"],"names":[],"mappings":";AAOO,MAAM,eAAe,CAAC,EAAE,SAAS,KAAK,GAAU,SAAS,QAAmB;AAC3E,QAAA,UAAU,QAAQ,KAAK,MAAM;AAEnC,QAAM,SAAS,CAAA;AAEX,MAAA,WAAW,OAAO,SAAS;AAC7B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAChC,UAAA,QAAQ,IAAI,CAAC,GAAG;AACX,eAAA,KAAK,CAAC,CAAC,IAAI,mBAAmB,QAAQ,IAAI,CAAC,CAAC;AAAA,MACrD;AAAA,IACF;AAEK,SAAA;AACT;AAMA,MAAM,gBAAgB,CAAC,QAAwB;AACvC,QAAA,QAAQ,IAAI,QAAQ,GAAG;AACtB,SAAA,UAAU,KAAK,IAAI,SAAS;AACrC;AAEa,MAAA,cAAc,CAAC,QAAwB,IAAI,MAAM,GAAG,cAAc,GAAG,CAAC;AAEtE,MAAA,iBAAiB,CAAC,MAAM,QAAwB,MAAM,IAAI,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC;"}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/url/package.json b/be/node_modules/@tinyhttp/url/package.json
new file mode 100644
index 000000000..4874c4000
--- /dev/null
+++ b/be/node_modules/@tinyhttp/url/package.json
@@ -0,0 +1,38 @@
+{
+ "name": "@tinyhttp/url",
+ "version": "2.1.1",
+ "type": "module",
+ "description": "URL extensions for tinyhttp",
+ "homepage": "https://tinyhttp.v1rtl.site",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tinyhttp/tinyhttp.git",
+ "directory": "packages/url"
+ },
+ "types": "./dist/index.d.ts",
+ "exports": "./dist/index.js",
+ "keywords": [
+ "tinyhttp",
+ "node.js",
+ "web framework",
+ "web",
+ "backend",
+ "req",
+ "request",
+ "url",
+ "params",
+ "query"
+ ],
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "author": "v1rtl",
+ "license": "MIT",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/@tinyhttp/vary/LICENSE b/be/node_modules/@tinyhttp/vary/LICENSE
new file mode 100644
index 000000000..9b450a079
--- /dev/null
+++ b/be/node_modules/@tinyhttp/vary/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 v 1 r t l
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/be/node_modules/@tinyhttp/vary/README.md b/be/node_modules/@tinyhttp/vary/README.md
new file mode 100644
index 000000000..9d3f4bfa4
--- /dev/null
+++ b/be/node_modules/@tinyhttp/vary/README.md
@@ -0,0 +1,77 @@
+# @tinyhttp/vary
+
+[![Version][v-badge-url]][npm-url] [![Downloads][dl-badge-url]][npm-url] [![GitHub Workflow Status][gh-actions-img]][github-actions] [![Codecov][cov-badge-url]][cov-url]
+
+> [`vary`](https://github.com/jshttp/vary) rewrite in TypeScript with ESM and CommonJS targets
+
+Manipulate the HTTP Vary header
+
+## Install
+
+```sh
+pnpm i @tinyhttp/vary
+```
+
+## API
+
+```ts
+import { vary, append } from '@tinyhttp/vary'
+```
+
+### `vary(res, field)`
+
+Adds the given header `field` to the `Vary` response header of `res`.
+This can be a string of a single field, a string of a valid `Vary`
+header, or an array of multiple fields.
+
+This will append the header if not already listed, otherwise leaves
+it listed in the current location.
+
+```ts
+vary(res, 'Origin')
+```
+
+### `append(header, field)`
+
+Adds the given header `field` to the `Vary` response header string `header`.
+This can be a string of a single field, a string of a valid `Vary` header,
+or an array of multiple fields.
+
+This will append the header if not already listed, otherwise leaves
+it listed in the current location. The new header string is returned.
+
+```ts
+// Get header string appending "Origin" to "Accept, User-Agent"
+append('Accept, User-Agent', 'Origin')
+```
+
+## Examples
+
+```ts
+import { createServer } from 'node:http'
+import { vary } from '@tinyhttp/vary'
+
+createServer((req, res) => {
+ // about to user-agent sniff
+ vary(res, 'User-Agent')
+
+ const ua = req.headers['user-agent'] || ''
+ const isMobile = /mobi|android|touch|mini/i.test(ua)
+
+ // serve site, depending on isMobile
+ res.setHeader('Content-Type', 'text/html')
+ res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user')
+})
+```
+
+## License
+
+MIT © [v1rtl](https://v1rtl.site)
+
+[v-badge-url]: https://img.shields.io/npm/v/@tinyhttp/vary.svg?style=for-the-badge&color=FF69B4&label=&logo=npm
+[npm-url]: https://www.npmjs.com/package/@tinyhttp/vary
+[cov-badge-url]: https://img.shields.io/coveralls/github/tinyhttp/vary?style=for-the-badge&color=FF69B4
+[cov-url]: https://coveralls.io/github/tinyhttp/vary
+[dl-badge-url]: https://img.shields.io/npm/dt/@tinyhttp/vary?style=for-the-badge&color=FF69B4
+[github-actions]: https://github.com/tinyhttp/vary/actions
+[gh-actions-img]: https://img.shields.io/github/actions/workflow/status/tinyhttp/vary/main.yml?branch=master&style=for-the-badge&color=FF69B4&label=&logo=github
diff --git a/be/node_modules/@tinyhttp/vary/dist/index.d.ts b/be/node_modules/@tinyhttp/vary/dist/index.d.ts
new file mode 100644
index 000000000..390801b9f
--- /dev/null
+++ b/be/node_modules/@tinyhttp/vary/dist/index.d.ts
@@ -0,0 +1,9 @@
+import { ServerResponse } from 'node:http';
+
+declare function append(header: string, field: string | string[]): string;
+/**
+ * Mark that a request is varied on a header field.
+ */
+declare function vary(res: ServerResponse, field: string | string[]): void;
+
+export { append, vary };
diff --git a/be/node_modules/@tinyhttp/vary/dist/index.js b/be/node_modules/@tinyhttp/vary/dist/index.js
new file mode 100644
index 000000000..bfcba6155
--- /dev/null
+++ b/be/node_modules/@tinyhttp/vary/dist/index.js
@@ -0,0 +1 @@
+var FIELD_NAME_REGEXP=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;function parse(header){let end=0;const list=[];let start=0;for(let i=0,len=header.length;i=12.20"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/tinyhttp/vary.git"
+ },
+ "keywords": [
+ "http",
+ "esm",
+ "es",
+ "vary",
+ "nodejs",
+ "javascript"
+ ],
+ "files": [
+ "dist"
+ ],
+ "author": "v1rtl ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/tinyhttp/vary/issues"
+ },
+ "homepage": "https://github.com/tinyhttp/vary#readme",
+ "devDependencies": {
+ "@types/node": "^20.7.1",
+ "@typescript-eslint/eslint-plugin": "^6.7.3",
+ "@typescript-eslint/parser": "^6.7.3",
+ "c8": "^8.0.1",
+ "tsm": "^2.3.0",
+ "tsup": "^7.2.0",
+ "typescript": "^5.2.2",
+ "uvu": "^0.5.6"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "scripts": {
+ "build": "tsup src/index.ts --minify-whitespace --format esm --dts",
+ "test": "tsm node_modules/uvu/bin.js test",
+ "test:coverage": "c8 --include=src pnpm test",
+ "test:report": "c8 report --reporter=text-lcov > coverage.lcov"
+ }
+}
\ No newline at end of file
diff --git a/be/node_modules/chalk/license b/be/node_modules/chalk/license
new file mode 100644
index 000000000..fa7ceba3e
--- /dev/null
+++ b/be/node_modules/chalk/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus (https://sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/be/node_modules/chalk/package.json b/be/node_modules/chalk/package.json
new file mode 100644
index 000000000..c9e0dc52b
--- /dev/null
+++ b/be/node_modules/chalk/package.json
@@ -0,0 +1,83 @@
+{
+ "name": "chalk",
+ "version": "5.6.2",
+ "description": "Terminal string styling done right",
+ "license": "MIT",
+ "repository": "chalk/chalk",
+ "funding": "https://github.com/chalk/chalk?sponsor=1",
+ "type": "module",
+ "main": "./source/index.js",
+ "exports": "./source/index.js",
+ "imports": {
+ "#ansi-styles": "./source/vendor/ansi-styles/index.js",
+ "#supports-color": {
+ "node": "./source/vendor/supports-color/index.js",
+ "default": "./source/vendor/supports-color/browser.js"
+ }
+ },
+ "types": "./source/index.d.ts",
+ "sideEffects": false,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "scripts": {
+ "test": "xo && c8 ava && tsd",
+ "bench": "matcha benchmark.js"
+ },
+ "files": [
+ "source",
+ "!source/index.test-d.ts"
+ ],
+ "keywords": [
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "ansi",
+ "style",
+ "styles",
+ "tty",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "devDependencies": {
+ "@types/node": "^16.11.10",
+ "ava": "^3.15.0",
+ "c8": "^7.10.0",
+ "color-convert": "^2.0.1",
+ "execa": "^6.0.0",
+ "log-update": "^5.0.0",
+ "matcha": "^0.7.0",
+ "tsd": "^0.19.0",
+ "xo": "^0.57.0",
+ "yoctodelay": "^2.0.0"
+ },
+ "xo": {
+ "rules": {
+ "unicorn/prefer-string-slice": "off",
+ "@typescript-eslint/consistent-type-imports": "off",
+ "@typescript-eslint/consistent-type-exports": "off",
+ "@typescript-eslint/consistent-type-definitions": "off",
+ "unicorn/expiring-todo-comments": "off"
+ }
+ },
+ "c8": {
+ "reporter": [
+ "text",
+ "lcov"
+ ],
+ "exclude": [
+ "source/vendor"
+ ]
+ }
+}
diff --git a/be/node_modules/chalk/readme.md b/be/node_modules/chalk/readme.md
new file mode 100644
index 000000000..5754e7cef
--- /dev/null
+++ b/be/node_modules/chalk/readme.md
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+> Terminal string styling done right
+
+[](https://codecov.io/gh/chalk/chalk)
+[](https://www.npmjs.com/package/chalk?activeTab=dependents)
+[](https://www.npmjs.com/package/chalk)
+
+
+
+## Info
+
+- [Why not switch to a smaller coloring package?](https://github.com/chalk/chalk?tab=readme-ov-file#why-not-switch-to-a-smaller-coloring-package)
+- See [yoctocolors](https://github.com/sindresorhus/yoctocolors) for a smaller alternative
+
+## Highlights
+
+- Expressive API
+- Highly performant
+- No dependencies
+- Ability to nest styles
+- [256/Truecolor color support](#256-and-truecolor-color-support)
+- Auto-detects color support
+- Doesn't extend `String.prototype`
+- Clean and focused
+- Actively maintained
+- [Used by ~115,000 packages](https://www.npmjs.com/browse/depended/chalk) as of July 4, 2024
+
+## Install
+
+```sh
+npm install chalk
+```
+
+**IMPORTANT:** Chalk 5 is ESM. If you want to use Chalk with TypeScript or a build tool, you will probably want to use Chalk 4 for now. [Read more.](https://github.com/chalk/chalk/releases/tag/v5.0.0)
+
+## Usage
+
+```js
+import chalk from 'chalk';
+
+console.log(chalk.blue('Hello world!'));
+```
+
+Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
+
+```js
+import chalk from 'chalk';
+
+const log = console.log;
+
+// Combine styled and normal strings
+log(chalk.blue('Hello') + ' World' + chalk.red('!'));
+
+// Compose multiple styles using the chainable API
+log(chalk.blue.bgRed.bold('Hello world!'));
+
+// Pass in multiple arguments
+log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
+
+// Nest styles
+log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
+
+// Nest styles of the same type even (color, underline, background)
+log(chalk.green(
+ 'I am a green line ' +
+ chalk.blue.underline.bold('with a blue substring') +
+ ' that becomes green again!'
+));
+
+// ES2015 template literal
+log(`
+CPU: ${chalk.red('90%')}
+RAM: ${chalk.green('40%')}
+DISK: ${chalk.yellow('70%')}
+`);
+
+// Use RGB colors in terminal emulators that support it.
+log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
+log(chalk.hex('#DEADED').bold('Bold gray!'));
+```
+
+Easily define your own themes:
+
+```js
+import chalk from 'chalk';
+
+const error = chalk.bold.red;
+const warning = chalk.hex('#FFA500'); // Orange color
+
+console.log(error('Error!'));
+console.log(warning('Warning!'));
+```
+
+Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):
+
+```js
+import chalk from 'chalk';
+
+const name = 'Sindre';
+console.log(chalk.green('Hello %s'), name);
+//=> 'Hello Sindre'
+```
+
+## API
+
+### chalk.`
+
+
+
+
+
+ ✧*。٩(ˊᗜˋ*)و✧*。
+ <% if (Object.keys(it.data).length===0) { %>
+ No resources found in JSON file
+ <% } %>
+ <% Object.entries(it.data).forEach(function([name]) { %>
+
+
+ /<%= name %>
+
+ <% if (Array.isArray(it.data[name])) { %>
+ - <%= it.data[name].length %>
+ <%= it.data[name].length> 1 ? 'items' : 'item' %>
+
+ <% } %>
+
+
+ <% }) %>
+
+
+
+