From 449d5e9f889743470ec1c6a8bad2a9e17f5490f0 Mon Sep 17 00:00:00 2001 From: Sarthak Date: Thu, 28 Aug 2025 15:08:34 +0530 Subject: [PATCH 01/22] Added client and server workflows for Github Actions --- .github/workflows/backend-dev.yml | 39 + .github/workflows/backend-prod.yml | 42 + .github/workflows/backend-staging.yml | 39 + .github/workflows/frontend-dev.yml | 59 + .github/workflows/frontend-prod.yml | 50 + .github/workflows/frontend-staging.yml | 51 + client | 1 - client/.gitignore | 41 + client/README.md | 36 + client/app/favicon.ico | Bin 0 -> 25931 bytes client/app/globals.css | 26 + client/app/home/page.tsx | 9 + client/app/layout.tsx | 34 + client/app/page.tsx | 103 + client/app/topics/[topic].tsx | 9 + client/component/PodcastCard.tsx | 9 + client/component/TopicsCard.tsx | 9 + client/eslint.config.mjs | 25 + client/next.config.ts | 7 + client/package-lock.json | 6454 +++++++++++++++++ client/package.json | 32 + client/postcss.config.mjs | 5 + client/public/file.svg | 1 + client/public/globe.svg | 1 + client/public/next.svg | 1 + client/public/vercel.svg | 1 + client/public/window.svg | 1 + client/services/api.ts | 0 client/tailwind.config.ts | 10 + client/tsconfig.json | 27 + server/.gitattributes | 2 + server/.gitignore | 33 + server/.mvn/wrapper/maven-wrapper.properties | 19 + server/mvnw | 259 + server/mvnw.cmd | 149 + server/pom.xml | 109 + .../com/example/podify/PodifyApplication.java | 13 + .../podify/PodifyApplicationTests.java | 13 + 38 files changed, 7718 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/backend-dev.yml create mode 100644 .github/workflows/backend-prod.yml create mode 100644 .github/workflows/backend-staging.yml create mode 100644 .github/workflows/frontend-dev.yml create mode 100644 .github/workflows/frontend-prod.yml create mode 100644 .github/workflows/frontend-staging.yml delete mode 160000 client create mode 100644 client/.gitignore create mode 100644 client/README.md create mode 100644 client/app/favicon.ico create mode 100644 client/app/globals.css create mode 100644 client/app/home/page.tsx create mode 100644 client/app/layout.tsx create mode 100644 client/app/page.tsx create mode 100644 client/app/topics/[topic].tsx create mode 100644 client/component/PodcastCard.tsx create mode 100644 client/component/TopicsCard.tsx create mode 100644 client/eslint.config.mjs create mode 100644 client/next.config.ts create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/postcss.config.mjs create mode 100644 client/public/file.svg create mode 100644 client/public/globe.svg create mode 100644 client/public/next.svg create mode 100644 client/public/vercel.svg create mode 100644 client/public/window.svg create mode 100644 client/services/api.ts create mode 100644 client/tailwind.config.ts create mode 100644 client/tsconfig.json create mode 100644 server/.gitattributes create mode 100644 server/.gitignore create mode 100644 server/.mvn/wrapper/maven-wrapper.properties create mode 100644 server/mvnw create mode 100644 server/mvnw.cmd create mode 100644 server/pom.xml create mode 100644 server/src/main/java/com/example/podify/PodifyApplication.java create mode 100644 server/src/test/java/com/example/podify/PodifyApplicationTests.java diff --git a/.github/workflows/backend-dev.yml b/.github/workflows/backend-dev.yml new file mode 100644 index 0000000..87bbb9e --- /dev/null +++ b/.github/workflows/backend-dev.yml @@ -0,0 +1,39 @@ +name: Backend CI - Dev + +on: + push: + branches: [ "dev" ] + pull_request: + branches: [ "dev" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Set up JDK 22 + uses: actions/setup-java@v3 + with: + java-version: 22 + distribution: temurin + + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build & Test with Maven + run: mvn clean install -DskipTests + working-directory: ./server + + - name: Upload JAR Artifact + uses: actions/upload-artifact@v4 + with: + name: backend-jar + path: ./server/target/*.jar diff --git a/.github/workflows/backend-prod.yml b/.github/workflows/backend-prod.yml new file mode 100644 index 0000000..2b48d7e --- /dev/null +++ b/.github/workflows/backend-prod.yml @@ -0,0 +1,42 @@ +name: Backend CI - Prod + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Set up JDK 22 + uses: actions/setup-java@v3 + with: + java-version: 22 + distribution: temurin + + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build & Test with Maven + run: mvn clean install -DskipTests + working-directory: ./server + + - name: Upload JAR Artifact + uses: actions/upload-artifact@v4 + with: + name: backend-jar + path: ./server/target/*.jar + + - name: Deploy to Production + run: echo "🚀 Deploying backend to production..." diff --git a/.github/workflows/backend-staging.yml b/.github/workflows/backend-staging.yml new file mode 100644 index 0000000..9218fd0 --- /dev/null +++ b/.github/workflows/backend-staging.yml @@ -0,0 +1,39 @@ +name: Backend CI - Staging + +on: + push: + branches: [ "staged" ] + pull_request: + branches: [ "staged" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Set up JDK 22 + uses: actions/setup-java@v3 + with: + java-version: 22 + distribution: temurin + + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + - name: Build & Test with Maven + run: mvn clean install -DskipTests + working-directory: ./server + + - name: Upload JAR Artifact + uses: actions/upload-artifact@v4 + with: + name: backend-jar + path: ./server/target/*.jar diff --git a/.github/workflows/frontend-dev.yml b/.github/workflows/frontend-dev.yml new file mode 100644 index 0000000..90e29b7 --- /dev/null +++ b/.github/workflows/frontend-dev.yml @@ -0,0 +1,59 @@ +name: Frontend CI - Dev + +on: + push: + branches: [ "dev" ] + pull_request: + branches: [ "dev" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Cache node modules + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install dependencies + run: npm install --legacy-peer-deps + working-directory: ./client + + - name: Build Next.js app + run: npm run build + working-directory: ./client + + # To ensure code quality and catch bugs before merging: + - name: Run Linter + run: npm run lint + working-directory: ./client + + - name: Run TypeScript check + run: npm run type-check + working-directory: ./client + if: success() + + - name: Run Tests + run: npm test -- --watchAll=false + working-directory: ./client + + - name: Upload build artifact + if: success() + uses: actions/upload-artifact@v4 + with: + name: client-build + path: ./client/.next + + diff --git a/.github/workflows/frontend-prod.yml b/.github/workflows/frontend-prod.yml new file mode 100644 index 0000000..6717887 --- /dev/null +++ b/.github/workflows/frontend-prod.yml @@ -0,0 +1,50 @@ +name: Frontend CI - Prod + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Cache node modules + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install dependencies + run: npm install --legacy-peer-deps + working-directory: ./client + + - name: Build Next.js app + run: npm run build + working-directory: ./client + + - name: Run Linter + run: npm run lint + working-directory: ./client + + - name: Run Tests + run: npm test -- --watchAll=false + working-directory: ./client + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: client-build + path: ./client/.next diff --git a/.github/workflows/frontend-staging.yml b/.github/workflows/frontend-staging.yml new file mode 100644 index 0000000..c988faf --- /dev/null +++ b/.github/workflows/frontend-staging.yml @@ -0,0 +1,51 @@ +name: Frontend CI - Staging + +on: + push: + branches: [ "staged" ] + pull_request: + branches: [ "staged" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Cache node modules + uses: actions/cache@v3 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - name: Install dependencies + run: npm install --legacy-peer-deps + working-directory: ./client + + - name: Build Next.js app + run: npm run build + working-directory: ./client + + - name: Run Linter + run: npm run lint + working-directory: ./client + + - name: Run Tests + run: npm test -- --watchAll=false + working-directory: ./client + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: client-build + path: ./client/.next + diff --git a/client b/client deleted file mode 160000 index 0b90259..0000000 --- a/client +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0b90259c3f2d5dc95f8ddddfbe0fe7048b966ef8 diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/client/.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/client/README.md b/client/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/client/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/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.tsx`. 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/client/app/favicon.ico b/client/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/client/app/globals.css b/client/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/client/app/globals.css @@ -0,0 +1,26 @@ +@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); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/client/app/home/page.tsx b/client/app/home/page.tsx new file mode 100644 index 0000000..983ebb8 --- /dev/null +++ b/client/app/home/page.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +const page = () => { + return ( +
page
+ ) +} + +export default page \ No newline at end of file diff --git a/client/app/layout.tsx b/client/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/client/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/client/app/page.tsx b/client/app/page.tsx new file mode 100644 index 0000000..21b686d --- /dev/null +++ b/client/app/page.tsx @@ -0,0 +1,103 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
    +
  1. + Get started by editing{" "} + + app/page.tsx + + . +
  2. +
  3. + Save and see your changes instantly. +
  4. +
+ + +
+ +
+ ); +} diff --git a/client/app/topics/[topic].tsx b/client/app/topics/[topic].tsx new file mode 100644 index 0000000..3fbdf5e --- /dev/null +++ b/client/app/topics/[topic].tsx @@ -0,0 +1,9 @@ +import React from 'react' + +const topic = () => { + return ( +
topic
+ ) +} + +export default topic; \ No newline at end of file diff --git a/client/component/PodcastCard.tsx b/client/component/PodcastCard.tsx new file mode 100644 index 0000000..6ff00ed --- /dev/null +++ b/client/component/PodcastCard.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +const PodcastCard = () => { + return ( +
PodcastCard
+ ) +} + +export default PodcastCard \ No newline at end of file diff --git a/client/component/TopicsCard.tsx b/client/component/TopicsCard.tsx new file mode 100644 index 0000000..665a3f2 --- /dev/null +++ b/client/component/TopicsCard.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +const TopicsCard = () => { + return ( +
TopicsCard
+ ) +} + +export default TopicsCard \ No newline at end of file diff --git a/client/eslint.config.mjs b/client/eslint.config.mjs new file mode 100644 index 0000000..719cea2 --- /dev/null +++ b/client/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", "next/typescript"), + { + ignores: [ + "node_modules/**", + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ], + }, +]; + +export default eslintConfig; diff --git a/client/next.config.ts b/client/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/client/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..7dc4e3e --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,6454 @@ +{ + "name": "client", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.1.0", + "dependencies": { + "axios": "^1.11.0", + "ci": "^2.3.0", + "next": "15.5.2", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-query": "^3.39.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.5.2", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "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/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "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.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "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.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/sharp-darwin-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "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.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "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.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "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.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "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.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "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.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "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.0" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "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.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "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.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "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.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "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.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "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.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.4" + }, + "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.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "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.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "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.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "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.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "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.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz", + "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.2.tgz", + "integrity": "sha512-lkLrRVxcftuOsJNhWatf1P2hNVfh98k/omQHrCEPPriUypR6RcS13IvLdIrEvkm9AH2Nu2YpR5vLqBuy6twH3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz", + "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz", + "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz", + "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz", + "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz", + "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz", + "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz", + "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz", + "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==", + "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.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "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.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "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.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "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.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", + "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "postcss": "^8.4.41", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "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/@types/node": { + "version": "20.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", + "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", + "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.8.tgz", + "integrity": "sha512-xG7xaBMJCpcK0RpN8jDbAACQo54ycO6h4dSSmgv8+fu6ZIAdANkx/WsawASUjVXYfy+J9AbUpRMNNEsXCDfDBQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", + "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/type-utils": "8.41.0", + "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.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.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", + "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", + "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.41.0", + "@typescript-eslint/types": "^8.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", + "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", + "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", + "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", + "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", + "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.41.0", + "@typescript-eslint/tsconfig-utils": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", + "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.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.41.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", + "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.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/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "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==", + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "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==", + "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/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "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==", + "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.30001737", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", + "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "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/ci": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ci/-/ci-2.3.0.tgz", + "integrity": "sha512-0MGXkzJKkwV3enG7RUxjJKdiAkbaZ7visCjitfpCN2BQjv02KGRMxCHLv4RPokkjJ4xR33FLMAXweS+aQ0pFSQ==", + "license": "MIT", + "bin": { + "ci": "dist/cli.js" + }, + "funding": { + "url": "https://github.com/privatenumber/ci?sponsor=1" + } + }, + "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": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": 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==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "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/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "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.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "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==", + "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/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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "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/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.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.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.34.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.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.2.tgz", + "integrity": "sha512-3hPZghsLupMxxZ2ggjIIrat/bPniM2yRpsVPVM40rp8ZMzKWOJp2CGWn7+EzoV2ddkUr5fxNfHpF+wU1hGt/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.5.2", + "@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/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.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": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "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==", + "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==", + "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==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "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-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "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.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.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==", + "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/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "license": "ISC", + "dependencies": { + "big-integer": "^1.6.16" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz", + "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==", + "license": "MIT", + "dependencies": { + "@next/env": "15.5.2", + "@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.2", + "@next/swc-darwin-x64": "15.5.2", + "@next/swc-linux-arm64-gnu": "15.5.2", + "@next/swc-linux-arm64-musl": "15.5.2", + "@next/swc-linux-x64-gnu": "15.5.2", + "@next/swc-linux-x64-musl": "15.5.2", + "@next/swc-win32-arm64-msvc": "15.5.2", + "@next/swc-win32-x64-msvc": "15.5.2", + "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/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/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "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/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/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "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/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "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/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, + "node_modules/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/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "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.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" + } + }, + "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/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "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.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "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", + "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/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "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/client/package.json b/client/package.json new file mode 100644 index 0000000..4e315f4 --- /dev/null +++ b/client/package.json @@ -0,0 +1,32 @@ +{ + "name": "client", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint", + "test": "echo \"No tests yet\"", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "axios": "^1.11.0", + "ci": "^2.3.0", + "next": "15.5.2", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-query": "^3.39.3" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.5.2", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/client/postcss.config.mjs b/client/postcss.config.mjs new file mode 100644 index 0000000..c7bcb4b --- /dev/null +++ b/client/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/client/public/file.svg b/client/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/client/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/globe.svg b/client/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/client/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/next.svg b/client/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/client/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/vercel.svg b/client/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/client/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/public/window.svg b/client/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/client/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/services/api.ts b/client/services/api.ts new file mode 100644 index 0000000..e69de29 diff --git a/client/tailwind.config.ts b/client/tailwind.config.ts new file mode 100644 index 0000000..3b742c5 --- /dev/null +++ b/client/tailwind.config.ts @@ -0,0 +1,10 @@ +module.exports = { + content: [ + "./pages/**/*.{js,ts,jsx,tsx}", + "./components/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..d8b9323 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/server/.gitattributes b/server/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/server/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..667aaef --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/server/.mvn/wrapper/maven-wrapper.properties b/server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..12fbe1e --- /dev/null +++ b/server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip diff --git a/server/mvnw b/server/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/server/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/server/mvnw.cmd b/server/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/server/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..94f4059 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,109 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.5 + + + com.example + podify + 0.0.1-SNAPSHOT + podify + Demo project for Spring Boot + + + + + + + + + + + + + + + 22 + 22 + 22 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.session + spring-session-jdbc + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.postgresql + postgresql + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/server/src/main/java/com/example/podify/PodifyApplication.java b/server/src/main/java/com/example/podify/PodifyApplication.java new file mode 100644 index 0000000..9721525 --- /dev/null +++ b/server/src/main/java/com/example/podify/PodifyApplication.java @@ -0,0 +1,13 @@ +package com.example.podify; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PodifyApplication { + + public static void main(String[] args) { + SpringApplication.run(PodifyApplication.class, args); + } + +} diff --git a/server/src/test/java/com/example/podify/PodifyApplicationTests.java b/server/src/test/java/com/example/podify/PodifyApplicationTests.java new file mode 100644 index 0000000..4613543 --- /dev/null +++ b/server/src/test/java/com/example/podify/PodifyApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.podify; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PodifyApplicationTests { + + @Test + void contextLoads() { + } + +} From 343dec3f2641f7aff1c9e766d58401ba13e54a60 Mon Sep 17 00:00:00 2001 From: Sarthak Date: Fri, 29 Aug 2025 13:47:41 +0530 Subject: [PATCH 02/22] feat: added next-auth login --- client/app/api/auth/[...nextAuth]/route.ts | 6 + client/app/auth/page.tsx | 8 ++ client/component/AuthPage.tsx | 9 ++ client/lib/auth.ts | 140 +++++++++++++++++++ client/package-lock.json | 154 +++++++++++++++++++++ client/package.json | 1 + client/types/next-auth.d.ts | 29 ++++ 7 files changed, 347 insertions(+) create mode 100644 client/app/api/auth/[...nextAuth]/route.ts create mode 100644 client/app/auth/page.tsx create mode 100644 client/component/AuthPage.tsx create mode 100644 client/lib/auth.ts create mode 100644 client/types/next-auth.d.ts diff --git a/client/app/api/auth/[...nextAuth]/route.ts b/client/app/api/auth/[...nextAuth]/route.ts new file mode 100644 index 0000000..7b38c1b --- /dev/null +++ b/client/app/api/auth/[...nextAuth]/route.ts @@ -0,0 +1,6 @@ +import NextAuth from "next-auth"; +import { authOptions } from "@/lib/auth"; + +const handler = NextAuth(authOptions); + +export { handler as GET, handler as POST }; diff --git a/client/app/auth/page.tsx b/client/app/auth/page.tsx new file mode 100644 index 0000000..b29a2b9 --- /dev/null +++ b/client/app/auth/page.tsx @@ -0,0 +1,8 @@ +import AuthPage from "@/component/AuthPage"; +import React from "react"; + +const page = () => { + return ; +}; + +export default page; diff --git a/client/component/AuthPage.tsx b/client/component/AuthPage.tsx new file mode 100644 index 0000000..597c787 --- /dev/null +++ b/client/component/AuthPage.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +const AuthPage = () => { + return ( +
AuthPage
+ ) +} + +export default AuthPage \ No newline at end of file diff --git a/client/lib/auth.ts b/client/lib/auth.ts new file mode 100644 index 0000000..1f857cc --- /dev/null +++ b/client/lib/auth.ts @@ -0,0 +1,140 @@ +import { NextAuthOptions } from "next-auth"; +import CredentialsProviders from "next-auth/providers/credentials"; +import GoogleProviders from "next-auth/providers/google"; + +interface AuthUser { + id: string; + email: string; + accessToken?: string; +} + +export const authOptions: NextAuthOptions = { + providers: [ + GoogleProviders({ + // ! tells the ts that this value might look like it could be undefined, but at runtime it wont. + clientId: process.env.GOOGLE_CLIENT_ID!, + clientSecret: process.env.GOOGLE_CLIENT_SECRET!, + }), + CredentialsProviders({ + name: "Credentials", + credentials: { + email: { label: "Email", type: "text" }, + password: { label: "Password", type: "text" }, + }, + async authorize(credentials): Promise { + if (!credentials?.email && !credentials?.password) return null; + try { + // when the user wants to log in + const res = await fetch(`${process.env.SPRING_BASE_URL}/auth/login`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: credentials.email, + password: credentials.password, + }), + }); + + console.log("Response status: ", res.status); + + if (!res.ok) { + const text = await res.text(); + console.log("Login failed response text: ", text); + return null; + } + + const user = await res.json(); + + console.log("User from backend: ", user); + + if (!user?.id || !user.email) return null; + + return { + id: user.id, + email: user.email, + accessToken: user.accessToken, + }; + } catch (error) { + console.error("Credentials auth error: ", error); + return null; + } + }, + }), + ], + + // instead of storing session in DB, we are using JSON Web Token to keep the session state + // our token from backend will be stored in cookies + session: { + strategy: "jwt", + }, + + callbacks: { + // token - the spring generated token + // account - credentials and oAuth info + // user - basic profile from provider or authorize + // profile - full profile data from provider + + // handles authentication + async jwt({ token, account, user, profile }) { + // how the frontend will send the spring jwt via nextauth so the whole chain is working + + // if user is already logged via Credentials (Spring boot login) + if (user?.accessToken) { + token.id = user.id; + token.email = user.email; + token.accessToken = user.accessToken; + return token; + } + + // if user logged in via Google OAuth + if (account && profile && !token.accessToken) { + try { + const res = await fetch( + `${process.env.SPRING_BASE_URL}/auth/oauth-login`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: profile.email, + provider: account.provider, + providerId: account.providerAccountId, + }), + } + ); + + const springUsr = await res.json(); + + if (res.ok && springUsr.accessToken) { + token.accessToken = springUsr.accessToken; + token.email = springUsr.email; + token.id = springUsr.id; + } + } catch (error) { + console.error("OAuth → Spring exchange failed", error); + } + } + + return token; + }, + + // handles the session so that you can your backend from any page + async session({ session, token }) { + session.accessToken = token.accessToken; + return session; + }, + + async redirect({ url, baseUrl }) { + // if error is in URL, redirect to /home + if (url.includes("error=OAuthCallback")) { + return `https://localhost:3000/home`; + } + + return baseUrl; + }, + }, + + secret: process.env.NEXTAUTH_SECRET, +}; diff --git a/client/package-lock.json b/client/package-lock.json index 7dc4e3e..0178ef5 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -11,6 +11,7 @@ "axios": "^1.11.0", "ci": "^2.3.0", "next": "15.5.2", + "next-auth": "^4.24.11", "react": "19.1.0", "react-dom": "19.1.0", "react-query": "^3.39.3" @@ -975,6 +976,15 @@ "node": ">=12.4.0" } }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz", + "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -2437,6 +2447,15 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4257,6 +4276,15 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -4652,6 +4680,24 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/magic-string": { "version": "0.30.18", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", @@ -4902,6 +4948,38 @@ } } }, + "node_modules/next-auth": { + "version": "4.24.11", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.11.tgz", + "integrity": "sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==", + "license": "ISC", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.7.0", + "jose": "^4.15.5", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "@auth/core": "0.34.2", + "next": "^12.2.5 || ^13 || ^14 || ^15", + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18 || ^19", + "react-dom": "^17.0.2 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@auth/core": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -4930,6 +5008,12 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4940,6 +5024,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -5059,6 +5152,15 @@ "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", "license": "MIT" }, + "node_modules/oidc-token-hash": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.1.tgz", + "integrity": "sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5068,6 +5170,21 @@ "wrappy": "1" } }, + "node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5243,6 +5360,28 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/preact": { + "version": "10.27.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.1.tgz", + "integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "license": "MIT", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5253,6 +5392,12 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "license": "MIT" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6306,6 +6451,15 @@ "punycode": "^2.1.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/client/package.json b/client/package.json index 4e315f4..c16b7af 100644 --- a/client/package.json +++ b/client/package.json @@ -14,6 +14,7 @@ "axios": "^1.11.0", "ci": "^2.3.0", "next": "15.5.2", + "next-auth": "^4.24.11", "react": "19.1.0", "react-dom": "19.1.0", "react-query": "^3.39.3" diff --git a/client/types/next-auth.d.ts b/client/types/next-auth.d.ts new file mode 100644 index 0000000..c892ac6 --- /dev/null +++ b/client/types/next-auth.d.ts @@ -0,0 +1,29 @@ +import { DefaultSession, DefaultUser } from "next-auth"; + +declare module "next-auth" { + interface Session { + accessToken?: string; + user: { + id?: string | null; + email?: string | null; + } & DefaultSession["user"]; + } + + interface User extends DefaultUser { + accessToken?: string; + } +} + +declare module "next-auth/jwt" { + interface JWT { + id?: string; + email?: string | null; + accessToken?: string; + } +} + +export interface User { + id?: string; + email?: string | null; + accessToken?: string; +} From bb1b62e8335fed80452cf1a5860a6aa6a1a22ae0 Mon Sep 17 00:00:00 2001 From: Sarthak Date: Fri, 29 Aug 2025 16:23:54 +0530 Subject: [PATCH 03/22] feat: implement home and auth page --- client/app/auth/page.tsx | 164 +++++- client/app/globals.css | 124 ++++- client/app/home/page.tsx | 87 +++- client/app/layout.tsx | 9 +- client/app/page.tsx | 110 +--- client/app/providers.tsx | 8 + client/component/components/ui/button.tsx | 57 +++ client/components.json | 21 + client/lib/fetchWithToken.ts | 20 + client/lib/middleware.ts | 11 + client/lib/utils.ts | 7 + client/package-lock.json | 482 +++++++++++------- client/package.json | 15 +- client/postcss.config.mjs | 5 +- client/public/auth-image.jpg | Bin 0 -> 168028 bytes client/tailwind.config.ts | 2 +- client/tsconfig.json | 14 +- .../example/podify/config/SecurityConfig.java | 7 + .../podify/controller/AuthController.java | 5 + .../java/com/example/podify/dto/User.java | 4 + .../com/example/podify/mapper/UserMapper.java | 4 + .../java/com/example/podify/model/User.java | 4 + .../podify/repository/UserRepository.java | 4 + .../example/podify/security/jwtFilter.java | 4 + .../com/example/podify/security/jwtUtil.java | 4 + 25 files changed, 843 insertions(+), 329 deletions(-) create mode 100644 client/app/providers.tsx create mode 100644 client/component/components/ui/button.tsx create mode 100644 client/components.json create mode 100644 client/lib/fetchWithToken.ts create mode 100644 client/lib/middleware.ts create mode 100644 client/lib/utils.ts create mode 100644 client/public/auth-image.jpg create mode 100644 server/src/main/java/com/example/podify/config/SecurityConfig.java create mode 100644 server/src/main/java/com/example/podify/controller/AuthController.java create mode 100644 server/src/main/java/com/example/podify/dto/User.java create mode 100644 server/src/main/java/com/example/podify/mapper/UserMapper.java create mode 100644 server/src/main/java/com/example/podify/model/User.java create mode 100644 server/src/main/java/com/example/podify/repository/UserRepository.java create mode 100644 server/src/main/java/com/example/podify/security/jwtFilter.java create mode 100644 server/src/main/java/com/example/podify/security/jwtUtil.java diff --git a/client/app/auth/page.tsx b/client/app/auth/page.tsx index b29a2b9..0cd3f64 100644 --- a/client/app/auth/page.tsx +++ b/client/app/auth/page.tsx @@ -1,8 +1,160 @@ -import AuthPage from "@/component/AuthPage"; -import React from "react"; +"use client"; -const page = () => { - return ; -}; +import { signIn } from "next-auth/react"; +import { useState } from "react"; +import Image from "next/image"; -export default page; +export default function SignIn() { + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + + const handleCredentialsLogin = async ( + e: React.FormEvent + ) => { + e.preventDefault(); + await signIn("credentials", { + email, + password, + redirect: true, + callbackUrl: "/", + }); + }; + + return ( +
+ {/* Left Side - Product Showcase */} +
+ {/* Background decorative elements */} +
+
+ +
+ {/* App Name */} +

+ 🎧 Podify +

+ + {/* Image with glow */} +
+
+ podcast image +
+ + {/* Tagline */} +

+ Your Podcasts{" "} + and + + {" "} + Your Topics + {" "} + - All in{" "} + One Place +

+
+
+ + {/* Right Side - Auth Form */} +
+
+
+
+

+ Welcome Back +

+

Sign in to your Podify account

+
+ + {/* Google Login */} + + +
+
+ OR +
+
+ + {/* Credentials Form */} +
+
+ + setEmail(e.target.value)} + className="w-full px-4 py-3 bg-gray-800/50 border border-gray-700 rounded-xl + text-white placeholder-gray-400 focus:border-orange-500 + focus:ring-1 focus:ring-orange-500 transition-all duration-300" + required + /> +
+ +
+ + setPassword(e.target.value)} + className="w-full px-4 py-3 bg-gray-800/50 border border-gray-700 rounded-xl + text-white placeholder-gray-400 focus:border-orange-500 + focus:ring-1 focus:ring-orange-500 transition-all duration-300" + required + /> +
+ + +
+
+
+
+
+ ); +} diff --git a/client/app/globals.css b/client/app/globals.css index a2dc41e..dfa7180 100644 --- a/client/app/globals.css +++ b/client/app/globals.css @@ -1,26 +1,124 @@ @import "tailwindcss"; -:root { - --background: #ffffff; - --foreground: #171717; -} +@plugin "tailwindcss-animate"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --font-sans: var(--font-geist-sans); --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.13 0.028 261.692); + --card: oklch(1 0 0); + --card-foreground: oklch(0.13 0.028 261.692); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.13 0.028 261.692); + --primary: oklch(0.21 0.034 264.665); + --primary-foreground: oklch(0.985 0.002 247.839); + --secondary: oklch(0.967 0.003 264.542); + --secondary-foreground: oklch(0.21 0.034 264.665); + --muted: oklch(0.967 0.003 264.542); + --muted-foreground: oklch(0.551 0.027 264.364); + --accent: oklch(0.967 0.003 264.542); + --accent-foreground: oklch(0.21 0.034 264.665); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.928 0.006 264.531); + --input: oklch(0.928 0.006 264.531); + --ring: oklch(0.707 0.022 261.325); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0.002 247.839); + --sidebar-foreground: oklch(0.13 0.028 261.692); + --sidebar-primary: oklch(0.21 0.034 264.665); + --sidebar-primary-foreground: oklch(0.985 0.002 247.839); + --sidebar-accent: oklch(0.967 0.003 264.542); + --sidebar-accent-foreground: oklch(0.21 0.034 264.665); + --sidebar-border: oklch(0.928 0.006 264.531); + --sidebar-ring: oklch(0.707 0.022 261.325); } -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; +.dark { + --background: oklch(0.13 0.028 261.692); + --foreground: oklch(0.985 0.002 247.839); + --card: oklch(0.21 0.034 264.665); + --card-foreground: oklch(0.985 0.002 247.839); + --popover: oklch(0.21 0.034 264.665); + --popover-foreground: oklch(0.985 0.002 247.839); + --primary: oklch(0.928 0.006 264.531); + --primary-foreground: oklch(0.21 0.034 264.665); + --secondary: oklch(0.278 0.033 256.848); + --secondary-foreground: oklch(0.985 0.002 247.839); + --muted: oklch(0.278 0.033 256.848); + --muted-foreground: oklch(0.707 0.022 261.325); + --accent: oklch(0.278 0.033 256.848); + --accent-foreground: oklch(0.985 0.002 247.839); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.551 0.027 264.364); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.21 0.034 264.665); + --sidebar-foreground: oklch(0.985 0.002 247.839); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0.002 247.839); + --sidebar-accent: oklch(0.278 0.033 256.848); + --sidebar-accent-foreground: oklch(0.985 0.002 247.839); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.551 0.027 264.364); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } } diff --git a/client/app/home/page.tsx b/client/app/home/page.tsx index 983ebb8..a751d78 100644 --- a/client/app/home/page.tsx +++ b/client/app/home/page.tsx @@ -1,9 +1,84 @@ -import React from 'react' +"use client"; +import { Button } from "@/component/components/ui/button"; +import { useSession } from "next-auth/react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import React from "react"; + +const Home = () => { + const { status } = useSession(); + const router = useRouter(); + + if (status === "authenticated") { + router.push("/dashboard"); + } + + const handleStart = () => { + if (status !== "authenticated") { + router.push("/auth"); + } + }; -const page = () => { return ( -
page
- ) -} +
+ {/* Background decorative elements */} +
+
+
+ +
+ {/* Main heading with enhanced styling */} +
+

+ 🎧 Podify +

+
+
+ + {/* Description with better typography */} +

+ Discover, stream, and enjoy podcasts on any topic you love. Your + personalized + podcast hub. +

+ + {/* Enhanced buttons */} +
+ + +
+ + {/* Additional features section */} +
+
+
🎵
+

High Quality Audio

+

Crystal clear sound for the best listening experience

+
+ +
+
📱
+

Multi-Platform

+

Listen anywhere, anytime on any device

+
+ +
+
🔍
+

Smart Discovery

+

Find new podcasts tailored to your interests

+
+
+
+
+ ); +}; -export default page \ No newline at end of file +export default Home; \ No newline at end of file diff --git a/client/app/layout.tsx b/client/app/layout.tsx index f7fa87e..dda1057 100644 --- a/client/app/layout.tsx +++ b/client/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import { Providers } from "./providers"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -13,8 +14,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Podify", + description: "Amplify your Podcast listening Experience", }; export default function RootLayout({ @@ -27,7 +28,9 @@ export default function RootLayout({ - {children} + + {children} + ; ); diff --git a/client/app/page.tsx b/client/app/page.tsx index 21b686d..8f5a456 100644 --- a/client/app/page.tsx +++ b/client/app/page.tsx @@ -1,103 +1,15 @@ -import Image from "next/image"; +"use client" +import { useRouter } from "next/navigation"; +import { useEffect } from "react"; export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - app/page.tsx - - . -
  2. -
  3. - Save and see your changes instantly. -
  4. -
+ const router = useRouter(); + useEffect(() => { + // Put any navigation logic here — *after* the component mounts + const shouldRedirect = true; // your condition - -
- -
- ); + if (shouldRedirect) { + router.push("/home"); + } + }, [router]); } diff --git a/client/app/providers.tsx b/client/app/providers.tsx new file mode 100644 index 0000000..8d42e47 --- /dev/null +++ b/client/app/providers.tsx @@ -0,0 +1,8 @@ +"use client"; + +import { SessionProvider } from "next-auth/react"; +import { ReactNode } from "react"; + +export function Providers({ children }: { children: ReactNode }) { + return {children}; +} diff --git a/client/component/components/ui/button.tsx b/client/component/components/ui/button.tsx new file mode 100644 index 0000000..65d4fcd --- /dev/null +++ b/client/component/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/client/components.json b/client/components.json new file mode 100644 index 0000000..13e8334 --- /dev/null +++ b/client/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "gray", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} diff --git a/client/lib/fetchWithToken.ts b/client/lib/fetchWithToken.ts new file mode 100644 index 0000000..60f3902 --- /dev/null +++ b/client/lib/fetchWithToken.ts @@ -0,0 +1,20 @@ +import { getSession } from "next-auth/react"; + +export async function fetchWithToken(input: RequestInfo, init?: RequestInit) { + const session = await getSession(); + const token = session?.accessToken; + const headers = new Headers(init?.headers as HeadersInit); + + if (token) headers.set("Authorization", `Bearer ${token}`); + + headers.set("Content-Type", "application/json"); + + const res = await fetch(`${process.env.SPRING_BASE_URL}${input}`, { + ...init, + headers, + }); + + if (!res.ok) throw new Error(await res.text()); + + return res; +} diff --git a/client/lib/middleware.ts b/client/lib/middleware.ts new file mode 100644 index 0000000..500efcd --- /dev/null +++ b/client/lib/middleware.ts @@ -0,0 +1,11 @@ +import { withAuth } from "next-auth/middleware"; + +export default withAuth({ + pages: { + signIn: "/home", + }, +}); + +export const config = { + matcher : ['/topics', '/dashboard'] +} diff --git a/client/lib/utils.ts b/client/lib/utils.ts new file mode 100644 index 0000000..43b0a4c --- /dev/null +++ b/client/lib/utils.ts @@ -0,0 +1,7 @@ + +import { ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 0178ef5..c4c3424 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,23 +8,32 @@ "name": "client", "version": "0.1.0", "dependencies": { + "@radix-ui/react-slot": "^1.2.3", + "@tanstack/react-query": "^5.85.5", "axios": "^1.11.0", "ci": "^2.3.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", "next": "15.5.2", "next-auth": "^4.24.11", "react": "19.1.0", "react-dom": "19.1.0", - "react-query": "^3.39.3" + "tailwind-merge": "^3.3.1", + "tailwindcss-animate": "^1.0.7", + "tw-animate-css": "^1.3.7" }, "devDependencies": { "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4", + "@tailwindcss/postcss": "^4.1.12", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "15.5.2", - "tailwindcss": "^4", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.12", "typescript": "^5" } }, @@ -985,6 +994,39 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1284,6 +1326,32 @@ "tailwindcss": "4.1.12" } }, + "node_modules/@tanstack/query-core": { + "version": "5.85.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.85.5.tgz", + "integrity": "sha512-KO0WTob4JEApv69iYp1eGvfMSUkgw//IpMnq+//cORBzXf0smyRwPLrUvEe5qtAEGjwZTXrjxg+oJNP/C00t6w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.85.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.85.5.tgz", + "integrity": "sha512-/X4EFNcnPiSs8wM2v+b6DqS5mmGeuJQvxBglmDxl6ZQb5V26ouD2SJYAcC3VjbNwqhY2zjxVD15rDA5nGbMn3A==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.85.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", @@ -1330,7 +1398,7 @@ "version": "19.1.11", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -2159,6 +2227,44 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "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", @@ -2210,21 +2316,14 @@ "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/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, "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", @@ -2244,20 +2343,37 @@ "node": ">=8" } }, - "node_modules/broadcast-channel": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", - "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "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": { - "@babel/runtime": "^7.7.2", - "detect-node": "^2.1.0", - "js-sha3": "0.8.0", - "microseconds": "0.2.0", - "nano-time": "1.0.0", - "oblivious-set": "1.0.0", - "rimraf": "3.0.2", - "unload": "2.2.0" + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "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": { @@ -2378,12 +2494,33 @@ "url": "https://github.com/privatenumber/ci?sponsor=1" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "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/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -2445,6 +2582,7 @@ "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/cookie": { @@ -2475,7 +2613,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -2619,12 +2757,6 @@ "node": ">=8" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -2652,6 +2784,13 @@ "node": ">= 0.4" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.211", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz", + "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==", + "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", @@ -2846,6 +2985,16 @@ "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", @@ -3462,11 +3611,19 @@ "node": ">= 6" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "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", @@ -3576,27 +3733,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3794,23 +3930,6 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -4285,12 +4404,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4698,6 +4811,15 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/lucide-react": { + "version": "0.542.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", + "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.18", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", @@ -4708,16 +4830,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/match-sorter": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", - "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.8", - "remove-accents": "0.5.0" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4751,12 +4863,6 @@ "node": ">=8.6" } }, - "node_modules/microseconds": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", - "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", - "license": "MIT" - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4782,6 +4888,7 @@ "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" @@ -4846,15 +4953,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nano-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", - "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", - "license": "ISC", - "dependencies": { - "big-integer": "^1.6.16" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -5008,6 +5106,23 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "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/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -5146,12 +5261,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/oblivious-set": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", - "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", - "license": "MIT" - }, "node_modules/oidc-token-hash": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.1.tgz", @@ -5161,15 +5270,6 @@ "node": "^10.13.0 || >=12.0.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/openid-client": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", @@ -5276,15 +5376,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5360,6 +5451,13 @@ "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/preact": { "version": "10.27.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.1.tgz", @@ -5475,32 +5573,6 @@ "dev": true, "license": "MIT" }, - "node_modules/react-query": { - "version": "3.39.3", - "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", - "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.5.5", - "broadcast-channel": "^3.4.1", - "match-sorter": "^6.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5545,12 +5617,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -5603,22 +5669,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6133,13 +6183,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", - "dev": true, "license": "MIT" }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/tapable": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", @@ -6265,6 +6333,15 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tw-animate-css": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.3.7.tgz", + "integrity": "sha512-lvLb3hTIpB5oGsk8JmLoAjeCHV58nKa2zHYn8yWOoG5JJusH3bhJlF2DLAZ/5NmJ+jyH3ssiAx/2KmbhavJy/A==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6396,16 +6473,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unload": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", - "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.6.2", - "detect-node": "^2.0.4" - } - }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -6441,6 +6508,37 @@ "@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", @@ -6575,12 +6673,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, "node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", diff --git a/client/package.json b/client/package.json index c16b7af..c7b869f 100644 --- a/client/package.json +++ b/client/package.json @@ -11,23 +11,32 @@ "type-check": "tsc --noEmit" }, "dependencies": { + "@radix-ui/react-slot": "^1.2.3", + "@tanstack/react-query": "^5.85.5", "axios": "^1.11.0", "ci": "^2.3.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.542.0", "next": "15.5.2", "next-auth": "^4.24.11", "react": "19.1.0", "react-dom": "19.1.0", - "react-query": "^3.39.3" + "tailwind-merge": "^3.3.1", + "tailwindcss-animate": "^1.0.7", + "tw-animate-css": "^1.3.7" }, "devDependencies": { "@eslint/eslintrc": "^3", - "@tailwindcss/postcss": "^4", + "@tailwindcss/postcss": "^4.1.12", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "15.5.2", - "tailwindcss": "^4", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.12", "typescript": "^5" } } diff --git a/client/postcss.config.mjs b/client/postcss.config.mjs index c7bcb4b..d5c96e4 100644 --- a/client/postcss.config.mjs +++ b/client/postcss.config.mjs @@ -1,5 +1,8 @@ const config = { - plugins: ["@tailwindcss/postcss"], + plugins: { + "@tailwindcss/postcss": {}, + autoprefixer: {}, + }, }; export default config; diff --git a/client/public/auth-image.jpg b/client/public/auth-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60324f065df85d492d3eb7f5f258390b18376b36 GIT binary patch literal 168028 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

2Se%B>343+o&N zI2w_^6xpPC+|=XcwPXBxm{h$Moxn}Xt^l!}m>o)QLKB$BqYP%xaV(x+Cx8r6w!V0` zBURw|NX#FcD4y{*+YB0jj@GqgsPa;b;9roV3uc;Wcg%D8__4RTg{-2S=BeAep*D}Z z?LR0kWaf>$b7E}s8ndIm()SxUL9SUpp~O&)G5J6Mad{ z!(~=o_GR6P-v${vdc*_qXlBh#wq z&DJU4F6)U|7j>v4$80m$CbY$k!%`o$tAnYajK;M@Zx7GK;_HIuWVp+#AjItBtTbMa zH?ncTes31F?4HjBdAi$9eXBYaS+pqEfeG1U7gEu*WEgUtOh_Q)H=w1fW!-NV5qxeW z6@>@dx+?4Jrx_Kv!r{J!_w~veF=Wd7+kyu-& zaSFJh0ixa`R0d=9CZ@*h$T#2(p3s<#`=(ulSGY)Af2_Q!Ia*MO2KbrfA+@T%fqbvJ zFN!>=fpAZnxsY{>^mbHZ24mt9#)mVWzY_MpekUl+Zz0>^c8=QjwuV|67iuS#n-at) z@}>6o>c`n7J>_LJ9+~8D^QE_H2<(ktRymU}?%i|rhhRppE_^8cUV);5qoDnp z$>~a(LEyvx186L{7q55}Zg6j;d{IMXF{3vqlt*7#CY_W4r#4c5ljYd5;SZkErG z(`pR7)Hi(X^t<~fCe`1}i>9z&QY&x$mRTu7iC~f-exrIr>y7gfzit@?dbWHAaSrtd zhZ;ifS#(n)TOK8<^UW(whaS#c67o|hbGzlxESxuz!{nLscs+$(5YqRH9@r12nHwzP zv>b3ZvUwwFkk z_9j*Dl*RWr_pjjMaT7pHP45)6F`DGa!KT2jN<{ZYfy&R(!#XB5#l5PqgPBV$8`T~% zI@n zUK})8j{|JCx|l;R4IbkLfYT|OjUO34t$Yh+7#+sEM}mXS>D!aN(Fs4&n>SoQ8>$5C z=)30%0n0>V;9A$Gvc%Y~_HQbaFNSetoHuW0HT5@I@Se-38d4OBug&Uq^DV%X{sK@D2P@53*v-ycj@7{4B0#6r*A68=t$>73EH!DZ) z)d)_Y2}H^hUd2c+Tqv}~}J-q}#{&?}>OQ#adc-kna zbXa|)c95M@)giOB1-z>L%-MRAr41Bf4ZcsCF3Pe&!4;rvbU<+?ew}9ZU5~zjDHeBc z-K1gQTqMVkDO&i5pzANEry=0shKdPG-{*36bsTc1n)Y?^`wOBv010_D*6m?m z6}S?jXc(qG9lN;a3V8MBR)fb=MqMwAkp@{xrM~M(4n@S7k6TO-BH+c$Y+J@tFVF-6 zE@Y|qF|-I~O9U4vtMEw8lC|st6X`RgqBnXBGA;eYooOE)@b0+aYsJq~@)rJi>J_GMjVdyjZ5U zQt)RV^jesruRR;JlfGb}eY$l%4Sn&{yd@#A;QZHi-~dd)Z%7g;H<$D|MJgc!c67K` z%b*ibeeztg;O}e8m{fFRe}$pVqHRkI=O?>*u1Ebhz-LCD`caCv;)~czfJ3DzJb}lN z_v|!RK~GS8e`s0Ui1B=Y6(XtTCz_Dbmhez>6R$b5G@*2BJoPq8bralj5)VYT7h1=( zud;>!LI&au11Ai>0z~qn0YTQqUnKxuGuZIcgo%d4GvCRz`fX~J1i;rIMNyk0 zG50C#!2ziv!(&-N#Ncrg9;n>rYoiUiVLIT=kFrrs{&)A0_7o>FZ60bK}38v%-OIr|v7;l<{&f9QsbVXf)(C$k%`I9|D;+;-vZMDAJ|ruz_)UgrdJ zL0|l##`?)`cSYF97a~ttA6Hj8jyd+Or9%6nn>BOAT}II>lCA!}uzm5?POo}+na=kd~lO@+rwg0Yq$7p7kN1$vl-(0=c-Q-5Iv_ZQa=^5vXNi6Q zuAP7hN*<010EFko+y`gcDf{OR4HyMWzM3DGr53G7*`u&@3kmZX@htZzo@*Qxx<6I#&HCjtVCWSH-kP!=Ot4D9n2mvSi ztkS+j<)(IvKv)Ye-Td)#O6P9UT2#1>qjN9^T!0ce>1oFFcs`JTx}pN$*i+8nS1GVH zZPDFj8m$dqN8<3F$=bag83U4+21osT=h*Txek5bVg(9UmUfNe?($Y@1AznCm7!BHu z--zruMlPt~_w!GSWEXym$nGpPcrP3JVjI}wF`XBEnnS92;7Cz*LY ziA9FV*As;Zm>GD}sq=UC-vhrX!F*{s^}J1H`)EZ$^2}KyhAvp80`A3P{Fx_PfEq75 z5|sm6`P)CQ>ETe8D}}D2lj>0@^2v*Fj65=$sJAw}^ua0k^HlEILgI##&w4s8PtG%% z4IzahuT>5zrnQM`OI><6Yi~b4(jnMI_L;Ny;$%Zf%@sEn(WzO9wGwX%pgp~2ts2WA zn@D)nt4QDdc;C_*nPzlu&THVtQKb;zE~CbBz{3&%uw1aD`QgwU0y*ein9fM|)P$FQ zb-#P?R*qM;&8*=0Y9I2S1%k7KlJPDyPOJ^g%HR?4QcR@_nLv6Ad#~e0lBF83#aTt2 zEA{U<#5}a@k4?_9+vg4#|AMza#a=jp)B+cpYa9OOpi9Je>9kEs4*jA4lZr2s{hNiQ za2?3~`RqVMMY7S&RxGnri}&zdD5IH++EsO1K(%2u*|$D3nrKnFoGOLMqh!a8z_SA}vFA7je$p6*o;&2OK=Z>>-9Mc2WC{|r}80v#k z#Q@^jh@9J+4t@D}ZwSfh%D0Gv#4~1zkG=q|>d3A;lQXS_ndivO%&LxI?{B0-f8oeT zAC>X|5uLS-WvblGiP|z>+eL8YOt@Nf;!98Xps6*{)Kte%6;J(H?0gx9qYHrPg;($t z$^VqtGs_t)IbtT?^cEr$J0spUWZaRxlICEBqb2SyyPn2c8w&gJx%w4m!Y7zgtb_wZFesZeygVe}8 zc01{=-+=!28l!8YO`aD6z!`!%J>`~TgTFn(P75CTtGkdrjBL4$f*+ZoidEpK^i;;| zGitz1vXl?|%%{zdom|*teia38hGl+5k@=hN;OvQ+x&4~QB6pPmiDTrZx>d%i1Bjj_ z^6t^pL<80BzX8^u*G@6f*}ySs*`7{f0GW5~mufGhevB&c#_H3b%x>v{~Atagj{`zEj%! zeL#Nad&Z!D1ia2?h_qf4Cc4z)sCn=e22GUslEdHv`0+)W_N$Ik*i(47LLr?d#rK5= zVTA^{n~ZOuTdz$VFwdr+6CL2xi)zXViyvYdqmybsEBbWUHTWG{Dgb_b<-<|~U|*o^ z56|g5{MiR@hKO~@aKw#Dg=Vv_1IKxrZ_}N(dkFyWMxBhXlkr+UbYh?Svh`KHB+W~O zqj=LS?*h~U_h&2b)Pi?S_SE^_W#n;hLuGxMJoa@>VOy~I-j*RRhtF+hnnfN?pOS<( z^2dj~KbUqeL`bXif>+z(s^LZzyy4cSX_2qc;CS%HE@d3q3=l=VEMh9064_?fFVCj; z$8N8BseAu*zwzr3=;-f|cAY|w z#|7(6z-~S|HwhYnX!e<_`5%o;0lRM_++bEY^!4>EwsD_W@I2&X3=Z8p0b*=p{V|Y| z(7t=Q$_3&AVf%T_9NRvkOPs)KM(TX-!;y*-0DF8-j`i%2U;KqpH^u7s+L!h`TBs}BmjW2G5S4}<0Hu?WN$UGp!y;t2HCg!*F2$*vSLi8 zvAL_FL|0CTp&+j@K>1Qzd*a2OT!2)#SBz0)Y!VHP^yJ1wW?ipv)k(|Hq?vlI^lOXX zXuV+23+BOB&)bWNdMuF^3;oU9p4X0QDu^$ecRO~{X7Z{|PCHk9q_VVZ^We|C*Lsw& z>e9lz?E>0 z&$p_#aSoQ}QQ#Yb%8Lx`dU9d85G#|B)`dkSSb!4O+?qVW2qA<>)m9{BaxW9Txi0}g zx{4RG(I5-r|1}VvoG*$wLUbeDo}uY&0ZdZ@pr1cHZb5zM6G0aYsUyCXG^Yu-I7@6I zZlI*!zr94T=&x^lEY5hCsHg{tEE2ylpoD=wR`T(|Nj{6C07agnRjMmY#gOt6oMl6Q zGe%U#X+B`urzw^m*xCae*UeTT(MBrfC;K<%9byXsCCOK^wZ3175US@2p=M|6#grav z=tl!VHH{;+e<|2EfxUqMr0F~!@KFl|9Rgunxb>CP8lG|Xz{#K^dW>zEQ%#SHLjdAX zf9k_1=m~&!#`EHXmSIu*DL>N<8x$SVy4aeEnHO*qOQfR0<|_sV-^RTkGSxb7gkET^ z1R@Zr@Op2?Hf_8w34$Hs;*(BTDn|np6oO1J`L3j^DFCUfNn%w{!}YJ5y-=PW!>P}+ zZtn8kkkwq^KKtroA+eUFvk&T184WGX+}w&pf^*x!qaeB(7p5oFksbFA7-_hMRxhZ` z+Ju3hbt3?gb*L3(^W!V5Xq}Y;aX+Wv122m^=HY zTR!5{>2LfTw61464qij@M%ppVz5)FhifJvHPR|SZpQaQNQUJj3PWxIgJAp6Gtdq7P zVl-Tj{J04p{vb|`&Zs!A5~F}fcgTZJ?t4@XI%@(|0K>gz0`N#Qu%6D0yV<9thOgx5JRpoIL7NsZh z);u~1o)Rj_i_5=nOa;G8dSV)(zoKyI3npm%3&999wY)KH-r>~|0%3c&b>O6n*^hOk zWb*4!UqUqp&NIxIvH(EuzH)xFh`ofSS_YDe@ww|r>=@`WApjq(xJfKrMi79!SNu2@ zP-+WmtO1#r@TumsaWUmirnvK~H2biq>w`>%leqOY5yjY$m6YYthibs_CL312)LPqF zLsM%Zi8b}TKFa+)W6Ic>wfN2eO6Q~C5Xc^si)TUZ-Lp9-3mNe)bBFZ?+fG~PT?Z5K zx5_37doZsz2zqo*j%G*3KaGfgwr&bCkPDA23wP^8vkswem+ z0n3KDZ5ZTQ*^9FAsU@en@*vKc_uNg{)(_xSQe_5TWY5pgtgJT$0JxAa zMB-C!>ppEmqJQ*>4PFuAYn#Pg^F*ev&Qn%8?W|;e?c0-NFRBfqUK=F6gGH4-Pco#M zJ_j5WvFic9m?8JPuH9Tkay3cn2$R5g#N_N>r#G^&9fMd{47F&QN$l~vmXg%09C#U~ zhT=RfTUf;k{+;|B!MQJT2zzR2r7pkT{b$i*Q2h?mIQtC)%h1Fs`DNF}+Q|L_(9g8p zEFtbQh96J?L-!xS1^y!Jw^_bI2x1wdejc{F0sz5#RRfbAkIZkzVpl0JrDRKNFV(;V8 ze)^hs1Si)II`N8Xi)ziHu;-Nz?mszJQ^Bq-(9P6gH;RZjVd*Stn zmG7f`few=zi4C|JZF71$!eB@_T6VhjD^H5)r@_8-JNiT#d|lwJZU2Fi>AYP^d~pQ; z|KZ1=zb$&5KV?==`As235SgWWcq=5B19^*#NulA>_gF>Bv5EeV3&&XDx`TXlUP^bMceO)`oo$&Q8(;J5r%LA904`#D{( zW6IF%P4QQ~K_+MYH2~msiHC2ZYuUY>ra%h&nGWUpvT0m<+60nS9h}sN3%H>S?o}6| zDpw*08;l6bF*AquuuE(b+y#Xn)IXJ)sFx_Bma3q+}Z6;f z;Q*`KKO^~<@~gd%Z?fIE_2M$C(qXr7wJ@fN$PmZ%{QRY^HY;TO|FQQLP<1Tpx+w1M z9-IkG+$98e2oT(zV1bDQhoHe_;_epQ-I=(%J0uXC1P{4n?X&mF+UM+h-g|evGsd~& zOlW3zSJPefSJ(Gz)!#L-9R4Q^|D*8V?>w(I3|MUjJgi)L9RK^$-_P9t`HX*@Ml93l z^d0Y+Sou3N|D)tz?I4piA3mpU(o3PeTKbQ#fjz_-8HBjlzKe>!UC=G*^-v+8bwF{ZhZXP1HAI; zCYPH9R=G3{|KlhA`?D~w=@L4|@H)ylN%`BK$KpSKp3yJ0?~nXTMjX+H8CuWv9Z&8r z^!@OU3z6jI4{8-e1cYz*>UP0PgBX8svOkKUU*OMIpoecnkIg6l$!j2 z_5axp1>W=BvTMR+%*diA7`^|VmP{nB#^AXs8Cv6}own##+Evfg(h&U@w-mv-(PK** zB3wm%b~L``Lu|7pB%dWZP458<=KPC)`QMzzvXxU@+OO3^q>JTT#W<3v5HWbokZbQ# zb~>lW8f9U+?Bc~16Y}NS;CasR|9t+30{=sS|DnKta|*nA&VekA^&G$r3k`#U3C{gUka;QuU1g}SoJ`x2d35h2{ohz5cU!c{VtD>nUp_V;kCMI znp{b4Z; zg2cCilR=1k3~a$I^}XD;Ww}C4O7u%X7IN%lf7O5yaI_)hSHJ|0*s3WsTCeB3v2XbG z;}q!N2PC+;Dp=igWjr}+?N7Q{hoE=-geq-XJc^pX&v(^g*4X>+o`W(5SPJ$Ysnfz7Vk0p-cG!l1%x~zuOlQU>KQnf>iqgqP6)i$Ma5kx z%L}ijb+E6;qS+B_pZgQ4Fu8@^fi1}^Vx$;#jqlNbIegA-C6nyaMmLLM3w8Hp{7_-G#a5_T zM-agsb-@FwdK83u%jx+p(-9fCeDM<{POfTumb0&@fU_v%k&KN>UUrP#`6I#v?AiBp z^IIWXPIjd_UzJ;qUeQYKl(tXkzF#buAgF$xS|-un>CY0BNfm-Nz1H`NzTuQ~W!ok$ zR0y{Us@vF(-EYeG%zlIR1&%sj$C*#lV`0s<#M?XWC{x$|rM;g}-;hFJdO%V8-{h-Y zhW&t&E#kQ4PVWb~C#0Mr9v`np6jh=HmiOj&TBM%zGsT9-ks;h|ID49-Po6b8NOCPl zWEqnnzUL4bcFHSRb_Sf8BfU5w_`B7JwD&VDmX-Rs9*f*h42Q5}2GxtH7-EaCG@y{2 zK_~P#2g}d_9puTEr8~{zhh_|m3dAC<+QZ*x23}Vtar(H_#D6V}%r*d;-~YEOoUffw zLBC!uR!PlG=}t)^tR(jG2rkap^`4BmOnaxVH#(bTV-^5niM9}6*blr))&lGKJ9T@; zYoyV<-WhH2D`#NlH<-?^U~tujM*bO=eE$^o7w0!7)~5P)IHJ5CPIN zoUvIs<2pqJA_cH7nLJLJL7OxWoKa#w7JPBz>4{S!DQdUeyrrPbW*TTg&Qljd1eXWQ z6<^-27Og&I`5o92Fi2_%=FackU^}t2rPGEeaMovj(JLQwP@~&#sFwPsluaAtFCTC# z%$XBto4UN3U|ZJ&ShRYlS~;RanKbjD2bCyCu zc>jVw&LfaHYKj>hV!Lv^>M)v6rX1UrmOCNsnOTs3^Wf0_`O&G>;Nd%InnlkDm)&DM zsxC?TGHE;ykHgoj z!^MUwhY=ve@uCxb=~^^)xq6dshh(ibc;?*G;-GRN%lCGUqI zty7?pv*aslEsqRWt$cp%Twf`#m5tSmt)Q3;@5JUR6B{}vna1IS78b3mhnrWsi8E)L zCA&dCEc-sMQFnn%AJV8EH%zjs%`a@2Ixoj zS$TkPzLK{c!x9ahoWwC;_&Mt5J{SNZ>}EtQ=~(o6-_`bg(5CL8#HR<`in#13pNzPJ zR)2O?-~3|V+R5Q;p}yg(uHg3?9u$4dFHU_wp}L)dcW%*qUAZ<)8)UpU5&mVnWV)6u zd2@2<2T8RWs%%$IzZ{3X9mROmdCfvJ8*!e<>(Kw9vs-BOm*{7%pfl z%rE~31hjv6;*~@h%GWHVdhk&8=8*nkXlh+v2!QYilHuGpJ-g*Ov(>X-kX4~ufnttj z)2N4P4r0Cx-hbye$XvMDr8^91CynJ5OmegC0qVqR7J4L6ILDZSpvUS zp^ZrDT3r*q#>EW;Gh%#>iM;bdI{Q(74(vJIaN8GCZkBIB zLp3|P{tNU{wOrFc{IYXx%r{s1w9WM}gQ-k33A>UbCY_jnc9HvB1Rj;(AcF!Et!A|b z_JBB+1X(F017@{!U}->92#P{k{d))ljMD}i5c z)7o^@TQdpp^y3|G1q+S$}eZQ`oyW9?ox+8FMLS;``{bZv$d-T>Q{yOi$^ z=ZSd0+H+pdX%kjA~{zKVu#pO zJdaWy!%^QkJR-v?{aNw)gF*ei=Tz3 zT+cG^G#i%YGj>Kcntx1SmmE@&@#<=UNMl?3vsd@V+_R|~Eo4!J*Xz2r@gE`x|HdHg z$wc~FJ`i5Tqd|*ehX@OzLuBr~w@ke1bQAW7g4i0sM+ zL#>PVi(BOvSIN9KjLzyHf9chcw6;x%UKO=-;HLlLPDKgFicJ0U=J}rx%&TlaBwQDu z-D?bE?7bs-GKuj;_A2>zrnSX$6&Fl5{JbR0Lxy9mOMv-WG0FXYmFM?S!|z{{I=*nR zcQG^>c=KQu31jNy$=cuV?ChnsIoooe8|2SIdnUl1NHjWnVfAHfNSb1y$smFz?6~o zeP!~An4eI4>I$uYd)_xX{`PFN5aF`U-$>{{@MioI2cUgf7d*p25~#_Rd ztDKGsok2@4vFtdo{ZaX{C#{Ti}n+$Fgy{i0&>ok4rxrmi!V|hx{?Dx zHC@wL&ZZ*P?%JWRo*&kvn4_DEI!<+^gGVrGH04w3!@4sn8J^d3oWl;Sj)VbfLEU8h zwT`{d$>yABIEY#d7XC_w&L_ZzM@U7NPcQQg0b5Jni~6$m9nQLJ1(&`nnPgPH0&M?| zQ|67EO9#K&VH#U?m;o{ul~F>k*h1=r{DaAoTIS10eUWW1Cc2yb6#kU=MydK^4d|6z ze1C<1zh3G?R{>tZ>GhrCpf3E0bO!s(e6FJt;%u$AWA|;+R`V-dB9+sr-`_`0mepJO z7(5qFtQ3H)+#kGszP5%6pl4~19BU)sLSYAX{MKQPGqqndlN>9&3>P}u$M5`#f%yJ= z$5K$A#l@|#3-KHU>fZIwgPbaLi~$6|&ZFz<6UVT-c7VoDsD^>xQO4_sCu7Uqac|YS zm#RloS{~r}l`^Y! zh@tWy2Vrxbq|pniIK!$siFY9r%t&ILQ~pjfPf+cxuxrGq)wT;-3SK7wP*dkj;!mi} z=Q&~vh2Oub-M1I^-M43sJZ;NnN}X~XPOaMEpMeZ_2uc4kTEE|i%3Xz_ctvAaTK4JF zvkgq@sK{W$0HA)q{wQ=VM>? zAPM{r@Y7+WrYe=79pyN+9wcN&!N3^`-Gb&yJH~RSLFV(nNR3_FL{`{p%@OBrw*r|T z)bmUSXojKph%$!b<;FNaH);^Aymq$~iyk>nRYjRisCWhHrD9|3wI&TNu0Z9CDu&L} zd{>g$J^G<2Jh&?&6+$`8VX1QS8yE~|Q{!L5Nu^-EeKav6mOu`!7l7~K3HD=4WZoyy zWxqY1DS-&!57Fdx(;(pVpg~mKcTK3Y`1@3sQMm9pO*1ql4cHBh66q9MIKl{C=NCdO zD$xq+8%sQ#?m;RQqkKS z#&O;B6;YVUkUG2=5@GCC)?oa89)6&0sKVU3Zr|&!=&@IzEdB^~DI#1k0v{#1m^=@; zev@FZb`&4gkbHt7nIY~6Gk^(u$ICMHhW!iqMa<1lJF|oHWe-uRHoY%DtoljX3<;U}E2kB9hf1xbz2|}yv+ZS-`kf_QSdSy;d%J=*CQ~gCNIu-pHL2(ZM49NnWeigbx%re*evF>-q}BWvkiAHP6{Q}Vs5avm&;di(x^nEMbn$J@S1*E-JWPS( zdWVOabV;cUF$>J2vymcCgkLOa7P44|XmJ7*<4iS%drMysNKd-g5frg6Tly~G^|5@o zoqLxvm5L#mkP|A+e!ybhHzj?m$D8MLFU%LEHB??G9~`cvUF9e5$QpC*?bGu5cQ&U$ z>Q)S_9$QbK`iunAefu}Tzu3-=YKRne-w7h5NXOFdYcx18rW;|n;DK1kZ#{RxEh5Zb zTH9!icdf-lTYu(lUxiUVKxC`&3@G+1X&Hu#cq@z1+d;iFg^g#9DFpS}wX7xzGCZ%F9UQ|G%GAAeYQ9q>Ud}`ghv*ct zdjAD*x*bEzRM8rROEx=ajsfwe{2CgIZ-1Y#zD%HLl!O#3sXxH2?o0iRSomUmK2k<`44 zEvPz#`3(?X&Qan4xV)7q_zr+<G}lgYc+dzO4yd|@wPsHG4CvdDu~NS+d!J5fIa1(i%+X! zR~TMT1q_-HQ-lth_OB(e9G`@x*BNrY_h-%QF4SI7tfk?!vj%yn;YCe(yC_hKm(1Dk z(={Ug4Xqy8{`D@N$;1RtdwiRJVkK)LMteG|sP(=(o(^ws8-;J7!a8?>n$`2(rbkNAd zos@W0=#+&hf0mm{2=>pcCtD%a?P=`3=qOh&RJBtoKbN+=lyHq!v1EXSvZ%j^U#p&5 zD-qiK3+p}?yzOlQe7j2wY>tuLG<87E-gQ?n1Wp7M#~ct?HHN{0l*>(#6w$i{FvuZJ zxk$s%t%|e5`TJq{%KR*m?|E7}N*i+d)fzUg8yYv+k46c0oT4S{AX%U9YDQjN zHq>0dj&GDeDWA=xcIU{1ZLieoA52RSZT1T#Pn&zay*Dy`Vg$FS=-ELIO}#+Z%uE zNfToT=@D?TW_*xNRFguAYGD#K0dWvPYD% z9qSM!e%b(kVw%1=U9kjxhgUy&gPVNd89Q*qY006#u(V_nRk^QyPyYb#rE%i8Y4Jra z0qO%2NzmRWfFz&}Ho_x-CmCZ~=fKXHA0uTDr>{onQS z3F;hAtDE4PpHQ)m8?4w>d3od;@!a*rbZoC<8E9kW#YHn;`Twc5tWIw)VL)`B#26K^ z0F1KUo`{gpMwr-_GzQgFm&me>%>*yFhdm7kQW=K^`!3DlrFoMWBhzDC>ZpdXf}9Cx z)2N1}(~Zl5zcga?vNw-^$LEh3rMIZ-JM+?AeU~Ht?Ts|K5Kcx09VUwX;O~0*HV;ps zWn^#cvZSFDxp!Fmrx@9XD8^?!g5QAnQ=<+PUvFHw_-wTxo^%LK-AG&6@z-?bJ)q!V{ zsI1`a7Y&|WV2@C5<&nJY*OlyP7MtPL%%K)4s`6{%4*)*m;B40ceY)_4W(V6tsq?L# zIZ=auQXhjSNZbPtuCuIn*^Gyu2;AFT>ip#WE-^?Uy*%I4C7R7lJ;1FD<}rt>k`)&w zbSeAQLGU5nh=G5Se7#2|L$pOQj@p@F*{QJUC)9>|YV-RgVAN3i87!rr2LGbkd2>D5hpWtZ zkwx%)As3^5`4b9#$V?3>J-58peo3)r0-41+r4GVV7GRX3;Osu{n>+m(83vA{Vk$@+ zKY)xczdStwP9lGRuKV@|op%|i(EF!_=Jb}H2=fE#Lf{taXwJ)?*fxYfdY5OlESc2n zhn=2-PvNImqYJyQ+7yC++^?W~Z|*u<*eUz-cgj!edAX_fdcXPoPp_)<2#nSkC4!%@ zht{P|NoRAju|JZy-bvpvxiS=yM=7t;(EbRjY&h|3DgrIU1387=*t#gq@9WJsCq#33E2hq1X`t^{6InwC))~NPqdi z-v07(0D8OMvg*W>3vGKW0vGQX5Q|tGo5!Ns9i2zRv4VP=L_NmYtG@J3HRhant;E0O zdYSE|z0isAm{oM$*6tUW#V^%sp2v`%0gs2JTqi`sjG~fjb|L&*L%$tiDB4F;72XzJ z*D$z$e6d+_#UKEKFrGtlr;s+D3lt|h0})G7*nqBr5#;d~6ve-@h2pn?K`+Yqiej^@ z{lRpi^7X-tx}LdqToD|E_l(nHK}n0%6(%3;8;`5}YVW#~0OnGFL{ar3l`yd|{KksC zjp6Zsc2-@W8eVsOFEZ%#@PGE#9Vb4GCT`z$?gAfaKL{tAwf7q5r`aL%<|E*I zpn;}Y2W4-oyUNl`8T7sx zo<7PmKV2#2BUu8g{A_!OYYM1{har*6Y4H?8(tcQue32E-M;Lj2un>FM%#qxT;x~Vj zFF&^mt-T4aN4N`-0h4YtabL6H>~uXXdqiE_OEssa5RK5;r+FDg6k+dLK3LGp z!9r>@TdRKOK(namns;s--9;@On1GgZW+RpX;A(dr!@{xCBOkj&SFvSLpx$@C!RF_0 z7GmLn%tpL0A8zFEWVysIW|3jH(p04v>iZLv&LFyEK^sMV%?Pm2CV@TjeYT90lK}CJ z!u}1rAk{s_3fmMMIrtVT-Ki)?Hj@fzCwv%XH?o8$pD$0G!?nYR+~n6nI?^6sqT zv~k9cn2mWs_7M9RG8PQBI0^+H2ui4Q21MR@qs3^kl__$&Nij9fa4yWOsqziV_Yo7r z7DeVo#$eBV_A31%{I3bU9Zo4)|DTF94&I)S&DKLhH?uLU|k zTq0go##w!z0Y0@#WiQIs-T!Zj5M+m>!u!~Wzmjrx6XIF{-z4TO2heBf;jjJ4w>BfB zGa6UFUA5ztcND}r#OF!d>{BYLahvB-G7jy6DQgpa!4$yHY03kX(hDPjDl^zD*k{u^ z>1dD_gfWlHK2%?1HvOpSjPT<5EHsNgz8^f;Ax}Lr-kf|k3@FJTH?#)} ztrRzO=?=P;bhMx$1-4X{doU6MPe@5?QQZ5zN5G_I6_F59FvS1>%Bc-yOFIzE<9LgGTl7w$fzw(s68r?z)fQ zxk#Z@Gt#>K6x?#EUFuzrcP#Ox5ekn18)q@N4m7OivvCNNO}lkbzuISE(x-e8_C7R~Xgwpm^0&LR`b==(YRj_kflb zyPf?*w?3@94M+3Cnt*j9?-?metrBfNcK79EWGi>Mm8#2E{y2f=##A%CG-u#R6&Snz zh{)d#c2`-~zwJ_7*TPzp&i~p=DJ`RynCJV35`9)b`SG|Gnq-$np2S#O1Fang5T9 znI0*Y-d}f=@oh6I<0O#`eQzmJqAnQ;Q%v5Yn0%x%$i5YCdvzZC-ftV_c?t4f{NNeG~1S zT)JuwY+;q1250~|s)Pmz_$ZuCYeXw+zhD z53$0r>yO*CRCpha6J*@F^{Q{-mWZf(HNEpVqa5|JeA)#;7~GsxW#svTUX1UB#gip@1gL zjtCYr>&;$z>n|QE%}sEFg;2fJo#H^&Ba=UG7evh(~b??$I}_`g0V)7^U^-u zr75p@i%Z?ei^%Fj(G~6N@z#oF#t?IY-=1-iN&qR@O)0Pwt{W?6N-^FVi$Bf z8^6R7N%E|_wVMw&Sxj#i$lKS`8egAT3}hn@`qv&X^nb4av;sI)+86%ZhU?Dbh2ERnDGJ)+I{}zNK$ng8zEb&bdDVg?MyqQO2F&x zbKTCzL*Zz(>UTIwNqNcw97zHq?DIwD16DYqj=lxPIz9NIHW%K%4W1%=k;nthO=y6^ z1RYH5E%Prq5bJy=-B^KMJx2)Wp%z4Qm*Zo@wWix2^7tGUeB*8xN}*4F`%Gi`FC|lD zifh5-jr5yX;_Pd%t{)3EOo&3HqSMj2#dN<$XQ|qAv|nN>+7G{hF#58@wQIrPTo!nLRhTuJ=qp_C;@p@K9u+&;2#sz8uHo(?!DY%=E3NlF2Ks+J<8zQNuJ+7S4 zxA2m+Wn>fx4+9DK6-DD4H4Za7S0ty5@sn{>P1Y#s0|qtpVhk2Tu&}D zdUt>_f(jx~e4AV(Tgv&Zph9jG|vU2inytwN-oJ>G_t(zU;KhZS3`;h6KdwC zcq)~!f}(+ovRIynFqj6EVqXi8Ub^@rR>o3(pMj%j{pTX;WT_0r8i4Qux1Zp;>Dd;o zwGVmk!N<`8s(tq6keschIN68Ap%phF{clHVS&`ceZ|J4z?`S?@a|NsgqV4=r8#eaH zvf&}+H(u!n70zQt-d6;?Ti?|@%e@#h>v(LL$xR<9#>tbc6ys8gPEai2y<^=3j?`Qx zIYzU`%N{;GJu#y?%d5p(G!p5phvbcpmp+xH^yxff0~%KEuH4D8o3M!<%?#B19}+U&MLf~#k`tE1J`I~x{BL; z1^#L>tE9HQ>@Z*@t!XFc+nt4zV=}Jt`3Mw=~qEyMrarYQ9-b`sMHSAT8 zU-4z_qeT{++u^|f2IqVW{iftJIE2N4`I_{rOIB z5UNyuW{jt?YbtSc|Cask7;2~0FbpC|WV1aMgPej0(w-00S1w8AoFHdFqr_icr z--mVDPQx9+PIh+lzeFP97|Z0$n9pnXi|e2|dO_bujESwhLV95FtFu;EU4+;bQqca^ zSqP1GyE87@OIa}C1sZF%hlv{!sd;0^+FD|$$$b-sb9EwWCkBO;-+Sqn% z1wi|-0EtgeSAV+I-SyAD->s(fkz@+#S|7#j48hPYC?Yo^*lK1#rf$cGFXd>y+cg(R zC6TQl95~AZEubxRzWGlM#hR8) z^``IK8_G%TevQWP7?|s^_W9@0INnsIyRg>FKkTbJta!c`I>X=~D-P$=txIzH)op?f zdA6Lg{}X9?Y(pMhN8RrpYeJzPzV8p<4_=C6^7O00Niw|z3F}6-yvXHVQlDr?e>b!i z(#3b*eLOKvIwvzz!pD90O)ZA|dgWV+{*h_qITI2L7$E~fi!QKBISEv?FCA~-flU_` z75ZTlZ_5^*t>m^6EBvbs-ukty!#vTI;X`$u=wK6MlL}?h^5au5qU2b4n*QvLA{`D+ zvJpw*cAdUpW{CMC7`(KW5poWFA`mX`|BVn?om(i}_Mff)VXtZO7=4_1iZThf2?uSBV$s7nGT;d97@-`jQ z6yCQ(o?nTo6rGs;+866^wlsb0C3uv3>lc9?wh|d&@({$r-$XI? zQBE?C%yf%^3i6COF9{T(1NaN>;<;!#I><%xosaC3V0?6ruvy2$zL%AVv)Q8awmH|3 z3aozp%4@g^eAiZ&nhm|OFiV+x+f3StJh;XiP9VH z$1w@7@5bx2YFgl&;Fy4_TiiUquxC(skcgJn8FTP(7x5G4=ZwC{nmv6nP9a;}h2`fA zGktiDD&x>;@p3o`FdZx!V@p~EOag1Gn_w|1fNl;Q-YSK4ByC;(*RjJM*M0@ZG2;B@ zF>5zh6A;~eyu$qz$GDm-fdf?U^DGUwy zwpAiym};k>mNrnXds?Py%SR>)-sMqK`h^K$w9vU~_6&zKX@`aq-gBq-Pb%W=UCi5v zsh$lVqRp6{w%~uIN-9pByJbhU7#CTewo?1OEnK zk))_&#%AZpl+bue#TR*Ssd!F*gwU-%$HLoVJx_$B{>X~3wAi}>tJ`jOE_rAOQaoV+ z3BH8lE2eGsR8N;37I=nkERU#Bc@R~wEFMG0=pUA_riNhKl}8%Y9Lk|`_~4;xK>CY4uCKLB{t5ZF%N{Ay`yaGG=-f2{Lp)7Q?HKUB8v%lH+C0!5)>;>%9ZM4_v zdCdmE2>yin%=DZ>I-{)W$*HpIZlv}9$`gt@(sIclYc66LLS)7dtj;9+qe+BL5z;6h z@J+g$&RBUr%O-6+S|pg{?Ir1XSVy!5N1iV(f zjDsz5Qa?!$gDa%0AAUUIvyYN;*IGCe(*Py!Yi0{OE6^Sb5Urh5dFLp-aT#IN%I!mT8MlLhWADx6G2(D5#EmgKX$ znf(nkqj9;f#fKk5?S+hsaTU-OTqT6{-CWoXk?5g4(r7`!mzCC^4AlJvz2T$4oF;jx zS=@;DMktYcNHeFq2_*XnEn<}_w*T1Kv~OHbXwq5XJy`V>z0+Se)z-+v&Oz78tX>5# z$OJozBf{k?bA@pTAe^?p}jY=16eJk7*4L-*!V7;<majiX>Q1Z+0`<5RXl?iGcO(fpe z75?RbZZTk+2@GaQ{f9(A zcOtXs$l63iyb4BzHzcvwkp!zE(jAY@jkvQ0jTA*QU-Xr#?QZj^NE!W+Ka#y=HIV@F zJ3=m+)Wb5|Uh^Y|a)^Ot8aVkNRq}^|&huHi=B19@hvLjk9G4;&r26!WB?Opy)Y5wG z5j5NW5YnJqh+I5HjhMCCu;XQOJN=9n3DkgguZjEJ?J)3V&DxLNP}=kqYVTvJ=3wKc zoM&Nz;5_dcf0128r(UWAtyxy+9*Ieg1jBt zsnQxmq`(N_dK;JuDwMz$>T8*`+jCVp^z1lS?gt_>untewvx8xwA^Sth03Q^vbG&Ie zk{*q{NlG~eS8Jcso55}0TbuVM)DuPFBYb-WnnLB9sy^WkzF(-CA;$0|js@~+j=Q6F2{L>J`YLsNpWHwb#5%L=doqjx zrvP=O0aqrw&<0C8TM4zMIk7(6( zOR|TU^E$s*j7DWXvKCFadevV{^(jYT4{s>E7g!0o5zO_e%IrK+A{k?UJpIz>JUQ~N zp$DLhvEUt}7|T+lTSHE6V&tgNYiZU7Ay#JtT{<6V9uhRNcs(?(q^{b9*j1~=x>Rc0{I-pgz* z-47}nccK+a>jHD!FhfRI>BP&(;xWbmmrdQ}=vK_2H~lA6CsR}7LYGs2_6)f!{1F_5 zWUV0i`nz%T@U12|IsSU1m~Cem^RINO*SsYgwaDh?i&aCRnkxP7%VkP3B77jn_v09H zK(OeO|KQyz@ zy}c4l+WC^8Sj~>N3*>ldTfr5aC(3VcuxjghT155oBJ0r92R7DY=$Nw8qwPFPc6aC# zc~R@gMo}6He~5MZu;5LI+cxA4ONR@trHuE5L+_&n(%GTpd`0 z?NuWNTmPJ$PXC-_7L~mZon1P;zl@TLJPfzjUoye^;6s3MIZR~#s!rr14DIVvJfr@h z6^~p44+@!Hd(P&031c`n6t?>9X}1+^hqZp>eJ1{gSkyE})cWVCAmkg^5PDrUG+C1V zd!vxo?B`a|X=sfDcRnRucO9OKRVO?6DX(@~?|VGWLiUc$&4*7^d6i4{uBR^JW#`^t zOId~S~bymKY zKiv_|IU44tXc^Hbf4O)ZC5ay_te_JaD0@{$TFjzcXa2UA$DB=Ge6Q^fL-?ZubrYak zGq7{4tbA+#er>rX5oldL^a(eXPd-bGG?`CXmTI~|){YYeFxz8>OqDq=+d?aOF&ds2 zT;cu8KHhjLF)$uq?@yFXc z13IvM3Iba~@rT8&>t|$utC{Z4Du7TsRirc<@oYa5SX3an}dcn(~ zN}P6KO~&gs@6xjFYP))N*si_GGI=4?keN&3Ha4R_jNjHD5d^}94VTbo3r@`F!j{lv zT>r!Fv!m7?wB6YkO+27K%Uu|cEq>k;Sy78na4{72c5e28TIRZtB|Il9qw|$1dN;%B zTpc(I8{zsnDTH(5_rLvQrTd^byZV2W))*~d)WK<@l%Mk#vLSDJM5{*XgVB}+(1Kwk zc9Ll5Y(NYGPBgJ4*oYo*{`=gn!NWi7g7+1pevF9LHRE50-xTbp;RTbh?(i!0&SgL= zioOBkRQ%FI-MG3#hnuILa7@3UtSkcT9Lud!8TeCdt1uzXHNZ)`+2P6t`Wi;9Plsl& z(?W(X0X#Lk*#rSK{?o#apBz8$saWv#3GO=CI#qc2{NSxAqRQS+*5m1QtPI_%MrH8K zNRTs6!U^Ao0ecQ|g__Zqcmd2fc;BA8k(;C2ZU2NC+eSz}v=t?6c3hNz6lg_lhcfZ(bsA@b93BOt{ zZBNoUw5>zB@p7tO=p%}_k6z4EZQHr*y|2$u+vb2^BlPeq>VpIm1f+Ox--aT?qQeD6 z6NB!mYQ7G$P`E&VQkrp1l+*Um6V*r41;8YTRKXZ5z4A+8?5J251Tcc`k_bDBGGI>9 zE$KYP;gD9bu~s(wpQ;b8`3T{97o&Zut885_CmR+=MHY>K4+h?KC;$H(>Z*)@*C0`N z@|ME7hrOqmEJJm8ZxmKStjB7oNisPJ5@?8xSYxP_X=;j)@>PLxpGI5Wv3xX@r{gqW z5i3Yt5cB#0f zHDIF>2oK&hA^|pcdZ#}dYft>hpYeTb~`B4vCE z=8+p}ur%n=1E@Xw&2$aC}tn<)32<{kB(1X+38- z{z8FTjcRXQxToO|7>+VMHl*BnE*GRdYehyiBq=&&#;=_1{I1Xf{i3+MID_fE$%t9FO8I# zIRjj95E&mqP2o={?<{)4L?EjLKZAI6GF&i=!mT3=Rd_cF?X`SDE$nXga?AVH=lCdt zH*9*YIM*4KyV5H@1hzvtPTs)U5g;9Y<$=Qj_dGT4>WS!QvUr#{L~ueGNc?%q-YM-= zO2RZlj)I|!Lh)jtWKO* zz?uuC!=q@A`+Zf-B~;b5lW_8(feQ`xFE$8#7*rqV1GY%P*i@>HIw!%*(?V#@*19up zoD~K?xR|L}=P9%-#)ijmt|?Q!(jsS+DBYmvBMd{>vj*I@r}whJTe$Fhn8)pq{sx9f zSCHbwLe08)uV|hQ&?A9)GhAw;s8;$*fg7SJuRcSx9_2WG$%2D6yW~j;Z|AE0W;ATl zsT8(-5aGLDhI0`Q2EHsm124Vx_6{P=Vr(rUIB0zuwM4;QN%54qx1Wa}=TCBGq9{ib zT+n^WxmIOlu;jM)NQy*cPrQl(%k)S+4+wn8$z{F_0gc-O{+P*jk@V%GE90YKb&+Ag z;f`)|=WgKF*M2!%5xnxv1r-bK(Sr2`x?TmEo_c3e&?7F*B@rjIZ5O{ty-U=}VPk7Aq{dOhLDonuV%1F~v?HshI0LWciNYbMN<_ zb7D7kH@>q!Zp4j==$`4Cj;_e6%FN1s^2vBB)BDk3PyLpb2Y5R|ZSp&eAlQ(j%$r3J ztZSK99hOW+i4+Ao1^4%=;4hZ?nOUtSAZxuv^k6icncm5%nz#BR8DHvG0YVKDJ{kWi z**4ofBtS0Kh2>?6F|hM=H>SzLJ|MM)}PDh zFwk*HCqL+8<1o;rcful;>2gvW8wE0#Kdqv}VnG>)cBRiy%xf0)$liH00PmXPKbmNq ztupJnvW67J6kkP3J)AAV+}KivI=dquT} zT(3Nik+C(5Yar*pgw~@dSwFqeDu*enON(@#liGbV&F;q8Yj)9nO#7a0A;;8f zGGMZjaGsNruBUl+o{Hd$L^*49j*pN43nMm=@oV6kssovHBBx`QvKBT(ly=I+-o@v(e;PFA< zxaO*FupEsuRkE%Vytn;m>u>^$gt=91v`ffKOUbd=2Ye$;3g22W*v z_rof%2g!yeSwka4dI>d_SX5emv3arhDrRcT@tL(?fG%ogl2*dx89#T^$Zu^WqmiM0 zSLP?UqPHX&$VC04-1x_cRAAx`T4CxwEMb3&+{;4F7Greb+*cU>!`-7m1Aop>b`XxR zevGbjp#_w}k~JZ+K!yo9#y_v&>T!=)t!vo$u|jCrHDtT0ZSQlAQg2|~`v0+syNjEj z=6iYX3FVO$7oGX%!yT>q&amKq1-zK`P(xe$(_zl@P;L?2U>vPsf|$|H+yn=<&xv~C z#?XAY!Z`DneS|6JYQm20v+EctTgBNfMB%D{35|(gs)}`&ybnZ? zIv5eO{-H>`8QdcbGSc=s#B{cazCUw<`Aa~S@lik*KaYCfu!)>S=TeP_&4t7}UBvPt zJFVsza9kMmq5TJ5X_=I9hvq{b$IvKxHg;Qf9{PK(GH;vxbbtCEVy&GfwdwzFKXqs? zx@)|Wvj?D~HbyoWEoRRVZBKHWGs6m+BRm|zv5r%?Z%#e|@vM`2(>BRAXfjB*ogtHt z9I`&q44jg2Hi-@l^0LdLK;?(=swAV7{G+5$;#qri^Y52T7Sz1CfpoM#>^I@@=OuyqTo^$5&bMUu`7&6Ddt7@pLO?pLM<%L zxyu?Pj-UYYFjIsfY-HLdzK{A7Xv~2zWy-hNDq#fdira(tM|eYYqveOxs-nXqjB=mr zR~)~9b}l|`PD32FP?wq>f5Bn?Yc_XUxD^nZRy=iHCD`WYrU~$_un#TSwG=s{zxqS) zRtq!303_`WlIBwQuc&3B&bnkSvoBp8wADf)l2qjU(wT^VFjZRHkZX7A@Kd zt1exTniu}%bm7}e{*j6oM`@IZfL#rW9YRgk=NMC<6k1HzB<^V!Ut+X(*huT5nb{_Dz?=-Q+KMf`YfV)pTNVZm>J&eGiLR~XyXNBA_Q-++CW zY=`)9gC&B->g|i(Fwz<8IT<~uLtRyvQr-5naa_%w-nX2QDED{CH;ajog2DGwlI}*F z6MbRMjl4-~t}_h>(RFLZ6#D_!@XtfzJ(Y!anG*NbOw9)Ioi+m1d%Oa8xM5G$F!;(aqwXf+D4~F z<{)$x#p~I*NY`2QEcWooV0P_tb}DXiw=e)alo8ZNZhCI=Y05{s%4Au28SC-;^6!!? z>exq#BG%CmRNg8<2xU>=Y*V(t!h3vSLfb4Y#^`8m!P89}d)wka33akGk(3Luhih!k#IQU!`c@U>|Ce{niwkMi*yZ;T~fzbW& z21%s@^+sJ)D|BW<9^-s^%l+lduF)qgc)`Y0{fwD&`c_twRg!oba0e^eFk(PvCVL7+ zp(Txv*(E%lwg@X;m&i`#7M#RTiX8nPX>0*r-Ta7HVf5V}j)Z$>>%Px-qWkdjY%gxC z+POI(k3qyx*yd3n6)=rruTW!!U~9RDmK;2DM*J~R1n-wtSi_jq=f7Ak6erpuCPm7; zAK{&Z2tShuhmd0%)q=CY&IDT}^-~K1D5n49+qcz0ejni4lFd%0?-_B`#)f^7!Qu~c z)Uweh)E85+g`SGoa_)$&Nj%p9dC-0#q)hziN^K_TXZ}uw(tS`l1Mk2$?94N%RW8)o ze>7k6bkH(>T+L;})Q?hI;ZTHX2N#quS8`g~_>l_$ZBzr`Xw&KB3}InR1FpMdzzyDn ziuPFcN4`(#8Tdu>8MbJ?E!JZXOkVMUvSmAxTqeu$Gmh3Y&pmFr^ChkM@}I%nwj4su zH1Z5pb++maM2?_Mtw_gyTcBN0m0BV84TQj~sxus|ZW%U(e9w%Ar&EX3e!9>t3NJ|* zW>_<3`=#U3r=7T7^Pu%?%cDmxVYS+M0al#@jJCIiZhG^_EP{c#8rdxM66R9Ga^m ztW7jCzEHk)KzG4jD0W+!8dj@0LG{`jTcaki0^x}SD7hWOK7|q3u97i!*`#(i95$E2 zG^4oCHqhBE&)#LxdT1s;mC7lY)I>HTo+{b_=I)HeJ9-U`+y(rCUec`I=e_NnvGH5s zTbj8rESb_*)iI$|`*P`P_|O+Neyd8uijOTQ+7el)>GO`i%Qv9gl1F5x{fE`eGfoMO z3{zL;9*wfj9+-L$f|Uts%`5m1AjeZ5oytkl*JbM|TEAgO$~m@bKWbu&JlSJHPt$xZ zS$|&7#5Bzcu)|m`m@W&e{!f-;mv9=_JbL4V?$mEU&!|sG zN@%*Z2dC0YEUpfE>E1iA5PDo2&M?HXQ=`!qX7 zvu$&l=2=Vy^0QYb;#AL{&GgQk7nfkJiI|zwxc0F@>|qSWJ@N2FDwDFVxR2CgaH2EK zL>6iMC4BC>R$DqVYIl;e;lst*1n2sfWZULy;HssjOxB|2F#fMMXW$`tvaaD{ z9714)!wNs)p1`~8ywr=qpx`$zB>N3GRx8|eYKB!FG`88sVR|6$h>o9G;2m_74cl>D z#C4D^lV?-U&-_W2B5k;VE!bn0J7JlO8q@C^=PQ_WKo@GaK^K0v90)piIGqlh*40CH z;ZG4y)`1Bt?(S93NX={&x#^~Ms+UL>Z-O9f|7qB$`y24ZIaOiurJH(sYxs=lmH1om zR%s-bOZYhGFTfA~6BOQ{ODt`s#S>}hie%!FmdVdrR?AUJan({juUUrpM!G!$B}|KP6}JyZgf|7;7j zx7{mS=??C?tfR)kuB;*YK_TTFB$03wxA?@pX+MuczU1rmg>WWa1g4yp3L8Qj3jWe5 zxt1F^Z(Qy3i}bgP>D8ifac=FAg0wE8dHAt~@ai z8^Zqv9E~UDcE4bXLIb&zOc3sA!ggZzojq=nAMbSRH1?TW_iE(`n^rVFcj=MxR%F7r zcZja{sV#Mduk6HrOuRsHHf?k%!!^}tZi%&<@Z(C-QS}rCrJ(a3S;X<3o^&IX zcW$H5^SFj1QZ1fF5nogay5dzvu*>%!5b*8pPBYKPxfOI!-Gj_>UADKTD)uQ2dUG9r zQv4pTZNa>u-x(#A_HiMv7_>DzBr4g3lgj|=J`40`XO$TI}?X=|Z zVNB@&NHiCa6ccx%u6h}ec{pthn>*Knku&{xV9e|CN>AzOlThh2^G?)6*r1GHQf=B4 z{~H?en70{(A+y(Ai`AU2mo#~2OT<2-ilH^RlIbSO`kt3UksflS89TSzUG}#dbr_y@ z7d@dGyffu7J>K^-$FUc#3IUAf{!MNC-hYYvA2g3;7HeS@#NM_Tn3rqu8#qqAKZ*<1EXZyDoQOn1K!?;m6^#aTyWI>$&dV;)yg-Q^eVZ+s#7+?(#7HuY2VV)2p5vN)mwdvFo=P$iE&4F~II%bpRovX)rk zy2FmD`85=+gXlWuqI!OznJdOOhx)+mDDLd|25&9UDkttpL{rXEiQj2r+jlc}?HN|u z5TB|Dc!^}+5se^PRKGa()t5Uiwo=@bZ`K4K@l&;9``xS2e@}M0cuV>J#bW%4NF_>n4M?G=(@C};-;;UC3 z+*qmT1}Ax(;*j^C1m><{;rAFs%^Zls5cW}E{7mp+t-WPOP6Hh#W>gM(!K`_>OLDSj z#2zTzM~p~}ENQG5hp^8^m7zT_Y#?XB#m(S`zp=q(dt%?>ak`e%Mr9MG8!y-ojjq2* z&)UJMkJrWB-a?x5Y9oCmme;SOB$f_sJ}Fh{-6RGRKvDD&=Z~FKd_OrS*0a9*mL1}ul3RK{@6is0 zB#RQdoQs&I$hvnd{*uQeslN!Y6$wk=>)HBOkxWHge zxGv{?2v_xF)fjU?t7XTYU(xi)bCy21RBeO9n>yARby%~dd4Evhe?gv%ZK7XAl8?Oz zE(g1kbXqc=l^N0WpjrulFlsb^+6>lz#+tmDTA*aK`6u@dP1MPX=0@p7=~JIQ5-k|b?kO)t(&Z*Jx$DA2*u4$ z^EVN|bh-e%8UVZ}t0$`oUf#~tYLTVI%@u8DFiX0!R*qxLEa}_pT{y)dAQ_<0lXr-U z1e|a=9v4tT+~>K%9II{Mx!M~}EljEq($WnOf-x%zTk0WB6C41}sA=yIPBLbt5H%md zvJmN55bVZh?Pv5FRo~JakU*@qC^v@Iv!Iy zYC8*zB-dVTThc6SVrBT)pixoP9~5<{F`8l8m6H(@+E6^So>$csTmJ^gWnFQl+UhHj zeIG;ND? z%lc>Zv3rmAPN97YMRRMkwii7@v16X*s<~YVf2ohFHz4`<%F^Yjew7Oz1NHqqRZr=B! z0v|WDd74BbHc`YUd-qGci|c)9o zHWVh}(K*S<;Uw4aKsrilDXWa)+mB=q>6SP$Km){Kb%&_xD(+N%-GSCxhoAVSov4~Q ztplb!W5f+6nf&UQoLhXY?Y&$K79PtH@0f@)a?Z3@VA)^7#yyBgoqdrVyC$H-wZ_&MhhVreznWHhlx>bA5)22V zA6)I-NMIX}0+QVf%5RJ_Eo<2w&NaL+s69u=+9~zJO-;U_)bU4#=F$r9e|?xUI?;sgnF;&029DT}7C;8e21Lrl) z4!S+|vJ=ThAyptYz4DUP=|N*{6o>?~($pJ;*D@`TQ3;;r)*H?C#W4ydxRN*{BJ z99#6J{=fiPEUJlE>+^kBY z-w3Y<^jX})iJ+Vb?6ftA*N@wIm=GF^r-Q4x{VeX>$t`kVW3}f&r;f*X6HQ-5BH18@ z;U)`9iMQ38$P-=cmgH_e!?Cn7e@OMRaqOs)jpX3oO}@{V=EURNzRC4|aPzXswK=TN z*E^*dduzKpw8`!8+Pm4?8(bP>^m(jcn{M|9I{EPuoBUE|vHL=bTQwEF$WdOB>B7Cg=wOe&#hh(s1i z=K!6JMn?IW$K5-{VQ%41+Plo!7t(4XdR7JIvx_(m$F%#$`DCS`7A7YA1&9zf+ z!B+Wk3VAA5TcMSxoT+8dc;-_IS761_7yceX@F*)*6A{Bk-Z(%AW?&1HdKS>9~C8?IJm4nnr-r z&EhYNF7j9V#Ob;pd8KC7%`2Ny$vviY2#4gNyrt=CqeU+xNYV)0%(YX0140R$=_WD8 z#$C-63Ps5~clo9=^o8wR(q;0leLFvF`nT`@Mb)39G0`)pv_AuC5^+_`8`mXWTOCFE zCW)&eZ;BQxohU6M+R7iJxdqR-$a8Ar#b+&@au`uPnwpprGH;3Kud) z)!1wm9E2~1Vd1G@uc#y!V{bj2Z6>=+VTKP6_GJ*v9~sl)@m%!Kv$rkLbzp`3I1@zV zoyShu=i8-Po~P*J`WL0j1w`?n?28EwgB~L;Qib4m9Df6996pU){i&(K_7fpinZw?! z@f5l!NEnoE_wby)$8^S-W`ZdKo%|aBJExhrO;1>UMWpkjrz8U|jj9Skxv5t{*`Zer7x=YS|QM_xFDoZQv4|o8vBx9TFz~_(d(zUU#GU z2luxGcQfo`YVZV~!Rc^i(pAo1Wn-Yq5mFN+YEuRpbHzv~zgwMz=Lwf|BBa_a!Yd~1 zF^M6b+G0D0utqU09AKs!x4n;$*?*LGR2K5ent2zH;7_znA%ow3l>{QHFpdC|zA3vP z?6+;Vtw&#yweSj-3Wa2=$Rc6TNIP}Q9Eu4d^}?r9bVRHjp{0The*-FaR#6_1++B5K zFP+0hO;gZv_y>EX(HpUhD?Ky#yS9W6gf}{;&(XuFc|a0(=}8G#VVelDAnQbGNby`X zWVbOUlsPW3I4V0x^lwJ^q8-ThqgJKiuTv0p4B;5m9U7C-z|8oT4cyTB*l}w;0 zkwSF*W7q*g7!K=v1mH!Sa{}TPWt}zvqx(1DVf3u#142wHq3zo29-rD5v_x6z5H&m2 z4aR2FcR^}~@3XoMSH)+7443sOedG7nQtga+3I-i*Kdigow!sPS%re|uAlTQD)h@kY z^5z=b{2={A zj&Dlq$v7E5@=h>j5>$AF)__ z8P~s6v32j+4`SlCobu@zWgl)=n43eBtH(l&BCNZQvxy`0nfJ#RRdooYl1A^W^t9P-r%+@w$);EQW8^ zij|C^3q=baE~jHwcZQmMWw~y^?C6h2m$sYct78k*t)r^P?v)-}zQv4MRij$ z;7+r^2q7Kg2CwWMX9UOo25cB2Sb;bHaFS5>NP{>1e&+kqYyo$Txp?(ql^}tFpvrRy zQXsqv?p+9a#3s~MiD;GA6GF~GwCV+$M6Io!c^{ePaJa*QftkIFe=(U6zDWo2O^&0U zqZWYWx)b`t4v04LHaaag5U)gK;ng&9MCuk136*r1(GvlDu!Mbw^lm^xbU4vix#2sW z;hu4(!LPx=hL@M{FbdC~NU)5PaZc0Uso39KD=c z_;zmgDm8lchHi}Jof)w~M0zkNa0DWuB4Z7Oe&nIU5H}H2IB_?j3EOaag_yOgQ6Qg!)HtN<%p*adqvgHv!d>w2m%YGG0mz51rZ|0n=v|e8{V9|1{ z0YJQ2Hz5KSe9*>Ty{yB_zN2`FOt%rVF}vudC~ZF@_!bF}u#_3Tdz|~$Y=!KcQ%E^_ z7E{+tQgnteER6T{EvW78ev5Xz{_I2ea<#n0;+44xca7~{sZKj&|AsM~g7lS0ddja+ zVm0zBTkvw9bNqSCQwDsff5;uhBTU*|op80IKrxt2d7D1! zKH0w=AskP+llm#kT0Q52u}w20^%Xj6{!eh4VU5{@z^q+MvqIyM_ae4ZJRj*chhoxhz=*suok=HlXl);9Dpp^f+w;g)T4Bl7{5ouw^~cCmhfdvxs& zFMj!#6ThaCx{{w6SYQH{4h->u_Lp#}?3m)5`II~GqFs07WDQYl8&WW~;oo#M2}9bD zX*4f-vS{La=V%>0OaFp=RcpKR!YHN}@-bE1z&VH6$7{;la4AY&)aXv;H=qz!$3idJ zcv>OyvLhink*S^RaVW`fan`|5Y6kqq=AtjSL7c@%INZ9Au?<&^wxem!Z*X6@eU_PZ zgD|kB&10|^fGHC&_!|K6$64%*S|q%O9bUF}d9>ZZj&kW*;M;1CWKr>5(zd06@lwYb?n*!YJx zwEVBSqzFP_KG-)Hors0OLJDVkAvY`p_rUc0juf3eWen;BPCVnJVR@>gr@%}#(>t-5 zCrA>dMDo$sC??VgA;eJ&x(MiviNRRq|@YtKetEsq($yY;Tvb-kv={qIz@`-|a zxsZcCauo%10wWTwh0&XgEWc0Mn@nNcdP7V4kZ^-Io#gWo8$?Jdqm?h8c(=uW(tiwo z@GuxO!N}E~1Sf22YTpxxsm)a?ww9v=%*D5gcw}%|l73JWpBW3C%_BQZxaB$^g8YN5_BXpZgk;jDZ=Xo`VD9Z!Fdp^8Gi#et5gAZ0+#+f2eT-V zH`i$}B)LdgqyzjPjol;%H09IKz>Q+f3GTuI=>;T2INDj%(6|05S>Y-gvT*F?B-wGT zSN~cAROc))k=0Crq7;l@KvYXPwT({82{Ii=5Q zh1UnX_th%aR1_X=;Cc$O%G|ODTQhYICRDyRtrs{T-DnhR^J1sWhVfu&H zx}2he%r2g_1VzTUy!tlO^x?-vNZ*V3)7kPYv&R3=3H0rVGnJsSwjlvS$ErSBS9%s%gi z_MlQ|r;Cc;saJz1_{VlcL{Ey0RGQMknA8$gMYXy|8`)WNB_7vmQORTlz%J|Q(-&+x zxzLUbGvX=hpSi~s7nsZ8MIth)3W(CrD#wbx?MMqeEOZb@AsOFCICpW=V87Md) z#{n3iI!3O4t1@^60k_B{m=4vlz6|uVW|FrpG9d{AA11j$q5brAY!4VCu=rk_JV6dF z2A+&043EN*kQ?3*!?b3q(v<@F=$bF$&%GNwm>kH5*AjYWX2QIlv+L7t%=7N)3NE1a zVW}cYd$XAhj)ZLTXifF~IZSb**Rq(!Z&Ke=HuzbSbN8xleb#2AF545MNgNMJsWjO5VE#4hVj9_`I(bJLy36K?I zrzlIBVvi{vnTouaOBu|gOzcG>rh3D{uFV&fRXRhOGNho=-lSo*x}TFmZy3DejJk)oD6vAS1F%IG;#$oga5hbw+@o><69gzQ#Bg)b7GOu%1MNeW*PqPfb< zN;l*fSr?s^H!x`dB!tNbEkISF@+@nibL2y`dC!UK1h?HB+k=XpoB&L%Sq@J`SJKu` z2-1@>g<%&l&z7yktY_&Z72I&f|MetEQ6@%m=~hc@$+HBsY?-f;Ecow<%vt0VK;?$^ zqD9im#ld^9kZlZn?$#M9*O{89&4)=Xw@W)SeF($@Jk?)WZO}H#$`J6Et>M=-zQ<1x zv)(FCCpi%rd^{uiRsOy+u;V-?x~e==D9iZ$qcphO44BcH8G;Vr)6ExzQf<<75GlK< zyYM3FkNDRPN7_Tx&ClqJ z%e4R5l{|16j+^5bNfYzZJiNgMeYaoB^FGF5T%c+<6LT9lPAgtGCx5Ymma$cqpTvRq zlP~IzzQa=wlN(;A*A}}W%IakV02rA_x^K#VN$hb} zYolUlhx$XC=F*swFV`z(cJJ3JnjQkqaFHooa=jKOl72^P4I;Rw`n8Jr(Bf8sB<8YT zN7<;-zNRwM!AgqS&T@R}wqFY>T^}-^kKPXI4|qS=`OQfQP@~!GJ zZ3-^Bz#b>otAxWqC59Sa-m?E{YWr&_zJg5Y^n2r4mziE&ZAmE0|C`x>g^G!@eCl`t`2#8oM&$)9FCn?ph1R)_r`LW_eI{{cX z6V^Hyma;{kQ1FJqJ_y=Ph$|tzL5l(1opU8Gg@^H=OIlaSIcqBkPo}$2xS1sO#+@u~ zD2u?k<$UEA`elFk@vXBI_LQL}NPo7F2hNuHLbW(k*)F%7#*{Y|R9!qa_Rk-ubl36f z-%8vo5FnYV7!*}J%TA>h&%9L~_{X~Z>ttEy|x0rt(wyd$&nvL5|2D{ z5~C-k(vT5~C>z7r=S;$?-&mt3Cv#vZw5ik5qYSJ2hx2okuqzCO4Yf$kD-1o|1pb>W zTxX{yCZ`H(S9hJrTY#4I-0;n_m`cT!Po`n*z;J80HrJTY0M<6kLtE-(%t)hj>4m8L z&3jB=Y7C`y4r$JHst>9RgD{hX!+4EJcCsJ_1j2iid}Cq3h_=M&Rr6%zD$Kr0m*^KR zR!)R7wMX0o3^%DN`NdC!k8&9*fO0+osTZ^RY*3LC=F9PMO4|xwH{}sW z!kyGww+5QiPv|HU=vsWgJBg~<<%>#a&<&XFDh&p}(Q zprJUdrwGY1+>H?;WlDk)12~n@pHA_^ADEY&b7=GwYoyEoq(WX!=Y*nkR!<;a? z#gD4r8GRB&`9J=xQ-iRjAfm@2PuO^x2O%Pry_Ct@ln|BV<(j;GOca`*;$$eN1TlaD zefz-QfVo%kidUt5U?f;q#`u9RZIWgVf2K@*`3e$Zl&{7ist z>;}(MoA3pS?9Gqi2Wr3)sea#<`>Q3xrP`J(1etoW10)l&K1qrz=6sIzhsV$=?m~=T z$x5jbE@};*Or{5nKDA)7S+MUahH+rqjqF#f-2vd<0lChaA>6PJ^R6bXP zOe?ZRlntJQ=M|UZFx`xXS!F!DGPjsj#bgIH_jK~XYA5+9`Y4RBzo3zo+1Hpulk`8S z(i7&TsP@{}$Lxfo@S!T3SemEgD4sS+@}nlKx5iDvZMpu${o8OM9>F#yStA~i5OdOi z_qZj9uXOmBAT*?ZwN*c{->B-XT7Lt4i5mXz0|M32C#U`IAh zU_5a!m8=SaH2%a4av4^Pk-`QdVeOOzbpBZ1_q_agN6IW?P)_d_V{L zp+weYlWu$9}z<=#R$0h0By4m7IU+=0ho?^Y&h=3LTNzw@{HJy6L37 zkN>Kk_OizsoQ&m?(-AcHPR^wacDqeNi}-&c+Uyv8ePA(?GW7`~zQ_MJ)de@?QCnK@ZIkb1s16cwY)_HBLpb~$on&c> zs$%|NVo|ezm4pj>hjBfb7>YL}p6xjLkfHD<(nwor0vGPWTDdiy9dLGiPx5fO&|y&s z6UIwri{x*wgDDLW@i5dSh;oSjsf9F`vX@VQ^WWAR+JTJGaL2kT%Bb}`b{%W3$kbXA zPYtDL#vM8Jxck|DuAO?KZD*ZT@{og-)KD}d*KwF1&;R@(&she3VbO(g^OaG7UZePp zr?^dCBwi(RYw&XQ^NxQ72lDJvsSB}K z{%ub8TwSXw_ejUWXE1{eiNA5z9L{r~!Bf|^c#{2`eB)da7wRG$6Z$Xj{vZD9#nrx$ zE$l^G6iA5g6MaD?>^O075aJA;KdYt9! z-vBj|ZauY@`Zo(fFECbte#sHD#-@f0=0pDTZtLyIFF1a}7MqP`q?z(gLu28$5tfwZ z$E<*LJtbnni_M!}&1GbQG9y|iQY41s4gOD-TDM=Pt3h?a5hX~6l=%*(fbHB0;j=W27a9eKy|m?@L{ zpGjBxE^ybn!FU*v+0kPP(iSY>-eN|uL+&Tyg1_f^1nOm|=id8wLOeZ_uy2{1)OUX9 zr41=wi0`z33NS39DZ<8SWY@6?O%6~PgwMW6=FI+}EwAsx>pP?3TsUjj3tmKgTz$$X zmux?#evN$?b?N;gn5QM9J+k50an_ZWFqe^+)wJA79=TjvMY^pW|H%odNuf#~o6IlNL+%(|JK5a9b`(#3t<~~9vJFH6U98V|V!7f@_i*Fs4 zRE7$CDO{$7MEz;;Ptzl`gFo#Cj}vY%qito6|5+&nK!*8=n9R0_L1wy01+&l*(i#Cl zRssOIx7JU#B@!%|hc`h0im&)LrE1A7w~iT~AmAQ2v$k%%DLb#4JV@-sm8_avqCu1a zg~OCGD;uy7-{mJz%W@CIE-qv%XbmiZd2l=VAP|@P5SGP(fHI_laJ{%;PGJ~`Wk;$%XT6YWSC{@2rz}NcmKV-%r%^II@B^B_P}xLDL}yBSAoGR}s&3k)4FET6#E-}Y_5KX$C(JJCu*`K8WJ5oNHGS_U2W zi8pAMTM}+=-ENvlv%r~Lf$oD8F)-#@vnP}{u6QOL?t98VciN((wRkl3BwU039h~${ z(kJ{aRHBp5yDmP?urU_eFwn$^DjhziFvKG>@gRm5Qy8NAqAzjSuCtMvtSWPS#M%Q= z0^i*KFD_dy#vNgiB@K%!;*?jZF+L8v#?H(&t7`3Xd&dso*Sw_Z`=}u{pQBAc1fMeC+f=tXc30;H9`Kp{pdEU}8x}jF|a{nJr+xTFqcM3-6iZ*}fGrN#Lv zYZ&o&nRJ=_bD`Db8EY_x1^1dvXXF>?LKgUchq;RC1`-Bg(0<9WD#Z*36A%Y~fXUu>OX*w&{Ov759;;4mAuD6;(c`HvWULj$Xu4NpBhmXFpU;YXq zcoRc}t$h@S9Wb5d5wxM{+DB(h>TN&IL>WquWG%OW<9BYn?w#cx-nNe_3cvZUp6r9i zZJMd>0FsbId!lOKbgIh(oHJhAhR>ACGo=1Ii9kNAnhEiI46ay}aMk@X2LlpanS+%~ z#I_q9x};3mv@RF@K-Cji+7bTK-3u(4^u%WKRSwp(_z6)7B@!c!ly|b1GG#oQW~(M< z4ti3UqT-;64_VHPEn%_Ctporb8FT=bM*j5Y)Y-2JnqJH5#`C1@wIEaK_H-S*v)=$V z#|BFLYC4t;W&(XK5PJ5TIqKZL`HQ)|fZNYz$FAf*VGH)mZQ9+&P^UfCNp!dc1#$#s z-l!Vt_=IgzDL+R~n@UNQ%y?MTy9l>D5>yaCec*Cg`s>X0Z-7FdMV`YtA|eq54x$AC zjId`lE*(wKs(~@QFuiJYA;6p(MO!bpO)-@WI&@6-c5peoG~|z!Eft@t@9y+y%yl=H z?DKhMm- zu3Fc98eZ~CUHaI-r2mm5GSOP|3B8BBsq0 z(Y{k_Dn-eHQUD-TZ1YWy$yu7@q|p~smrdZ!R3{f6li?M}-OZK4=>qMVt~_Ttawkc0 zOYHW+K~42C+IawbvMYQ6!@wzxtsvKWm;Yf-avoFZljLiVt!$e18m$_rjMhOvhjT5d zPfVj=5Ogj;)O=%5@a=d~LAByM?ykES>&X{NFMZQyGD8J_Vx6esf3WwKQEhK+-yp7q z;_jLRhZJ{BaDr2ySb*SAoKoDOMS@F_1a~V|!-^L#TD&-v7HEOCXL8Q{zV|uLJs)P) zyJp_?%v$q>Ecj=CU}tCV>-yQ|4*y5R5x~7~21*Z`nQMmt4a*3nlc$+bhx%TpQcf^^ z4I=Yx=vda~oQ6ynOT_y~Dplt~#4am01Z`c zj6O}npj5?G!S+maR|g)N8_LH56a4D?D1W5t_mMyU$EIKFO>2L(@2&cS^R<@z=RmvL z%)lvLlBd(iwiW(Y%Qo06b!d$R(6g_K0Y(MM3O5DWTM@vDkK5d>;)+6v^R=XOF=1$p+=>_U zsl$A8(TgjQ+WEycyhY|eyqzk)RtG!S*Tm<5a+xe(Cg5mc*&h!9NvO)2j2w$lgp0DL z)H7N`HT})s_v(=iNReM$o=V&GP6lgwE6~MElZ7%@S!QKizu52NmJ`U7(MY;V>eeaU z?HOYU66TlpS>HNi5&5#uwn4=Mjd?zG$B}015z!iL;>ycbJqmXVcu(VI*1?n+G^!9) z{48+BV%tk$7Ic~UX69#|8{(~w_OcqOq{mcmL)hO zTm=6Ry)Lc4SX20o<-x44Ots?YF4mrVir$UTL8W^T*emssBDwD=BpNI5wfbS$DIm}ZJn7^PJ5p%7R(&E5@ zJa25DRs1K}blWkPqp6l=ydku7sq^D7&lA`|$exg3dB>14zn?&!yCk~7IZ0asDmR_k zQF}RtT2rEA{2proLwF&Fgm~0z-zkIqELiL`{Ynz?D18a7?1x=EUd~c|a~rZElFP;s zr%=_ErgztIw7kw>{W)NQACb=s+Tut2M~6qXdlK>8v>cThxu9Eru~U^ANc@u5#mQFf z>$#+BYfn}b+u=4Eqnf=-jta+z^$wQ{E>_haUXL4yZ+4{)vJ5i6qmLm| zas>^BA+`#2z%uYXN?)cKb)LIivm6hVD2mxPe*3z}c0ZmWb<Pp~kn+3(IV(8Ul0OA^VJa5o*&RE>Fm~!YDqsK7aBGTC*V+V2C8(&WPOI%>f!H_3VT%~ zC(UPTmp>xM??_>XT3O;i|*8CfM6a0b&Zyy4|2#A~ao=+Mr+B&JzEEkQ}HM z$alTraXr~pa>K91W)VVVw$@5Geo{sMElof+<8qasD*?MK$+?pE6I881HWDSo58zl+ zH{d4R|7cn}6-*25YU^~ z|3r0s_^Rz3ed;6^(z8o$=o#{~hvSkN;8+L&nm9r>ZXsaUWQkVUemWE0fuL>Y0HubEVX7-l_{{82&PSMQnGd5em;y>U%gxh zhF8mC#p`x*aKr=B8@>g)h6uc?dunIYpDszippKpncBPRf_x#U>)MxC;YF=jGtYJ~| z$lQKHJO7t!W;5rhb~ydBiNT&Rv#fI_m97EeHWv+My%ynR@v~y#QrqQO4J|w?zs1=t>0py|+QT$m!D)Zq_sYBP({$=-8l<8x zJ10*C=$^C}0%>&oPI=p--lpR*Vbdjh9{Xa&E-!}mU(o&*D6S>A+7A^Xi=KkRVV%}3 zz+5{-)zhXv@68i{l~c>$5b9QAVhnXQ>0dJMok2B{i_C=I6P?AUil4=TuwapI{@uDS zQ9-BipnVa*c)Dd7u{g>8l%T+-po%WzmhQ{B7YVw&_xZK;?sF#bYwgu@LS>1n0=rNE zCyrTa-Bm8FdezzXqFAQqxNt*a7MHi1loG-_=I5wHN2-~2Z%)PSra9Xjd_|){c26|-<$CDl{Rgtp)im4K|DoN--AN!*~gUR5xtgI3~*Pu9c$Jk zzD5D%8JtKG?6ovrN7XpH6M>m*{&HrZ;jTRE${}PbD_Gu8l92rIN{Rfm3Lz&O-q=fl z5v3QzAMJ0#eyoUfiWxj%KW6TYW&gGH({NE(9Ehyqy|^@}vqXB#552EEDiElTt_gZ6 z9Q6hnwzbVfsi=^AxJy% z3Z8VQJ@M|EX;}%iX0PoGR|!UUHeqYi@Ejy@v4qAu`yK&r;_e-prD0i1{>M2nJOKOg z$fZMb!OvK6`uC{IA^DY7W_D+@D@;3nWYYG_V>M*Ad=lKZ`t5o13T(H2APK8)h8{3`v{-tc z*nh{$htPp$`v~SFo9dbZa5ZeKj5#S|C2`3Xuh8$!Lc|Cgg_cu1^}Oc$2}k$hM5I4v zQx0=k*`%_*8-A+7mG6WHZnNrYkIJjvd>m!{#fvi6(TF7-OS^uz!DOlxO&jXo@gJbS z@=$Ty*VDCDF{>94dd_u{3Hm{=QD-HW6>)vKjofhQS{1gI(v;`+zkh}obo9CYfz^5f z^BUb;fdrbV*p;oSNrM<+AJLYLuXzh{b8<0MQ2|7oA`(D_)rIvB2Jh3d1_)ZsEf&=x z!Y6uape`f;oyxL3A2$_9KF4OwZ^_rh986;(7-?lf(Dxe1Ww2>`irYAeb%)n-dYE(4 z#+cL(JJY!C6a{B}o>(BFr+qB$UN%cWntt((sff}nu45AcFM?dcVOiv!Ij>VK&5^&* zKo57Yp=z}9lpRGs+3xrE>P}qoxvyX+!0cqxXt|Nze0<9xi_?J!qNG1 zrm<<+4a64bGv5tpxh7z!H6yCdEUa29JLmG=h44AGC8am)&JEs7N+-Se`4X-MlY*T2 zA%SCyt^U}@@fPhuCNs|%g9_M_I z;%)c^|8SiD@W=*<`%%*1{UIZ2A%Q3dn)~ej(i9jcJsuAAN~tRwt`U?GQ~lx3J7FBt zhY7Iub2y8_YQA!)ypUkGfHso4wOxCmg2m|(>)nMbsk)qC5=x$V=^z`Z8f&uA9gAkm zA~nJ=gXzkplo#Hj6F5%DD}%uycxvqhH0>#BCB$S;|BqQ~zyt=~|ZjI)8LYbRfUP`xik z8EDf9yn$y(uFa{~)F$g4$_<+M4pY|-7B9Vfs_JGlBt(kd0;xg_8`W$fx#2~u&DRE5 zz}@X`@uS1kLxWI2I@UOHf0d_3eHse{O@ePuM)v?F^*hz3s($jN5pS6i-m@f@Xyo8? zp3N)&{AkNORPo4FuJCVSz}XkN2~K*6A&_PF8SC}T<8aIAmbcWwqd%)EdGqC402@@P zQ2y~G_8%_>Aur~Cb3tt%T~O(K9fXREQ}VnKRL}g0A(9P_A}G24z@q+07p6x>QwR;@EW7gFCh03J4E5b-HhVK|y{F_B&^uB7>>0Gwh&yyfBS+hbKiOoyJ)- zt~8V6l#ziaGa%Pgr)3Ep8O?ZP$o)#wmlUN$54Fd@gKs@uUOj$%I7(3Z{!ges!n{q; zT;nsD%1A)ppJetr!vkJ72~~=!hd0CDr(1fUn__Vmu?x_)hKFxI>5Q^>%VW^<)HWji zU%<+1gdaG8(&X!0i`{93yDnf_3MgC!k-MZ}@s$Hc&uW($V|@OuX}dhzs4sQNf_PSe zb#@V-B-8K9(xQngLDF$ScNKq6{?fL!i!AZzyK;J~z)>0Ff%QigO^@RE9(o5C-f$+c z$?EU=502OPQ_&0n(O|DsyKi0%LO)AP;ZAbMf*sPskX}9u$qE9Wv)TOGNP&XVA>_}E zQA0HM9yN&}k5hG*MxhWN!_!#NX^r=M5FbtrhQ>!5_d4R$ga98YTx1vtCD~H2g+42uk`Cod#1-R&pz$?K>oHvt9<;#zO zthLT)YlK!BuPUFYm&d(0>SL(9wsH#FsM(M9)g*TU+wQe?m8#4v2FI9IHN~MeMXeiS zrV1+wC1^LJy0|p5waLUTq+>&a$ZtN}V55p|H+5r-F{wai*}x6=ryV~RI^lU~%ufY7 zAh6?2Vmpkrc_=ISmX}zERgpwov8qoE6XF3A*aSPIYpF?$1h4n*$Y(us=j9H~r?_T= zYSo#dLFCtcZGN52b+F~{5NoRSsbL3XTuBU)%6xona9s5n4!2;O-+rM&v&)}MhAVW> zi-P-he@ZrChB0gK!S34*xY2XP0Zh7wl`GtWU5^{-%_ zDVFR&g*!pY$?#8(9gKxYiW^&+6maP9+)YV5FUVE+`b@PNsoPgnE<9U-tkIHv2D397 zjq^wd4ys5rb{nz2Dv43zQ+~tR42ArJ4zpzJ5PQ4kJrJMriXdsa`Z)0V-xcfc(E>`6 zo9p36DDZdTC&mYC6jFVgEULfLJd$WdOR4aom~6D34jM9I`unEA*GI&vDlnuT7A{as z{OU!N__LhKDrR0`s}zFkRhh!s$Aek0*33g9MCF`v#@rji0Pv>DPn@ez!b)^B)w;ItqYn_5C2cSAQqdFC~8TnDxp>vY>7T;z)Fg7o(Sv zPlM*aqRTo+v7K$1Z&R+h;i8Z>i7w?@&FXL}I<-ZH3-d>&d&v#|KK#c-8d=n-REznJ zpbiv9Hzc!;zZmj+gsIcAQAMPAq(BV>MSgLbBGx&0=H_tn(ok$no}Xz3IxmbnV`wrA2c%Ir;vbGYrmS-H(x8xz?^^2ydwm*ivU}y%DOl*Y zFcC*(YB1SYuJ(+=By6{ibG6F9dv;WAG@#-SEO5}$7=~n6k&VxT^LhzsW3+W3s7xfq zt&_)Rn#x=cA#8(*bXOe})kMu`6@H7l=7;&MK`=v_<|?0oX;Q@cI9 zZU5}5f>h{*QcwefrN_pPfKJC-@ z%)~E#mwvUFD*3W|=&aqo=}by8g2x}E%ZTQ&$G z3xa$~imuEFl*xAiwvP4TpVlL${V1Pe?sEK}Lf~b%t%%19$eH35T)yJR7wK1;-%1g& z)Ay=mWc6p1q=$Y2KQ!?TPS(jsABfC%jw{bGM5^!0Ju;UhAuJzRIf zUUy@p$ck2j*r|&3U1jnb>YPgA2h9G_Oc!i+&&IWQB%D|P;XmhV@OkBL4al8fy(vdD z`A=hJuHiVBGr?*r)3fhCSe0bIG~8t6d1}Bk?vZ8&$?ZsX_?p5ylHNV*xpi+4ujFHV zfak<5%`GjqUMjQ)0fLQI0$dbmmxJDA!QZ&R`)8yJHMF+{DKeh1rWQlrSla2D(gBjCg-UAKd{dAmp&D$=x6lr zaD=9YtKP40%?2g`_xFlR!O#F=AVw(I%l*7R(ddR}rOJjQu%SH;kTpWc_Rr5Rz^Lja zfAD98q2gAI7N9DaLJYkhseSz&J)xs4r+I1$bck_NMO6cL`RS9&4lD( zZ9#WLf_|$MI1oBy%y~NZ2bN@Sil@V613@x$_8u7BmeyUYTpRbaK+~3zI(4FTv({{- zKZ-T}gF~R{j0X5CPG*Q7>yJRUrFZIQl_v=%)}eZgi~VVP+_Jj57{~_N@Z3pXmF%!F zny745;1^VU%n-9`9vP-ia6}+I0W18gHwlNZfx}lX39%xAeYvPu0mDQ4r{LCAA7XD zsc%F7_e-{|5e@D>BLmK}nQzY`(X1x}u4C5vaYP|{?B#Xub-}p=$m+070;8hp`3oXF zD)FM-LpdK36M)JT2i4f5VFU9pwJ^Lmk3@gsz$+Q+QpmY`WW0Mh4ap1Ovv1M)m0n2&w& z%~8`iT>;lU24>dY{0jThYgN{;MT6r!n#+-hhbp4g%~t@j`5vm6_tGbKis?wBH}4>f`!0 zf5qiZ)OV!-DeM$r|Nra*!zo2;%uSS|3_R~IqX|BTdTQEV{-zb^_*v@t zw_lF0Zl|-b7lO{e~D~w5BTt6FP!Uf;}j9l@uuTEFrTo?&6mYp{Oh zKX@1x=j(DtiKJn-I0HKhS>lluPh6d9(QpEosDSmwNdp@^@GXi@BN$y=1YojVkLI8p zd!krAykFV*Lv|oM0NhOssw$^57gG}59j}$q&MB`rUJ=h`mANmdSHm7)9z&Ikd(8Yw z^vFyqZO7BlKSqrlJ#%SIBVW#FOd>JI_~wc>2{?w>=19MF$-5V{KI-1c-?q18)JQ8-u!i z2hc`Pw(klPElN^)l3Sq;c$&3!{%^H?gtHz^CXw8Qwh+g~{@J}0D0C+(lm-^uoAL@4 zwRcuIztb8*fw%V}6$Yb7IJU8W-(U&pn z$mJ;mj~FrtvTF4c3YW>9oeeQjcPoz3>k=N4%rdz3k*!N$K59S<{E8IwcCg)Tecg%Bf11KDRG#)`L8 z3NsS2Z551)yMwVu@!7qJ3Nw7Mzh&asO>}fF@C6nfpqR_px(!~pz`>Ba($H8-zwH7e zi!20Rt{1iezq)iK_NY}u#e1ZBW{TsT*>}huqxAJro!@|i0eOT$Ey3ZqzF847D6DnS zd8%!X+O+4WwP+MFhGuzd>+tZFWCE|$>OP0C?-rV4LFk$BYpzf2LeK;Aaf3c} zGsxv13raKT@#hb01_nMUE2j6ce}|<`Cl(mtihoy|qpG&O)#I#sxQ(a2V*DeD5Rm*ZU2MIt2zqHsUt+}ATYf_N<+JNGr!X7gmS?vZN>U$ZQXPg zSdF@YkV#ZgqzjK)SG7sf=cLB%zd1Ed6dgDA>0u?EU;iQF3+u- z34Q5c@1)2^8lt7=yYZItn!HTgd_2a3f1+K~FaCnR0Q*QT(@#cJA8utGY|gcGbzU7D zCI!7>6$4=$XzP2Fd>GGv(l3nR;yu$JScypQG))G$y!ty2UOz8XWYJP3m?QL#8R|<2 zFs!EqkdAA98^rXS-aIy1lrV*DKHJ<kM-AFdwr{LxT(rMv@|} zaw75d4=h14!qnGek~XQCI2V4~^OV-P?y@;62wr!qG#q7Go}zxfg1p=iPS2j%{%H&y zN9oJ@50vq-{Hk6RD5o@CdcxiYNhAI|o4Zo9b?h7Ra+uE2)~_V5e_UY7c#gpm9x@i{ zNGjMQW1wpf&)x?frV6(9?J0=G<(L;${a+8EExJqKG7^st5!mu*092)jyy^1N*jNFp1+GN>KqN(bFw1806dm~}-xbY#Um+bZ!vZ93#m6aRMs!9Fubb*~e z=kYJrxIeIx4|=~=Rz(Yaqz4pg+vr-JP_5M|$rdFt8hkR<|LMva*WcdjCO>Zaph8c; zQJHxjaw44T%*(sr(o^mRg~M^)AbGBtt=uL{a+)(MD|w5B8u<6f_ZeTds^`dhse0Cc zz2fgC@4ZQq$5_%<{3Pg{MlmEW&g@f!xeZ3@vAt-rp7q?^qh^S9yxwJq@uA#d6^mX9 zArT7}vuway+~hy7h{vOU2%CL}|6Rnc^>&aA2;r(8Cvb)8CzeG4#l$TLQ#M}L8$p#TtzX{QT9W%`(H3vs~B9yYkE8Bs|Kacwc=%y z=7Z^8i`92d@(GBjb< z>K1}^LM1XOU!RD;*P5Zj+wEmsgMl*oHT4xLgVXbJmW@+CjV)`6&I;tZwpQ^JSvTlg zn|ykqQbiv}HeP$5;f&HGLyeIN)B8!qv^8)3fdzbaqWbt> zv$J_;T#DN~ft@7!Zgw^L;$0Rbt~YiO1Zth7{9Vu=G_6#RtL^&wmHj&f(#{ur;duy?dEElRpszqyL!QX)E>zb)Bg(OyMX+s52NGwXQqUz>0n z8eLrCBPZTzMI<6ff)C2qlPGpqwDPl52kI#B>u+1@@&odJN9;znXGc^o>ro^U(M}8ZIQ#3ScTvBkk{M4+^M!GBat^+-L3xA|Ggm$vfj;bo> zWzX_*_C-$0o{A-F4;dCX%S=Q(Wp6%JdLwgZyk&bstoUq;IhP9Nu*a#+POz_y#Ua|6d5cWTmyTJW@O`Zh*Ugvwjjp=BXlY#@~kFSbb!eCne28n zEH(;OuJ;zZ1m~1kj>HH?`oiC#L-g~AiOKYsaX3zzK*2$7uCL5ovhiU()!ZSiv9{Eg zH13Cgy1wsn@9GpQ+WmREzq01=thYvm2EVU!bH(2s==v&YCkQU}vO4ZH{8Wvb^62i4 zy-(}=)*boW-M1GVinO=Qn6g?Xh&=3h%;RW|z*6!lO>xEopS11Dx4$aMHh2ED!}SX0 zc#|EHUX7c zMLLg3-n**$Ix#0lE6D;KGQ2}=$nYbIo%lbn&^}S~4sYCaIUIRdY7k1xRkM#vjtfoN zhZ!eilZMLF0i&%{X342zuxauy+=@N(v*~WR0@|ue+OV{hb6WF1utF+G;d^|=9VG!Z zd{LqB!4uEv_&H;p)&ipW?S*z28P(WOl~rdx<^EX*#?(cf+CdjGOuT_RgX-fw7=i~ZWgZPx?LE6#xFyFfrfpQ z_c>GSQQOl6e0JnFa<`h@SlBRV7g7GOYHd=@AamkWEW73IN<@U?_r%{nmF!m{o<6>= z>hG>qP#6SdSEd6{poDiRLy~&g65=rrua#qx^nSW&ve@IgStTdxRequ6>lUjpdBUxy z^egm3{cug^1+Mry=~dza0mA=w+1dP9*WM)S@^)P8xu3e6-GuS6;O)}|qBb9E?{m^{>dyw>uEPk@P4qaG(dJYVF%AF9 z257FogSLFq8|R#sM&5IK7*lKcfCtJGT7i86C8S*G8cac0Y?=xjo-NMT$nftA9>!t& z(H(fY@@oV>Nb{NwteGQp^nT?Lw#7+28KBFl-*;4v)t5!i>7CNAx5clj`S=ZOwhOP8 zmlnAfz$&LA1oVJU2$)a2499O16Fl@B1h|mUCl-2&^uQ*H-zdk{Xl~}G3*-H=>($RQ zgqdLDF-3!)O=Y!ALOTupk(oqSey3(AAv_=mT1E&F6ZVwxpW)n1&&`zjCh+XnkB*#` z^n(0=*3v^+tdS5q(1+H^q4v6cR`zf;$uGSLZjo((TQ*|;&LKnarN#@D9tHT;tJ*9M#b*ZG>|85do$jz%pAb9{#R zCHhi}&*3_!7khW)*;PlD%Po)?rpZk!dd9{XM}S%Tg_%YxQZ&V}$B;#l-g!pEBP#^z zWVr6G^e(&00?m~rrY7Hj%r$=craZPUdWa_Eq#^AnsGsdi$7m@Ce}v?Zc)IaZ0NS$w z4AYO6i$W8q5IESS4M3)#bET?c4A}@F4sYz-*u5`JivnG9CiN7WmqC>^vYL*YFKbgk zAN;~EV=_KwtAC6V`U9)5%iV0jG^$wU7ey^vS%^RQfBa7xDqV>X>$XMMnpZ`;oOt7Q z{3tmJuR$t#j&r77N?2O#4N>1M9+TvXS_-bd`ZK-u{=65h&V_~c2yl6N?Of!p+~7L` z+vN;5UydL&6d$@pQoVh0ZAJHm=67oao>%UB!xO_P+A(AR7;%T8Yv zp=UqlS*rLh|M`BpS2cT53keOx&1AkT{yc0fhFmK7nv@x2d@-?ya{K+uYvz7@jcpMm zkDufBw(5)m?xIM=GC+RGEqs+(K9ORHw5Q21s z0*XxPqijA!QFY0E1|1JJlHVlvTnNOxc4+L=-aOB%Yx@5m{I5;Pmn5)3W1xd|lGzw# zax~DF@9y$=Bh68W10g3~W@>0Fepqn)DsP_ABIU3YM)i5h)u>rkzmP76>BS&>={h-h6X+J-OS#Wa+vL)D;2J+6hqUjhC@byBxShbd;>R||7=^&7`^l|q(pKAP)VwM8^G=5;t@B8hFp z+$Mkb^f-Jff!i(a&uek^NJ{RruC;(Ol5=6Q!3Jf z?}1srhkY>l3TXhwHqDmk^`Rdjs%#NnI&k?xiN$-D+`bgtP>=1Gg}aTZyG4Zr(`{2(SX|Ava> z@D;ANnMI*xeF!>VrzO4#%W}16rkTH)SX;`ORIIwN>IG{a>(@BEItrV=AR%)$JD#fMBvP(L>MP^% zK@(^|48Eru*rgl{8Ge?R8yciYa7_9$qJltGqnXq>0A$%(AI`LvF=SB~>IJR!IPD=A znZ7k;)T*=0?)g?rq)GuYsYu7BOXD|0d9;>2(8fsvrWK{$bRc1Ee0IOszRVe}pw+p- z2VIsrx%jMnB7Jp~Gp@V%N#6h|IrvxyXhkDVp|Lr*Z5%69p7Z23O$kMnu_E%*knl6} zO~5Sr0buNtg+2_4%F?^5AoMBOF}MnR&0}{)ebf7hN;HW0=Xz5TgIw%yuaASNto;#E z?%SH=TS|o;7uL7cA7uh+1EpMxPUCD~rW5!;|b4 z|MauII749G1^v1b}F3MsgI{ zE;xqivd+1YLN_o$H=k!WcW77sz2@)jd|FJ{%WS36{XA1Pw*W*RcW;eQ z`U6g+69tupc;iX-XiBm>ql5->cXg=9(zF!kq3x4yfz0l*cFEnPT2bh3!1 zu5-t|7N`8*ICgW}) z$z~!NSyA43&VWgSJGIpjZ`EzI->1zWg79jktEEtlTRMNRE6mG=N+;n$>5IPxtRcGV z^u7$Z`=`h5^UU62-LqOkASXF;$)C+|#2n8!Z;-jO(2V29k^6~51k=y*MZps)G_HEGBf(9nJLMtcT$ zH&(ipde1tw!&hqrmAd*i{JWVL^@y~?>dONDfEH$b8$53ZT*$lSI@KvCwp%+2r;t0; zzQFKH);qi<2K6!(PVgq+$sbtJd+#2_PM@>A`_m$zdQt4VAnS!znLLP1*K{OdKwBKy z72NX#DjYt~Z6$+c9uph#z_GOiEplGfn2lL1RZcH*C5~y3>){+2)&Hz`EU9~xHYWt+ zh@XF2;I4P;i9=*j)&Sk61YGtMBZN6*Gc!?6BxRHS@Echz-cP4Z-=*Hze^inKY+5iP zB~a&-M)&dC57zm5D;J7E)0(}Q&=hVuU)Kj@QkMdk&%$vZorOJa6o38w><&lR6J%aq z^83)>L#J@n6L2u?8Z;$j(IcnY6=KzrYcLWQ$jSu{q%_QSED^YBvl1^^kTdU;N#)3Q zo5W*cP0V~L11sUS$_>mCosp9;+r>0MnnV7x41HJv(@FC|5c&XTVJO z(C1YTj@0b}ibW7Q7GJXe(l zYs5T_5D6^_l!hY>PZP}`HaU5ziTd&1?L{Mo+i8@ZbSOzv%~b$gTP;yQuHT>YStw){ zUSFfZe$0kGHeZAEUEI4+k`Z&(SG0y_SEE-ol=qr~M@F#F2o+@kobe2sqA?cJLSSNC z`%3(t2F@*0;PMrEH6#}X>s*7tOvo{r#)(;`#crc!Zq8#lynryeuRAoSER4Py?;ns` z)_VY23WjyYyNzeJPaG6mr0@}4hpT^bT~;H6DpQ;mBW7wPqJC4IytJOWWbuAB!l);! zAt2%H6yjs1+4cr{-fOo!ab%B`Sr zkK3X1BtcP6etE21Tv{r-!C~AgQ%6a9ygZrtz~WCN_TK0OD#EPWRA|#5$4xqNk4U5FRIx7R0xScfZ&^-3AltV>E1z`W3}Qq2RK<4qXHM+}3ogdi!i`g}tMa zg4{1q@_3M5pL)rEIBH4DHPvW1BJmuF_ZI^1_SAD+6+Yw>kI8m8w#P3YD!((<=MhH{ zSPEt1#o>U$tO|!MZVw;9b}&IIj>mkjAkTlk;XQH_TGdDzdL=qbEsP>qAxlY)!Yk&x z@D~&WZ>Q799Wj{^6XzjIJi~T&kIfsnZGzK8SBia2_>v$sVCMb@ni?BFCB3&at53iA zZ}g`bt$sdy6US8Xa&j($lVtHWgy$Y%vOj>8e8^5(@yh`{X(=J}5UqzpeiUDk zm~gjGE01U3-9meqxzw0J4}ZRu35dvIl&og3C|SAsQlk*u>JM&Av>P9nRPE#qJfkeg zPq;^d-D#2CZUMbF5xZD%Q0>B2-TWfogSjM|nTrOz9=t;t)A_tmq+B#`<{SJ{lYB+d z<8|V@RjtX~8LBhUZ_de{gUA|rj$@0qrq0u-p$Z5pX?Vw0X#qu4aYtOF+8aBu8-hM{?#+9R?F9=1jfBp`>+q} z_Op&!_N=|gZ5;d&8WyoX0m|ZPUP;qNsyzwb#rcdw$l^=>z1`x*QQ`Tq+1cZq8iM$i ztJyalzB?ao#jdh!QChzrWnMj?+x>}ZTUcgvfV-+50o>AEy%tr3EEY`$#!Q7t{L)aq zaROO39Iqq*-}ItgNs!U_KQZ$EsWObxa69#K_}=o`!3SNt$>OR1Py7Ov5K!E!y__|i zJM{N(Q?p~LJgJd#FG3)>=KLMu@2%hBeVHz?@utB@2|qN%-XEn>3AHW?2^vmdmJ&!1 z{%J>Z6@9D%q;`VAJob&H-?L9^-bCU~ewb(__sf>d)By5Iv{D8`DCZ0i|MaI;264?hE_@g<*5_8)NYD+Xcj*V%TG$x zHp2SEtXxikQICAEal&Eugpf>S={y(WaMWFHY=mBZ^rwkYIY432i%9ooBk{4cUegeL zQpgAEUe-Ei`}Ap@Gq5szz;c9P5v_ zr>JwgcwXby80q;!8r4ElOe+^85I@TUJ>O!2<#>_{tdYr4ecVJSAuZn5hC3TP;llC# zEy^`|%6#z$9q5lvCuHLQK1*PLCs$sLz&1<4*S+ouV2FSn5X@!N6U#nPj`lHr>tdJL zamtu)B4p0*P{vME)`vvsU+0*`Ge9RaOu$OA>x7v$)me1E1#9+fwLC7UUd^ zC=+e!Sw0<^ZB!w`xcqQn_?SpY9P$qjgyVFjS421u<9Nv`3tS84o*nXzxe#f|h4* zK#1qDlB;;U?<)0m=NMdlSKA^Tw4YBHPU`h)D2bL8yUmnwB{4>(=8a#Gg%z|jxJ`RF z51*PI#!-;bY7fpe09;f@uGGo{GO~rQ=RcY2$|WCZo@TGLU#9&Yd2zJnXQLIOOnD?a zCHSj4y_M)yC#E~ylYeBd0h<<(w^UGARX!3?eR=7ls%;jddOwnF>9bI5hf_;9u?Q%+ zYL`^rCP7_?zUmYa+Zv;dZr^*DJdLbG6(8gfXSeO~^RR`{CFg}UH0TRJVaXpVno|l8 z^6h_7gZe8P`pv({dIiVa9@-ipBjx6N%wnECewiCk#Ms87lY?3(B4Jbm$SgJ~*UV5= z=jI?0_gXPt@>m`tAg(f&J2C-{W((=FH%diPfuz;-Eu^TFzPwvZ>Ln~BwBkEq^I&x? zYz}D-DEE5z`M<}X%SJWyJKPiiS%SlZ#c2Q)dXo)P=BvF$Pf}v+I*2&AOfJc=T7T|B zo7Fkf=cM7~{#79IrGhXT%NdrTd`sXHwkgi^8D-_I;QSIOJP>I8%Fx<4pvHHitFoI~ z?G2rJLq4}KV6Cssp2&b=ENJp}j;oB9$`4_>UA=B8QE?VRmNOcYb5!y;XHf(wN1k?D#Qkj?$I!fmbJ8(@9EMj)W7IH2Pto0`?ewq(mtKiZMUhhEN zE0P_!ed!wf{-P;pY}c8==#&0|rUoi42swv|LRDLMhlP>n;!d9b;_M4!^38XEcNaZE z8TzsASSe$XMl!zc#~==XP4*8#{QJ}LEfw+jL|xC$1HW58UCdLK$;9>inA%uG*nA+y zofONUJ90zq#UB9V^47Ob_S<9cO$PUiv^5N(>XZY}$$nMML1Vacj3(h$pZ<(GUzN;d z^5qp!jpS5b!^j|G!7D|)A5Zvcs0#M@Y&5rikgbrrwp0m@F6z+@&Vf7~6Ze>RY_fZf z6KIK4wUHI2*dg(c-W9P|Tk6!HcE|iV+g5Ndvj^{4>Om}L5kqR8DWg+pmRh4Jy*u@t z2cjzlz7No_QWchXQGK_&Kd>$cdmQm9yWgGVy#qG-gjI@ayBDz?rcxE`|Mz>4BID;r zJ^@1LHS9_2Bx6yVKFZ*>Y44g#0$9<2Fk3N&${3deJb}??qINtd$T2U+#!a`o@leTU zBhSQ!f#Pz0zG<@if$)ng-Du&PVKXu42EIH+5jSGYcH=UbuLndAc^lH5^ioP_Vnv%6 z!p}*@h1LqrphNyDbjYN6@qe)Q)-iEKfB)y;?t@El1}(+iZEyx3pvA4YmjVTfyA19y zXo2G1mf~KdP#lW1#flb+_IKOwZnB$AHrZrgfPjyb0+tmx%bSupYwjdUx-SZ z7efaYNf!BujQ7k~)bZlgv?B5ibNFo#(5z3IJL|gk=gUFuDi3q%)0F2y--tE^H#iV3 z>#=zzNJ@GZnZ8JL4u#KU+0Q}pWB5e5dOg8pGnjdds|C0dRv3hg)5#%ix}TRj8W{~a zJ;(`|+i#fPSQ)>*2=ED$J=aCqky;ew z|FYxk5{<`{_n8MoTVU^cp}rqdZrMi2OC}PgyE-8bZ|4)*CNT`2_K8u@jQ}CanZp1H zvORIWo$061DP#y`TG|VWmze%!2gzj??te4%FY#%bU0($1vb$OEfgebf_51KGd*<`Y zX=c@546u5zrZJDUe*5t}?iaG>sT5oVbxGu9@2gt2(Dn~{hQ^g2shI5Go46QS8f?$i z)-9eylO$@Fr|O$4X-bieCQ_l;CN?oSJURs#8^mnDAM67P~sHZ(XF^-`x z4U^{0F&~psm?af#wd&8;DHA6qTJBNGb&lgF2v5R|kbP|B%YQ|& zm2%Y336zKuw}!;bKwDhuoN}Ukk7J{+#VEB2cAZueb!f*-V%xKYAJ^xfzJ4SZ*!s`$ z`?Vh~p+D;1?Y@FH>q7+we*dX8VvKZ4aF*B(ucK;*!V~ugw2T#dtXi3zI)GDD=yoqq zB~<*m;L1(AMbBG++oOPj$S->icgHpk^l$OJPX?O})1BC#V58H<@TZvoR}|XJTGF96 zMMRTJrxyW^**><=1~#{pMU+ZrWX*C;BaNqMGnbqGXK~y!qAtP$pY5P7i%5=2XWJ6G})iT>>hcBmpC!nSXWiF46G+=I9yLYA{6E= z`YseC_POm<{>;fXZ0W&Uwf}#1{r}w?jRj3BUUqx#=^ZCN;Y+9;z4)y&)a%b`FHyYe zpAly35{zny-NfEjvy+AxyT1QbbuA9{H6*_)R_ZeHhM1QC@j^FnLk;Inlg^>nKB!#W ziU?QA=Ek&$pJ}4WU37Q~%?T^R&1N_T`;lfTnPusC8-rM0qVw{ETBC5+;x0B0UD9@9 zfocraNPV%oAPG^{d9zV!OI;K>DRiKsulqV*j?2n^`$GHmn%j*2oDSR@8>_rZn53az>ic1IM||26)w-uwME z{%{<${x$x{TKqNsKyQxz8h>=Y{4@T9bpJK}r2ks}>lXT-M*m+rf=oZ1ly^c>fKsHT zZo)2APZw0a%mPGICOEFdXL8~)`{VFpx(uLX5m%8H%I`%)v~rD6yWod$f{2VQjVHt$ zw}S8Zi(w_YDxQl+)z2mLsKNW~8WN=WHIlu``S(RUHONnO!nqz!awCfy!crsxcLQ_r zY~LA7VV`Sv(qBB`;Gayj$)eBB=j3#?ErAjsuLd%nV#+@wjN?2=|E(HE3Xa4jwyv>q z@Tj95?#dsw!D3x()UCJ(bxQ}U1;TUG(G)6% zj5#a5_EQ=CDn9JvlX%NW-{1#Tb8kfLT zb$qzVbL=zEfrp=P=nip@-SQ=3VAntME6a>lPtvZ~*>9P-*fDoP&FRx}j#GMC+i7?k z>ziM*x<(s!uiXpA0@3|z{v(*Q?30ujvBZs>(q!v#@58A{I!WNjYca?_gAwv_ged_F ze9c@q6_RaUaj(WSt=2Lm`D@b#H&-?)x*(@S*l}2no7JJtjI1a&m{>jPrr4nYfBtRENY2TmQ5Ja>RvKX z&2qQDay7*z82X<)k2X(;D-KW_b_7vFC76buz9@xfw^O9F&DKWnr+ZajOfI90Q+(d7 zmN;c|pOmTuzwjdXTECUjLQ@VE;*^l5X1Y4b!;;5_u~V8>`|P>)2UcGg>H&sZ5^0A? zg0VD5B)0@bezoot;fy?|8k;(MC;>Zv)9`o9F2D&cD<%xs#~ZId)&utO)JGn^!Q|%h~n=ai!9b^nuJ-aF2N%hNeLjA=|ObG)FZGFu=hjEyQH`{jv z1{BDF6lV>^OefVh(#qW9Tx1BZ_pp+^QRz? zx*!N>hSY1X(9Eh#xRD^6(b$U;fp@Od39vzK+gajuz&zsj)M10};_5bHJHx7F{bk?g zx=h#qC6{eR{7m&mObJ~{*5I3Fw$x5+JJENmQiBRM%UO>WtvbgIqmHOmPvtx(J_pR-yshm*;YF=<*rqzX<|tquBeObtI*o`Q*ns@ z-~Je+a_{Rd!O?|}1eqY@%9;}-opRHdFmI6cVs6&QogTd=_N`w;H$6>SBMM&R`iQ|W zho!F(Nbv?FWrm)or-Ki4Lt;TFqmumxC!jViA4u_!>0)=V)3blPt55Ng5AqIzvAaNy zKsrFH(bT#qR!sD5N@TeeR3N#}8G~7buORl41FrfBE7hF35ot@TZM%H%K&#ChO_s*b zCPSh)6{~t`ccVjejL$W(3Lh=Cc1bxf#z9-$R%vRJ7-HavznWAIlb=T~wVxX0stBuH z$PX^cVOKcY#@XOy3NiFGMZ?aF!Uai!tP@j(;308CdM(+mnduoChUom~P2T12a!zU$ zftW0+&SOq$>q&dP;>QEpduIFM(66y}J^N>DEbQ0Q%yU+`yXvGys#OYEQd?eFa@bfW z2|XU6|1KAFw`?F}I;yYP5NYVMeX?0CiUM+Zv&M7VL;5$@V;zWKnIahI$7kZ4`Nu0q%+nZ3a|3y6S#HqZLMSm=%cFG zlD0Nn6D_P2LswHSwr65~*Rwjv;n|9R6DhxPHY4-gRXdIk0f3H&=5s0;UWl9T?u5+# zr248Uo6>246Vx9gKZ46@c!Qu^Y-cMjAGuYi*0c;?Y+cDJ$k4-cwP`C?9)p4NkAR4+;d-aNuYXJ^&C?X3swij2L#P73Ff9>UfSwN_6LsOI{ zp+(l45lM(a;G6ki%(snUX-rAaCR`C{By3dJ1AxPERRYddenLJ1~Ir{wj%q|U&>oMq9z4^Xsd9vQQMyDeG|H)j z9f`k^ZDQtz1dyEIG%mvV1|(1oPe&^5cII%B2y@-|l%L7(QpO0R>2OL)m3hTN)K@5Z z(bJ$Tk5MF8WP;20oW6X|ltpz+AFtIO>dq8x`G`)Ut7<7bUr`y+kH{)uWUtui%**0n zZ~kG2TsLaf#dg>wv|Y*v%WYC?YKxsUqxy4hQe!p<%o@Ji#hdR*EsAEH`$0Q zNi(`GR}S{_NQemKdr$BtZY9OqeWu%#m65>=dnNtrIGnF4Oxr6g)Yc=u7eqa46tZp` z`yUf#HbDO=;~RqifHYPJ%5CYYU2!eMxV5#OV@~I$+jq0}3yhmN7FXAV78fV~0V)3h z8A%269+EuTU=Pl<0R(sI4?|mhEgW`>53Nft>^dSW%*NzVkL*(Bn;o>&YmK&G1sNO< zk1BhehJ%atpok1RJhR`eJFK1u0i`+*!OzVnO_dD;$MV^{4yaF6jHYg!hAGI)?X{p0 z6;AC-Yza2M-1W(WC`s}aKvSsq<%}UN;2iA{p=JP z*=-pJQF7$$pzF+KNtDUljso;5i2OJ}TT^`E`k2Bu#y~VazM|_bWt(;)&0!Ypr}!0) zcqtiDAFdystnO4VaA^05>oUxi#BJL2YJtdAfLB1OJTAvVK3F>gihtw#t<&1mZNuxi zQe~(u%|zW7BS!?IK{^UwcZNXkPyOFX-tW>#NfB`%3=pj8h70so?+7Aq4DpfE!XC45Y^az&%&Dx*+?(aJYwSVx?(-|$BjvauHnmT*|8(y+%BJv-zoo}>xQylmXw zbGM9nxE4H|dvpyqz7(Y(C=(Q7U(a#%`iMao875b2ja>r%36#FwFvCH9~z1p0DbtoFb$E05zO{4*SL6 zLyJ`f@p=5cW4|WTcgmZYsBFcl$G^%5_@ncm9jMS)5s7{HZ_*C#oj!-Uk}c=uv@6k& zvSL84$DUQ--O%X#NqeNt(1Yo`sUhHsB@(_4N&f>XJIb(5MwX?r1f?)L zi6Ev+=WND#VtwcdYoC4x6>mIYdd$YjmlBno+?bB>Iv7LGn)TBFxV269X7E#~eM{VG-iEm{Ba zVP_VWV63bn(iH>Kl8?iP&lIBfvF5oN?P5?Ex*wu?iy9$Bj0r0TF+mLlk!vmPHd)Zp z4U^R*0**i$ykLd+U>m>supW_0Tc4oM`K7OFbF&RcTv<4)$BT^^RPSs1+R=Be;i1=p z&z8pHc5tXw3bFgEMJw~hSsaQoWGyftRXX38g{Awb+vF?84knt^X2}c#tw-ArjSc;T z`XQb*$JMy3gpgJ?2V{l5ZX1I}7{`xXTgi3GfBcgvOVs^i)2jd>yVb{QtCKbpmJ_#v zyuL<#%Q2iKvORa#RD~##I9AseL!fCyPq8$3g?@Z*aGNsG zWvuo;s*kBrL94F$nota=qJ5J78K-LeGwhw(4DC`w7cSS{W%B_(8&H|A3V#*UhnWsTrE)WNXnZ zRjei2M;uh=6P^aF|Bz5%6n(3^P!6-deiKY$Y5LxIL&=1~J-2;^0weFg;SSQ;@#1{z zs61@)Ir;jPn2=ArPn_yfyPVVvO+t>aymY<-yqmQ&SDxir-_n#H;3ZPQ5>xrffJusz zl#dHLcIB5iR;D?TWwcZVs}UQS=kKUwx$PT3!!R;q3t8x3!R#lTg?!BxL@o|$cYD@) zTUdd*C<b4+&LEpYT{Ou<9Z&A=APDk6fB)gHt^;)!mnv9u655jm_hgUchE~bM z43a6oi}OWZCA04)nGKziWSJf8nw^F(-LxTsEtL=}JxrWegE6Va9akOL znduH;7*CrizK^aPnYmWXCG9t}p=Pl2W~~<5vH1}au}!8fz`VqeJL-vFa`jV`i+{!2 z)~2wP7aEOhy&CZ5+yoOtSwE+_b3DVgXQiuptg&sQF~RYpW2sYdR**`=NQPouG*Qr= z^JP}(*f#p*=xlyj(6g_$KVz<2^80mONA7Fs_X)_AP%`Yw!Fc0EtaZ^Y5aFajH43;- zGd(ps(jW>zxB;`(yBeH{>2lc_iG3c@=Poxr+UxUa8TTH9%=vnqM@GG^o>Md)`DCCk)D!> z$!E1>M)f11>df~v%USY1m)3WSbUZ)bq=)jt-AdCElHO?zsDK*wx z^E{swl=`tA49~E0e+)K2l(Xi#Pb+6c8q>V07CyBe>wEj;`PN`YMV)%_W$fT*^%>?{+qn(v;cI$tKW~Aqbqpd=n!tB1twr>)! zG%eC{T(_v;7b+FVZ_E0R8@4=Cw!jdWN}STp-5_EX@zow)uL&*A&0KZAweLt=QVICj z`9{Q-Hk!j_$E6msr*FGm7HXqX<-$l}t~@4_am_{^FEP`{xlFvAIg^=%1%+MNdayJ2 zjea!s=ZZ!wxfw<{Xm;CQ87VIgb$=I9qjsWxf>>`imu`-iK8qa-UU~I5$;FI$7^yVG zo8z9cI3$_*O%=ebx_v&0(f+FHgB57QWA~8eDiyO_bNbTurZ^PS`;pYUpPxPZD=7sq z`WZmnf=^vbK3BfRQ<4At?lFJgn9=gbj@N%cYgU?LR>6P-v4kft zT_7Rcs&O=|B!zCK=I4xewbt$2fs$o#N(G^wt_wACe;tNORF?Khyl+?4&v zH2o{NKH(g5ONlAqK#plDNXxg)S0*vqP_b(RlEG%hE^EbZk0DHLD^OTwSqkVeJ8K&6 zE(gP8^8)u7vFfk*KOpdHkK+KZ=T%JJu=<7!ZbmM7HI7XF?^thHF9G&Ep@;tn0HXJP z{az8E(&y8k0f>6K&Eph+SN|O=D7vdLT1;{Wz|xC<++YG2^;3k`ME}K&2CF$_`HxBu zH~kDCjBHRjG#`}uog)t#`K4h=r%p?|4GyT8E!nV%n9A~Vi$sw)&tM4092Mcf#hfkp zos(E~DPc-RzTPN7dD}E9EP@psiQkJ~@DIPaKv}#%ffQQ~PeJB_Q=G9Q7Mwt%Q{jC2 zBOu6WIQcL+Z_P!Kj~zw2bH%C3yb>pSag0yIJ$O~54nqtW@D!&h-+`S$C_h`cGwRg@} z1i#hP0U-QI=(|?yLbSUpK_Sh%H*My9y~oQ&65Q8D_44gTqGK*lj^`D%l`ioWhwZzW zb(d>Zbn%kj%Y0=CuSjy_{^i>EU6P4JyaV_(aR<0JTD4EpKMtGpy?Ci$lBUn%L?648 zh|>GSa0poNTX~G0m&LxAquzmMJ5)}k3D%PFlXoRF3}qUZ#I(b~u)9(`o_o3$JE%QM3aJFN`EKDP(O7H70RFu zjm323%p{MMe9mi_nl{%x(n^5Zu}-gdoTQ!D4M22C%Z>K zZrS1AvbF6XS3gNIRO4PZPC_i(NIGK8l({5x`~^h$g{;$+gJ*pJkOL0}8&nvbF5(fk zd1~N%4l|ijC8B_%kNFpJE?UTr(w|%GTuhRGvStbOB;pOpr!$^Hrgq^!pp%O=U z6wfu7!NfOFOSq;A(RyiD1O@V2dz$ng^Mxx4BpQ8N(Y6%YWj|kX5Yc#rKAowMSyOMV zwz_;Z_ENF8K!!;BCL@Oh8uq^2L2vG>WLmjRW$4CgHLmqSYKWFEdFKH5OI+&~;2mLQ z2dJ4G0@I~w;wmcxwMpuUO-~ZDo{vr>ZkASz?s&Uzlt3?x*Xp)8^#H@V48z|DnAV}a z?%&PB$?Vd3y1AW?yS{3B9w(0b)h5j6mStBfb#O3TVr?|ZptNCTcCzIn%iKE_2H*92{+GuTW4_GaHFYM3GlEw%(>hqZs0~e z0iXJ`tY1@;S=Q+)o)WR6t|EtJ51W6?_p@JSOy}2GeCNP%?o-iOW;-%c?+IpWi_bKX zZ4J0;TQUS%&@pcmWN)=-wJKL~B&M!zu+7Hm#G%(h*Gg;o4+!p4EkkXL$Ryr|l7|S( zvv9wWAu}WYu@uo|xbagtzw3D&mA298I5=huey^ za~C!DpfULtc|tUdA{|Mhhx37JRyuHiWG|xNOqqo*8;sUwWQ7*-ox}0f8(8|@+xMK! z&~Xx;^bMKjxW%&=DZNH`V98fSl?5+7=bG1_+}a$@BUp(+W2M-@nZJcolox;X{Jthy z0K$(|qXhAxb+Dfv@lZ&zW_Rb93jL}joZdMGSYfuGRy~(U z3c;3BSFL=$-a$Sl8`Dz0+Bz}DD{A{Dp}1detJ+3DeFQA-XgwPkGF$j`ozY3Qq3ghxaNVJ^Y+hFWym0U02~&WBb38X@d;#$*h3V zQKnbbZ!_ju{c&oTn)Dd(=w%&sl&t1j-Voh26itma^) zhUR)DjOL&Y!XZaY6JSyPTbqU%x)IO!#tcI~^KcW>yH=f@6ZKc5NlJ&2i z$r&by9se}I7+)5sACpK=DH#B#1SGJQ-*WlxiK2joUG0P~TrooQ1?Gh25*nmWIL}`A zEmwY3V>s%1qJJ-N{sTOc1=+mdcKsE*AcQ)L0CcGD7#Jjxi({-FJ@tu|NrjiLA0HZL zMz9{1XGgLTc`hvn&Xk<&48C_XzAx$1T_NNyXo5ufpGU~cruXSxd%=+_g^Qu_h}`<~PzO=JFf3SaF5)*%}MMamze8 z{-n+shqf72bldbA%K>}G_MiQ$Vae1F!aGa38Np&nLi<29_dWB9(qyi-KrOePofZL8 zr9fHe5I%hIiEv8CImVJ5J*TI5M;XrHQqS`~vuthAG%ZzD;u7Su7TB}GAd16l^qTl= zzru(F#4M!}I<(&d1U~D9A+bE!|up@pR=S^PZ^O$;A3wlL3$XMO2J?A5m z0w5xfGn>~-n9qC^c_%d|IBZ)h4H7>e?C2@oe}s|d_XlO$sij`SDh_{~$5@`<$M%_4Kd#jvAEt7AKrS|w6mLMyHaUtfnwp$AZbTME|##YDeSRnsB& zWN40!R3Q(NIk`33RtH>mmi|cusa?l5Y&PevBnk17yJQF8i50HOa>WMby<2K6PPoBJ z#ZP5|_CRnj%`&>cQAzk^e3*V(tYn*Uy1jF|jXq?gSZI2P3<}4F%j-iu*uG6gw)sP) zSo-zPW?_@zMi>3nt~h8=Jyc$zj7cpvO|2EJ)j5bLClAB5l0|ZgeZ9%w!0J!+j-cwK zoAp=e*3SI)BQ3VIhN6&X*`B?v62y3~y`1DqRl&}$tc&^uek5wUZ2xvJlAftXcHW7^ zMc<`Xd&)-5SKdQD7kn`@c8Oe8gX@qu3uAjm8@}*@O>1z~7xc-+3li17L&z&kR#ECWCnQ>B!9Qs}9~pbR(9w_23TxDch}h<$NbW%9qS*ADrkGGFR&!0CGGof6 zK(L6TX%UWBX+N+pb|c9l>ri2iMs-P1S&1!Et0x!Ri%krFgiH%3%(pmqWN5f7_^+25sJU&;c zGEtp!_boHvVfilFHB&=Da-O&5IFE;YJ^8c6IWi*X+Z9|`p-;y9WgSh4)g$qD3yHc7 z$@%LC|I_e)OXmg2etPK-BS zxnvo$*$uZKkFpGp#Kd5#RFYmzlLaD0871Q8nNN2=Uvo)WDy?`62p$3xDqzWZXaPk% z8e0Yp1AiAy0w}brsly;3N+Lqs3=yY(?Qe4WWSVu+q~7IF#v6Rb@^OaQ?DUE=Iz|Td z=k3by%O<-OLxGa0n<<9gxIDg@MktQ+-77B|=D zEzx+l5~XXg6{~xjh*P}Q<~M7XXw1r*c6zmZQ49Sl%A( z%Z8^A2}7nTU{7Jk+Wi47nKQw^9cF>pcxqa`ObQ_EW$J1hE0bLC*~W@gf&S3%&=H?- zF6?PdUZ!s4)Uzo0>a1+7DIx#anp55HKQG8RRYFl-gi>7U3bI_^g7{vDo+LjEdkY%# zy!bT&toR7sIOjgt5A!wQuD4b$rps0M)8Sn8JuykM>hw!5!B$hdAneVzk+hm>!MwIJ zxHyXZ9a=~h(jHX$vKxih>DtaV8~@Oy5Q|c&(4<#@JA10}O9BQ%&@fzBq-E8r(U4EK z)cUnHw=>s;BA)<&Wp(XH%V7P%xGveT-W*^1_E)}O;S1=xQkmSNbJr#`A9GB7w1~aK zYA#qJ2o+g?$~t^s-$y~(t}wK(V6vWx8A%&=^+V8g8o~Sda8}Ty)c`pwKj0~4AK`!= zlP<83k-z{w%;H!K}{#eqb!aZ$`>M6r2e38(bvG*;KsE)LW6o+no#@L$ZvVy^lpLcG`N>&HTzv2x zTB06S#rTbJV9YSW2%=Tw!rWahmf8`ROOg7N&g~Eb$h|gYsN)B!die!^Kn)7TaU?)0 zC5PJNYPG`j=dP5fjMOjSC$Pku^ih*0J2u?U1{zu*cj56YzK7;`&z+JX*w&=_bYwLr z>-P@*_=Yla-j!wzx#`H-I+;j<;!b47=?=}>Dbg0TVCmlQjZ-7v@k5Tu@E;I_e++JI z(b6*K1jbfS2GRBsG&`x@7pHRO41#fAq>&}|>FV!Xx!w3i?U-Gbid|CMv;rO}g5O}Y zW{oTkUXF0wk=3TfcW!SKV7cj|_z}>hgb4CfWvQ>gCUrzjVL#XE1mc`KE8Fg)LC5k( zTqx~kADu-8zvf!1KnYO1W)J@Wm9E~Py>%IiVh86xYEySPu zmG2d9;_!LdYK1TSydj#RHWp7TLyBsCrH(5EZe;D+OR%T@8Bx(A7MOZSsgRhW z==({2+cK}%OACqXtvD^2B%RWjRPU;IYB#V|-HM!nGVU-Y)_eN3{2X<+3@2S-b6%TJ zqs=qAmS3emeEP$s&UpkKw7n!ZQJ8*7{a5)5?d$0r)>%CI6}jerQcv&`_oMkViE7tgj_Xb7SSyn`nW*6! zWr*z0X)6?X!n8nP%50MLWLYM`Giz@ELkTzoO#!=yge*n{Y>HnJuVSi>;uaByH7i(d z@IHq?C9$q}HKTwzyq(UpCx1lk7@^gR-w-Jj+Zwe?#omqH#pg;V)N`D^))^TrG0SZ} z5Jk$o;JR6&1aOBHa$XuTY&YwSl+PzyLVJ=A@*h3e$z4@TSEPqnExFtvXT%hF#suhM zb3vXMr}UC88C8+ITBAL*1y<~Pv4*P$4rlA4y-!49-^hH2aa{ z8sb=*>_Ei9l>Q|nX#cVNl>(56jV+$+A%-}~RW9Mel^1%PUBunAX{%zA*`APkpW| zL4i>{b!F5>a*fa%4vVI0zt7dx@%4) zG)Gm)PYQ~4qS4N-x(#lVhe=s~=vM4rtREEsQC#+gs*_@XK(wJG?r@yV>}Q%*Y-Pjz zWd{i?dE2@&jTE;vcUr}_rJr4&#YS8xo<0AXMgQb6<9mvjUsO#zzdUS`gDmg5KH!Zp zY*PvA^b0<_w(iY+6!|&3nPX-k{Ww;<-LAq+Uq|4u0S-i};u>%VF!rs#!r(Q=YvO`q z8`LE3MjERIdMBRvb^ct)ubt1Ol(r_X`8A$?UYp#f%})dN@rM9og=$beJ%F}m-vr%) z3#K25rRF;=LkP(zkYxrp?#RFiD{zL2?OUoF=6SP9MHikMC$-EL2FXb_mRTFDZ-&Kn zJIT5U3|5i{K}EW;c+!o(!DY9lZl=W{30=Xb?p<;B=xj1S`oteN;)3;DK8Zgo=Wjla zjW*EENXP7XV&7B_`CP>wQAk20%~wxnwYQfvk3c76TAb78a1tF%${_H2o2#3e$?6~b z&ekJeZxA()Zamb(hKd&9mc015I2b-!T9LUkOk#*ttSHtbvUzQ$g!ej!PUl}tA@NQ< z(fH%Eu{Yus?9zqC=y|j>kYY>BI``$$tS!Vuz?+X>5UhZD_50r7;c?=Ctrd=xlxWM8DH77w=2avadWgJ&XOT=iKB z!Je{w$D6)fzoB9T$$gEJxJ*x#dStBza(Lnf4Iw zSWZb7ceNCI;SNT!_dEAQa%v22O#0|F@)6o+>(qW8BGI1yrjcDXLlH4Pe=}_G)-?Y2 z%W7eR4reRL#d`Ml;l6o%Qn#^AEn$I(GC6Tgkc=`PqC++4>pO=;r9Q}HX&fZXZzL~f zrzEV);`<@xv`m$}{+wGm5(SwnSLT⁡eG?H6Y?u403YF^QXd=zbHhm<}zh8-Qw|f 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�DT(#P+0F4x&m?q6% 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 Date: Mon, 1 Sep 2025 20:28:11 +0530 Subject: [PATCH 04/22] feat: Implement full Google OAuth authentication and authorization --- client/app/auth/page.tsx | 142 ++++-- client/app/dashboard/page.tsx | 77 +++ client/app/home/page.tsx | 42 +- client/app/topics/[topic].tsx | 9 - client/app/topics/page.tsx | 200 ++++++++ client/components/ui/badge.tsx | 36 ++ .../{component => }/components/ui/button.tsx | 0 client/components/ui/card.tsx | 76 +++ client/components/ui/dialog.tsx | 122 +++++ client/components/ui/input.tsx | 22 + client/components/ui/skeleton.tsx | 15 + client/lib/auth.ts | 31 +- client/lib/axios.ts | 19 + client/package-lock.json | 440 +++++++++++++++++- client/package.json | 1 + client/public/file.svg | 1 - client/public/globe.svg | 1 - client/public/next.svg | 1 - client/public/vercel.svg | 1 - client/public/window.svg | 1 - client/types/type.ts | 19 + server/pom.xml | 32 +- .../com/example/podify/config/AppConfig.java | 15 + .../example/podify/config/SecurityConfig.java | 108 +++++ .../podify/controller/AuthController.java | 68 +++ .../podify/dto/AuthDTO/AuthResponseDTO.java | 15 + .../podify/dto/AuthDTO/LoginRequestDTO.java | 16 + .../dto/AuthDTO/OAuthLoginRequestDTO.java | 17 + .../java/com/example/podify/dto/User.java | 4 - .../java/com/example/podify/dto/UserDTO.java | 18 + .../com/example/podify/mapper/UserMapper.java | 29 ++ .../java/com/example/podify/model/Topics.java | 4 + .../java/com/example/podify/model/User.java | 24 +- .../podify/model/superclass/Auditable.java | 28 ++ .../podify/repository/UserRepository.java | 11 +- .../example/podify/security/JwtFilter.java | 42 ++ .../com/example/podify/security/JwtUtil.java | 54 +++ .../example/podify/security/jwtFilter.java | 4 - .../com/example/podify/security/jwtUtil.java | 4 - .../example/podify/services/AuthService.java | 17 + .../com/example/podify/services/Signable.java | 17 + .../podify/services/impl/AuthServiceImpl.java | 67 +++ 42 files changed, 1760 insertions(+), 90 deletions(-) create mode 100644 client/app/dashboard/page.tsx delete mode 100644 client/app/topics/[topic].tsx create mode 100644 client/app/topics/page.tsx create mode 100644 client/components/ui/badge.tsx rename client/{component => }/components/ui/button.tsx (100%) create mode 100644 client/components/ui/card.tsx create mode 100644 client/components/ui/dialog.tsx create mode 100644 client/components/ui/input.tsx create mode 100644 client/components/ui/skeleton.tsx create mode 100644 client/lib/axios.ts delete mode 100644 client/public/file.svg delete mode 100644 client/public/globe.svg delete mode 100644 client/public/next.svg delete mode 100644 client/public/vercel.svg delete mode 100644 client/public/window.svg create mode 100644 client/types/type.ts create mode 100644 server/src/main/java/com/example/podify/config/AppConfig.java create mode 100644 server/src/main/java/com/example/podify/dto/AuthDTO/AuthResponseDTO.java create mode 100644 server/src/main/java/com/example/podify/dto/AuthDTO/LoginRequestDTO.java create mode 100644 server/src/main/java/com/example/podify/dto/AuthDTO/OAuthLoginRequestDTO.java delete mode 100644 server/src/main/java/com/example/podify/dto/User.java create mode 100644 server/src/main/java/com/example/podify/dto/UserDTO.java create mode 100644 server/src/main/java/com/example/podify/model/Topics.java create mode 100644 server/src/main/java/com/example/podify/model/superclass/Auditable.java create mode 100644 server/src/main/java/com/example/podify/security/JwtFilter.java create mode 100644 server/src/main/java/com/example/podify/security/JwtUtil.java delete mode 100644 server/src/main/java/com/example/podify/security/jwtFilter.java delete mode 100644 server/src/main/java/com/example/podify/security/jwtUtil.java create mode 100644 server/src/main/java/com/example/podify/services/AuthService.java create mode 100644 server/src/main/java/com/example/podify/services/Signable.java create mode 100644 server/src/main/java/com/example/podify/services/impl/AuthServiceImpl.java diff --git a/client/app/auth/page.tsx b/client/app/auth/page.tsx index 0cd3f64..7fe80e9 100644 --- a/client/app/auth/page.tsx +++ b/client/app/auth/page.tsx @@ -3,25 +3,64 @@ import { signIn } from "next-auth/react"; import { useState } from "react"; import Image from "next/image"; +import { useRouter } from "next/navigation"; +import { Eye, EyeOff } from "lucide-react"; export default function SignIn() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); + const [isValidEmail, setIsValidEmail] = useState(true); + const [isValidPassword, setIsValidPassword] = useState(true); + const [showPassword, setShowPassword] = useState(false); + const router = useRouter(); + + const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/; + + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; const handleCredentialsLogin = async ( e: React.FormEvent ) => { e.preventDefault(); - await signIn("credentials", { - email, - password, - redirect: true, - callbackUrl: "/", - }); + + const emailValid = emailRegex.test(email); + const passwordValid = passwordRegex.test(password); + + setIsValidEmail(emailValid); + setIsValidPassword(passwordValid); + + if (!emailValid || !passwordValid) { + console.log("Form invalid"); + return; + } + + try { + const res = await signIn("credentials", { + email, + password, + redirect: true, + callbackUrl: "/topics", + }); + + console.log(res); + + + if (res?.error) { + console.log("Login failed : ", res.error); + } else { + router.push(res?.url || "/topics"); + } + } catch (error) { + console.error("Auth error", error); + alert("Authentication Failed. Please check your credentials."); + } + + // Proceed with form submission + console.log("Form submitted: ", { email, password }); }; return ( -

+
{/* Left Side - Product Showcase */}
{/* Background decorative elements */} @@ -48,13 +87,18 @@ export default function SignIn() { {/* Tagline */}

- Your Podcasts{" "} - and - - {" "} - Your Topics - {" "} - - All in{" "} +

+ + Your Podcasts + {" "} + and + + {" "} + Your Topics + {" "} + - +
+ All in{" "} One Place

@@ -73,7 +117,7 @@ export default function SignIn() { {/* Google Login */}
@@ -132,17 +189,44 @@ export default function SignIn() { > Password - setPassword(e.target.value)} - className="w-full px-4 py-3 bg-gray-800/50 border border-gray-700 rounded-xl - text-white placeholder-gray-400 focus:border-orange-500 - focus:ring-1 focus:ring-orange-500 transition-all duration-300" - required - /> +
+ setPassword(e.target.value)} + className={`w-full px-4 py-3 bg-gray-800/50 border rounded-xl + text-white placeholder-gray-400 focus:outline-none + transition-all duration-300 + focus:ring-1 ${ + isValidPassword + ? "focus:ring-orange-500" + : "focus:ring-red-500" + }`} + required + /> + + {password && ( + + )} +
+ + {!isValidPassword && ( +

+ Invalid password format +

+ )}
+
+ + + {/* Search */} +
+ + +
+ + {/* Recommendations */} +

Recommended for You

+
+ {podcasts.map((pod) => ( + + +
+ +
+

{pod.title}

+

by {pod.author}

+
+
+ +
+
+ ))} +
+ + ); +}; + +export default Dashboard; diff --git a/client/app/home/page.tsx b/client/app/home/page.tsx index a751d78..60eba4a 100644 --- a/client/app/home/page.tsx +++ b/client/app/home/page.tsx @@ -1,14 +1,13 @@ "use client"; -import { Button } from "@/component/components/ui/button"; +import { Button } from "@/components/ui/button"; import { useSession } from "next-auth/react"; -import Link from "next/link"; import { useRouter } from "next/navigation"; import React from "react"; const Home = () => { const { status } = useSession(); const router = useRouter(); - + if (status === "authenticated") { router.push("/dashboard"); } @@ -25,7 +24,7 @@ const Home = () => {
- +
{/* Main heading with enhanced styling */}
@@ -50,30 +49,43 @@ const Home = () => { > Get Started - + + → + -
{/* Additional features section */}
🎵
-

High Quality Audio

-

Crystal clear sound for the best listening experience

+

+ High Quality Audio +

+

+ Crystal clear sound for the best listening experience +

- +
📱
-

Multi-Platform

-

Listen anywhere, anytime on any device

+

+ Multi-Platform +

+

+ Listen anywhere, anytime on any device +

- +
🔍
-

Smart Discovery

-

Find new podcasts tailored to your interests

+

+ Smart Discovery +

+

+ Find new podcasts tailored to your interests +

@@ -81,4 +93,4 @@ const Home = () => { ); }; -export default Home; \ No newline at end of file +export default Home; diff --git a/client/app/topics/[topic].tsx b/client/app/topics/[topic].tsx deleted file mode 100644 index 3fbdf5e..0000000 --- a/client/app/topics/[topic].tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -const topic = () => { - return ( -
topic
- ) -} - -export default topic; \ No newline at end of file diff --git a/client/app/topics/page.tsx b/client/app/topics/page.tsx new file mode 100644 index 0000000..3325e35 --- /dev/null +++ b/client/app/topics/page.tsx @@ -0,0 +1,200 @@ +"use client"; +import React, { useState } from "react"; +import { useRouter } from "next/navigation"; +import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Topic } from "@/types/type"; + + +const topicsList: Topic[] = [ + { name: "Technology", emoji: "💻", description: "AI, gadgets, innovation" }, + { name: "Health", emoji: "🏥", description: "Wellness, fitness, medicine" }, + { + name: "Business", + emoji: "💼", + description: "Entrepreneurship, finance, leadership", + }, + { + name: "Education", + emoji: "📚", + description: "Learning, teaching, academia", + }, + { name: "Entertainment", emoji: "🎭", description: "Movies, music, culture" }, + { + name: "Sports", + emoji: "⚽", + description: "Athletics, competitions, teams", + }, + { + name: "Science", + emoji: "🔬", + description: "Research, discoveries, experiments", + }, + { + name: "History", + emoji: "📜", + description: "Past events, civilizations, stories", + }, +]; + +const TopicPage = () => { + const [selectedTopics, setSelectedTopics] = useState([]); + const router = useRouter(); + + const toggleTopic = (topic: string) => { + if (selectedTopics.includes(topic)) { + setSelectedTopics(selectedTopics.filter((t) => t !== topic)); + } else { + setSelectedTopics([...selectedTopics, topic]); + } + }; + + const handleContinue = () => { + if (selectedTopics.length < 3) { + alert( + "Please select at least 3 topics to get personalized recommendations." + ); + return; + } + // Save topics to localStorage or backend + localStorage.setItem("userTopics", JSON.stringify(selectedTopics)); + router.push("/dashboard"); + }; + + return ( +
+ {/* Background decorative elements */} +
+
+
+
+ +
+ {/* Header Section */} +
+
+

+ 🎧 Choose Your Vibe +

+
+
+ +

+ Select your favorite topics to get + personalized + podcast recommendations +

+ +
+ Selected: + + {selectedTopics.length}/8 + + (minimum 3 required) +
+
+ + {/* Topics Grid */} +
+ {topicsList.map((topic) => ( + toggleTopic(topic.name)} + className={`cursor-pointer transition-all duration-300 transform hover:scale-105 group ${ + selectedTopics.includes(topic.name) + ? "bg-gradient-to-br from-orange-500 to-orange-600 border-orange-400 shadow-2xl shadow-orange-500/25 scale-105" + : "bg-gray-900/40 backdrop-blur-sm border-gray-700 hover:border-orange-500/50 hover:bg-gray-800/60" + }`} + > + +
+
+ {topic.emoji} +
+ + {topic.name} + +
+
+ +

+ {topic.description} +

+
+ + {selectedTopics.includes(topic.name) + ? "✓ Selected" + : "Click to select"} + +
+
+
+ ))} +
+ + {/* Progress Bar */} +
+
+
+
+

+ {selectedTopics.length >= 3 + ? "Great! You can continue now" + : `Select ${3 - selectedTopics.length} more topics to continue`} +

+
+ + {/* Continue Button */} + + + {/* Footer Info */} +
+

+ Don't worry, you can always change your preferences later in + your dashboard settings. +

+
+
+
+ ); +}; + +export default TopicPage; diff --git a/client/components/ui/badge.tsx b/client/components/ui/badge.tsx new file mode 100644 index 0000000..e87d62b --- /dev/null +++ b/client/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/client/component/components/ui/button.tsx b/client/components/ui/button.tsx similarity index 100% rename from client/component/components/ui/button.tsx rename to client/components/ui/button.tsx diff --git a/client/components/ui/card.tsx b/client/components/ui/card.tsx new file mode 100644 index 0000000..cabfbfc --- /dev/null +++ b/client/components/ui/card.tsx @@ -0,0 +1,76 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/client/components/ui/dialog.tsx b/client/components/ui/dialog.tsx new file mode 100644 index 0000000..1647513 --- /dev/null +++ b/client/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { X } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogTrigger, + DialogClose, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/client/components/ui/input.tsx b/client/components/ui/input.tsx new file mode 100644 index 0000000..69b64fb --- /dev/null +++ b/client/components/ui/input.tsx @@ -0,0 +1,22 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Input = React.forwardRef>( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/client/components/ui/skeleton.tsx b/client/components/ui/skeleton.tsx new file mode 100644 index 0000000..d7e45f7 --- /dev/null +++ b/client/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ) +} + +export { Skeleton } diff --git a/client/lib/auth.ts b/client/lib/auth.ts index 1f857cc..39333a1 100644 --- a/client/lib/auth.ts +++ b/client/lib/auth.ts @@ -25,18 +25,22 @@ export const authOptions: NextAuthOptions = { if (!credentials?.email && !credentials?.password) return null; try { // when the user wants to log in - const res = await fetch(`${process.env.SPRING_BASE_URL}/auth/login`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - email: credentials.email, - password: credentials.password, - }), - }); - - console.log("Response status: ", res.status); + const res = await fetch( + `${process.env.SPRING_BASE_URL}/api/auth/login`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: credentials.email, + password: credentials.password, + }), + credentials: "include", + } + ); + + console.log("Response status: ", res); if (!res.ok) { const text = await res.text(); @@ -91,7 +95,7 @@ export const authOptions: NextAuthOptions = { if (account && profile && !token.accessToken) { try { const res = await fetch( - `${process.env.SPRING_BASE_URL}/auth/oauth-login`, + `${process.env.SPRING_BASE_URL}/api/auth/oauth-login`, { method: "POST", headers: { @@ -102,6 +106,7 @@ export const authOptions: NextAuthOptions = { provider: account.provider, providerId: account.providerAccountId, }), + credentials: "include", // important to include cookies } ); diff --git a/client/lib/axios.ts b/client/lib/axios.ts new file mode 100644 index 0000000..6a4f1e4 --- /dev/null +++ b/client/lib/axios.ts @@ -0,0 +1,19 @@ +import axios from "axios"; + +const BACKEND_URL = process.env.SPRING_BASE_URL; + +const API = axios.create({ + baseURL: BACKEND_URL, +}); + +API.interceptors.request.use((config) => { + const token = localStorage.getItem("token"); + + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + + return config; +}); + +export default API; \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index c4c3424..f7d7cba 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,6 +8,7 @@ "name": "client", "version": "0.1.0", "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@tanstack/react-query": "^5.85.5", "axios": "^1.11.0", @@ -994,6 +995,12 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", @@ -1009,6 +1016,213 @@ } } }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", @@ -1027,6 +1241,91 @@ } } }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1408,7 +1707,7 @@ "version": "19.1.8", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.8.tgz", "integrity": "sha512-xG7xaBMJCpcK0RpN8jDbAACQo54ycO6h4dSSmgv8+fu6ZIAdANkx/WsawASUjVXYfy+J9AbUpRMNNEsXCDfDBQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.0.0" @@ -2034,6 +2333,18 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", @@ -2757,6 +3068,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3689,6 +4006,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -5573,6 +5899,75 @@ "dev": true, "license": "MIT" }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -6549,6 +6944,49 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", diff --git a/client/package.json b/client/package.json index c7b869f..1855d07 100644 --- a/client/package.json +++ b/client/package.json @@ -11,6 +11,7 @@ "type-check": "tsc --noEmit" }, "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-slot": "^1.2.3", "@tanstack/react-query": "^5.85.5", "axios": "^1.11.0", diff --git a/client/public/file.svg b/client/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/client/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/public/globe.svg b/client/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/client/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/public/next.svg b/client/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/client/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/public/vercel.svg b/client/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/client/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/public/window.svg b/client/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/client/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/types/type.ts b/client/types/type.ts new file mode 100644 index 0000000..b233978 --- /dev/null +++ b/client/types/type.ts @@ -0,0 +1,19 @@ +export interface Topic { + name: string; + emoji: string; + description: string; +} + + +export type Podcast = { + id: string; // internal id (Mongo id) or fallback to videoId + videoId: string; + title: string; + channelTitle: string; + durationSec?: number; + publishedAt?: string; + thumbnailUrl: string; + topic?: string; + hasTranscript?: boolean; + description?: string; +}; \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml index 94f4059..c8828ab 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -12,7 +12,7 @@ podify 0.0.1-SNAPSHOT podify - Demo project for Spring Boot + Your Topic, Your Podcast @@ -40,13 +40,19 @@ org.springframework.boot spring-boot-starter-security + org.springframework.boot - spring-boot-starter-web + spring-boot-starter-oauth2-client + + + + org.springframework.boot + spring-boot-starter-validation - org.springframework.session - spring-session-jdbc + org.springframework.boot + spring-boot-starter-web @@ -75,6 +81,24 @@ spring-security-test test + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + diff --git a/server/src/main/java/com/example/podify/config/AppConfig.java b/server/src/main/java/com/example/podify/config/AppConfig.java new file mode 100644 index 0000000..2835c84 --- /dev/null +++ b/server/src/main/java/com/example/podify/config/AppConfig.java @@ -0,0 +1,15 @@ +package com.example.podify.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class AppConfig { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); // uses bcrypt for hashing + } +} diff --git a/server/src/main/java/com/example/podify/config/SecurityConfig.java b/server/src/main/java/com/example/podify/config/SecurityConfig.java index c09c9e5..17cb7d5 100644 --- a/server/src/main/java/com/example/podify/config/SecurityConfig.java +++ b/server/src/main/java/com/example/podify/config/SecurityConfig.java @@ -1,7 +1,115 @@ package com.example.podify.config; +import com.example.podify.dto.UserDTO; +import com.example.podify.mapper.UserMapper; +import com.example.podify.model.User; +import com.example.podify.security.JwtFilter; +import com.example.podify.security.JwtUtil; +import com.example.podify.services.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserService; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +import java.util.List; @Configuration +@RequiredArgsConstructor +@EnableWebSecurity public class SecurityConfig { + @Value("${client.url}") + private String clientUrl; + + private final JwtFilter jwtFilter; + + private final JwtUtil jwtUtil; + + private final AuthService authService; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + return http + .cors(cors -> {}) + .csrf(AbstractHttpConfigurer::disable) // cross site request forgery + .authorizeHttpRequests( + auth -> auth + .requestMatchers("/api/auth/**").permitAll() + .requestMatchers("/").authenticated() + .anyRequest().authenticated() + ) + .oauth2Login(oAuth -> + oAuth.userInfoEndpoint(userInfo + -> userInfo.userService(oAuth2UserService()) + ) + .successHandler(oAuth2SuccessHandler()) + ).sessionManagement(session -> + session.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ) + .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) + .build(); + } + + @Bean + public OAuth2UserService oAuth2UserService() { + return new DefaultOAuth2UserService(); + } + + @Bean + public CorsConfigurationSource corsConfiguration() { + CorsConfiguration config = new CorsConfiguration(); + + config.setAllowedOrigins(List.of(clientUrl)); + + config.setAllowedHeaders(List.of("*")); + + config.setAllowedMethods(List.of("*")); + + config.setAllowCredentials(true); // important when using cookies + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return source; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception { + return authConfig.getAuthenticationManager(); + } + + @Bean + public AuthenticationSuccessHandler oAuth2SuccessHandler() { + return (request, response, authentication) -> { + OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal(); + String email = (String) oAuth2User.getAttributes().get("email"); + + // Get or create user + UserDTO user = authService.findByEmail(email).orElseGet(() -> { + User newUser = new User(); + newUser.setEmail(email); + authService.save(UserMapper.toDTO(newUser)); + return UserMapper.toDTO(newUser); + }); + + String jwtToken = jwtUtil.generateToken(user.getId(), user.getEmail()); + + response.sendRedirect(clientUrl + "/oauth-success?token=" + jwtToken); + }; + } + } diff --git a/server/src/main/java/com/example/podify/controller/AuthController.java b/server/src/main/java/com/example/podify/controller/AuthController.java index 7e1e197..b6ab52e 100644 --- a/server/src/main/java/com/example/podify/controller/AuthController.java +++ b/server/src/main/java/com/example/podify/controller/AuthController.java @@ -1,5 +1,73 @@ package com.example.podify.controller; +import com.example.podify.dto.AuthDTO.AuthResponseDTO; +import com.example.podify.dto.AuthDTO.LoginRequestDTO; +import com.example.podify.dto.AuthDTO.OAuthLoginRequestDTO; +import com.example.podify.dto.UserDTO; +import com.example.podify.mapper.UserMapper; +import com.example.podify.security.JwtUtil; +import com.example.podify.services.AuthService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseCookie; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + + +import java.util.UUID; + +@RestController +@RequestMapping("/api/auth") +@RequiredArgsConstructor public class AuthController { + @Value("${base.url}") + private String baseUrl; + + private final AuthService authService; + + private final JwtUtil jwtUtil; + + @PostMapping("/login") + public ResponseEntity login(@Valid @RequestBody LoginRequestDTO loginReq) { + + System.out.println("Login Request : " + loginReq); + + return authService.validateCredentials(loginReq).map(userDTO -> { + String token = jwtUtil.generateToken(userDTO.getId(), userDTO.getEmail()); + + ResponseCookie jwtCookie = ResponseCookie.from("accessToken", token) + .httpOnly(true) + .secure(true) + .sameSite("Strict") + .maxAge(3600) + .build(); + + return ResponseEntity.ok() + .header(HttpHeaders.SET_COOKIE, jwtCookie.toString()) + .body(UserMapper.toAuthResponse(userDTO, token)); + }).orElse( + ResponseEntity.status(401).body(new AuthResponseDTO(null, null, null, "Invalid Credentials")) + ); + } + + @PostMapping("/oauth-login") + public ResponseEntity oAuthLogin(@Valid @RequestBody OAuthLoginRequestDTO oAuthLoginReq) { + UserDTO user = authService.findByEmail(oAuthLoginReq.getEmail()) + .orElseGet(() -> + authService.createOAuthUser(oAuthLoginReq) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()).getBody()); + + if(user == null) + return ResponseEntity.status(500).body(new AuthResponseDTO(null, null, null, "Unable to create or retrieve oAuth user")); + + // Generate spring jwt + String token = jwtUtil.generateToken(user.getId(), oAuthLoginReq.getEmail()); + + return ResponseEntity.ok(UserMapper.toAuthResponse(user, token)); + } + } diff --git a/server/src/main/java/com/example/podify/dto/AuthDTO/AuthResponseDTO.java b/server/src/main/java/com/example/podify/dto/AuthDTO/AuthResponseDTO.java new file mode 100644 index 0000000..3545eae --- /dev/null +++ b/server/src/main/java/com/example/podify/dto/AuthDTO/AuthResponseDTO.java @@ -0,0 +1,15 @@ +package com.example.podify.dto.AuthDTO; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.UUID; + +@Data +@AllArgsConstructor +public class AuthResponseDTO { + public UUID id; + public String email; + public String accessToken; + public String error; +} diff --git a/server/src/main/java/com/example/podify/dto/AuthDTO/LoginRequestDTO.java b/server/src/main/java/com/example/podify/dto/AuthDTO/LoginRequestDTO.java new file mode 100644 index 0000000..8c98ba8 --- /dev/null +++ b/server/src/main/java/com/example/podify/dto/AuthDTO/LoginRequestDTO.java @@ -0,0 +1,16 @@ +package com.example.podify.dto.AuthDTO; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class LoginRequestDTO { + @Email + @NotBlank + public String email; + + @NotBlank + public String password; +} diff --git a/server/src/main/java/com/example/podify/dto/AuthDTO/OAuthLoginRequestDTO.java b/server/src/main/java/com/example/podify/dto/AuthDTO/OAuthLoginRequestDTO.java new file mode 100644 index 0000000..0e519c7 --- /dev/null +++ b/server/src/main/java/com/example/podify/dto/AuthDTO/OAuthLoginRequestDTO.java @@ -0,0 +1,17 @@ +package com.example.podify.dto.AuthDTO; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class OAuthLoginRequestDTO { + @Email + private String email; + + @NotBlank + private String provider; + + @NotBlank + private String providerId; +} diff --git a/server/src/main/java/com/example/podify/dto/User.java b/server/src/main/java/com/example/podify/dto/User.java deleted file mode 100644 index 335bd55..0000000 --- a/server/src/main/java/com/example/podify/dto/User.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.podify.dto; - -public class User { -} diff --git a/server/src/main/java/com/example/podify/dto/UserDTO.java b/server/src/main/java/com/example/podify/dto/UserDTO.java new file mode 100644 index 0000000..1a3260c --- /dev/null +++ b/server/src/main/java/com/example/podify/dto/UserDTO.java @@ -0,0 +1,18 @@ +package com.example.podify.dto; + +import com.example.podify.dto.AuthDTO.AuthResponseDTO; +import lombok.*; +import org.springframework.http.ResponseEntity; + +import java.util.UUID; + +@Data +@AllArgsConstructor +@RequiredArgsConstructor +@Builder +public class UserDTO { + private UUID id; + private String email; + private String role; + private String accessToken; +} diff --git a/server/src/main/java/com/example/podify/mapper/UserMapper.java b/server/src/main/java/com/example/podify/mapper/UserMapper.java index 689d06e..a7d271e 100644 --- a/server/src/main/java/com/example/podify/mapper/UserMapper.java +++ b/server/src/main/java/com/example/podify/mapper/UserMapper.java @@ -1,4 +1,33 @@ package com.example.podify.mapper; +import com.example.podify.dto.AuthDTO.AuthResponseDTO; +import com.example.podify.dto.AuthDTO.OAuthLoginRequestDTO; +import com.example.podify.dto.UserDTO; +import com.example.podify.model.User; + public class UserMapper { + public static AuthResponseDTO toAuthResponse(UserDTO user, String token) { + return new AuthResponseDTO( + user.getId(), + user.getEmail(), + token, + null + ); + } + + public static UserDTO toDTO(User user) { + return UserDTO.builder() + .id(user.getId()) + .email(user.getEmail()) + .role(user.getRole()) + .build(); + } + + public static User toEntity(UserDTO userDTO) { + return User.builder() + .id(userDTO.getId()) + .email(userDTO.getEmail()) + .role(userDTO.getRole()) + .build(); + } } diff --git a/server/src/main/java/com/example/podify/model/Topics.java b/server/src/main/java/com/example/podify/model/Topics.java new file mode 100644 index 0000000..21e999f --- /dev/null +++ b/server/src/main/java/com/example/podify/model/Topics.java @@ -0,0 +1,4 @@ +package com.example.podify.model; + +public class Topics { +} diff --git a/server/src/main/java/com/example/podify/model/User.java b/server/src/main/java/com/example/podify/model/User.java index b7f9bfc..da81b29 100644 --- a/server/src/main/java/com/example/podify/model/User.java +++ b/server/src/main/java/com/example/podify/model/User.java @@ -1,4 +1,26 @@ package com.example.podify.model; -public class User { +import com.example.podify.model.superclass.Auditable; +import jakarta.persistence.*; +import lombok.*; + +import java.util.UUID; + +@Entity +@Table(name = "users") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class User extends Auditable { + @Id + @GeneratedValue + private UUID id; + + @Column(unique = true, nullable = false) + private String email; + + private String password; // nullable if oAuth only + + private String role = "USER"; } diff --git a/server/src/main/java/com/example/podify/model/superclass/Auditable.java b/server/src/main/java/com/example/podify/model/superclass/Auditable.java new file mode 100644 index 0000000..ef63bb7 --- /dev/null +++ b/server/src/main/java/com/example/podify/model/superclass/Auditable.java @@ -0,0 +1,28 @@ +package com.example.podify.model.superclass; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; + +import java.time.LocalDateTime; + +@MappedSuperclass +public abstract class Auditable { + @Column(name = "created_at", nullable = false, updatable = false) + private LocalDateTime createdAt; + + @Column(name = "updated_at", nullable = false) + private LocalDateTime updatedAt; + + @PrePersist + protected void onCreate() { + createdAt = LocalDateTime.now(); + updatedAt = LocalDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + updatedAt = LocalDateTime.now(); + } +} diff --git a/server/src/main/java/com/example/podify/repository/UserRepository.java b/server/src/main/java/com/example/podify/repository/UserRepository.java index 560792f..0c114e4 100644 --- a/server/src/main/java/com/example/podify/repository/UserRepository.java +++ b/server/src/main/java/com/example/podify/repository/UserRepository.java @@ -1,4 +1,13 @@ package com.example.podify.repository; -public class UserRepository { +import com.example.podify.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface UserRepository extends JpaRepository { + Optional findByEmail(String email); } diff --git a/server/src/main/java/com/example/podify/security/JwtFilter.java b/server/src/main/java/com/example/podify/security/JwtFilter.java new file mode 100644 index 0000000..5d09e41 --- /dev/null +++ b/server/src/main/java/com/example/podify/security/JwtFilter.java @@ -0,0 +1,42 @@ +package com.example.podify.security; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.Collections; + +@Component +@RequiredArgsConstructor +public class JwtFilter extends OncePerRequestFilter { + private final JwtUtil jwtUtil; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String header = request.getHeader("Authorization"); + + if(header != null && header.startsWith("Bearer ")) { + String token = header.substring(7); + + try { + String email = jwtUtil.getEmailFromToken(token); + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(email, null, Collections.emptyList()); + SecurityContextHolder.getContext().setAuthentication(auth); + } catch (Exception e) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return; + } + } + + filterChain.doFilter(request, response); + } + + +} diff --git a/server/src/main/java/com/example/podify/security/JwtUtil.java b/server/src/main/java/com/example/podify/security/JwtUtil.java new file mode 100644 index 0000000..a658e61 --- /dev/null +++ b/server/src/main/java/com/example/podify/security/JwtUtil.java @@ -0,0 +1,54 @@ +package com.example.podify.security; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.Date; +import java.util.UUID; + +@Component +@RequiredArgsConstructor +public class JwtUtil { + @Value("${next.auth.secret}") + private String SECRET; + + + private Key getSigningKey() { + return Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8)); + } + + public String generateToken(UUID id, String email) { + long EXPIRATION = 1000L * 60 * 60 * 24 * 7; + + return Jwts.builder() // This builder lets you set the payload (data), headers, and signature. + .setSubject(String.valueOf(id)) // subject to uniquely identify the user i.e. id + .claim("email", email) // adds a custom claims into the JWT payload + .setIssuedAt(new Date()) // token created + .setExpiration(new Date(System.currentTimeMillis()+ EXPIRATION)) // token expired + .signWith(getSigningKey(), SignatureAlgorithm.HS256) // signs the jwt with a secret key using HMAC SHA-256 + .compact(); + } + + public Claims validateToken(String token) { + return Jwts.parserBuilder() + .setSigningKey(getSigningKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } + + public String getEmailFromToken(String token) { + Claims claims = validateToken(token); + return claims.get("email", String.class); + } + + + +} diff --git a/server/src/main/java/com/example/podify/security/jwtFilter.java b/server/src/main/java/com/example/podify/security/jwtFilter.java deleted file mode 100644 index 4106609..0000000 --- a/server/src/main/java/com/example/podify/security/jwtFilter.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.podify.security; - -public class jwtFilter { -} diff --git a/server/src/main/java/com/example/podify/security/jwtUtil.java b/server/src/main/java/com/example/podify/security/jwtUtil.java deleted file mode 100644 index d581884..0000000 --- a/server/src/main/java/com/example/podify/security/jwtUtil.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.podify.security; - -public class jwtUtil { -} diff --git a/server/src/main/java/com/example/podify/services/AuthService.java b/server/src/main/java/com/example/podify/services/AuthService.java new file mode 100644 index 0000000..63da5ca --- /dev/null +++ b/server/src/main/java/com/example/podify/services/AuthService.java @@ -0,0 +1,17 @@ +package com.example.podify.services; + +import com.example.podify.dto.AuthDTO.LoginRequestDTO; +import com.example.podify.dto.AuthDTO.OAuthLoginRequestDTO; +import com.example.podify.dto.UserDTO; + +import java.util.Optional; + +public interface AuthService { + public void save(UserDTO user); + + Optional findByEmail(String email); + + public Optional createOAuthUser(OAuthLoginRequestDTO oAuthUser); + + public Optional validateCredentials(LoginRequestDTO credUser); +} diff --git a/server/src/main/java/com/example/podify/services/Signable.java b/server/src/main/java/com/example/podify/services/Signable.java new file mode 100644 index 0000000..e518d69 --- /dev/null +++ b/server/src/main/java/com/example/podify/services/Signable.java @@ -0,0 +1,17 @@ +package com.example.podify.services; + +import com.example.podify.model.User; +import com.example.podify.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.context.SecurityContextHolder; + +@RequiredArgsConstructor +public abstract class Signable { + protected final UserRepository userRepository; + + protected User getLoggedInUser() { + String email = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + + return userRepository.findByEmail(email).orElseThrow(() -> new RuntimeException("User does not exists")); + } +} diff --git a/server/src/main/java/com/example/podify/services/impl/AuthServiceImpl.java b/server/src/main/java/com/example/podify/services/impl/AuthServiceImpl.java new file mode 100644 index 0000000..0df6d06 --- /dev/null +++ b/server/src/main/java/com/example/podify/services/impl/AuthServiceImpl.java @@ -0,0 +1,67 @@ +package com.example.podify.services.impl; + +import com.example.podify.dto.AuthDTO.LoginRequestDTO; +import com.example.podify.dto.AuthDTO.OAuthLoginRequestDTO; +import com.example.podify.dto.UserDTO; +import com.example.podify.mapper.UserMapper; +import com.example.podify.model.User; +import com.example.podify.repository.UserRepository; +import com.example.podify.services.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class AuthServiceImpl implements AuthService { + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + @Override + public void save(UserDTO userDTO) { + User user = UserMapper.toEntity(userDTO); + userRepository.save(user); + } + + @Override + public Optional findByEmail(String email) { + return userRepository.findByEmail(email).map(UserMapper::toDTO); + } + + @Transactional + @Override + public Optional createOAuthUser(OAuthLoginRequestDTO oAuthUser) { + User user = User.builder() + .email(oAuthUser.getEmail()) + .password(null) // no password for oAuth + .build(); + + User savedUser = userRepository.save(user); + System.out.println("Saved oAuth user: " + savedUser); + + return Optional.of(UserMapper.toDTO(user)); + } + + @Transactional + @Override + public Optional validateCredentials(LoginRequestDTO credUser) { + Optional userOpt = userRepository.findByEmail(credUser.email); + if(userOpt.isPresent()) { + User user = userOpt.get(); + if(user.getPassword() != null && passwordEncoder.matches(credUser.password, user.getPassword())) { + return Optional.of(UserMapper.toDTO(user)); + } else { + return Optional.empty(); + } + } else { + User newUser = new User(); + newUser.setEmail(credUser.getEmail()); + newUser.setPassword(passwordEncoder.encode(credUser.getPassword())); + userRepository.save(newUser); + return Optional.of(UserMapper.toDTO(newUser)); + } + } +} From 5bc417e113b613a84d5b81809ed9b444a601f224 Mon Sep 17 00:00:00 2001 From: Sarthak Date: Wed, 3 Sep 2025 15:19:41 +0530 Subject: [PATCH 05/22] feat: add topic selection page with dashboard redirection --- client/app/auth/page.tsx | 93 +++--- client/app/home/page.tsx | 96 +----- client/app/topics/page.tsx | 202 +------------ client/component/AuthPage.tsx | 247 +++++++++++++++- client/component/HomePage.tsx | 100 +++++++ client/component/TopicPage.tsx | 276 ++++++++++++++++++ client/component/TopicsCard.tsx | 9 - client/lib/auth.ts | 12 +- client/lib/axios.ts | 4 +- client/lib/fetchWithToken.ts | 11 +- .../example/podify/config/SecurityConfig.java | 28 +- .../podify/controller/AuthController.java | 2 - .../podify/controller/TopicController.java | 44 +++ .../java/com/example/podify/dto/TopicDTO.java | 15 + .../example/podify/mapper/TopicMapper.java | 22 ++ .../java/com/example/podify/model/Topic.java | 29 ++ .../java/com/example/podify/model/Topics.java | 4 - .../java/com/example/podify/model/User.java | 11 +- .../podify/repository/TopicRepository.java | 14 + .../podify/repository/UserRepository.java | 1 + .../example/podify/services/AuthService.java | 6 +- .../example/podify/services/TopicService.java | 16 + .../podify/services/impl/AuthServiceImpl.java | 3 +- .../services/impl/TopicServiceImpl.java | 57 ++++ 24 files changed, 915 insertions(+), 387 deletions(-) create mode 100644 client/component/HomePage.tsx create mode 100644 client/component/TopicPage.tsx delete mode 100644 client/component/TopicsCard.tsx create mode 100644 server/src/main/java/com/example/podify/controller/TopicController.java create mode 100644 server/src/main/java/com/example/podify/dto/TopicDTO.java create mode 100644 server/src/main/java/com/example/podify/mapper/TopicMapper.java create mode 100644 server/src/main/java/com/example/podify/model/Topic.java delete mode 100644 server/src/main/java/com/example/podify/model/Topics.java create mode 100644 server/src/main/java/com/example/podify/repository/TopicRepository.java create mode 100644 server/src/main/java/com/example/podify/services/TopicService.java create mode 100644 server/src/main/java/com/example/podify/services/impl/TopicServiceImpl.java diff --git a/client/app/auth/page.tsx b/client/app/auth/page.tsx index 7fe80e9..69055a6 100644 --- a/client/app/auth/page.tsx +++ b/client/app/auth/page.tsx @@ -2,9 +2,9 @@ import { signIn } from "next-auth/react"; import { useState } from "react"; -import Image from "next/image"; import { useRouter } from "next/navigation"; import { Eye, EyeOff } from "lucide-react"; +import Image from "next/image"; export default function SignIn() { const [email, setEmail] = useState(""); @@ -18,45 +18,46 @@ export default function SignIn() { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - const handleCredentialsLogin = async ( - e: React.FormEvent + const handleLogin = async ( + provider: "credentials" | "google", + e?: React.FormEvent ) => { - e.preventDefault(); - - const emailValid = emailRegex.test(email); - const passwordValid = passwordRegex.test(password); - - setIsValidEmail(emailValid); - setIsValidPassword(passwordValid); - - if (!emailValid || !passwordValid) { - console.log("Form invalid"); - return; - } + if (e) e.preventDefault(); try { - const res = await signIn("credentials", { - email, - password, - redirect: true, - callbackUrl: "/topics", - }); - - console.log(res); - - - if (res?.error) { - console.log("Login failed : ", res.error); - } else { - router.push(res?.url || "/topics"); + if (provider === "credentials") { + const emailValid = emailRegex.test(email); + const passwordValid = passwordRegex.test(password); + + setIsValidEmail(emailValid); + setIsValidPassword(passwordValid); + + if (!emailValid || !passwordValid) { + console.log("Form invalid"); + return; + } + + const res = await signIn("credentials", { + email, + password, + redirect: false, // use router manually + }); + + if (res?.error) { + console.log("Login failed : ", res.error); + alert("Invalid email or password"); + } else { + router.push("/topics"); + } + } + + if (provider === "google") { + await signIn("google", { callbackUrl: "/topics" }); } } catch (error) { console.error("Auth error", error); - alert("Authentication Failed. Please check your credentials."); + alert("Authentication Failed. Please try again."); } - - // Proceed with form submission - console.log("Form submitted: ", { email, password }); }; return ( @@ -87,17 +88,14 @@ export default function SignIn() { {/* Tagline */}

-

- - Your Podcasts - {" "} - and - - {" "} - Your Topics - {" "} - - -
+ Your Podcasts{" "} + and + + {" "} + Your Topics + {" "} + - +
All in{" "} One Place

@@ -117,7 +115,7 @@ export default function SignIn() { {/* Google Login */}
{/* Credentials Form */} -
+ handleLogin("credentials", e)} + className="space-y-5" + >