diff --git a/.github/ISSUE_TEMPLATE/bug-template.md b/.github/ISSUE_TEMPLATE/bug-template.md
new file mode 100644
index 00000000..c8ff8e1d
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-template.md
@@ -0,0 +1,20 @@
+---
+name: Bug template
+about: 버그 픽스
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+## 어떤 기능인가요?
+
+> 추가하려는 기능에 대해 간결하게 설명해주세요
+
+## 작업 상세 내용
+
+- [ ] TODO
+- [ ] TODO
+- [ ] TODO
+
+## 참고할만한 자료(선택)
diff --git a/.github/ISSUE_TEMPLATE/feature-template.md b/.github/ISSUE_TEMPLATE/feature-template.md
new file mode 100644
index 00000000..0bc8d430
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-template.md
@@ -0,0 +1,20 @@
+---
+name: Feature template
+about: task 기능
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+## 어떤 기능인가요?
+
+> 추가하려는 기능에 대해 간결하게 설명해주세요
+
+## 작업 상세 내용
+
+- [ ] TODO
+- [ ] TODO
+- [ ] TODO
+
+## 참고할만한 자료(선택)
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000..c74c7aa7
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,15 @@
+## #️⃣연관된 이슈
+
+> ex) #이슈번호, #이슈번호
+
+## 📝작업 내용
+
+> 이번 PR에서 작업한 내용을 간략히 설명해주세요(이미지 첨부 가능)
+
+### 스크린샷 (선택)
+
+## 💬리뷰 요구사항(선택)
+
+> 리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
+>
+> ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?
\ No newline at end of file
diff --git a/.github/workflows/be-cd.yml b/.github/workflows/be-cd.yml
new file mode 100644
index 00000000..6e5c2970
--- /dev/null
+++ b/.github/workflows/be-cd.yml
@@ -0,0 +1,57 @@
+name: froxy BE Continuous Delivery
+
+on:
+ push:
+ branches:
+ - deploy
+
+jobs:
+ be-cd:
+ runs-on: ubuntu-20.04 # 빌드가 진행될 환경 설정
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Setup Docker Buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }} # DockerHub 사용자 이름
+ password: ${{ secrets.DOCKER_PASSWORD }} # DockerHub 비밀번호
+
+ #이미지 이름 저장
+ - name: Set Docker image tag as a variable
+ run: echo "DOCKER_TAG=${{ secrets.DOCKER_USERNAME }}/froxy-server:latest" >> $GITHUB_ENV
+
+ - name: Create .env file
+ run: |
+ echo "${{ secrets.BE_ENV }}" > ./apps/backend/.env
+
+ - name: Build Docker image
+ run: |
+ docker build -t $DOCKER_TAG .
+
+ - name: Push Docker image to Docker Hub
+ run: |
+ docker push $DOCKER_TAG
+
+ - name: Setup SSH
+ uses: webfactory/ssh-agent@v0.5.3
+ with:
+ ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
+
+ - name: Deploy
+ run: |
+ ssh -o StrictHostKeyChecking=no mun@211.188.48.24 "
+ if [ \$(docker ps -a -q -f name=froxy-container) ]; then
+ docker stop froxy-container
+ docker rm froxy-container
+ fi
+ docker pull ${{ secrets.DOCKER_USERNAME }}/froxy-server:latest && \
+ docker run --network host -d --name froxy-container -v /var/run/docker.sock:/var/run/docker.sock ${{ secrets.DOCKER_USERNAME }}/froxy-server:latest
+ docker image prune -f
+ "
+
diff --git a/.github/workflows/be-ci.yml b/.github/workflows/be-ci.yml
new file mode 100644
index 00000000..297c12cf
--- /dev/null
+++ b/.github/workflows/be-ci.yml
@@ -0,0 +1,49 @@
+name: Froxy-BE Continuous Integration
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ be-ci:
+ runs-on: ubuntu-20.04
+ if: contains(github.event.pull_request.labels.*.name, '💻 Be')
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: 9
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '20' # 적절한 Node.js 버전으로 설정
+ cache: 'pnpm' # pnpm 캐싱 활성화
+
+ - name: Create .env file
+ run: |
+ echo "${{ secrets.BE_ENV }}" > ./apps/backend/.env
+
+ - name: Install dependencies #라이브러리설치
+ run: |
+ pnpm install --no-frozen-lockfile
+
+ - name: Run lint & Turbo build
+ run: |
+ pnpm lint --filter=backend
+ pnpm turbo run build --filter=backend
+ #FE CI : pnpm turbo run build --filter=frontend
+ #전역 CI : pnpm turbo run build
+
+ #테스트코드 빌드는 테스트코드를 추가할때 사용
+ #- name: Run Turbo tests
+ # run: |
+ # pnpm turbo run test --filter=be
diff --git a/.github/workflows/fe-cd.yml b/.github/workflows/fe-cd.yml
new file mode 100644
index 00000000..6c88dd99
--- /dev/null
+++ b/.github/workflows/fe-cd.yml
@@ -0,0 +1,50 @@
+name: Froxy-FE Continuous Integration
+
+on:
+ push:
+ branches:
+ - deploy
+
+jobs:
+ fe-cd:
+ runs-on: ubuntu-20.04
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: 9
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '20' # 적절한 Node.js 버전으로 설정
+ cache: 'pnpm' # pnpm 캐싱 활성화
+
+ - name: Create .env file
+ run: |
+ echo "${{ secrets.FE_ENV }}" > apps/frontend/.env
+
+ - name: Install dependencies #라이브러리설치
+ run: |
+ pnpm install --no-frozen-lockfile
+
+ - name: Run lint & Turbo build
+ run: |
+ pnpm lint --filter=frontend
+ pnpm turbo run build --filter=frontend
+
+ - name: Upload to Object Storage
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.NCP_ACCESS_NAME }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.NCP_ACCESS_SECRET }}
+ AWS_DEFAULT_REGION: 'kr-standard' # 리전 설정
+ run: |
+ # AWS CLI 설치 확인 및 설정
+ sudo apt-get update && sudo apt-get install -y awscli
+
+ # 빌드된 정적 파일을 오브젝트 스토리지로 업로드
+ aws s3 sync ./apps/frontend/dist s3://froxy-fe --endpoint-url=https://kr.object.ncloudstorage.com --acl public-read
diff --git a/.github/workflows/fe-ci.yml b/.github/workflows/fe-ci.yml
new file mode 100644
index 00000000..46c88dbb
--- /dev/null
+++ b/.github/workflows/fe-ci.yml
@@ -0,0 +1,42 @@
+name: Froxy-CI Continuous Integration
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ fe-ci:
+ runs-on: ubuntu-20.04
+ if: contains(github.event.pull_request.labels.*.name, '💻 Fe')
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: 9
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '20' # 적절한 Node.js 버전으로 설정
+ cache: 'pnpm' # pnpm 캐싱 활성화
+
+ - name: Create .env file
+ run: |
+ echo "${{ secrets.FE_ENV }}" > apps/frontend/.env
+
+ - name: Install dependencies #라이브러리설치
+ run: |
+ pnpm install --no-frozen-lockfile
+
+ - name: Run lint & Turbo build
+ run: |
+ pnpm lint --filter=frontend
+ pnpm turbo run build --filter=frontend
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..da035b4d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,43 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# Dependencies
+node_modules
+.pnp
+.pnp.js
+
+# Local env files
+.server.env
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# Testing
+coverage
+
+# Turbo
+.turbo
+
+# Vercel
+.vercel
+
+# Build Outputs
+.next/
+out/
+build
+dist
+
+
+# Debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Misc
+.DS_Store
+*.pem
+
+
+#docker
+mysql-data/*
\ No newline at end of file
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100644
index 00000000..7f460e1c
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+# 브랜치 이름과 커밋 메시지 파일 가져오기
+BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
+COMMIT_FILE=$1
+
+# 브랜치 이름에서 커밋 번호 추출
+if [[ $BRANCH_NAME =~ [Ff]eature-#([0-9]+) ]]; then
+ COMMIT_NUMBER=${BASH_REMATCH[1]}
+
+ # 기존 커밋 메시지 불러오기
+ MESSAGE=$(cat "$COMMIT_FILE")
+
+ # 커밋 메시지에서 타입과 나머지 내용 추출 (예: Chore: 환경설정)
+ if [[ $MESSAGE =~ ^([A-Za-z]+):\s*(.*)$ ]]; then
+ COMMIT_TYPE=${BASH_REMATCH[1]}
+ COMMIT_CONTENT=${BASH_REMATCH[2]}
+
+ # 커밋 번호가 메시지에 없는 경우 추가
+ if [[ ! $COMMIT_CONTENT =~ \(#$COMMIT_NUMBER\) ]]; then
+ echo "$COMMIT_TYPE(#$COMMIT_NUMBER): $COMMIT_CONTENT" > "$COMMIT_FILE"
+ fi
+ fi
+fi
+
+# 커밋 메시지 유효성 검사
+npx --no-install commitlint --edit "$1"
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000..d0a77842
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1 @@
+npx lint-staged
\ No newline at end of file
diff --git a/.husky/pre-push b/.husky/pre-push
new file mode 100644
index 00000000..d0a77842
--- /dev/null
+++ b/.husky/pre-push
@@ -0,0 +1 @@
+npx lint-staged
\ No newline at end of file
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 00000000..e69de29b
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..2c886e57
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,10 @@
+{
+ "singleQuote": true,
+ "trailingComma": "none",
+ "semi": true,
+ "tabWidth": 2,
+ "printWidth": 120,
+ "arrowParens": "always",
+ "bracketSpacing": true,
+ "endOfLine": "auto"
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..50630c3a
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,10 @@
+{
+ "eslint.workingDirectories": [
+ {
+ "mode": "auto"
+ }
+ ],
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": "always"
+ }
+}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..6a93de80
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,18 @@
+FROM node:20
+
+WORKDIR /app
+
+COPY package*.json ./
+RUN npm install -g pnpm
+
+COPY . .
+
+RUN pnpm install
+
+RUN pnpm lint --filter=backend && pnpm turbo run build --filter=backend
+
+WORKDIR /app/apps/backend
+CMD ["pnpm", "run", "start:prod"]
+
+# 외부에서 접근할 수 있도록 포트 노출
+EXPOSE 3000
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..d76dec85
--- /dev/null
+++ b/README.md
@@ -0,0 +1,331 @@
+
+
+
Froxy
+
+
+
+
빠르고 간편하게 코드를 실행하세요 🐸
+
+
+
+> Froxy는 개구리를 뜻하는 ‘Frog’와 ‘Proxy’의 합성어로, 사용자가 직접 코드를 실행하지 않고도 결과를 빠르게 확인할 수 있는 서비스입니다. 🐸💻
+>
+> Gist에서 코드를 복제하고 실행 환경을 설정하는 번거로움 없이, Froxy와 함께라면 폴짝! 뛰어넘어 간편하게 코드를 실행하고 결과를 확인할 수 있습니다. 다양한 기능을 통해 코드를 테스트하고 실행 결과를 즉시 확인해 보세요!
+
+
+
+
+
+
+
+[팀 노션](https://freckle-calliandra-79a.notion.site/Team38-F-Rog-12d9038c617380509fbdf4eb928e4238)
+|
+[팀 피그마](https://camo.githubusercontent.com/8a61ef97622df78c36d2ac0c400be9d154e0a756137e6752117de9bc1a78660a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4669676d612d4632344531453f7374796c653d666f722d7468652d6261646765266c6f676f3d6669676d61266c6f676f436f6c6f723d7768697465)
+|
+[팀 피그잼](https://www.figma.com/board/NYv2EBl18ZcY9sxcYuqn9M/%ED%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B3%B4%EB%93%9C!?node-id=0-1&node-type=canvas&t=USILPXIX2R8atRyd-0)
+|
+[개발 위키](https://freckle-calliandra-79a.notion.site/12d9038c6173807297b4d21e68b642c8)
+
+
+
+
+
목차
+
+- [주제 선정 동기](https://github.com/boostcampwm-2024/web38-Froxy#%EF%B8%8F-%EC%A3%BC%EC%A0%9C-%EC%84%A0%EC%A0%95-%EB%8F%99%EA%B8%B0)
+- [주요 기능](https://github.com/boostcampwm-2024/web38-Froxy#%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5)
+ - [Gist 코드를 빠르게 게시하기](https://github.com/boostcampwm-2024/web38-Froxy#gist-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EA%B2%8C%EC%8B%9C%ED%95%98%EA%B8%B0)
+ - [다른 사람의 Gist 확인하기](https://github.com/boostcampwm-2024/web38-Froxy#%EB%8B%A4%EB%A5%B8-%EC%82%AC%EB%9E%8C%EC%9D%98-gist-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0)
+ - [Gist 코드를 빠르게 실행하기](https://github.com/boostcampwm-2024/web38-Froxy#gist-%EC%BD%94%EB%93%9C%EB%A5%BC-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0)
+- [FE 기술적 도전](https://github.com/boostcampwm-2024/web38-Froxy#fe-%EA%B8%B0%EC%88%A0%EC%A0%81-%EB%8F%84%EC%A0%84)
+
+ - [QueryKey Factory로 QueryKey 구조화 하기](https://github.com/boostcampwm-2024/web38-Froxy#querykey-factory%EB%A1%9C-querykey-%EA%B5%AC%EC%A1%B0%ED%99%94-%ED%95%98%EA%B8%B0)
+ - [계층화와 도메인 모델](https://github.com/boostcampwm-2024/web38-Froxy#%EA%B3%84%EC%B8%B5%ED%99%94%EC%99%80-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%AA%A8%EB%8D%B8)
+ - [MSW로 개발 효율화하기](https://github.com/boostcampwm-2024/web38-Froxy#msw%EB%A1%9C-%EA%B0%9C%EB%B0%9C-%ED%9A%A8%EC%9C%A8%ED%99%94%ED%95%98%EA%B8%B0)
+ - [Suspense, ErrorBoundary로 Fallback 구현하기](https://github.com/boostcampwm-2024/web38-Froxy#suspense-errorboundary%EB%A1%9C-fallback-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0)
+
+- [BE 기술적 도전](https://github.com/boostcampwm-2024/web38-Froxy#be-%EA%B8%B0%EC%88%A0%EC%A0%81-%EB%8F%84%EC%A0%84)
+
+ - [docker를 이용한 코드 실행](https://github.com/boostcampwm-2024/web38-Froxy#docker%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BD%94%EB%93%9C-%EC%8B%A4%ED%96%89)
+ - [queue & pool을 이용한 스케줄링](https://github.com/boostcampwm-2024/web38-Froxy#queue--pool%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81)
+ - [Octokit 클라이언트 대신 직접 Gist API 모듈화](https://github.com/boostcampwm-2024/web38-Froxy#octokit-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EB%8C%80%EC%8B%A0-%EC%A7%81%EC%A0%91-gist-api-%EB%AA%A8%EB%93%88%ED%99%94)
+ - [TypeORM을 통한 다대다 테이블 관리](https://github.com/boostcampwm-2024/web38-Froxy#typeorm%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%8B%A4%EB%8C%80%EB%8B%A4-%ED%85%8C%EC%9D%B4%EB%B8%94-%EA%B4%80%EB%A6%AC)
+
+- [기술 스택](https://github.com/boostcampwm-2024/web38-Froxy#%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D)
+- [프로젝트 아키텍처](https://github.com/boostcampwm-2024/web38-Froxy#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98)
+- [프로젝트 Flow](https://github.com/boostcampwm-2024/web38-Froxy#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-flow)
+- [팀원](https://github.com/boostcampwm-2024/web38-Froxy#-%ED%8C%80%EC%9B%90)
+
+
+
+## ⭐️ 주제 선정 동기
+
+부스트캠프 챌린지 과정에서는 매일 도전 과제를 수행하며, 동시에 그룹원들의 과제를 Gist를 통해 확인하고 피드백하는 시간을 가집니다.
+
+이 과정에서 캠퍼들은 Gist 경로를 찾아 로컬 환경에 클론(clone)한 뒤 실행하는 일련의 과정을 반복하게 되며, 특히 익숙하지 않은 도구를 사용하면서 이를 수행할 때 여러 가지 개발 환경 문제를 겪게 됩니다.
+
+Froxy는 이러한 반복적인 코드 확인과 실행 과정을 보다 간편하고 효율적으로 지원하기 위해 만들었습니다. Froxy는 캠퍼들이 실행 환경에서 발생하는 문제를 줄이고, 코드 리뷰와 피드백에 더 집중할 수 있는 환경을 제공합니다. 이를 통해 캠퍼들이 과제 수행과 코드 리뷰에 있어 생산성을 높이고, 학습 과정에 더 몰입할 수 있도록 돕는 것이 Froxy의 목표입니다.
+
+
+
+
+
+ 검색하기 어려운 표
+
+
+
+ 그룹원을 태그나 제목으로 검색
+
+
+
+
+## 🐸 주요 기능
+
+### Gist 코드를 빠르게 게시하기
+
+> 사용자의 Gist 코드를 쉽고 빠르게 게시할 수 있게 만들었습니다.
+
+![생성](https://github.com/user-attachments/assets/deee5eb7-d79b-46fd-8f20-f3ab823f55ba)
+
+### 다른 사람의 Gist 확인하기
+
+> 다른 캠퍼가 올린 Gist를 빠르게 찾을 수 있습니다.
+
+![목록](https://github.com/user-attachments/assets/90b33f0b-4ee5-481e-bfd7-2c0819d9be4d)
+
+### Gist 코드를 빠르게 실행하기
+
+> 코드의 입력값 제공해 빠르게 실행할 수 있습니다.
+
+![실행](https://github.com/user-attachments/assets/4b09df35-2d04-4976-bf82-d282e4a7a794)
+
+## 🧑🏻💻 FE 기술적 도전
+
+Froxy의 프론트엔드에서는 서버 데이터를 효과적으로 UI로 전달하는 것이 핵심 과제였습니다. 이를 위해 아래와 같은 기술적 도전에 집중했습니다.
+
+### QueryKey Factory로 QueryKey 구조화 하기
+
+> [Effective QueryKey](https://github.com/boostcampwm-2024/web38-Froxy/wiki/%5B%EB%AF%BC%EC%9A%B0%5DEffective-Query-Key)
+
+- Tanstack Query를 사용해 서버상태를 관리하고 있었기 때문에 각 도메인마다 **구조화된 QueryKey가** 필요했습니다.
+- 이를 위해, API 계층에서 사용하는 fetch 함수를 인자로 받아 **QueryKey와 QueryFunction을 함께 동적으로 생성하는 QueryKey Factory를 구현**했습니다.
+- 이를 통해 프론트 코드 전역에서 **구조화된 QueryOption들을 선언적으로 재사용**할 수 있었습니다.
+
+### 계층화와 도메인 모델
+
+> [나도 써 본 잘알려진 UI 패턴(프론트엔드 계층화, 도메인 모델 객체 활용)]()
+
+- 프론트엔드 코드의 유지보수성을 높이기 위해 계층화된 아키텍처를 도입했습니다.
+- 각각의 계층(API, Query, Hook, UI)를 통해 추가 요구사항이 생겼을 때 필요한 코드를 **계층으로 분리해 독립적으로 개발**할 수 있었습니다.
+- 또한 **도메인 모델**을 설계해 각각에 도메인에 필요한 **비즈니스 로직을 캡슐화**해 UI에서 불필요한 비즈니스 로직을 선언하지 않고 UI로직만 관리할 수 있도록 했습니다.
+
+```mermaid
+sequenceDiagram
+ participant UI
+ participant Hooks
+ participant Query
+ participant API
+
+ UI->>Hooks: useCustomHook 호출
+ Hooks->>Query: 데이터 쿼리 요청 (fetch or mutate)
+ alt Cache HIT
+ Query->>Query: 캐시 데이터 반환
+ Query-->>Hooks: 도메인 Model과 쿼리 옵션 전달
+ else Cache MISS
+ Query->>API: HTTP 요청 전송 (Axios, fetch 등)
+ API-->>Query: 응답 데이터 반환 후 Model로 래핑
+ Query-->>Hooks: 도메인 Model과 쿼리 옵션 전달
+ end
+ Hooks-->>UI: 도메인 Model과 상태 전달
+ UI->>UI: UI 업데이트
+```
+
+### MSW로 개발 효율화하기
+
+> [MSW로 개발 효율화하기](https://github.com/boostcampwm-2024/web38-Froxy/wiki/MSW)
+
+- **MSW**를 이용해서 백엔드의 API 개발이 완료되지 않은 상태에서 **API 호출과 관련된 시나리오를 테스트**할 수 있었습니다.
+- MockRepository를 이용해 요청 조건에 따라 데이터를 **동적으로 응답**하도록 구현했습니다.
+- 이를 통해 인증이 필요한 요청에 대한 로직이나 tanstack query를 미리 적용해보고 테스트해볼 수 있어서 나중에 실제 API를 연결할 때 빠르게 진행할 수 있었습니다.
+
+### Suspense, ErrorBoundary로 Fallback 구현하기
+
+> [Suspense, ErrorBoundary로 Fallback 구현하기](https://github.com/boostcampwm-2024/web38-Froxy/wiki/Suspense+ErrorBoundary)
+
+
+
+
+
+
+
+ 로딩 시 Fallback UI
+
+
+
+
+ 에러 시 Fallback UI
+
+
+
+
+
+- 리액트를 선언적으로 사용하기 위해서 **로딩 상태는 Suspense**가, **에러 상태는 ErrorBoundary**가 관리하도록 역할을 분리하고자 했습니다.
+- Layout Shift 문제 방지와 사용자 경험 개선을 위해서 **Skeleton UI**를 사용해서 로딩 시 fallback UI를 구현했습니다.
+- ErrorBoundary와 tanstack query의 **useQueryErrorResetBoundary()** 훅을 이용해서 오류 발생 시 **재시도**가 가능하도록 에러 fallback UI를 구현했습니다.
+
+## 🧑🏻💻 BE 기술적 도전
+
+### docker를 이용한 코드 실행
+
+> [dockerode를 이용한 컨테이너 관리](https://github.com/boostcampwm-2024/web38-Froxy/wiki/Dockerode%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%82%AC%EC%9A%A9)
+
+- 쉘을 이용한 방법보다는 nest에서 직접 docker를 관리하고자 했습니다.
+- git clone, image build보다 빠른 속도를 위해 컨테이너에 직접 파일을 parsing, 삽입하도록 구현했습니다.
+- 컨테이너와 소켓을 통해 입출력 결과를 반환할 수 있습니다.
+
+### queue & pool을 이용한 스케줄링
+
+> [Redis-queue를 이용한 컨테이너 스케줄링](https://github.com/boostcampwm-2024/web38-Froxy/wiki/redis%E2%80%90queue%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81)
+
+- queue를 이용해 요청이 순차적으로 처리되도록 했습니다.
+- container pool을 직접 관리하여 리소스 사용률을 감소시켰습니다.
+
+```mermaid
+graph LR
+ API[API 요청] -->|요청 추가| RedisQueue[Redis Queue]
+ RedisQueue -->|작업 요청| DockerService[Docker 서비스]
+
+ DockerService -->|컨테이너 요청| Pool[컨테이너 Pool]
+ Pool -->|할당된 컨테이너| Container[컨테이너]
+ Container -->|작업 실행| Task[js 실행]
+ Task -->|결과 반환| Container
+ Container -->|컨테이너 반납| Pool
+ Container -->|작업 결과| Response[API 응답]
+ DockerService -->|결과 반환| RedisQueue
+
+
+```
+
+### Octokit 클라이언트 대신 직접 Gist API 모듈화
+
+> [사용자 지정 Gist API 파싱 모듈](https://github.com/boostcampwm-2024/web38-Froxy/wiki/%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A7%80%EC%A0%95-gist-api-%ED%8C%8C%EC%8B%B1-%EB%AA%A8%EB%93%88)
+
+- GitHub 공식 client Octokit 모듈 사용이 nest와의 호환성 문제로 인하여 REST API를 통해 모듈을 직접 구현했습니다.
+- 이때 type-safe한 환경을 만들기 위해서 응답과 요청에 대한 type 추론이 가능하도록 설계했습니다.
+- 이는TypeScript의 장점을 최대한 활용할 수 있도록 dto로 파싱하여 응답을 필터링하고 유효성 검사를 할 수 있게 되었습니다.
+
+### TypeORM을 통한 다대다 테이블 관리
+
+> [typeORM 다대다 테이블 트러블 슈팅](https://github.com/boostcampwm-2024/web38-Froxy/wiki/typeORM-%EB%8B%A4%EB%8C%80%EB%8B%A4-%EC%86%8D%EC%84%B1-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8A%B8%EB%9F%AC%EB%B8%94-%EC%8A%88%ED%8C%85)
+
+- update 함수를 쓰는 과정에서 **다대다 관계**의 데이터는 관계 테이블을 통해 연결되기 때문에, 직접 필드로 접근해 조건을 걸 수 없는 문제를 발견했습니다.
+- 다대다 관계를 사용하는 repository에서 update 사용 시, 쉽게 보이는 오류이며 save로 임시로 오류를 막았으나 find 및 save로 인한 원자성 해침을 막기 위한 방침이 필요했습니다.
+- 또한 tag 미사용 시 데이터를 자동으로 삭제하는 기능을 위해서, tag-lotus relation 테이블을 추가하여 one-many 관계로 분리하였습니다.
+
+## 🔧 기술 스택
+
+
+
+## 🔧 프로젝트 아키텍처
+
+![image](https://github.com/user-attachments/assets/3b99d8b7-84e7-4555-a397-25757a067f2e)
+
+## 🔧 프로젝트 flow
+
+![flow](https://github.com/user-attachments/assets/49847a33-5851-4e6c-b109-689156b1a32f)
+
+## 👥 팀원
+
+
+
+
+
+
+
+
+
+ 김민우
+ 이나경
+ 김현지
+ 문준호
+
+
+
+ FE
+ FE
+ BE
+ BE
+
+
diff --git a/apps/frontend/.gitignore b/apps/frontend/.gitignore
new file mode 100644
index 00000000..b88c8135
--- /dev/null
+++ b/apps/frontend/.gitignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+/test-results/
+/playwright-report/
+/blob-report/
+/playwright/.cache/
diff --git a/apps/frontend/README.md b/apps/frontend/README.md
new file mode 100644
index 00000000..15ad2cd0
--- /dev/null
+++ b/apps/frontend/README.md
@@ -0,0 +1 @@
+# 프론트엔드
diff --git a/apps/frontend/eslint.config.js b/apps/frontend/eslint.config.js
new file mode 100644
index 00000000..e45b5497
--- /dev/null
+++ b/apps/frontend/eslint.config.js
@@ -0,0 +1,106 @@
+import js from '@eslint/js';
+import globals from 'globals';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+import tseslint from 'typescript-eslint';
+import eslintImport from 'eslint-plugin-import';
+import prettierPlugin from 'eslint-plugin-prettier';
+import noRelativeImportPathsPlugin from 'eslint-plugin-no-relative-import-paths';
+
+export default tseslint.config(
+ { ignores: ['dist'] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser
+ },
+ plugins: {
+ 'react-hooks': reactHooks,
+ 'react-refresh': reactRefresh,
+ 'no-relative-import-paths': noRelativeImportPathsPlugin,
+ import: eslintImport,
+ prettier: prettierPlugin
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ 'prettier/prettier': 'error', // Prettier 규칙을 ESLint에서 에러로 표시
+ '@typescript-eslint/no-unnecessary-type-constraint': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ 'import/order': [
+ 'error',
+ {
+ groups: [
+ ['builtin', 'external'], // 내장 모듈과 외부 모듈 그룹
+ ['internal', 'parent', 'sibling', 'index'] // 내부 모듈 그룹
+ ],
+ pathGroups: [
+ {
+ pattern: 'react',
+ group: 'builtin',
+ position: 'before' // react를 최상위에 오도록 설정
+ },
+ {
+ pattern: 'react-dom',
+ group: 'builtin',
+ position: 'before'
+ }
+ ],
+ pathGroupsExcludedImportTypes: ['builtin'],
+ alphabetize: { order: 'asc', caseInsensitive: true } // 알파벳 순 정렬
+ }
+ ],
+ 'sort-imports': [
+ 'error',
+ {
+ ignoreDeclarationSort: true, // `import` 자체의 정렬은 무시
+ ignoreMemberSort: false // 세부 항목 정렬은 적용
+ }
+ ],
+ 'no-relative-import-paths/no-relative-import-paths': [
+ 'warn',
+ { allowSameFolder: true, rootDir: 'src', prefix: '@' }
+ ],
+ '@typescript-eslint/naming-convention': [
+ 'warn',
+ {
+ selector: 'variable',
+ format: ['camelCase', 'PascalCase', 'UPPER_CASE']
+ }, // 변수명은 camelCase, PascalCase, UPPER_CASE 형식 중 하나여야 함
+ {
+ selector: 'function',
+ format: ['camelCase', 'PascalCase']
+ }, // 함수명은 camelCase, PascalCase 형식 중 하나여야 함
+ {
+ selector: 'typeLike',
+ format: ['PascalCase']
+ }, // 타입명은 PascalCase 형식이어야 함
+ {
+ selector: 'interface',
+ format: ['PascalCase'],
+ custom: {
+ regex: '^I[A-Z]',
+ match: false
+ }
+ }, // 인터페이스명은 PascalCase이고 I로 시작하면 안됨
+ {
+ selector: 'typeAlias',
+ format: ['PascalCase'],
+ custom: {
+ regex: '^T[A-Z]',
+ match: false
+ }
+ }, // 타입 별칭명은 PascalCase이고 T로 시작하면 안됨
+ {
+ selector: 'typeParameter',
+ format: ['PascalCase'],
+ custom: {
+ regex: '^T[A-Z]',
+ match: false
+ }
+ } // 타입 매개변수명은 PascalCase이고 T로 시작하면 안됨
+ ]
+ }
+ }
+);
diff --git a/apps/frontend/index.html b/apps/frontend/index.html
new file mode 100644
index 00000000..1076b4b8
--- /dev/null
+++ b/apps/frontend/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Froxy
+
+
+
+
+
+
diff --git a/apps/frontend/package.json b/apps/frontend/package.json
new file mode 100644
index 00000000..06de9472
--- /dev/null
+++ b/apps/frontend/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview",
+ "test": "vitest",
+ "test:e2e": "playwright test",
+ "test:e2e:ui": "playwright test --ui",
+ "test:e2e:debug": "playwright test --debug",
+ "test:e2e:report": "playwright show-report"
+ },
+ "lint-staged": {
+ "*.{ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ]
+ },
+ "dependencies": {
+ "@froxy/design": "workspace:^",
+ "@froxy/react-markdown": "workspace:^",
+ "@hookform/resolvers": "^3.9.1",
+ "@lottiefiles/dotlottie-react": "^0.10.0",
+ "@tanstack/react-query": "^5.59.19",
+ "@tanstack/react-router": "^1.78.3",
+ "axios": "^1.7.7",
+ "framer-motion": "^11.11.11",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-hook-form": "^7.53.2",
+ "react-icons": "^5.3.0",
+ "zod": "^3.23.8"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@playwright/test": "^1.49.0",
+ "@tanstack/react-query-devtools": "^5.59.19",
+ "@tanstack/router-devtools": "^1.78.3",
+ "@tanstack/router-plugin": "^1.78.3",
+ "@testing-library/jest-dom": "^6.6.3",
+ "@testing-library/react": "^16.0.1",
+ "@types/node": "^20.3.1",
+ "@types/react": "^18.3.12",
+ "@types/react-dom": "^18.3.1",
+ "@typescript-eslint/parser": "^5.59.11",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "autoprefixer": "^10.4.20",
+ "eslint": "^9.13.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-no-relative-import-paths": "^1.5.5",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-react-hooks": "^5.0.0",
+ "eslint-plugin-react-refresh": "^0.4.14",
+ "globals": "^15.11.0",
+ "jsdom": "^25.0.1",
+ "msw": "^2.6.4",
+ "postcss": "^8.4.47",
+ "prettier": "2.x",
+ "tailwindcss": "^3.4.14",
+ "typescript": "~5.6.2",
+ "typescript-eslint": "^8.11.0",
+ "vite": "^5.4.10",
+ "vite-tsconfig-paths": "^5.0.1",
+ "vitest": "^2.1.4"
+ },
+ "msw": {
+ "workerDirectory": [
+ "public"
+ ]
+ }
+}
diff --git a/apps/frontend/playwright.config.ts b/apps/frontend/playwright.config.ts
new file mode 100644
index 00000000..9e21df9e
--- /dev/null
+++ b/apps/frontend/playwright.config.ts
@@ -0,0 +1,35 @@
+import { defineConfig, devices } from '@playwright/test';
+
+export default defineConfig({
+ testDir: './src/app/test/e2e',
+ fullyParallel: true,
+ reporter: 'html',
+ use: {
+ baseURL: 'http://localhost:5173',
+ trace: 'on-first-retry'
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] }
+ },
+
+ {
+ name: 'firefox',
+ use: { ...devices['Desktop Firefox'] }
+ },
+
+ {
+ name: 'webkit',
+ use: { ...devices['Desktop Safari'] }
+ }
+ ],
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: 'pnpm dev',
+ url: 'http://localhost:5173'
+ }
+});
diff --git a/apps/frontend/postcss.config.js b/apps/frontend/postcss.config.js
new file mode 100644
index 00000000..2e7af2b7
--- /dev/null
+++ b/apps/frontend/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/apps/frontend/public/android-chrome-192x192.png b/apps/frontend/public/android-chrome-192x192.png
new file mode 100644
index 00000000..a57301a2
Binary files /dev/null and b/apps/frontend/public/android-chrome-192x192.png differ
diff --git a/apps/frontend/public/android-chrome-512x512.png b/apps/frontend/public/android-chrome-512x512.png
new file mode 100644
index 00000000..e827c926
Binary files /dev/null and b/apps/frontend/public/android-chrome-512x512.png differ
diff --git a/apps/frontend/public/apple-touch-icon.png b/apps/frontend/public/apple-touch-icon.png
new file mode 100644
index 00000000..42f9e079
Binary files /dev/null and b/apps/frontend/public/apple-touch-icon.png differ
diff --git a/apps/frontend/public/favicon-16x16.png b/apps/frontend/public/favicon-16x16.png
new file mode 100644
index 00000000..c96c3be4
Binary files /dev/null and b/apps/frontend/public/favicon-16x16.png differ
diff --git a/apps/frontend/public/favicon-32x32.png b/apps/frontend/public/favicon-32x32.png
new file mode 100644
index 00000000..6401c30e
Binary files /dev/null and b/apps/frontend/public/favicon-32x32.png differ
diff --git a/apps/frontend/public/favicon.ico b/apps/frontend/public/favicon.ico
new file mode 100644
index 00000000..d494de19
Binary files /dev/null and b/apps/frontend/public/favicon.ico differ
diff --git a/apps/frontend/public/image/exampleImage.jpeg b/apps/frontend/public/image/exampleImage.jpeg
new file mode 100644
index 00000000..3ef371bf
Binary files /dev/null and b/apps/frontend/public/image/exampleImage.jpeg differ
diff --git a/apps/frontend/public/image/logoIcon.svg b/apps/frontend/public/image/logoIcon.svg
new file mode 100644
index 00000000..c96cd06b
--- /dev/null
+++ b/apps/frontend/public/image/logoIcon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/public/image/onboardingImage.svg b/apps/frontend/public/image/onboardingImage.svg
new file mode 100644
index 00000000..6d460343
--- /dev/null
+++ b/apps/frontend/public/image/onboardingImage.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/public/json/404Animation.json b/apps/frontend/public/json/404Animation.json
new file mode 100644
index 00000000..6125cef5
--- /dev/null
+++ b/apps/frontend/public/json/404Animation.json
@@ -0,0 +1 @@
+{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":320,"h":200,"nm":"404","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"mark Outlines","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.9,19.295,0],"ix":2},"a":{"a":0,"k":[2.503,12.271,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.244,0],[0,0],[0,1.244],[-1.244,0],[0,-1.244]],"o":[[0,0],[-1.244,0],[0,-1.244],[1.244,0],[0,1.244]],"v":[[0,2.253],[0,2.253],[-2.253,-0.001],[0,-2.253],[2.253,-0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.503,22.04],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.244,0],[0,0],[0,1.244],[0,0],[-1.244,0],[0,-1.244],[0,0]],"o":[[0,0],[-1.244,0],[0,0],[0,-1.244],[1.244,0],[0,0],[0,1.244]],"v":[[0,8.26],[0,8.26],[-2.253,6.007],[-2.253,-6.008],[0,-8.26],[2.253,-6.008],[2.253,6.007]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.503,8.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"t":17.0000006924242,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[198.645,-21.677,0],"to":[0,13.167,0],"ti":[0,-13.167,0]},{"t":17.0000006924242,"s":[198.645,57.323,0]}],"ix":2,"x":"var $bm_rt;\nvar _0x9233 = [\n 'BOUNCr overSHOOT+',\n 'Amplitude',\n 'Frequency',\n 'Decay',\n 'Floor',\n 'index',\n 'time',\n 'frameDuration',\n 'PI',\n 'sin',\n 'exp',\n 'abs'\n ];\ntry {\n var effecto = effect(_0x9233[0]);\n var amp = $bm_div(effecto(_0x9233[1]), 1000);\n var freq = effecto(_0x9233[2]);\n var decay = effecto(_0x9233[3]);\n var floor = effecto(_0x9233[4]);\n var n, numkeys, v, t;\n if (floor != true) {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time)[_0x9233[5]];\n if (key(n)[_0x9233[6]] > time) {\n n--;\n }\n }\n ;\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n)[_0x9233[6]]);\n }\n ;\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n)[_0x9233[6]], $bm_div(thisComp[_0x9233[7]], 10)));\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(v, amp), $bm_div(Math[_0x9233[9]]($bm_mul($bm_mul($bm_mul(freq, t), 2), Math[_0x9233[8]])), Math[_0x9233[10]]($bm_mul(decay, t)))));\n } else {\n $bm_rt = value;\n }\n } else {\n $bm_rt = n = 0;\n if (numKeys > 0) {\n $bm_rt = n = nearestKey(time)[_0x9233[5]];\n if (key(n)[_0x9233[6]] > time) {\n n--;\n }\n }\n ;\n if (n == 0) {\n $bm_rt = t = 0;\n } else {\n $bm_rt = t = $bm_sub(time, key(n)[_0x9233[6]]);\n }\n ;\n if (n > 0) {\n v = velocityAtTime($bm_sub(key(n)[_0x9233[6]], $bm_div(thisComp[_0x9233[7]], 10)));\n $bm_rt = $bm_sum(value, $bm_mul($bm_mul(v, amp), $bm_neg($bm_div(Math[_0x9233[11]](Math[_0x9233[9]]($bm_mul($bm_mul($bm_mul(freq, t), 2), Math[_0x9233[8]]))), Math[_0x9233[10]]($bm_mul(decay, t))))));\n } else {\n $bm_rt = value;\n }\n }\n} catch (err) {\n $bm_rt = value;\n}"},"a":{"a":0,"k":[19.9,19.899,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"BOUNCr overSHOOT+","np":8,"mn":"Pseudo/pse bouncR overSHOOT+","ix":1,"en":1,"ef":[{"ty":0,"nm":"Amplitude","mn":"Pseudo/pse bouncR overSHOOT+-0001","ix":1,"v":{"a":0,"k":65,"ix":1}},{"ty":0,"nm":"Frequency","mn":"Pseudo/pse bouncR overSHOOT+-0002","ix":2,"v":{"a":0,"k":3,"ix":2}},{"ty":0,"nm":"Decay","mn":"Pseudo/pse bouncR overSHOOT+-0003","ix":3,"v":{"a":0,"k":6,"ix":3}},{"ty":0,"nm":"Floor","mn":"Pseudo/pse bouncR overSHOOT+-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":6,"nm":"ゥ2018 pixelbot - BOUNCr_v1.1","mn":"Pseudo/pse bouncR overSHOOT+-0005","ix":5,"v":0},{"ty":6,"nm":"BOUNCr overSHOOT+","mn":"Pseudo/pse bouncR overSHOOT+-0006","ix":6,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-10.852],[10.852,0],[0,10.852],[-10.852,0]],"o":[[0,10.852],[-10.852,0],[0,-10.852],[10.852,0]],"v":[[19.65,0],[0.001,19.649],[-19.65,0],[0.001,-19.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.949,0.345,0.306,0.5,0.969,0.249,0.269,1,0.99,0.153,0.232],"ix":9}},"s":{"a":0,"k":[0.919,-19.305],"ix":5},"e":{"a":0,"k":[1.461,19.954],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.9,19.899],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"shadow Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[59.474]},{"t":34.0000013848484,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[192.874,67.919,0],"ix":2},"a":{"a":0,"k":[10.821,15.161,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.518,0.466],[0.611,2.446],[1.717,3.21],[3,2.924],[0.416,0.36],[0,-5.597],[-9.025,0]],"o":[[-0.422,-2.528],[-1.032,-4.229],[-1.743,-3.26],[-0.387,-0.377],[-4.29,2.946],[0,9.026],[1.671,0]],"v":[[10.572,14.192],[9.033,6.724],[4.888,-4.486],[-2.26,-13.806],[-3.464,-14.911],[-10.572,-1.432],[5.771,14.911]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.286549407361,0.552295520259,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[10.821,15.161],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[160.035,100,0],"to":[0,0.917,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[160.035,105.5,0],"to":[0,0,0],"ti":[0,0.917,0]},{"t":22.0000008960784,"s":[160.035,100,0]}],"ix":2},"a":{"a":0,"k":[45.07,56.17,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.946,-4.134],[1.675,-1.603],[2.103,0],[2.364,4.894],[0,12.516],[-1.917,4.368],[-3.475,0],[-1.795,-3.644],[0,-16.272]],"o":[[-0.862,3.772],[-1.554,1.484],[-2.009,0],[-2.094,-4.339],[0,-12.412],[1.605,-3.657],[3.443,0],[1.436,2.914],[0,8.997]],"v":[[9.154,20.45],[5.328,28.55],[-0.105,30.756],[-7.423,25.295],[-10.579,-0.105],[-7.691,-25.394],[-0.245,-30.756],[7.432,-25.414],[10.579,0.662]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.955,7.82],[1.717,3.21],[3,2.923],[4.787,1.84],[7.226,0],[7.565,-8.395],[0,-20.411],[-1.408,-6.709],[-2.646,-4.04],[-5.755,-2.978],[-9.056,0],[-6.851,9.387],[0,19.134]],"o":[[-1.032,-4.229],[-1.743,-3.26],[-3.071,-2.996],[-4.746,-1.823],[-15.154,0],[-7.59,8.422],[0,8.085],[1.443,6.876],[3.669,5.731],[5.711,2.956],[16.3,0],[6.636,-9.094],[0,-8.49]],"v":[[41.871,-25.357],[37.727,-36.567],[30.579,-45.886],[18.738,-53.173],[0.697,-55.92],[-33.54,-43.269],[-44.82,-0.42],[-42.697,21.875],[-36.527,38.34],[-22.324,51.465],[-0.07,55.92],[34.818,41.773],[44.82,-0.768]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.528999956916,0.933000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.07,56.17],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[255.368,99.127,0],"ix":2},"a":{"a":0,"k":[47.967,55.297,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.087,7.857],[-13.799,7.857],[4.087,-13.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.657,0],[0,0],[0,0],[1.657,0],[0,0],[0.57,-0.677],[0,0],[0,-0.707],[0,0],[-1.657,0],[0,0],[0,0],[-1.657,0],[0,0],[0,1.658],[0,0],[0,0],[0,1.657],[0,0]],"o":[[0,0],[0,0],[0,-1.657],[0,0],[-0.886,0],[0,0],[-0.455,0.541],[0,0],[0,1.657],[0,0],[0,0],[0,1.658],[0,0],[1.657,0],[0,0],[0,0],[1.657,0],[0,0],[0,-1.657]],"v":[[44.716,7.857],[34.871,7.857],[34.871,-52.047],[31.871,-55.047],[7.087,-55.047],[4.79,-53.978],[-47.012,7.598],[-47.716,9.53],[-47.716,32.919],[-44.716,35.919],[4.087,35.919],[4.087,52.047],[7.087,55.047],[31.871,55.047],[34.871,52.047],[34.871,35.919],[44.716,35.919],[47.716,32.919],[47.716,10.857]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.528999956916,0.933000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.966,55.297],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[64.633,99.127,0],"ix":2},"a":{"a":0,"k":[47.966,55.297,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.087,7.857],[-13.799,7.857],[4.087,-13.19]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.657,0],[0,0],[0,0],[1.657,0],[0,0],[0.57,-0.677],[0,0],[0,-0.707],[0,0],[-1.657,0],[0,0],[0,0],[-1.657,0],[0,0],[0,1.658],[0,0],[0,0],[0,1.657],[0,0]],"o":[[0,0],[0,0],[0,-1.657],[0,0],[-0.886,0],[0,0],[-0.455,0.541],[0,0],[0,1.657],[0,0],[0,0],[0,1.658],[0,0],[1.657,0],[0,0],[0,0],[1.657,0],[0,0],[0,-1.657]],"v":[[44.717,7.857],[34.87,7.857],[34.87,-52.047],[31.87,-55.047],[7.087,-55.047],[4.79,-53.978],[-47.012,7.598],[-47.717,9.53],[-47.717,32.919],[-44.717,35.919],[4.087,35.919],[4.087,52.047],[7.087,55.047],[31.87,55.047],[34.87,52.047],[34.87,35.919],[44.717,35.919],[47.717,32.919],[47.717,10.857]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.090000002992,0.528999956916,0.933000033509,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.966,55.297],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/apps/frontend/public/json/emptyHistoryAnimation.json b/apps/frontend/public/json/emptyHistoryAnimation.json
new file mode 100644
index 00000000..ad6aa197
--- /dev/null
+++ b/apps/frontend/public/json/emptyHistoryAnimation.json
@@ -0,0 +1 @@
+{"v":"5.5.5","fr":60,"ip":0,"op":225,"w":985,"h":910,"nm":"â½ Group 62","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-40.75,-106.75],[-17.5,-96.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":44,"s":[0]},{"t":70,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-62.25,-138.25],[-14.5,-118.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":41,"s":[0]},{"t":67,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-58.5,-154.5],[-9.75,-133]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":38,"s":[0]},{"t":64,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-54.25,-171],[-5.75,-150.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":37,"s":[0]},{"t":63,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-46.5,-185.5],[2.75,-165.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":34,"s":[0]},{"t":60,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.295,3.052],[-2.065,1.835],[-3.494,-0.079],[-1.058,-3.597],[7,1.25]],"o":[[0,0],[-0.25,-2.588],[1.985,-1.764],[4.428,0.1],[2.5,8.5],[-1.984,-0.354]],"v":[[-1.25,-183],[-3.143,-188.688],[-0.5,-196],[8.497,-199.346],[18.5,-193.25],[5.25,-180]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":38,"s":[0]},{"t":64,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-32.75,-207],[-15.75,-200.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.350949754902,0.350949754902,0.350949754902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.075],"y":[0.344]},"t":32,"s":[0]},{"t":58,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Page","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[471.356,299.63,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.82,-7.34],[-0.31,0.1],[6.69,2.57],[0.94,0.38],[0.17,0.55],[-0.03,0.35],[-0.04,0.42],[-0.11,0.88],[-0.32,1.7],[-5.49,8.32],[-1.22,1.37],[0.3,-0.08],[-7.46,-2.75],[-0.76,-0.25],[0.1,-0.37],[0.32,-0.7],[1.27,-2.91],[1.3,-3.61],[-0.12,0.33],[-3.33,7.16],[0.06,0.02],[7.84,4.29],[0.18,-0.21],[2.26,-4.92],[1.2,-5.73],[0.26,-3.47],[-0.94,-0.49],[-0.9,-0.36],[-7.11,-3.21],[-0.08,0.31],[-2.56,7.12],[0.11,-0.33]],"o":[[-2.56,7.12],[0.3,-0.11],[-6.54,-2.95],[-0.95,-0.36],[-0.53,-0.22],[-0.1,-0.34],[0.03,-0.42],[0.08,-0.9],[0.21,-1.71],[1.85,-9.78],[1,-1.53],[-0.3,0.08],[7,3.82],[0.75,0.27],[0.37,0.13],[-0.19,0.74],[-1.32,2.89],[-1.54,3.52],[-0.12,0.32],[2.69,-7.43],[0.04,-0.07],[-8.28,-3.26],[-0.26,-0.14],[-3.61,4.09],[-2.44,5.32],[-0.71,3.41],[-0.08,1.02],[0.85,0.44],[7.25,2.86],[0.24,0.11],[1.82,-7.34],[0.11,-0.32],[0,0]],"v":[[10.354,5.075],[3.894,26.805],[4.814,26.495],[-14.936,17.865],[-17.766,16.755],[-19.726,15.665],[-19.636,14.405],[-19.536,13.135],[-19.256,10.465],[-18.456,5.355],[-7.426,-22.275],[-4.156,-26.715],[-5.046,-26.475],[17.204,-17.565],[19.454,-16.725],[19.624,-16.475],[18.614,-14.275],[14.724,-5.585],[10.354,5.075],[11.374,4.935],[20.764,-16.875],[20.664,-17.045],[-4.226,-26.965],[-5.106,-26.725],[-13.706,-12.625],[-19.186,4.025],[-20.646,14.355],[-20.136,16.545],[-17.466,17.685],[3.994,26.975],[4.914,26.665],[11.374,4.935],[10.354,5.075]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960992813,0.501960992813,0.501960992813,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 50","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[412.178,346.625,0],"ix":2},"a":{"a":0,"k":[-80.322,-108.375,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8,6.5],[-2.5,-33.5],[0,0],[-38.5,76]],"o":[[-28.5,25],[22.5,10.5],[0,0],[-37.5,-13.5]],"v":[[-33,-235.5],[-81,-108],[-8.5,-75.5],[40,-206]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.501960784314,0.501960784314,0.501960784314,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Page 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.026],"y":[0.06]},"t":40,"s":[0]},{"t":63,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.194],"y":[1.028]},"o":{"x":[0.067],"y":[1.268]},"t":41,"s":[-10]},{"t":99,"s":[0]}],"ix":10},"p":{"a":0,"k":[493.663,378.251,0],"ix":2},"a":{"a":0,"k":[-25.808,62.423,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.62,-1.21],[-0.23,0.21],[0.33,-0.4],[0.65,-0.91],[1.37,-2.16],[2.62,-7.94],[0.61,-1.97],[-0.29,0.08],[0.37,0.2],[-0.5,-0.27],[-0.38,-0.2],[-0.1,0.33],[-1.81,4.54],[-4.14,5.99],[-0.68,0.93],[-0.36,0.46],[-0.11,0.16],[0.59,0.19],[0.48,0.36],[1.69,1.11],[-0.48,-0.31]],"o":[[1.69,1.11],[0.23,-0.21],[-0.59,-0.2],[-0.73,0.85],[-1.48,2.08],[-4.51,7.05],[-0.65,1.96],[0.29,-0.08],[-0.37,-0.2],[-0.38,-0.21],[0.37,0.2],[0.24,0.14],[1.43,-4.67],[2.69,-6.8],[0.66,-0.96],[0.35,-0.47],[0.12,-0.15],[0.29,-0.41],[0.33,0.11],[-1.62,-1.21],[-0.38,-0.24],[0,0]],"v":[[4.827,-20.462],[9.817,-17.002],[10.497,-17.632],[9.107,-16.842],[7.087,-14.152],[2.777,-7.802],[-7.743,14.778],[-9.583,20.688],[-8.703,20.448],[-9.813,19.848],[-10.593,20.438],[-9.483,21.038],[-8.603,20.808],[-3.843,6.978],[6.687,-12.052],[8.697,-14.902],[9.757,-16.302],[10.137,-16.752],[9.907,-16.952],[10.597,-17.592],[5.617,-21.052],[4.827,-20.462]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960992813,0.501960992813,0.501960992813,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 32","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 15","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.026],"y":[0.06]},"t":40,"s":[0]},{"t":63,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.194],"y":[1.028]},"o":{"x":[0.067],"y":[1.268]},"t":41,"s":[-10]},{"t":99,"s":[0]}],"ix":10},"p":{"a":0,"k":[490.97,360.535,0],"ix":2},"a":{"a":0,"k":[-1.53,-94.465,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[17.418,-67.064],[0,0]],"o":[[0,0],[3.461,-18.041],[0,0]],"v":[[34.284,-193.75],[-1.5,-94.5],[45.75,-187.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.87740502451,0.87740502451,0.87740502451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[101.989,99.963],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Page 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.026],"y":[0.06]},"t":46,"s":[0]},{"t":69,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.194],"y":[1.028]},"o":{"x":[0.067],"y":[1.268]},"t":47,"s":[-10]},{"t":105,"s":[0]}],"ix":10},"p":{"a":0,"k":[492.459,373.771,0],"ix":2},"a":{"a":0,"k":[-34.569,50.461,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.11,-1.29],[-0.29,0.15],[0.5,-0.44],[1.43,-1.36],[3.2,-5.07],[1.59,-3.68],[-0.14,0.33],[-3.98,5.09],[-3.34,3.09],[-0.79,0.69],[-0.32,0.26],[-0.09,0.1],[0.72,0.38],[0.3,0.35],[1.24,1.17],[-0.3,-0.27]],"o":[[1.23,1.17],[0.29,-0.15],[-0.85,-0.45],[-1.48,1.31],[-4.35,4.12],[-2.14,3.39],[-0.21,0.47],[2.57,-5.93],[2.81,-3.59],[0.77,-0.71],[0.3,-0.27],[0.11,-0.09],[0.28,-0.33],[0.22,0.12],[-1.11,-1.28],[-0.27,-0.25],[0,0]],"v":[[7.548,-16.61],[11.158,-13],[12.038,-13.46],[9.188,-11.73],[4.827,-7.7],[-6.553,6.14],[-12.132,16.78],[-11.182,16.82],[-1.372,0.18],[7.977,-9.69],[10.307,-11.79],[11.238,-12.58],[11.598,-12.86],[11.227,-12.95],[12.107,-13.41],[8.488,-17.02],[7.548,-16.61]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.501960992813,0.501960992813,0.501960992813,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 28","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 17","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.026],"y":[0.06]},"t":46,"s":[0]},{"t":69,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.194],"y":[1.028]},"o":{"x":[0.067],"y":[1.268]},"t":47,"s":[-10]},{"t":105,"s":[0]}],"ix":10},"p":{"a":0,"k":[507.867,343.3,0],"ix":2},"a":{"a":0,"k":[15.367,-111.7,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[23,-38]],"o":[[0,0],[0,0],[6,-20.5]],"v":[[49.5,-177.75],[58.75,-170.25],[13,-114.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.87740502451,0.87740502451,0.87740502451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Fill 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[157.973,122.959,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.59,2],[-17.79,0],[-6.7,-1.16],[-6.74,0.1],[-5.95,13.01],[7.48,9.32],[5.81,2.71],[15.74,-5.22],[1.25,-4.87]],"o":[[2.03,0.36],[-0.6,-2.04],[6.8,0],[6.65,1.15],[7.45,-0.11],[5.02,-10.99],[-4.01,-5],[-8.29,-3.86],[-15.73,5.22],[-9.75,38.06]],"v":[[-24.755,40.762],[-23.845,38.382],[-16.395,25.092],[3.765,27.882],[23.905,29.462],[49.315,10.522],[44.985,-19.118],[24.515,-33.998],[-24.755,-38.848],[-50.005,-14.248]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.944113016129,0.944113016129,0.944113016129,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.511],"y":[1]},"o":{"x":[0.012],"y":[0.399]},"t":52,"s":[-80]},{"t":147,"s":[0]}],"ix":10},"p":{"a":0,"k":[488.737,378.563,0],"ix":2},"a":{"a":0,"k":[488.574,378.572,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.509,0.509,0.667],"y":[1,1,1]},"o":{"x":[0.005,0.005,0.333],"y":[0.874,0.874,0]},"t":65,"s":[0,0,100]},{"t":190,"s":[100,100,100]}],"ix":6}},"ao":0,"w":985,"h":910,"ip":56,"op":3656,"st":56,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[485.213,615.857,0],"ix":2},"a":{"a":0,"k":[-5.5,168.211,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.325,0.325,0.667],"y":[0.995,0.995,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":58,"s":[100,100,100]},{"i":{"x":[0.349,0.349,0.667],"y":[0.741,0.741,1]},"o":{"x":[0.693,0.693,0.333],"y":[0.018,0.018,0]},"t":98,"s":[138.645,138.645,100]},{"i":{"x":[0.568,0.568,0.667],"y":[2.815,2.815,1]},"o":{"x":[0.385,0.385,0.333],"y":[2.381,2.381,0]},"t":137,"s":[96,96,100]},{"i":{"x":[0.624,0.624,0.667],"y":[0.963,0.963,1]},"o":{"x":[0.468,0.468,0.333],"y":[0.158,0.158,0]},"t":180,"s":[95,95,100]},{"i":{"x":[0.541,0.541,0.667],"y":[0.506,0.506,1]},"o":{"x":[0.468,0.468,0.333],"y":[-0.017,-0.017,0]},"t":230,"s":[120,120,100]},{"i":{"x":[0.459,0.459,0.667],"y":[1.04,1.04,1]},"o":{"x":[0.36,0.36,0.333],"y":[0.613,0.613,0]},"t":293,"s":[100,100,100]},{"i":{"x":[0.727,0.727,0.667],"y":[0.551,0.551,1]},"o":{"x":[0.45,0.45,0.333],"y":[0.035,0.035,0]},"t":318,"s":[96,96,100]},{"i":{"x":[0.638,0.638,0.667],"y":[1.012,1.012,1]},"o":{"x":[0.349,0.349,0.333],"y":[0.533,0.533,0]},"t":360,"s":[120,120,100]},{"i":{"x":[0.437,0.437,0.667],"y":[0.5,0.5,1]},"o":{"x":[0.657,0.657,0.333],"y":[0.057,0.057,0]},"t":383,"s":[134,134,100]},{"t":402,"s":[114,114,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.774,21.711],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.850980451995,0.61568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.887,157.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":53,"op":3653,"st":53,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[372.523,613.982,0],"ix":2},"a":{"a":0,"k":[9.274,168.211,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.325,0.325,0.667],"y":[0.995,0.995,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":58,"s":[100,100,100]},{"i":{"x":[0.349,0.349,0.667],"y":[0.741,0.741,1]},"o":{"x":[0.693,0.693,0.333],"y":[0.018,0.018,0]},"t":98,"s":[138.645,138.645,100]},{"i":{"x":[0.568,0.568,0.667],"y":[2.815,2.815,1]},"o":{"x":[0.385,0.385,0.333],"y":[2.381,2.381,0]},"t":137,"s":[96,96,100]},{"i":{"x":[0.624,0.624,0.667],"y":[0.963,0.963,1]},"o":{"x":[0.468,0.468,0.333],"y":[0.158,0.158,0]},"t":180,"s":[95,95,100]},{"i":{"x":[0.541,0.541,0.667],"y":[0.506,0.506,1]},"o":{"x":[0.468,0.468,0.333],"y":[-0.017,-0.017,0]},"t":230,"s":[120,120,100]},{"i":{"x":[0.459,0.459,0.667],"y":[1.04,1.04,1]},"o":{"x":[0.36,0.36,0.333],"y":[0.613,0.613,0]},"t":293,"s":[100,100,100]},{"i":{"x":[0.727,0.727,0.667],"y":[0.551,0.551,1]},"o":{"x":[0.45,0.45,0.333],"y":[0.035,0.035,0]},"t":318,"s":[96,96,100]},{"i":{"x":[0.638,0.638,0.667],"y":[1.012,1.012,1]},"o":{"x":[0.349,0.349,0.333],"y":[0.533,0.533,0]},"t":360,"s":[120,120,100]},{"i":{"x":[0.437,0.437,0.667],"y":[0.5,0.5,1]},"o":{"x":[0.657,0.657,0.333],"y":[0.057,0.057,0]},"t":383,"s":[134,134,100]},{"t":402,"s":[114,114,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[14.774,21.711],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.850980451995,0.61568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.887,157.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":53,"op":3653,"st":53,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[395.437,594.09,0],"ix":2},"a":{"a":0,"k":[-30.188,139.09,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-13.625,11.375]],"o":[[0,0],[13.625,-11.375]],"v":[[-40.375,136.375],[-20,136.875]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.619607843137,0.501960784314,0.321568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.626],"y":[1]},"o":{"x":[0.695],"y":[0]},"t":38,"s":[50]},{"t":73,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.634],"y":[1]},"o":{"x":[0.882],"y":[0]},"t":38,"s":[50]},{"t":73,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":38,"op":3638,"st":38,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[462.312,594.09,0],"ix":2},"a":{"a":0,"k":[-30.188,139.09,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-13.625,11.375]],"o":[[0,0],[13.625,-11.375]],"v":[[-40.375,136.375],[-20,136.875]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.619607843137,0.501960784314,0.321568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.626],"y":[1]},"o":{"x":[0.695],"y":[0]},"t":38,"s":[50]},{"t":73,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.634],"y":[1]},"o":{"x":[0.882],"y":[0]},"t":38,"s":[50]},{"t":73,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":38,"op":3638,"st":38,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[427.688,624.517,0],"ix":2},"a":{"a":0,"k":[-64.812,169.517,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.25,-5],[-20.75,22.25]],"o":[[2,3.875],[22.08,-23.676]],"v":[[-84.375,163.625],[-45.25,165]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.619607843137,0.501960784314,0.321568627451,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.626],"y":[1]},"o":{"x":[0.695],"y":[0]},"t":54,"s":[50]},{"i":{"x":[0.526],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.334],"y":[1]},"o":{"x":[0.453],"y":[0]},"t":155.562,"s":[80]},{"i":{"x":[0.461],"y":[1]},"o":{"x":[0.63],"y":[0]},"t":239,"s":[100]},{"i":{"x":[0.42],"y":[1]},"o":{"x":[0.485],"y":[0]},"t":325,"s":[80]},{"t":408.4375,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.634],"y":[1]},"o":{"x":[0.882],"y":[0]},"t":54,"s":[50]},{"i":{"x":[0.575],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[0]},{"i":{"x":[0.634],"y":[1]},"o":{"x":[0.568],"y":[0]},"t":155.562,"s":[20]},{"i":{"x":[0.562],"y":[1]},"o":{"x":[0.373],"y":[0]},"t":239,"s":[0]},{"i":{"x":[0.568],"y":[1]},"o":{"x":[0.499],"y":[0]},"t":325,"s":[20]},{"t":408.4375,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":54,"op":3654,"st":54,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Bubbel 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[385.71,440.982,0],"ix":2},"a":{"a":0,"k":[-29.71,24.982,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.648,0.648,0.333],"y":[0,0,0]},"t":21,"s":[0,0,100]},{"t":84,"s":[-100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.25,-0.9],[-1.04,0.06],[-4.13,1.83],[-0.16,0.068],[-0.385,0.148],[1.549,1.633],[3.32,-5.46]],"o":[[0.78,0.56],[2.33,-0.12],[0.162,-0.071],[0.396,-0.168],[8.268,-3.182],[-3.02,-3.21],[0.02,1.45]],"v":[[-11.36,3.79],[-8.4,4.49],[-1.23,1.99],[-0.746,1.781],[0.425,1.307],[12.74,-2.26],[-13,-0.15]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850000023842,0.850000023842,0.850000023842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":-210,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-38,"op":3562,"st":-38,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Bubble","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[656.185,350.788,0],"ix":2},"a":{"a":0,"k":[-17.205,11.132,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.039,0.039,0.333],"y":[0.31,0.31,0]},"t":67,"s":[0,0,100]},{"t":117,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.21,-0.79],[-0.94,-0.12],[-2.08,1.93],[1.57,1.52],[-0.07,-4.55]],"o":[[0.02,1.26],[0.75,0.48],[3.25,0.41],[1.24,-1.14],[-2.91,-2.79],[0,0]],"v":[[-7,-0.31],[-5.42,3.12],[-2.76,3.9],[4.31,1.55],[6.5,-2.1],[-7,-0.31]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850000023842,0.850000023842,0.850000023842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":-195,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"bubble","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[574.516,424.335,0],"ix":2},"a":{"a":0,"k":[-50.367,24.951,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.009,0.009,0.333],"y":[0.234,0.234,0]},"t":57,"s":[0,0,100]},{"t":127,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.81,-1.47],[-1.51,0.09],[-5.96,2.98],[2.37,2.84],[4.78,-8.91]],"o":[[1.12,0.91],[3.35,-0.19],[13.21,-6.6],[-4.36,-5.23],[0.03,2.37]],"v":[[-16.37,6.182],[-12.1,7.322],[-1.77,3.252],[18.37,-3.688],[-18.74,-0.238]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949999988079,0.949999988079,0.949999988079,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":-195,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"Big Bubble","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.5,444.008,0],"ix":2},"a":{"a":0,"k":[81.5,245.508,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.019,0.019,0.333],"y":[0.528,0.528,0]},"t":29,"s":[0,0,100]},{"t":167,"s":[98,98,100]}],"ix":6}},"ao":0,"w":315,"h":246,"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[492.5,455,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[4.25,-20.25],[3,-10.25],[4.25,-6.25],[10,-2.25],[4.052,5.462],[1.25,14.5],[0.75,-10.25],[0,0],[0,0]],"o":[[0,0],[0,0],[-2,30.25],[-3.458,11.815],[-5,7.75],[-11.649,2.621],[-5.75,-7.75],[-1.801,-20.888],[0.5,-12.5],[0,0],[0,0]],"v":[[-119,6],[152,9.25],[146.75,130.75],[136.75,188.25],[123.5,216.5],[99.25,236],[76.5,225.5],[67,188],[69,127],[76.75,57.5],[81.875,24.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.996078431373,0.894117647059,0.741176470588,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[38]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[49]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[67]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[69]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[69]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[72.333]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":27,"s":[76.111]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[81]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[88]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[95]},{"t":41,"s":[100]}],"ix":2},"o":{"a":0,"k":-360,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Folder Front 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[443.987,587.909,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[4.237,-0.553],[6.394,8.698],[0,0],[-2.871,-1.286],[-3.656,-0.473],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-6.456,1.023],[-6.763,0.03],[0,0],[1.519,2.125],[1.529,0.685],[2.583,0.334],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.294,34.924],[45.85,35.334],[-44.306,30.374],[-45.848,28.739],[-40.316,32.971],[-33.09,34.337],[-26.383,35.167],[-17.903,35.734],[-6.203,36.171],[0.494,36.601],[14.494,36.701],[27.927,36.751],[38.654,36.271],[49.294,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[3.987,-0.137],[34.561,10.657],[0,0],[-1.263,-0.523],[-2.739,-0.515],[-2.654,-0.303],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-3.623,0.69],[-29.58,-0.12],[0,0],[2.644,3.833],[1.404,0.643],[2.38,0.448],[3.33,0.381],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.793,34.341],[41.184,35.667],[-44.89,29.457],[-46.515,28.031],[-40.233,33.012],[-34.048,34.337],[-25.716,35.334],[-17.736,35.942],[-6.453,36.504],[0.494,36.601],[14.493,36.701],[27.593,36.501],[38.653,36.021],[49.293,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[2.456,2.744],[33.977,11.933],[-0.91,-2.287],[-2.696,-1.758],[-2.504,-0.442],[-3.091,-0.257],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-4.862,0.836],[-29.58,-0.12],[0,0],[0.91,2.287],[2.696,1.758],[2.172,0.383],[3.341,0.277],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.793,34.341],[41.298,31.12],[-47.713,23.154],[-46.989,26.202],[-42.359,32.189],[-35.908,34.348],[-28.28,35.12],[-19.096,35.854],[-9.443,36.358],[0.494,36.601],[14.494,36.701],[27.593,36.501],[38.653,36.021],[49.293,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[3.071,5.697],[33.227,13.573],[0,0],[-1.346,-1.857],[-2.406,-0.473],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-4.622,0.857],[-29.58,-0.12],[0,0],[0.394,3.333],[0.84,1.159],[2.555,0.503],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.793,34.341],[39.684,27.417],[-48.223,17.207],[-47.89,20.197],[-45.066,29.637],[-39.423,33.254],[-31.883,34.584],[-20.736,35.901],[-13.286,36.171],[0.494,36.601],[14.494,36.701],[27.593,36.501],[38.653,36.021],[49.293,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[0,0],[0.74,7.15],[33.22,13.544],[0,0],[-1.262,-3.352],[-1.185,-0.936],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-6.465,1.026],[-29.58,-0.12],[0,0],[0.727,5.833],[0.925,2.458],[1.511,1.194],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.793,34.341],[38.931,22.714],[-49.057,12.108],[-48.89,15.774],[-46.817,27.216],[-43.09,31.92],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.493,36.701],[27.593,36.501],[38.653,36.021],[49.293,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[-0.679,12.947],[39.061,7.24],[0,0],[-0.654,-2.477],[-2.073,-1.89],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-10.622,2.19],[-31.846,5.78],[0,0],[0.227,3.833],[0.654,2.477],[2.125,1.938],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[38.35,5.084],[-49.39,4.957],[-48.973,15.031],[-47.733,24.971],[-43.756,31.421],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.493,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[-3.068,20.113],[32.74,2.487],[0,0],[-1.171,-4.286],[-2.798,-2.377],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-12.4,2.857],[-30.335,1.847],[0,0],[0.561,5.167],[0.944,3.462],[2.182,1.873],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[39.406,-5.916],[-49.39,-7.487],[-49.362,11.475],[-47.511,24.471],[-43.756,31.421],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.493,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,0],[-2.513,15.613],[29.58,0.11],[-0.061,-4.667],[-1.733,-5.097],[-1.678,-1.783],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-13.289,3.19],[-29.58,-0.12],[0,0],[0.061,4.667],[1.154,3.393],[1.594,1.693],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[39.684,-6.416],[-49.39,-13.709],[-49.806,9.864],[-47.983,24.471],[-43.756,31.421],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.493,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[0,0],[-3.358,18.268],[50.384,5.02],[0,0],[-0.763,-2.607],[-1.822,-1.473],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-15.151,4.647],[-29.58,-0.12],[0,0],[0.154,6.328],[0.594,2.032],[2.236,1.808],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[40.889,-17.615],[-49.047,-17.989],[-49.233,5.285],[-47.233,24.387],[-43.84,30.754],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.493,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[-4.203,20.923],[31.924,0.663],[0,0],[-1.948,-8.876],[-1.671,-1.454],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-17.014,6.105],[-29.58,-0.12],[0,0],[0.062,6.887],[0.832,3.789],[1.937,1.685],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[41.594,-23.648],[-49.647,-23.213],[-49.558,-0.023],[-47.381,24.239],[-43.766,31.345],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.494,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[{"i":[[0,0],[-4.31,21.26],[29.58,0.11],[0,0],[-0.444,-5.59],[-3.16,-2.62],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-17.25,6.29],[-29.58,-0.12],[0,0],[-2.773,16.167],[0.362,4.56],[2.21,1.84],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[42.684,-31.583],[-49.223,-32.376],[-50.223,-14.303],[-49.191,19.054],[-43.756,31.421],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.494,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]},{"t":41,"s":[{"i":[[0,0],[-4.31,21.26],[29.58,0.11],[0.729,-13.637],[-2.596,-16.19],[-3.16,-2.62],[-2.84,-0.45],[-3.34,-0.28],[-4.16,-0.18],[-4.6,-0.08],[-4.67,0.02],[-4.37,0.13],[-3.68,0.24],[-3.43,1.26]],"o":[[-17.25,6.29],[-29.58,-0.12],[0,0],[-0.606,11.333],[0.649,4.051],[2.21,1.84],[3.31,0.53],[4.14,0.35],[4.59,0.21],[4.67,0.09],[4.37,-0.01],[3.69,-0.1],[3.59,-0.22],[0,0]],"v":[[49.794,34.341],[43.684,-36.249],[-49.556,-36.709],[-51.223,-19.469],[-49.9,18.887],[-43.756,31.421],[-35.716,34.251],[-25.736,35.401],[-13.286,36.171],[0.494,36.601],[14.494,36.701],[27.594,36.501],[38.654,36.021],[49.294,34.541]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980392156863,0.81568627451,0.564705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 8","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":3583,"st":-17,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Folder back 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":11,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[509.689,578.168,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.278431372549,0.286274509804,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":177,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.90588241278,0.725490196078,0.454901990704,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-0.478,2.311],[-0.2,5.873],[-0.009,0.31],[-0.039,0.46],[0.318,8.583],[-0.061,0.318],[-0.624,-5.547],[0,0],[3.45,0.69],[0,0],[0,0],[0,0],[0,0],[0,0],[-26.247,0.049]],"o":[[3.58,-0.22],[1.161,-5.62],[0.013,-0.377],[0.184,-6.359],[0.523,-6.099],[-0.01,-0.271],[0.286,-1.49],[0.382,3.394],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[26.246,-0.049]],"v":[[44.257,-46.898],[44.647,-49.211],[45.327,-48.851],[45.36,-49.88],[44.981,-49.348],[44.887,-47.366],[44.857,-48.257],[44.927,-50.475],[45.154,-50.291],[-45.826,-51.271],[-45.456,-50.302],[-45.592,-48.794],[-45.586,-48.25],[-45.581,-47.825],[-45.579,-47.68],[-4.771,-49.365]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[{"i":[[0,0],[-0.011,-1.816],[0.062,1.037],[-0.001,0.033],[0.031,1.047],[-0.061,-0.825],[-0.015,-0.011],[-0.093,-0.419],[0,0],[3.45,0.69],[-0.189,-3.089],[0,0],[0.042,-1.084],[0,0],[0,0],[-25.262,-0.666]],"o":[[0.66,-0.164],[-0.186,1.251],[0.001,-0.029],[0.028,-0.675],[0.078,-5.196],[0.061,0.912],[0.111,0.089],[0.09,0.526],[0,0],[0,0],[0.189,3.089],[0,0],[-0.042,1.084],[0,0],[0,0],[25.238,0.167]],"v":[[44.793,-18.572],[45.483,-21.82],[45.391,-26.952],[45.395,-27.046],[45.467,-30.126],[45.641,-34.875],[45.673,-35.184],[45.541,-37.099],[45.487,-38.291],[-45.493,-39.271],[-44.714,-32.086],[-44.72,-24.326],[-44.816,-22.082],[-44.717,-20.416],[-44.84,-19.228],[-2.429,-16.081]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[{"i":[[0,0],[-0.05,0.011],[0.042,0.862],[-0.002,0.029],[0.005,0.754],[-0.036,0.386],[-0.007,0.156],[-0.107,2.895],[0,0],[3.45,0.69],[-0.248,-3.965],[0.01,-1.116],[0.021,-0.542],[0.034,-0.44],[0,0],[-26.369,-0.954]],"o":[[0.543,-0.319],[0.004,-1.393],[0.002,-0.026],[0.038,-0.595],[0.078,-3.485],[0.031,0.312],[0.052,-1.096],[0.09,-2.04],[0,0],[0,0],[0.248,3.965],[-0.01,1.116],[-0.021,0.542],[-0.023,0.299],[0,0],[26.357,0.704]],"v":[[44.463,-12.235],[45.211,-17.349],[45.255,-23.589],[45.261,-23.671],[45.37,-26.258],[45.501,-31.131],[45.557,-34.679],[45.463,-35.058],[45.487,-38.291],[-45.493,-39.271],[-44.605,-28.796],[-44.404,-19.695],[-44.369,-16.415],[-44.32,-14.476],[-44.423,-12.879],[-6.215,-6.951]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[0,0],[-0.089,1.839],[0.023,0.687],[-0.002,0.025],[-0.02,0.462],[-0.011,1.597],[0.001,0.323],[-0.122,6.209],[0,0],[3.45,0.69],[-0.306,-4.841],[0.021,-2.233],[0,0],[0.069,-0.881],[0,0],[-27.476,-1.241]],"o":[[0.426,-0.475],[0.195,-4.037],[0.002,-0.022],[0.048,-0.516],[0.078,-1.775],[0.002,-0.287],[-0.006,-2.282],[0.091,-4.606],[0,0],[0,0],[0.306,4.841],[-0.021,2.233],[0,0],[-0.047,0.598],[0,0],[27.476,1.241]],"v":[[44.132,-5.898],[44.939,-12.878],[45.119,-20.226],[45.126,-20.297],[45.272,-22.389],[45.361,-27.386],[45.44,-34.173],[45.385,-33.017],[45.487,-38.291],[-45.493,-39.271],[-44.497,-25.505],[-44.087,-15.063],[-43.922,-10.998],[-43.923,-8.536],[-44.007,-6.531],[-10.001,2.179]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[0,0],[-0.175,1.963],[-0.019,1.687],[-0.001,0.049],[-0.007,0.462],[-0.011,1.589],[-0.028,0.322],[-0.163,6.208],[0,0],[3.45,0.69],[-0.286,-6.835],[0.068,-3.354],[0,0],[0,0],[0,0],[-23.174,-0.045]],"o":[[0.593,-2.6],[0.411,-4.62],[0,-0.022],[0.016,-0.996],[0.078,-4.983],[0.002,-0.292],[0.66,-7.622],[0.207,-7.887],[0,0],[0,0],[0.286,6.835],[-0.069,3.414],[0,0],[0,0],[0,0],[23.174,0.045]],"v":[[42.091,12.977],[44.148,0.956],[45.161,-12.851],[45.162,-12.958],[45.314,-20.681],[45.404,-27.336],[45.607,-31.507],[45.552,-32.017],[45.487,-38.291],[-45.493,-39.271],[-44.31,-22.748],[-43.622,0.089],[-43.701,6.659],[-44.114,9.642],[-44.279,12.802],[-11.199,18.207]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[{"i":[[0,0],[-1.232,4.97],[-0.013,0.383],[-0.006,0.199],[-0.154,1.176],[0.08,-0.548],[0.004,-0.044],[-0.049,0.106],[0,0],[3.45,0.69],[-0.473,-10.523],[0,0],[0,0],[0.898,-2.465],[0,0],[-26.941,-1.093]],"o":[[5.385,-2.183],[1.745,-7.036],[0.007,-0.208],[0.123,-4.094],[-0.172,-0.9],[-0.003,0.017],[-0.131,1.426],[0.049,-0.106],[0,0],[0,0],[0.139,19.523],[0,0],[0,0],[-1.188,3.259],[0,0],[26.941,1.093]],"v":[[31.424,34.602],[41.564,17.872],[44.661,-7.268],[44.68,-7.878],[44.897,-15.014],[45.033,-22.181],[45.273,-28.34],[45.427,-32.808],[45.487,-38.291],[-45.493,-39.271],[-41.331,-5.104],[-41.837,15.187],[-42.838,23.245],[-44.09,28.301],[-46.34,31.969],[-17.799,37.993]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0,0],[-2.311,4.874],[-0.333,2.187],[-0.017,0.253],[-0.132,0.923],[-0.212,2.875],[-0.041,0.752],[-0.087,2.14],[0,0],[3.45,0.69],[-0.196,-15.078],[0.757,-6.678],[0.536,-2.364],[0.648,-2.211],[0,0],[-22.907,-1.026]],"o":[[7.579,-1.739],[2.967,-7.092],[0.008,-0.157],[0.18,-3.631],[0.022,-1.032],[0.007,-0.091],[0.051,-1.519],[0.102,-2.7],[0,0],[0,0],[0.139,10.746],[-0.157,1.382],[-0.214,1.469],[-0.906,3.09],[0,0],[34.903,3.264]],"v":[[26.924,37.352],[39.342,23.22],[44.189,-2.532],[44.226,-3.154],[44.842,-12.403],[45.114,-19.433],[45.343,-25.34],[45.482,-32.086],[45.487,-38.291],[-45.493,-39.271],[-41.997,-3.993],[-42.282,16.097],[-43.227,25.45],[-44.506,30.297],[-46.729,33.469],[-20.094,38.655]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[-3.389,4.778],[-0.653,3.991],[-0.028,0.307],[-0.111,0.671],[-0.505,6.297],[-0.086,1.547],[-0.125,4.174],[0,0],[3.45,0.69],[-0.742,-10.556],[0.125,-2.779],[0.265,-3.071],[0.685,-2.905],[0,0],[-18.873,-0.96]],"o":[[9.774,-1.294],[4.189,-7.147],[0.009,-0.106],[0.238,-3.169],[0.215,-1.165],[0.016,-0.199],[0.233,-4.464],[0.154,-5.293],[0,0],[0,0],[0.806,11.468],[-0.125,2.779],[-0.568,3.151],[-0.685,2.905],[0,0],[19.088,0.88]],"v":[[21.924,37.602],[37.12,28.567],[43.716,2.205],[43.773,1.571],[44.786,-9.792],[45.196,-16.685],[45.412,-22.34],[45.538,-31.364],[45.487,-38.291],[-45.493,-39.271],[-42.164,-8.382],[-42.726,16.841],[-43.616,26.322],[-45.173,32.459],[-47.118,34.969],[-22.39,39.317]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[-4.457,4.685],[-0.974,5.795],[-0.039,0.361],[-0.089,0.418],[-0.797,9.72],[-0.131,2.343],[-0.163,6.208],[0,0],[3.45,0.69],[-0.126,-10.529],[0.187,-4.168],[0.397,-4.607],[0.852,-2.631],[0,0],[-14.839,-0.893]],"o":[[10.051,-0.516],[7.328,-7.703],[0.009,-0.056],[0.295,-2.706],[0.245,-1.15],[0.025,-0.307],[0.414,-7.409],[0.207,-7.887],[0,0],[0,0],[0.139,11.69],[-0.187,4.168],[-0.853,4.726],[-0.852,2.631],[0,0],[15.161,0.773]],"v":[[17.174,39.102],[33.564,33.206],[43.077,7.149],[43.153,6.504],[44.564,-6.764],[45.11,-13.563],[45.356,-19.09],[45.51,-30.392],[45.487,-38.291],[-45.493,-39.271],[-42.331,-1.104],[-42.337,16.584],[-43.172,26.86],[-45.173,34.121],[-47.507,36.469],[-24.685,39.979]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[-4.922,4.13],[-1.685,4.437],[-0.014,0.054],[-0.068,0.457],[-0.777,10.297],[-0.028,0.322],[-0.163,6.208],[0,0],[3.45,0.69],[-0.289,-8.419],[1.021,-8.777],[0,0],[3.352,-3.507],[0,0],[0,0]],"o":[[21.135,-0.766],[1.828,-2.786],[0.008,-0.021],[0.965,-3.613],[0.995,-6.65],[0.025,-0.326],[0.66,-7.622],[0.207,-7.887],[0,0],[0,0],[0.306,8.922],[-1.021,8.777],[0,0],[-3.352,3.507],[0,0],[0,0]],"v":[[10.674,39.686],[34.814,33.289],[39.994,24.316],[41.594,18.449],[42.981,10.069],[44.695,-8.202],[45.19,-19.173],[45.677,-32.558],[45.487,-38.291],[-45.493,-39.271],[-41.831,-9.836],[-41.837,16.309],[-45.088,28.953],[-49.006,34.579],[-56.007,37.969],[-28.372,39.734]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[0,0],[-3.431,1.278],[-2.373,5.272],[-0.013,0.033],[-0.089,0.453],[-0.219,4.759],[-0.018,0.323],[-0.163,6.208],[0,0],[3.45,0.69],[-0.473,-13.483],[0.187,-5.06],[1.646,-4.532],[0.981,-0.539],[0,0],[0,0]],"o":[[27.246,-0.436],[5.707,-2.108],[0.009,-0.02],[0.274,-0.685],[1.243,-6.319],[0.015,-0.323],[0.446,-7.795],[0.207,-7.887],[0,0],[0,0],[0.473,13.483],[-0.187,5.06],[-2.43,5.769],[-3.724,2.045],[0,0],[0,0]],"v":[[-6.34,40.016],[27.784,37.419],[38.587,25.134],[38.637,25.009],[41.742,15.437],[43.696,1.625],[44.363,-6.702],[45.013,-24.46],[45.487,-38.291],[-45.493,-39.271],[-42.497,-11.897],[-41.837,13.526],[-44.011,25.734],[-51.506,35.208],[-58.315,37.304],[-38.901,39.173]],"c":true}]},{"t":20,"s":[{"i":[[0,0],[-11.363,2.599],[-1.337,2.042],[-1.054,2.897],[-0.187,0.423],[-0.205,5.037],[-0.027,0.322],[-0.146,6.209],[0,0],[3.452,0.681],[-0.168,-11.809],[0,0],[2.034,-5.359],[4.824,-2.192],[0,0],[0,0]],"o":[[3.579,-0.23],[6.392,-1.462],[0.012,-0.019],[1.054,-2.897],[1.014,-2.294],[0.013,-0.323],[0.639,-7.624],[0.186,-7.888],[0,0],[0,0],[0.168,11.809],[0,0],[-1.133,3.641],[-4.584,1.977],[0,0],[0,0]],"v":[[-10.47,40.057],[26,38.298],[35.395,31.795],[38.838,25.15],[40.712,19.296],[43.514,3.465],[44.181,-3.501],[45.276,-25.014],[45.384,-38.414],[-45.599,-39.147],[-43.859,-10.723],[-43.435,11.278],[-45.392,23.945],[-52.515,34.778],[-60.654,36.759],[-46.518,38.602]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.90588241278,0.725490196078,0.454901990704,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.115,0.074],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 6","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Shadow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[0]},{"t":42,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[461.597,695.146,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[17,17,100]},{"t":30,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.48,-0.56],[10.66,-0.02],[20,0],[-12.36,2.88],[-14.22,0.38],[-12.88,-0.85],[0.51,-2.66]],"o":[[-0.1,0.48],[-10.36,3.95],[-20.02,0.04],[-12.49,-0.83],[14.07,-3.28],[12.89,-0.35],[2.18,0.15],[0,0]],"v":[[57.478,0.585],[55.198,2.145],[21.928,4.895],[-38.122,4.085],[-52.782,-1.725],[-9.232,-4.905],[29.438,-4.145],[57.478,0.585]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933000028133,0.933000028133,0.933000028133,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/apps/frontend/public/json/errorAnimation.json b/apps/frontend/public/json/errorAnimation.json
new file mode 100644
index 00000000..a602c482
--- /dev/null
+++ b/apps/frontend/public/json/errorAnimation.json
@@ -0,0 +1,463 @@
+{
+ "v": "5.5.10",
+ "fr": 29.9700012207031,
+ "ip": 0,
+ "op": 75.0000030548126,
+ "w": 300,
+ "h": 335,
+ "nm": "Comp 1",
+ "ddd": 0,
+ "assets": [],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": "Shape Layer 6",
+ "sr": 1,
+ "ks": {
+ "o": { "a": 0, "k": 100, "ix": 11 },
+ "r": { "a": 0, "k": 0, "ix": 10 },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": { "x": 0.667, "y": 1 },
+ "o": { "x": 0.333, "y": 0 },
+ "t": 25,
+ "s": [148, 190.571, 0],
+ "to": [0, 1.667, 0],
+ "ti": [0, -1.667, 0]
+ },
+ { "t": 32.0000013033867, "s": [148, 200.571, 0] }
+ ],
+ "ix": 2
+ },
+ "a": { "a": 0, "k": [0, 31.75, 0], "ix": 1 },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
+ "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
+ "t": 25,
+ "s": [0, 0, 100]
+ },
+ {
+ "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
+ "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] },
+ "t": 32,
+ "s": [119.25, 136.286, 100]
+ },
+ {
+ "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
+ "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] },
+ "t": 34,
+ "s": [86, 98.286, 100]
+ },
+ { "t": 36.0000014663101, "s": [100, 114.286, 100] }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": { "a": 0, "k": [20, 20], "ix": 2 },
+ "p": { "a": 0, "k": [0, 0], "ix": 3 },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 },
+ "o": { "a": 0, "k": 100, "ix": 5 },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": { "a": 0, "k": [0, 40.5], "ix": 2 },
+ "a": { "a": 0, "k": [0, 0], "ix": 1 },
+ "s": { "a": 0, "k": [100, 100], "ix": 3 },
+ "r": { "a": 0, "k": 0, "ix": 6 },
+ "o": { "a": 0, "k": 100, "ix": 7 },
+ "sk": { "a": 0, "k": 0, "ix": 4 },
+ "sa": { "a": 0, "k": 0, "ix": 5 },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 25.0000010182709,
+ "op": 372.000015151871,
+ "st": -6.00000024438501,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": "Shape Layer 5",
+ "sr": 1,
+ "ks": {
+ "o": { "a": 0, "k": 100, "ix": 11 },
+ "r": { "a": 0, "k": 0, "ix": 10 },
+ "p": { "a": 0, "k": [149, 187.5, 0], "ix": 2 },
+ "a": { "a": 0, "k": [0, 78.156, 0], "ix": 1 },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
+ "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
+ "t": 19,
+ "s": [52.459, 2.459, 100]
+ },
+ {
+ "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
+ "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] },
+ "t": 27,
+ "s": [52.459, 61.459, 100]
+ },
+ {
+ "i": { "x": [0.833, 0.833, 0.833], "y": [1, 1, 1] },
+ "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] },
+ "t": 30.5,
+ "s": [52.459, 45.459, 100]
+ },
+ { "t": 34.0000013848484, "s": [52.459, 52.459, 100] }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "hasMask": true,
+ "masksProperties": [
+ {
+ "inv": false,
+ "mode": "f",
+ "pt": {
+ "a": 0,
+ "k": {
+ "i": [
+ [-3.805, 13.022],
+ [-0.092, 37.927],
+ [0, -49.691],
+ [-4.587, -15.298]
+ ],
+ "o": [
+ [3.996, -13.582],
+ [0, -49.932],
+ [0, 37.689],
+ [4.06, 13.26]
+ ],
+ "v": [
+ [10.277, 74.31],
+ [31.587, -36.638],
+ [-30.587, -36.638],
+ [-9.624, 74.31]
+ ],
+ "c": true
+ },
+ "ix": 1
+ },
+ "o": { "a": 0, "k": 100, "ix": 3 },
+ "x": { "a": 0, "k": 0, "ix": 4 },
+ "nm": "Mask 1"
+ }
+ ],
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": { "a": 0, "k": [234, 260], "ix": 2 },
+ "p": { "a": 0, "k": [0, 0], "ix": 3 },
+ "r": { "a": 0, "k": 0, "ix": 4 },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": { "a": 0, "k": [1, 1, 1, 1], "ix": 4 },
+ "o": { "a": 0, "k": 100, "ix": 5 },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": { "a": 0, "k": [5, 1.5], "ix": 2 },
+ "a": { "a": 0, "k": [0, 0], "ix": 1 },
+ "s": { "a": 0, "k": [100, 100], "ix": 3 },
+ "r": { "a": 0, "k": 0, "ix": 6 },
+ "o": { "a": 0, "k": 100, "ix": 7 },
+ "sk": { "a": 0, "k": 0, "ix": 4 },
+ "sa": { "a": 0, "k": 0, "ix": 5 },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 19.0000007738859,
+ "op": 374.000015233332,
+ "st": -4.00000016292334,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": "Shape Layer 3",
+ "sr": 1,
+ "ks": {
+ "o": { "a": 0, "k": 100, "ix": 11 },
+ "r": { "a": 0, "k": 0, "ix": 10 },
+ "p": { "a": 0, "k": [150, 167, 0], "ix": 2 },
+ "a": { "a": 0, "k": [-4, -8.5, 0], "ix": 1 },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": { "x": [0.471, 0.471, 0.667], "y": [1, 1, 1] },
+ "o": { "x": [0.48, 0.48, 0.333], "y": [0, 0, 0] },
+ "t": 7,
+ "s": [0, 0, 100]
+ },
+ { "t": 25.0000010182709, "s": [78.151, 78.151, 100] }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": { "a": 0, "k": [238, 238], "ix": 2 },
+ "p": { "a": 0, "k": [0, 0], "ix": 3 },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": { "a": 0, "k": [1, 0.486274509804, 0.501960784314, 1], "ix": 4 },
+ "o": { "a": 0, "k": 100, "ix": 5 },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": { "a": 0, "k": [-4, -8.5], "ix": 2 },
+ "a": { "a": 0, "k": [0, 0], "ix": 1 },
+ "s": { "a": 0, "k": [100, 100], "ix": 3 },
+ "r": { "a": 0, "k": 0, "ix": 6 },
+ "o": { "a": 0, "k": 100, "ix": 7 },
+ "sk": { "a": 0, "k": 0, "ix": 4 },
+ "sa": { "a": 0, "k": 0, "ix": 5 },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 7.00000028511585,
+ "op": 385.000015681372,
+ "st": 7.00000028511585,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 4,
+ "nm": "Shape Layer 2",
+ "sr": 1,
+ "ks": {
+ "o": { "a": 0, "k": 20, "ix": 11 },
+ "r": { "a": 0, "k": 0, "ix": 10 },
+ "p": { "a": 0, "k": [150, 167, 0], "ix": 2 },
+ "a": { "a": 0, "k": [-4, -8.5, 0], "ix": 1 },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": { "x": [0.471, 0.471, 0.667], "y": [1, 1, 1] },
+ "o": { "x": [0.48, 0.48, 0.333], "y": [0, 0, 0] },
+ "t": 3,
+ "s": [0, 0, 100]
+ },
+ { "t": 21.0000008553475, "s": [96.639, 96.639, 100] }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": { "a": 0, "k": [238, 238], "ix": 2 },
+ "p": { "a": 0, "k": [0, 0], "ix": 3 },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": { "a": 0, "k": [1, 0.486274509804, 0.501960784314, 1], "ix": 4 },
+ "o": { "a": 0, "k": 100, "ix": 5 },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": { "a": 0, "k": [-4, -8.5], "ix": 2 },
+ "a": { "a": 0, "k": [0, 0], "ix": 1 },
+ "s": { "a": 0, "k": [100, 100], "ix": 3 },
+ "r": { "a": 0, "k": 0, "ix": 6 },
+ "o": { "a": 0, "k": 100, "ix": 7 },
+ "sk": { "a": 0, "k": 0, "ix": 4 },
+ "sa": { "a": 0, "k": 0, "ix": 5 },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 3.00000012219251,
+ "op": 381.000015518448,
+ "st": 3.00000012219251,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 4,
+ "nm": "Shape Layer 1",
+ "sr": 1,
+ "ks": {
+ "o": { "a": 0, "k": 10, "ix": 11 },
+ "r": { "a": 0, "k": 0, "ix": 10 },
+ "p": { "a": 0, "k": [150, 167, 0], "ix": 2 },
+ "a": { "a": 0, "k": [-4, -8.5, 0], "ix": 1 },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": { "x": [0.471, 0.471, 0.667], "y": [1, 1, 1] },
+ "o": { "x": [0.48, 0.48, 0.333], "y": [0, 0, 0] },
+ "t": 0,
+ "s": [0, 0, 100]
+ },
+ { "t": 18.000000733155, "s": [110.084, 110.084, 100] }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": { "a": 0, "k": [238, 238], "ix": 2 },
+ "p": { "a": 0, "k": [0, 0], "ix": 3 },
+ "nm": "Ellipse Path 1",
+ "mn": "ADBE Vector Shape - Ellipse",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": { "a": 0, "k": [1, 0.486274509804, 0.501960784314, 1], "ix": 4 },
+ "o": { "a": 0, "k": 100, "ix": 5 },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": { "a": 0, "k": [-4, -8.5], "ix": 2 },
+ "a": { "a": 0, "k": [0, 0], "ix": 1 },
+ "s": { "a": 0, "k": [100, 100], "ix": 3 },
+ "r": { "a": 0, "k": 0, "ix": 6 },
+ "o": { "a": 0, "k": 100, "ix": 7 },
+ "sk": { "a": 0, "k": 0, "ix": 4 },
+ "sa": { "a": 0, "k": 0, "ix": 5 },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Ellipse 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 378.000015396256,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": [{ "tm": 40.0000016292334, "cm": "", "dr": 0 }]
+}
diff --git a/apps/frontend/public/json/frogAnimation.json b/apps/frontend/public/json/frogAnimation.json
new file mode 100644
index 00000000..333129ee
--- /dev/null
+++ b/apps/frontend/public/json/frogAnimation.json
@@ -0,0 +1 @@
+{"v":"4.8.0","meta":{"g":"LottieFiles AE 2.0.4","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":1000,"h":1000,"nm":"Comp 1","ddd":0,"assets":[{"id":"image_0","w":171,"h":20,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKsAAAAUCAYAAADydM25AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAABYklEQVRoge3WsW3CQBTG8f85UUIXNog3yDUJdPEGYQxI5Q2SEaiijMEIVyKlMRuYDXAHRXwpDAUQzBkJCZnvV57Od+/5PcsPRERERERERERELpI5umPUS/EkGBymdHz9ZI1uSG2X1V2CjyyUyf6GKMf4DG8mfE/zRmdvvD9byhsL3gIxmPTks9qgpTWrb9ZhLwOedlYLwNW+iGE/AZIqUfMaGj8wByYY7/BR9m/wW0l6e+D8AsyA76lrcHc7tLhmR5q1/wn+IzDoAngI3NvUjP0C1JnTWVnG2eJM8VyuFtfstvbxznLM8t4CbwGXhSQ9B59vLwV9xU2SnoFJr7JRodU1Oz6zbpz2myjATAAHuIMzyehlgDcJMAAeg2OqkszW81N2lb/9Oi2rWXiz7hr2E4y3eNMF36UakjezUE70mzUe7Ktz4+oskvVKDGUMkasi9gs15olUMxERERERERERkXP4A4X208aieaQiAAAAAElFTkSuQmCC","e":1},{"id":"image_1","w":66,"h":33,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAYAAABtNH0cAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAACaUlEQVRoge2aQVbaUBSGv/u0ibOyg7KDOtROmqFCPQdXULuCsgS6A90BrkA81egwToRh3EHcAcxqqrkdgDYqUEDIlWO/EUle3vn5z3335d5ENk8r+8A6b5h2NQxW6Zvw2VqMNc5awGvhvxFwDeAQTYyFWJMAOFFJbHUYMwgEl2UuslViTOZiALd2uxpba7FEVWIAAdg8rSTAB0tBVrSrocDfXaNlqMWS4/sffSNEIysllmguABxAu3LWYrCfviXWUu+xEQACTRM1VogeRrut7v3hgxGZy5omgozQu5Vm/vjBiM72eYLoYeGKbLjo7JxE+ROPag0VbRSpxgrNXOPpuUdGdLbPE+CgID1WPIsGGFJ9+qnXAHoFCLKgpy7bG3bhmRHRbquL6NDBS49KYxD1z5BR92yG201Uvi5MVPFctKthMOriyMaMf+PXFa4WIql4en7q1cYNGBkRAMFRrXTjpQnwfp6qCqYnEFxWw7FV9thWXbTb6goELHHy1MzV/mUCTNCzvKyG8bKaofBt2FY5jLFLI8+n08q6QsRyLJOJlkOeibvYl9Uw9lOv/NoTqMLVtCbAFBGRZ/B27Pss9y6YYz/19vJV5aTMZATAxs8vgfQr1tfQ4ushujfoq8zEzC94OjsnkZ966wI/sE2kB37qlV9iArwgIvIER7VS6qV1hTpFJVPRQxUd+cg89XTzmOSe4KhW+uWlNaAu8HGecw+4RmXf//2uOUseGMdcjcizcbZVlruVGqIB/eeQWSPlApWWiEbT7gTTsDAjnrJxtlXmdrXsXBYAaP9zhFJuSFcgBlDRWFSSRf7xp/wBiGTMDJvgS8YAAAAASUVORK5CYII=","e":1},{"id":"image_2","w":68,"h":35,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAYAAAAt4qxQAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAACP0lEQVRoge2aQW7aQBSGvzepSHY9QjlCl7Aqy8YQiZyg5gbNDTgCuYG5gVECdAkbYOncwNwAtkjx6yI4BQTEgGGcwreyNWb069c/vJlnS7HtNIDvXAAIvvBmxg/bSrKCsS0ga1wMWSYwiIa2VWQFgYkRldC2kKygooFR0cC2kKwgKuHFkAUG5U5gRrd/QmBsW0wG6ENcZUR7NpVkAYEe/Cu7vj0pmcEHkPiu2HYmwFdrcuwyHpY7eVjcmImebUoEvPj63RB9vfLWPXwORCby4ut3Q0Z3zz3m/7RnhWhzXmmBlbOMRqZ+aj22UdH64v2SIWeXkpV0wJrT7hmlZLqaDlhjyDwljycQZBeV+mo6YEM/5HqWq/N/b+f7w0q7sW5grSG9e38iUD2uJmtM1UTupsGNHbNBuRMo1I4iySai7rqlErO1hTgqdzxEm6mLsoRCbeh0t+7IZdtgTLFz66HyKx1ZlhBtDp2u++FjSef71KYkNAN26LoPna77KZePykNSM2DH1xBDp+ui8rCzKDtMFWqbyusmEi+ZRQpPlZKYyCej/ROFFwPuoNzZuV+814uq0d1z73qWywOtfX5/ZB5vZrnSPmbAnglZZJ4WD/h26FwH0hf4va8RMQcbElNoO65AnRMbo/AiovWP9hdJSc2QmLkxLsf/oqClkWnMD6OpkbohMYXuz7y8XlURrZKeOS0F/2aW83v3/iSlOZc4miGrFJ4qJWOikormUcnz9l3Kpio1BkJEQyITqEqQdhIuJOQv1hDJF/vzewUAAAAASUVORK5CYII=","e":1},{"id":"image_3","w":66,"h":33,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAYAAABtNH0cAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAACMUlEQVRoge2aS3LaQBCGvx6nqOzwDdANzFKwQdkR4VTkG5AbcAQdwTcIOQFUGcEWbxLvQm7gI5ilqbI6C4TKYB4CCTDC3wpJM13Nr57ueUg4APagbolKWVTKKmqhYq1p/iQwCuHRwOh3oz86hI+yL8OV/lcP8FBxgFIKU2NgqND9PCl0hzfdp0wcXCBTIaI376PiAcUsbceI/tKXi/bDt94wU7NZGLHvrh0xoQ/UsrCXkHsNjZ+VIKmEsAd1S0JzC3zPwpkduRdopc0lZteOlV6jJaEZcVwRAGoKf6uB66cxsnVEOB3v8rkw6XLYYZAIhX8GmrtEx1ZCVAO3rDBkX4kwG8aINv+4g+42nRIPDTtwmycgAkARlY4duM1tOiWKCDtwmwI/d3LriCj8eGj020nabhTiVEWYkVSMtUKcSE7YjOjNppyxUoioOjxy6iJMGQs466rJymQZlcg8iABQDKHtdLzLVQ2WClHpNVq8w3lCGgSungsTf83zeaJp84j8RMMcGpovy9YnbyIiWjvkUgQATHi79PbrC/vu2uH4a4e9InC1bLI1J0S0lM49Av7ivViIauCWyVmCXEMp2kGLiYVQ0dbh/TkiKnP/17x64L1pnG9q9qBuzS4MxBut+a0UK5CXi/jlzyLi3KJhiuiCENMt93MkLg4mGidpzh1OmmjuhBGV8pF9OSrGhA58CIGKWgBm9uNsic5hzYYD2XPAghQHPDmiBB9CxHwCDvL9wXvnP59cp71qPdWYAAAAAElFTkSuQmCC","e":1},{"id":"image_4","w":68,"h":35,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAAjCAYAAAAt4qxQAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAACSElEQVRoge2ZTXKbQBCFX09UKDt0A3MDa4m8mqWEU2V8A3KCcAQdwTcwPoGUSiGyi1aJl+QEsW4Q7WRKobMZqyysH5AQYNC3ZKCr69Xr7mGGUBByZHcWrWVXiFgy0AHQ3fNJCKYnZgo/Llvh9Hb8t4g86ZTBe5OBDSbJgCTg8phYDPwmYEqA9/N6EuaVY5LcBTGDvkGxcAE4APS84ytmBHixiL3HwfenPAPnJoj57ZMkEbsAbvKKmQriByYe5iXM0YIoR9yhaCGSED+0n9vusb3mKEGufGvIgIvTlUZW5gy4j9cT79AABwliBn0DsRgf2yhPyNd2pDmHuCWzIGpyeKiOK7YxI8DOOpFElpdN33LANEL1xQCACwampm85WT5K7ZCeb90B+JI1qyrAwOe0fSWVIO9ZjBfSirJXENO3HALuc8mqbIhvf1nBeOcruxZVAx3lm1WpzAmQuxrtVkHUhivE+2igWZi1I627bSRvnzKxGKN+YgDAxbMWedsWNwpy5VvDCm+68uCmNxnYmxbelEyNSyXJvB1pRrJ03jhE/ajVXQwA0CMtcpMP1xyifuF/FJdT6cxZxN3XRwdrDlHnGU1CV4dZK1YOUb3jT/E5lc5aL1k5JKlUg9AXWrSaOK9Lxik+l8qwMoMA1Ba9GZNlIwRcmkHfAF4cwiRLzKcS0L8PNqAEYUCWmk0VIJYAIOTI7tR8m54WCQBi0Vruu1JsCroZ9A0hRCzLzqQqEFNXqIvnM1CCYP8tfKPIdA1RdxiQZ0ESnAU5s5v/GNG2dQAlMzcAAAAASUVORK5CYII=","e":1},{"id":"image_5","w":189,"h":82,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL0AAABSCAYAAAABxdVnAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAT0klEQVR4nO2dX0xbV57Hv+dCDAiHeBJtgVVmMGyM1O4mMeShEE2Jq8lDYmeEq9Es1URNXNGpdpqOQvrQRGqYukMiNfMwcbQ7kTbbqKZVqzIPg6PGTh9SraGjQrWqgSClI4gSo8muDVKyQMySOMZnH7AZh0B8fudeXxuaz5vhnnOPj7/3d3/nd/78GPKMrddpul+csDLGrYxxEwdsAsWGGTDNGR/mjA8P7v8inONmPiVF05V9ZsaZlXFm5YAJgDVbGQYEOWfTnLPh0kTxcPAl37QOTX1Se/TF1us03TfEnYxxGzizAajRoNoZAEFwFuRFC76nD4F2NF3ZZ2YLRU4wbsOiQdqkQbUTYDzIOQuWxg0+vR8CXUS/JHTACaA11/fjwAjjzPv0AZAjLXTOuIsBO3W45SUO+PR6AHIq+tSr0A3OnNDGQshwiScVz+BPLwfzdP81Q9PnB2xMSXZAB8O0CjMAvFxJenJprHIi+gyxH85F/ZL08aTifir+x0mJ3Q1gT77bsgTj3Zxxdy7Er6nobb1O0wND3A3gqJb1akwfV5Kup24PsNtvt3LAg0IS++OcK4kb3Fq6PZqJvjmw3wnOvMifG0OCAe8Z4gZPviMJ+cDW6zTFDfEODryb77YIMgPGXQP2Kz4tKlMt+pR19yJ/fqA0HBhRANfXjsBwvtuiFynr7oM2UTO9uVQSN7jUGipVol/jHbgEB14ddAS8+W5Hrmm+7OgA42fz3Q6VTDDAqcZQKbIFm/x2FweGsMYFDwAM+LA5sN+b73bkkubAfu86EDwA1HBgqMlvd8lWIGXpd/vt7jXkD1LoK4kbnOvJz0/NkQR1irfrCgPe+9oRcEuUo9Ec2O/NVSiycct2VJdVoqqsEgBQX1EH44ZyAEDozigAIJaIYXz2JsZmbyL2cE7zNnBgpDRusK0H4edS8MYN5aivqIOlog7GYiM2biiHpaIOABB7OIex2ZsAgOj8JCLzk0u/n+Yw3j1gv+IiFaFcrLXgLRV1cGzdi8bNO7CtopZcPjo/hdCdUfRPDqB/ckCrZq0L4WsteOOGcjRu3oGWymY0btmOqrJnyHXcmL2F0N1r8N++ivHUQ6EJROELi14rl6a6rBL2rXvh2LpXquNWI5aYQ390ED1hnyYdyoGRQUcg62KqQkRLwVsq6tBmdqKlqgnG4nItmgdg0WD5b19FT9inyRub4uoIib7Jb3cx4EM1jaouq0S75SDsW3+iphohhu6O4uL4J+pfqRKvzkJAizdy45btaLccRMPm7Vo1a1UCt7/ExfFPEJmfVFWPaBQuq+hTYckhNY1ptxxEW22rppZChK8mB+G5fkFVZ8oOlvKF2jdydVklOp57HS9UNmnZrKzEEnPouXUJF8c/UVUPAxqyhTOfKPrUxNMwJMOSloo6dO54S8pf14pYYg7nrl+A//ZV6Tp4UnlxLazZSa2h+U/Z8m21rWi3HNTdOGVyY/YWuq79Xo2LOlESN1ifNB4relLp6kN1nwF4XubObbWteH9XJzaX/ECmuGYYFANaKptRXVaF0N1riCcfkutgjL+47ef/6A33/OV+DpqoCbZep2mhODEIoJRa1rihHG//06/xyj/8HAbFkIPWibO55Ad46Ud2ROenZIVvWihaePb2p+OfrXbBqpNTzYH90mvfT+54C0effV2maM6wb/0Jzj9/ZikESqTmQckDj9Zt0pLUUhDyuifjhnKcf/6MLmMtCu/sOIaTO96SLd6a0u+KrOjepNyaMCQ68eSOtwquAzO5MXsLx7/tkvLzC9XNkXVrLBV1OLOrU9MomtYEbn+JU9d+L1N0piRuMK/k5qxo6VPLg9ed4AFgW0UtzuzqlLL4TEl6tW+RemTaZdxQjj80vV/QggcW39CSFn9TSseP8Zilb7qyz8ySyi3qHbQWfDAUwnTsHobHx5f+Zq6qhrm6GtZ6C0zGjarqvzF7C298c5wcIy60xWky4eS0S6M2wDAdu4fhsXGEIxGEo5Glv1sti7+PrbFRVf2ZyFp8riRrl++dKF5+EePMTa24rbZVteDDkQh8/X3w+v0YuTGe9fqaqio4W/bA5XDAaqkn329bRS06d7yF4992kcoxwA3AS75hDrD1Ok0PECePNc7s6pQWfDAUgq+/D77+PkxEo1mv37nNApfDAWfLHpirq6XuCSxa/KHUbC6FlJ5dj/wt84OMlbdU1KH7x/9Kakgm4UgE7osfoDvgl66jpqoK7vZfwuVwkMue++4Cem5dIpUpFGsvY+XbLQfRbvkF+V5evx/ui/8hJPTVOGx3wN3+mirxH/7zr8lRneXW/hGfXsbKd0qOsKdj99DhOYvan72kSvAAMBGN4tXTXbAd+RWGx8dIZY8++/rSQilRUtY+71DbYamoIwt+eHwMtiO/wqunu1QJHgC6A37U/uwldHjOYjp2T6oOGb2xpNKR+XlJ9LZepyl1aoEw7ZaDUq/J4fExWA+9gnN/7CGXfRJ9Q0NoOHwIXj/tIep4jhxerWn6/ICNWkhLUiE50qQh9Xt6/X40HD6EviFVE/KPce6PPbAeeoVsoIBFt7TdcpBazJX5YUn09w1x0jEd1WWVaKulh/F9/X2wHXlDtdV4Eq+e7oLrlLiv3rB5Oxxb95LuwYoWXMRmaQtnpPs7tu4lraNxnerCq6dp4x0KE9EobEfeQDAUIpdtq21FdWr5uSCbMjedLIk+dRCTMDLT1b7+Prx04jhmYjFSORm6A36S8MnWg7PDtl6nidgsTUjdl2RxKN/PdapLtcspwkwshhffpAvfWFxO/r0y9a0A9E5cXB5Mi9YMj4+RRKgF3QE/PD2rzkY/QlXZM2Rr/6DkgU2iWapJvZWFoSzjVhtUkMF54m2yq2Pf+hPqXEtr2kgpAL0T7URxTMfuwXn8bV0s/HKOnfMIW5I2M6kbAOLbUSvY4rmSwoh+r2AohPcufiDTJFXMxGJwdXWRB7fU3yttpBSA3olUi+j+4IOc+vDZcJ36rVCHbquopfmKiwfQ6g8h4GCpqBMKNkzH7sF16reqmqWGkRvjcH9Ae+CoOkTKSC369IQfz1JRR5q6DkcimkdpqExEo/D0iLWBODivabqyzyzTJll2++1WEAIOosLw9PTk1TABi1GdcCSS/cIUVWXP0MLNKZ0rKT9HOPRFtvJ5eF2uhKfnMyFr37h5B63ipGKTapAkSYHz4DMR+T7TsXvCY59cQ9ULUY81tl6nSblfnNC8E9OEIxHdB0WrMROLwdfXn/W6bRW1pAGSAphVNIsMI4i+uqxSyLXx+v15GW+tRHfAT7L2VCN1vzhhVRjjJNFTJqN8/X2kBuUaUWtG6UjBzClaIvx7ib76qZN5uYaiG+rkKGPcqjDGhWPNjVtom4QLTfQjN8aFXByKn5hKQaMnZtELRb5HOBIRWuCnJ1TdUHTJGDcpFEtFnAXTfPpaC0TCl/UE0efh5DDh8ZfI95BZCpBrqLqh6JIDVtJZllWEymWml/Ugc33+akhuKSw4RL6HSH/kA8rDSNElAJP0Aa5rleGx7J25sdioQ0voUMOjIhZQpD/ywfS93A2sSaKnvPaDQ4Vp6UUnqSjotuIyUWymXC4ynyK7xDfXUCz9RuKbWQEhGrBeXvtPKXymCSFU6n4IBcD3JgvHU9Ynkf+bIl1Pcm8o27SsFgupIYVEdJ7WiaWJYl0Mh6Ik1+wpylRsDeKbyqnHuZBEf49wcoDa0wpyha1xV9ZrqJ2o15He1JQzQ3ezH2Ars6l+rUMSfSwh7mdZ6wvT0pur5Dclr0fUbNLOJZTjQyi6BIg+PcW9MRk3Yue2whO+SGcSj/iekG6MHDOiF4r8XlqeTaMVVN1QdMmAoMIA4VfzGPHohULr0JqqKiHLFqW5N2HZ9kiiqZGyWupRU1WlqkFaQ9UNVZcKZ1y4E2MP50iDPJlzaHKJs0UsMTbR0usb/WI8LHqpqBhE+0UvKLqJzk+RTqlLJpUgSfQATRBWSz32NDRQqs8pHW0vZ70mOj9FG8hyFpZvkQRJhWTpY4nsghDpF73Y09BAGlyTs80UJ8JK6uQnYT+RmtDM3f5LWqNyxGG7Q8i1oXYiYzwo2SQpOGckI9UfHcx6jbm6GofthfFWpuqFqMeZwf1fhNPRmyDlJiLWI42tsTHv1n6T0Qh3+2tC11IfajWZq2WgHhUu+n3c7a9hkzG/a472NDQQozZz1N8rCPxtj2yQUlLEemTiPfmbvHao6PmJ0fkpaifSDsHUDuH79k8OCI3DzNXVwoYhF2wyGuE9+RtSGaoO0zpXAIAXLfgoZXvCpMthrq6G5+gxUhmtaH2hRdhnJeelIhoLzSDeV/R7dbS9jNYXWmRapBrP0WPkOQOqDtM6VwBgcP8XYQ6MiBYen70pNNuXicvhwNF/biOVUcvObRZ4OzuFro0l5qQ7UW9kjJSoS+rt7NR9fuXd9tfIkb6hu6Ok+DwHRtInF//tWD/OvJSbyqQ+9HQc023AtHObBcHz54WXQ/TcukRN0NC3/LB/vaAaqdjDOeHjyE3GjQieP6+b8NPHd1Oh6i9T30uip1qP0J1RfDVJ9KkAeE924sN3xKyvLK0vtJAEH52folv5/CdmICVjoFj7tPBz7ep8+E4nvCfpWgjc/pIcZcvU95LoU1aLNDDzXL9AiuSkcTkcGOr+SPOZwE1GI84e7YDvzO9IC9481y9QrfxMadyQF9cmTer+wqHm2MM5nBo5K1y/ybgRvjO/w9mjHZoHIXZus2Co+yOpyctYYg6e7/6dVojx7lWTMvCkQrIekflJnLt+gdaAFFZLPcJ/8uFdjUJlh+0ODHd/TJ5o+WpykBymZIBHr5WVq5G6v5dSpn9ygPx27mh7GcPdH2vilqaN0vBHH0uv7jw1cpaeJ2yhyJv5+bFEa81+exAAaV5abZK16dg9+Pr64Q1cJu2Er6mqgstxAC7BiaflROencOjPb5Kt/GqpGvVGJl2ScUM5Pvrxv0llFQxHIvAG/PD6L5OOAGx9oWUpP5gaJJOt9Q04ArbMPzyeXVAiJ6lW2eqAxQcgGApheDyVtS7yP0v/Mxk3wlpfD3NVNWyNjaqWxcYSczgyeIKcv4gB733tCLilb6wxzX67B8BRShlLRR3+0PQ+Ob9AJuFIBMFQCOFoBMNjY4/stTVX//1iFkiLBbbGRk32Vkhng1wh9++KyZNlrL2WwteDN785QV+3UUBWPo1souuWyma8v+tkbhqlMbKCxwpWHlhlEwlXki5q7bGHczj+bRduzJJT0OrO6WtnZQQPcOYuJMEDKd9eIkFe/+QATl8TH9jmCxWCX1XHK1p6ANjtt7s58C71RoVs8WOJOZz4tktK8BwYGXQESOd+6kmT3z4sc9pa45bteH9XpypXJ1eoEfyT3NBVtwsa4gYPZQIkTezhHN745rhUDD+XROencGRQyqUBACjLMtQVGrLtC90ZxZHBE+TN8Lnmq8lBeQsPjDxp3FW02j/CPX+5/6ODlkEA/0K9aTz5EFcj/Ygl5tD0d9k3YuearyYHcey/OuV/WM6ODRwI5DUun42/fjoe/eEv6mfAsI9a9u6D/4X/v6/CbPwhaoxbc9E8Eue+uwDP9QuIJx/KFJ9RAOdfPx1fNby0qnuTRiYrdSaWijp0PPc6KZ2jVkTnp+C5foEch1/GpQFHIC+5pWRo9tt9IGYezKSlshkndx7Li7szdHcUnusXyBG1TESyuWcVPQA0B/Z7wdlh6ZZgMWNEu+WgVHyYSiyxuNakJ+yTej2m4cBIadxgK7TB65Ow9TpN9w3xoJrTlI0bytFmdqKttlUX8Ufnp3Bx/BP6KtflMN49YL/iynqZaH0yYcyVcGzdizazMycD3ej8FPy3r6oWe4oZriSt+VpUpobdfruVL26YIIUxl5MWPyUlJ4Whu6MI3L6qXuyLrBieXAlh0WthQTJJZxxv3LxD1QMQnZ9C6M4o+icH1LoxmcwwwKb3rigt0Ur4aVoqm9FS2YzGLdtVPQA3Zm8hdPcaem5dIh+qtRrUN7Kw6AHthZ/GuKEcjZt3wFJRh/qKOhg3lGNjsfGRhyFzw3boziii85MI3RnVrOMyWPOCT6O18NOkf6eqssqlLCCWirpHXKEbs7dwLxFD7OEcxmZvYnz2JkJ3r2nxBn4EGReUJHogd8IvENaN4NPkSviFgOyYiyz6NFoMbgsJDoxASTrXog+fjd1+uzUJeNeVoRIctK6EdCaSAfsVFwPeky1fYFwqjRts61HwwOKJDaVxgw3528iuLZwdkxU8oMLSp0mtyvSCkACsoODs2MABP2kfwVqm+bKjA4wX/qKblZngScVFPQZlOapzTg3+9HKwJG6wgvFutXXpCQdGGNDwfRI8AAwc8HsY0CCzxCTPnCuJG6xqBQ9oYOkzWSNWfwacub9vYl+JlNV3o7AHuZpY90w0FX2a1NIFNwpL/DMM8Bjihrxv9SskUuvx3SBuRNGBCQ64sy0pkCEnok9TIOJ/KnYBmq7sMytJxcWBDuTX8udM7GlyKvo0TZ8fsLGiBZfOIc4+DnhL4wbfU7GLk5qHcQLo0DHEOQPGfXyhyKulG7Mauog+ja3XaXpQ8sAGwAnObND+DXAJnAV50YJvvYYf9aTpyj4zWyhygnEbVKzcXIUJLJ747Ct5UBLU0zDpKvrlNF3ZZ0ZSsSmAmQM2DpgErcsEFjOADIOzMGM8uJ5mUQuV3X67lXNmA+NmLOYfNkPAcKUiZdMMCCaBMJRkMJ9GKa+iz0ZmJu7SRPHwUzelcLH1Ok33ixNL2yn1cFNk+X8IR6ESYButKwAAAABJRU5ErkJggg==","e":1},{"id":"image_6","w":120,"h":148,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAACUCAYAAABY4u0rAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAH4ElEQVR4nO2dT3baRhzHvz89V2RXbhBuEJaYTdVdjN0X5QSlJyg9QckN6A2UE0BeCu6uZFOyq30D+wZmZ6l5+nURkSfLEgghaaSZ32en/wMfzcxPM6MRQSgdZ+52H+3AJWIHTL0nG4nvmGn9IrAX67eLh6rTQlVfwCScudsN7GDCwATA9wd23xIwswN7VqVoEVwS56sLF0weDotNsgXTdHO1nFWQLBFcBuerCw9MP590EuL3Hb8zKTs3i+ATcOZu17eDBYAfyjgfA7cvAtspU7IILkgUSK0JeFXmecuWbJVxEhPxO/6sbLkAQMCrRztYO3O3W8b5RHABzpej2cl17h4IeOXbgVfGuUTwkZyvLlwAv9ZwqTfD5Wh66kmkDj6CKKi6w/GPQoXh0Prx809/roseLzn4CKKIuTa5AEBW6J1SH4vgnERFcymPQ0fy0reDadGDpYjOQVQ03wB4qSoNRYtqycE5COxgAoVyAYCscFrouJLToR0qAqssGPjl8+XKO+YYycEH8Dv+DA2QCwAETI89RgTvwZm73SobNArwcrAcjY85QATvIap7G8WxuVgEZ+DM3W7Ucd80jsrFIjiDRztw0ZC6NwkB47z7iuBsmph7d/wwXI76eXYUwSkMl6N+FV2BZcLEuW5AEZxC3j9PKUxunt1EcBo5/zzFfJ8n2BLBCaJOhUYGV0kIOHgjiuDntCH37nhzqCtRBCdpR/H8jehxLhMRHKNNxfOOQ8W0CI7D5KhOQgHe7Nsogp/SquJ5R1TypCKCIwbXr3tQ3KlfmD0ljwjeEVqO6iQUhQEna5sIjiBiR3UaikLAq6zHJRG8o50B1jf8ju+krRfBaHn9uyPjBhXBAIgpV9dbw0n9DSIY2ghOHZQvgrE/Cm0TaYMARPBXdMjBCFN+h/GCowCrVe3PWVhAL2Wd4Xw566lOQlmkVTXGC7as0FGdhhLpJVcYL5iJe6rTUCLPnuWNF/xsqsGWM/h45cSXRbAmEXQWIliTCHpHMqYwWnCyONMRowXrSPJRyWjBRKx1/QuI4FKmC2wSDDz5TUYLTv4ZOpB8ac5owdD8EQkQwdojgjUk3i9sumAVUxNWThha32IL0wVrjwjWHBGsOSJYc4wVXNZHL5qOsYIfz75o38gBGCzYFESw5ohgzRHBmiOCNcdcwWdf7lQnoQ6MFfz54q871WmoA2MF60z8+0oiWHNEsOaIYP24jy+IYP24iy+IYM0RwZpBwDq+bKxg6Q/WHF37g8PQWseXjRWsK5YVPjxZVpUQ5VhhT3USquCfy9VNfNlYwWlzSrUdBm6T64wVrNnsOgAASjwDAwYL1m12HQAg4Ca5zlzBGr6XlIygAYAUpEM5w+Woz8C/qtNRNpvL1TOfRuZgbvn0/WmkBViAoYLR4g9wZJFsotxhpmBNJgB/AvE6bbVxgtv4fcI8dPzOOm29cYLR0s/X7YOB2/XbxUPaNqMEO3O327bPx+aBmLysbUYJjr61q13xTBn1L2CYYAKmqtNQAffJDoY4xggeLEdjtP3rZuks9m00RrCmuRdshbN9240QrGvuZeD20Cs42gt25m6XgL13eYs5+Lu0F+zbgQcNI2cA2xeBvbf+BTQXHLVavVGdjkogXmQ1bsTRVvBwOepjTwNA22HiaZ79tBTszN1uCHjQs2gGgA9532/WTrAzd7uPdrBOznyuExxauYNG7QT7HX+ms1wAn+IveB/irMKE1Iozd7u+HXhgTYOqCA6t6TH7azEmy4RiOeLT5nLlHHNA64vo4XLUN0Qu2ArHxx7TasGD5WjMgBFyAfxRZGagVtbBztzt+h1/BsbPqtNSE9tOYE+LHNg6wYOPV45vBR6YtOs8yIKBSZ5WqzRaE2QNrl/36Ovzn9ZRcgpHB1ZxWpGDh8vRlENMoG/LVBbbIoFVnEYLHixHYwKmrGFfbh4YmJw65WIji+idWBgqNuLD5nJ18gjQRuVgEfuN+05gj8s4USNy8ODjlUNW6EHEAsCWAGffSMljUJqDI7FTINTuXd2iMDDZlCQXUCQ4euTxROxTCHi3uVx5JZ+zXobL0ZSB3+u+buMhfr8ZXY9LP23ZJ8zCoB6fIpQSMadRSxE9uH7d88PghsxrqDgIA7cvSoqY06inNym0FhC5z4jkOkXbmfNQueDo2VaK5QR1yAVqEEzAuOprtA7i93XIBeqpg7Wc1bUwFUXLWdRRB1d+l7YGpt/qlAvUI/iuhms0nS2I326ulrW/BFe9YKaDL0jpDAO3BDib0bWS/6FywZ3/vvMAbKu+TiOJgqmyOg4KJaGOixjYPLkF8VhVro1TS0OHHdgzJD7YpDEfOoHda4JcoMa26Khr8O+6rqeAexBPmiJ2R20D3z//9OeagHd1Xa9OCHjXCex+0+QCCroLz1cXHph0GbD+ga3w5IFxVVJ7h3/H70we7aDf8vbpTxxa02Ne41SFkjFZLe4bbo3YHcoG3UXv896gDQPtiN8z8bTJRXEWSkdVRt9OWKOZfcX3YJp1/vvOq6PXpyqUD5sdLkf9EPAaUlxv8TUtnsrWpzJRLhhQXiffA1joJDVOIwTviJo0x6i2Xr4HcMPAAla4bmO9egyNErzjfHXhgslhwDklV0c9OQ8ErJn4holvdBeapJGCkwyXo34YWl0i7hNx6oedmemBmb4WsWdf7kwTKQiCIAiCIAiCIOTif1QLe9RC+y5vAAAAAElFTkSuQmCC","e":1},{"id":"image_7","w":120,"h":148,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAACUCAYAAABY4u0rAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAILUlEQVR4nO2dT3baShbGvyvniZ7ht4LQKwhvBp5EwyD8TvAKQlbQ7OCRFbSzguAVmD4O2LPIE5tZkxU8sgN7FtSxbg8QNuafBVJVSVX1O8eDHDvSZz7fW7f+EyRQu3xXoYeDFog9AIeL3yMgANC/aQ7HMrSYBol8eO3i2CMn6gJ4m+DHfzDQHTWHPZGaTEOIwd5563Dqhl0A/9rjv1+zE7VHjatJtqrMJHODjwZ+lYE+gNcpHnMP4vatf9nPSpepOFk+rHZx7PGsTU1jLgCUwXReG/jt9KrMJjODawO/TU70DUA5q2cS8MWanI5MUnSclgNkaO4iDHy0xdd+pDa4dvmuQpEzhiBz5xDwh+1K7U6qFO2dtw4ROX0INhcAGAi889bhyz9pWSSVwVM37BLwJisxL1CeumFP0ru0Ye8UXR82WmA6z1JMIohPbPcpOXsZHA9kjJG+O7QP96XQrQQn/TsF7y4ce6XoeJRKhbkAUJ6WpqeK3l04do7guGr+W4SYXbBVdTJ2jmCKnJ4AHTvDgI3iBOxkcO3i2EOymSEZvI31WLawk8Hx1F9uyJuePJK4DY7ndr+JFLMPti3eTuIIpoOHtkAde8PEHdUa8kyiCM5L5byJUuj+bvvF60kUwRQ5uY6S6W//a6vWkFeSpui2SBGpsWl6Iy8aXB82WpAwW5SS17bLtJ6XI5ipLV5GevJaBKpmq8Hx/Ot7SVrSwdRSLSGPbDX4pxsW6UMrx82JZYGtBhNQtA+saHqFs9HgQqXnOTZNr7DR4Glp6knUkRXlo4FfVS0iT2xL0UWNhqLqFsJmg5k8eTKyI7IGP2OtwXGaU7UkJxUEvLHLa59YazAXNHrnFLR+EML6FD3bqF1YiMkWWjGb2uBCf0AMeKo15IUVg2uX7yooaPu7QF7WjSlnxWBd0pvtD8/Q1uCiF4pZsWKwNu0XcUW1hDywrsjSIoKhz++RimcGxwMEeV+9kRRbaGHJ4J+vfmn1Vx/3CIzmeYp2oooaGYL49aqiWoJqnKV/VBTpEILjRJ5qDap5ZjDbwkQ7lqtorWZhtOnypWDZYK0imDX7g92HZYN16SIBmM0Nq9agmkeDbZdCT54iWNMuhemTDpmeNptHosgxuh1+NJgOHoz+IHTlyWBNpgmXMX2wQ/sUbTrWYM3R3mDTBzseDdb4g9CytkjKYgQb/UHoivYp2nSswZpjDdYca7DmWIM1xxqsOYsG2yN5NeRpsgGwp7VqiE3RmmMN1hxrsOY8GhwBE4U6LIJ4iuDImaiTYRGFTdGa82Twq18TdTIsong0eNS4mijUYRHEcoq+V6LCIoxlg+1wpWYsG2yHKzXjmcGkZwQbfRjL8x3+xDoabDTPI5hpokiHUEzeYfjMYF2vaTV5h+G6owy/qxAiEpM3oK0eRqphO8wGn1u5GsFMgQIdYjH45NkVgx09u0qvTb2oY8XguNDSbsjS1Is6Nk0XBjJFSMLI+5TWX6sD9GULEY6h9xquj2AnCuTKkIKR18+uNXjUuJro2B+GgWl645Id0rEdZvpgWjW9zeCeRB3SCN2wo1qDTGjbN+sDf4LiX5K1zH0pdCvBSd+Iue+XrnjvSdIhk7JJUbzV4MiJepJ0SIWBjilt8VaD45WW13KkSKU8dcOeahEyeHHhO+uZpgHgvQn94q1F1pz6wL+DZqfBx2hfcCXaukLAqWghiihP3VC/YdkFEhnshu4pNJxhinlbHzZ6qkWIIpHBwUn/DsT6/qUzfagN/LZqGSJIvLuQibsCdSiHgC86mpzY4FHjagLiM5FiVKOjyTvtDy5NSx3o2xYDmJl8NPC7qnVkRaJu0iJHA7/LwF8ixOQK4rPStNQpehdq5x3+cUX9Q4CWfMH04acbBkXfFbGzwXFFbcRgPQFvGAjqX5uF/X13TtFz6gM/gFk79/7DTtQp2kkIex/Cwk7UhuYF1xLvKXLGRYvmvSMYAOpfmx0Q/zsrMQXiB0dOe/Tn10C1kJdIZTBgZKpe5JqATp53ZaY+J6sUui2YlaoXecvAf+vDRi+v1/OmjmAAqF0ce+RE37J4VqEhPmPibp4KsUwMBgwaAElCjozOzGAAqA/8PoD3WT6z0OTA6EwN9s5bhz/dMCDgTZbPLToEfHJD91TFsGemBgMzk6duOIZ+66nToqRrlflps8FJ/45me4BMraw38Zqc6Ft94Etd/pR5BM85GvhVnu1v0nGxXjqIz279y7aMVwk7L/qmORwT4MFG8ipMH2TNOQuL4Dk2kjfDTvRP0RW28BPfbSRvhh4OhC+8l3Kk/01zOGYnqmq6qXxviFj4/ihpdzaMGleTf4SuBz33OuUWqZdyBCf9u9vm0NN9dWZSZFxlpOTWlVv/ss3AR5jeLks47EbZtTqj5rBHgGdsu0x8JmOMWum9STfN4Thulz+r1KECWTtFhPeDkxLPKfdgxhj259vmUMrartzcfDb682tQCt0qAZ9UaxEJA99LoduV9b7cRPAi8ejXKfRb63VPgCdzDVcuDZ5THzZaYDqFJmmbgY+j5rAn8525NnhObeC3CeiiwEYT8OmmOewqeG9xKKzREqcHV16t4qVpiVN3B0VooxWaCxTU4Dm1y3cVYurGZ0HnbzpSsblAwQ1eJE7fLeRlVWcOzAU0MnhOvLKzFZvtQU1kSxvIeAntDF6mdnHsOU7k8cxs0W32NUdON0+b0rQ3eJmjgV+NgCoBVTx9pYnyazD1+eChn4edDMsYZ/AmjgZ+NYqcQzp4OCSmjcc2MPGYHw7u8OrXJI+GWiwWi8VisVgsFotlK/8Hb+tpD5qGoRAAAAAASUVORK5CYII=","e":1},{"id":"image_8","w":209,"h":103,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANEAAABnCAYAAACeqaeHAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAIiUlEQVR4nO3dT1MjxxkG8KcHaSA+sFRh9oRiUakS2ZN1cJy9WSfXBu+Bb2BxWdic2GNOwZ8gcAm7e7H8DbSVFPbNonKxEx+kE4aLRYmTCVUSlUrMH03nMDNaAWIlxGj67dHzq1IhQCu91ejp7unp0QJERERERERERERERERERERERERERERERERERERERHFQI3nWtceFzv2X31VG8hq2Ws/P4JepfPBdNrj1Uw9u/v2X39VvfSRdtfY4i7CNnXYTf/1XNeqXiDZEzz9ehlYlAA+u/aYGoA6oKoAKpn6pYrPajPS1pfnj7/LwJvIAsoBXAFQWwAcRvsIhoOuAqkKhDq2qY91h+R131r/poN3x4c0H6l3AKUbZEUUXorXHBUB/e4d/EbwJnAqUV4V2qtb2sJ3A6OCmPjFYTQ1ApdNh2dqmvbwdVQqAngnaOo+bnXY/NUydFaLqyCMM0ceVCN48LUBX/TeAqsJpV0cx/N7L2uMslJeHdvLBCDPMHzFOQZs6FdgyCxh4VLkHhRfY/n4zmqeKytrvdWTPdYPeBZw6lK7GOm252vPl/a+iAzOoWjBS1WEqWNGNKkPSu3j5z0IUz2RJiHp6e0wA1QymhP4bYdCQ9T7IzwJe1vCUzBC9C6hmEDAAqAC4+wF5d7sqb8YftYFg5J5B1KPKUGSGqI5oD5yJRmkLL79fj+KJnCiexKdK0T0X0aipSI6HAGAiqifCD0cVfJRZAJDv+1gio9RKlMfV0Z9s9Ze6lwUs9Yo1P5fCe5N+0+fmU30ff3B0CQD475nG0fHlSGtLqBqgm8EKZSnqZf/R7FjodvOko/Ql4cjMz6WQmZvA7LSDxUwas9P+/fsKw9T4uY3G8SUax22G6+1Sfh3hquOIdihcN/oQ9XLlXIvOw58CWr0oMTvtdEKzmEkjN5+OvYaDowvsNy46oTo59WKvYdTCUfzg6PILhNuhDJ/7MhOiHv70j0+fnp/rv+03LnBy6onuXX81qZCZSyE3n8JiJn1leiaJ346XOAiCdXB0YbqkgYTtOzvtdEbx8Geh1cUdMQ3ef0Iek1+/7/7HcbwbPfjB0QUaP7dxcto28kbw/5ATyM2nkHmY6vxxbeDX7iL/G7fzs0YwDTwKpoGN40v87yzuU3y+sPPJzacwOz2B9x84g3ZItTjqG5SYEAGX9V4r7rn5m1Ojk1MPJ6dt/Lvlf/W/94Lfte80jel1kJ95GP5x45+SjVpmLhX06JNXfh52TvsN/2vjuN0J1zBBCzuft/cdvDfpIPNw4saocmcaorYtiRkSAeDV/pKZLpHsorG7+tudgukyQnbMS4i6KV03XUI3aSE6NF0A2UDVTVfQTVaIdOfqTSJryAqRsGGaZPI8p2K6hm6yQiRsmCYahKgQKcXpHPX3/NHfK6Zr6CYqRO22UzddA4knbvFJVIik9TAkkMDFJ1EhCojraUgQFVyyLoi4EClA1qf7kCgSj5vFhUgzRPRu4t4f4kIk7RwAidJ6ltthiPqZmkqJayQSQssbhQCBIVpZKDch7HoREkLgogIgMEQAoIU2FpkldaovMkRK64rpGkgeqecRRYbIdScrpmsgWRTwxnQNtxEZopWFchMau6brIDm0VhXTNdxGZIh8qmy6ApLD022x7wexIZLcaBS72vNH39RNF3EbsSEKGo1L3YTgvzAVS2yIAIhvPIqH9FmJ6BBJbzyKgcau5KkcIDxEzx99U5e8tEmjpxyUTNfQj+gQAYCGLpmugYxppdOu+NmI+BCtLn5dBi/UG1O6HOylFE18iAIl0wVQ/DxPb5iuYRBWhMh13cj+f02yhAULCiErQuQP6for03VQfDztbJiuYVBWhAiwZ2inCGjsSt2x3Ys1IfKHdo5G48CGZe1u1oQI4Gg0FjR2n+V2SqbLuAurQsTRKPlsOhYKWRUioDMatUzXQSNg2bFQyLoQBcueXPJOIOVg3XQNw7AuREDnvBF3MSSIVtiS+Jlyg7AyRCsL5abnOUXTdVBkWpNpd8N0EcOyMkSA/8kv3OGdFLpowx6521gbIgBIu24RXGSwmgLeBJuMrWV1iILtQEXTddDQWkFHaDWrQwSEl0rw3JGd7J7GhawPEQC47uQ6+KEmVtEKW7ZP40LKdAFReX2wlNcaFQAPTNdCfdVWF3fypouISiJGIgB4ltupKmXnybox0/I8b9l0EVFKTIgA4Flup6QVtkzXQbdTCgVbLrYbVKJCBABruZ11LjTIpBRWbN2V8C6JCxHAhQaRtHph2yUOg0rMwsJ1X/60PHN+fl4B8KHpWkh/tbr4ddF0FaOS2BABDJIMyQ4QkPAQAQySWckPEDAGIQIYJDPGI0BAQhcWrltZKDdd1y2Aiw3x0OrFuAQIGJORqNur/T+UAPW56TqSKljGLpmuI05jFyIAePXjZ+tQ+i+m60iYllIoJPE8UD9jGSIA2N57WnAcrwzutYtCzXXdQhJ2ZA9jbEMEANt7T7KOckpQ+MR0LbbSClv+LpHxNdYhCr3aX9oA8GfTdVjm0POcoo0fcRU1higQXEpRApfB+9IKW5Npd2Ncp2/XMUTXBKPSOnis1AtHnx4Yoh62955kHUdtcCm8owVgc3VxZ8N0IRIxRO/w+mAprz1sjvnCwxeu625y6nY7hmgA23tPC47yNsYoTC2tUNJtbzNpF9CNAkN0B/7ig15P8DTvEECJI8/dMERD+PKn5Znzs4silF4H8IHpeu5LAW+gUB637TpRYYju6fXBUt4DikpjGXYFqgatSp5ulzllux+GKELBuaZlAMuQd76ppYCK1qrC4ESLIRoR/xqmswKg8tAoQCGPeM89HSqg6odGVXluZ3QYohht7z3JAqms43gFrTCjPPgfYDj8qt8hNOpKoamBKrRqelpVp6ZSVS4MxIchEiYM2m2/Z0Dk+T94xiI3Kf3YnwAAAABJRU5ErkJggg==","e":1},{"id":"image_9","w":221,"h":151,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN0AAACXCAYAAACRB14QAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAKjElEQVR4nO3dS3bi1hYG4H+fcsA9M4NiBkUTuxPdXhlcK9QIQkYQZnDJCEKNIHgEppYNTlN0yu5dPAM8A9MriEv7NpAcbIORQG/9X8sPkE7nX/s8dI4ElIiTYaPmOKYCAMY4lvd3BSoAaqHcRHQqKtOna4tO9Me7BwA4fDyY2J8HD6HchwKRpBuQR9ZFq/L94LEG41QNUFXRKlSqClQE+JB0+16YAZgAeBBgoioPqjLBweP09vTvacJtyyWGbg9euES0BtEqlhWqBuAo2ZaFR4E7AaYCTFR0oqIThnE/DJ1PXsCMcSz9N1zvk25XgsYAJgpMYBybQfSPodugfv2xCsdYAtQUsFLYLUybGQAbKraI2t+ao0nSDUorhs5lXbQq8/LcAtCCioViV7EwMIQbFDp0J8NGTVUsFW2zkkXuHqI2gMFN43qQdGOSVLjQnQwbNQXaAFpgNUvSVwUGh4vSoGhLF4UIHYOWeoUKYG5DV7/+WBXHdMCgZYvoOXLeBc1d6OrDRluWVe3npNtCe7kHMFDj9PK2HJGL0K1UtTZytDBNT8YQ7eWl+mU6dPXLM0uM0wWrWlHcQ6VX/uenfpbHfpkMnduF7IJjtaKaAehnteuZqdAxbPSK6LmKdrMUvkyEjmGjrTIUvlSHjmGjwDIQvlSGzp0g6YNho93MBOiVFqVeGidcUhU6d+q/D85GUjhmCnRum6N+0g1ZlYrQWRetyry06AL4Pem2UC6NBeikZadD4qE7Hp22oNIDu5IUvS/lRambdJczsdC51a0P4Jek2kCFdK+Oad9+urKTakAioXOrWx98ZIuSk1jVizV0rG6UMolUvdhC5+5pG4BjN0oZAf741hx1Y7xf9I6vmh2I/hnHvYh2NC4vSq04upuRho7dScqYmQBW1EsLJqoLnwwbte+lhQ0GjrLjSIH/1YeNdpQ3iaTSueM3G5ydpKwSPb9pXLcjuXTYF3QfUv4r7OsSJeBreVFqhz3OCzV0DBzljQJ3h4uSFWbwQgvd8ei0D5Vfw7oeUVqEHbxQQsfAUd6FGby9Q8fAUVGEFby9lgyOh40eA0dFIcCH76WFbV20KnteZzecNKGi2rfi7VTpGDgqMgE+uE9a7fr9YLjwTeTacQE9UOjcZymnYOCIAAAK/Bb0DJZA3Uv3WUoGjsglwF8nw0YtyHd8h+542OjxbaVErykwCDKj6St0x6PTFnhSF9Em74NMrGwd03EcR+SP3/Hd1krnJpiBI9pCgF79+mN12+feDF398swCN6ES+XUkjult+9DG0FkXrYr7PgEi8u8Xdw5ko42hW5QWHfDkLqLglieWb7Q2dNZFq6JAJ5oWEeXe++Or5sb8rA3dvDzvgZMnRLsT7W5au3sVuvr1xyq36xDt7cgdor3yKnTGMe3Im0NUAJuGaM9Cx7EcUaiO1p2h+Sx030uLFjiWIwrTqyL2snvJKkcUIgE+vNyF8BS6k2Gjxl0EROFT0WfF7Cl0CrRjbw1REag8e0JltXv55qMrRLSzI/c5ZgBu6Nwno/nIF1FExDhPRc0AgPx4xypHFCEFLO/nZfdS1NrwWSIKgQAfvMfCvDGdlVxziIphXp5bAGDc8RwXxIkiJio1ADB4PKgm3BaiQlBgGTpjHCvhthAVggJVYM+39hCRf94TX0Y5iUIUK1Y6ohjVL88sho4oZgwdUcwM3BkVIoqHUWCvl5YTUTBGGDqiWHFMRxQzho4oTgePUwN2L4lic3v699QIMEm6IURFYlSFlY4oHmNgGTpWOqI4iE4BwBw+HjB0RDEQlSkAGPvz4AHAfbLNIco/xzE28O/BRHaCbSEqBK9XuQydY9jFJIqQAndur3IZOn33Y5Bsk4jyTQDb+9kAywU7cFxHFBl1zFNhW30MjNWOKBqz209XtvfLU+gE6CfRGqLcE31W0J5C9605moBdTKIorA/dun8S0d5mN43rzaFT4/TibQ9R7vVf/uFZ6NxZzHFMjSHKvXWF7NUmVuWEClFYxm4he+ZV6G6boz44oUK0N3VMd93f1x7XoMDaDxORb/era3Or1obucFEaAJhF2SKiPHurcK0Nnf158CAAZzKJdnPvDtPW2nga2LfmqAuO7YiCE+289e83j+Dj2I4osPHLxfCX3gzdbXPUV+Au3DYR5demGctV2w+bdcybpZKIXKLnm2YsV20N3e2nKxui56E0iii/ZuV52VeB8nWsunsxLiEQbaBAxzuOYRvxe9Hj0WkLKhe7N4sot8Y3zZHl98O+XyDizsh83aVFRDk2U+O0g3wh0Ft7yotSG1y7I/qXaHvdQ81vCRQ6+/PgQR3TDvIdotwSPd+2JrdO4PfT3X66sgX4I+j3iPJEgTu/s5Uv+Z5Ieel42LAB/Lzr94kybCaA5Z4rFNjOb2ItL0otcHxHBaRAZ9fAAXuEzt2J0ALX76hYvry1g8CPnbuXHq7fUYF8vWmOWvteZOdK57lpXA8U+G3f6xClmQJ37pLZ3vaudJ7j0WkfKr+GdT2itFDg7nBRsvw+5rVNaKEDGDzKpb1mKtcJNXQAg0e5EnrggAhCBwD1YWMiwIcork0Uk0gCB4QwkbLO4aJkccc5ZVhkgQMiCp39efBwuChZ4BHtlD2RBg6IqHu5imM8ypDIAwdEVOlW3TSu2zzugTLgPo7AATGEDnCDB3yJ415EQbkL37U4AgfE0L1cVR822gL8Fec9ibYYlxelVlgL337EGjoAqF+eWWKcAYCjuO9N9MxyE2o77tvG0r1c5W6C5ZICJUqB35IIHJBA6ADgW3M0cZcUeNARxW2mjvnPvttz9hF79/Klk2Gjq8B/k24H5Z8CdzBOK+hBQmFLPHQAx3kUiy83zVEqXhGQitABgHXRqsxLiwF47gqFawbR9i6ndkUlNaHzHF81OxD9M+l2UC7EvhzgR+pCBwAnw0bNAfrcqUA7mkGle3M2TOXbhFMZOg8nWWgHYzVO4FOX45Tq0AGseuRbqqvbqtSHzuOO9brgDCe99lWN00lzdVuVmdABQP36Y1VUutwqRK57dUzbz9tP0yRTofPUL88sGKfHLmdhzQTofWuOukk3ZBeZDJ3H3bXQBfA+6bZQTETPy/Oy77eeplGmQwcsF9UXpUVHgQ443suzTI3b3pL50HkYvtwaq2O6WRu3vSU3ofMwfLmRu7B5chc6D8OXUaLnotKL6+iEJOQ2dKs44ZJ6M4gOVLSbhzHbNoUIncfdQtQB8EvSbSEAwD1UeuV/fupneTYyqEKFzlO//lg1jmkr0AarX/xEz/XHu34ex2t+FDJ0q45Hpy0ALT7lEi0F7kSlX7Sqtk7hQ+exLlqV76VFy32lM7uf4bgHMBCgn+eJkaAYujUYwL0waFswdFtYF63KvDy3sOyCtsDlh3XGUBnoux+DIsw+7ouhC+hk2KipigVRCwWtggrcCWBD1C7Py3bRx2hBMXR7ehHCGvI5GzoWwFbRCUO2P4YuZO6ev5qo1HQZwiwFcQZgAmCiwMQAE47LwsfQxaR+eWbJux8VUampaBUqVQBVxB9IL1gPAkxU5UFVJoePBxNWsHgwdClRvzyzvJ+NcazV/62E9E0C2Ku/O8AUjpkCAA4ep5zkSIf/AxJ+InImX6U7AAAAAElFTkSuQmCC","e":1},{"id":"image_10","w":221,"h":169,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN0AAACpCAYAAACvdzjNAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAPVklEQVR4nO3dz28b550G8Of7ihpKa9kiuGmioliHBYQE8WHDYheGLBhrbk4S5db0X7DyxUGABar/IPQe9rIX5uS2WMA0ei4sIyHtU0EBhS30RF9qNCgQqkABF10YUqvCFiXPu4eZkSiJlPhjZt6Z4fMBBEsMNfNGmkfv+37f+SEgYwqPSpm3qYM8AIjovIjOAIAGMgDyI25+W4Cm94VtqwYAKGVvP1upN3t+FwVOTDcg6RZrxbwWnRMteS06By05ADkAHxptmGMDbjhtoAVbtaYOUs3G7fVt0w1LMobOJ16vpZRd0EBeAzkBPjXdriHtAGgK0NCim1p0c3P5act0o5KCoRvSYq2Y11oKUHYeWgqIRs8VpMMg2rZqbP74m4bpBsUVQ9enhSdLOdiqIEAJQAHArOEmRcEGQzg4hu4M1+rLJbcXKyH5PdmodgA0NLA+1bbWOS/sjaE74Vp9uQSgBC0lsDcbmgZeiJaqnni3zvngcQwdGLSgeQFM709W2QOOcegWnizlxFZrAFbBoIXpMURXnxefrJtuiCljF7qFWnEVwFqMy/lJsQOgqpVdGbfh51iEjr1a5D3WtqqMSwU00aFb+PpmQSberULLf5huC/VlSwPlzZV61XRDgpTI0C18fbMgyi4DuGG6LTSULQGqVtuqJLHwkqjQMWyJsyNAJWnhS0ToGLbE24GW8vObtYrphvgh1qFzCyQVALdMt4VCkYg5XyxDV3hUyuxZ7TKAn5puCxmxoW1Vjmu1M3ahW6gVVwWogKV/Ev0wvZdei9t8LzahW6wV89oJG+dt1Cl2871YhG6xVixr4EvT7aBI2xBgLQ63ooh06NyqZBW8rIb6JMC9Zyv1sul2nCWyoWPvRsPSwAsouxTVczojF7rFWjFvA1WekEwj2tHAWhSXFyIVOlYmKQCP021rNUoVzkiErvColNlL71V4YjIFZEuAUlSKLMZD597wZ53DSQpYZIabRkPnVifXweEkheer5yv1NZMNMBY6d/72wNT+aaxtpNtWydQ8z0jortWKFfC8STLI5LJC6KG7Vl+usmBCEbEjQCHsAktooSs8KmXeWu0GCyYUMaEHT4WxEwaOImxWAw333qehCLynY+AoLjRwJ4wlhUBDx8BR3IQRvMBCx8BRXAUdvEBCx8BRzAVaXAmkkLJntXlaF8XZrAYai7XiqM9978r30F2rL1fBWypQ/M1qoLHwZCnn94Z9Dd1irVjmwjclyCxstV54VMr4uVHfQrdQK67ySm9KGgE+3bPavj7Wy5fQLdaKeffiU6IkuuGeL+yLkauX7o1fm+DNgyjh/FpKGLmnc7teBo4ST4CKHxXNkUK3WCuWwUoljY9ZG6iOWlgZOnTuHZdZOKGx4hZWyiNuY3Ccx9HYE337efHJUFXNoXo6N+kMHI0vLUMPMwcO3cLXNwvgrRaIZvesdnWYbxwodIVHpYz7bAEiAm4Nc/HrQKFrW+01cFhJdERLZdBhZt+hW3iylGO1kuiUD93OqG99h05sVR24OURjQANfDnI1Ql+hc4snXAQn6kFs1fe5mX2FjsUTonPdcjunc50buoVacRUsnhCdS5Rd7ud954ZOgL42RES40U9vd2bo2MsRDaaf3u7M0LGXIxrYub1dz9C5K+3s5YgGJMo+c92ud0+nxeiD84hi7NZZ63ZdQ+d+A9fliIYkturZaXUNnWgpB9YaovGw2us/dB9eagntsUFECTXrVv9PORU6942zATeIKPGkR293KnQCsJcj8seNbgWVY6Fzrwu6FVaLiJJO3k2c6sSOhe6t1WYvR+QjLXr15GvHQsehJZG/BPj05BDz5JyOQ0siv9mq0PllyvvkWn25BB12a8gzMwnMpM5/3yDaNvB6z99t0uDcEWTV+/ro16ylEH5zki2bBix19G9nsIII2Xk6Q7h7AOzuO5+/esOABqzQ+cXhHZ4XasUmH1k8nGza+ZhJAXPTZgLlFy+Mr/eA123n81dvTLcq/gT4kfcM81THiwxcHyzlBGtu2gna3LTpFvlrJnX0x6PTqzdHQXz15qiXpP5oZyR5FDrn+h/bYJOibW4auHzhKGjjyPtD49k9AP646wTQG57SGZR9+IitFAAoZRdYQznu8gXg8ozzr+Xrk9mTYSYFXMk4HwDwx7+7H7sMYFcdNZMUAGhg5AfdJQGDNrzLF5wPvM8A9nB4QbgA411EmZkE5i8C85fiW/yIqrbthO9326yMAoC21b9v/vibRgoYzyJKNu0MjeYvmm5JclnK/YN20Zn3/eFvwB/+arpVBik7BwAp94mqY2NuGshnk1d1jDqvEJPPAs3X4xk+BeQAIGXbKiMq+QPvbBq4+h7DZtpMCrj+/niGT7uL5CkRnegiysyk8wvmMDJaOsP32784c79xkRLRmaQOL/NZZ97GSmR0zaSAz77vzPl++3+JL7jkASClgaGemxxl2bTzV3RcF7LjaG4a+Mk/OUPO320ndqlhFnDW6RI1vMxnnQ+Kp3zWWb75zZ+Te85nYgZe2bTzl5KBi7+ZFLD0g2T+LhdrxXwiloPnLzmVSc7dkiWfdc5y+fWr5JxgbdsqE/vD9Op7zvyNgUsmbwSTpKWe2B6qlnKqXlcSVwaikyzlDDfnL5luiT8U3FXyOPF+CZcvmG4Jhen6+8D1D0y3YnQKQMt0IwaRTQM/uczlgHE1fzH+wYvV8DKbdno4Xg0w3uYvOsdBXOfxsWm2F7i4/qDJX3PT8T0eYtHkmcn4/oApON4f4riJ/GFsKeCzOQaOusumYzbHSx20In8oL/2ARRM6W5yKK5vLT1tKgIbphvRy/QMGjvozfzE+a7aR7el4KwUa1NX3Ir92uwUAyo7gOt3ctPMDJBrU9Q+cwltEtQBAwVYts+04zju9i2gYkS68iW4BgJo6SDUNN+WYz74f0R8YxUY2DVz9nulWnCZaWgCgGrfXtwHsmG2O40omWWeTkznzF6M3v9Oim8BRIcV4b5dNJ/OiRTInavO7w57O/dp46HhNHPnNUs5xFRXeo7IUAGjDoctnuR5HwZibjsz63Yb3idO3KLthqiXefSmJgpLPmh9mdp6EogDn1BS4C3dhi1L3T8kUhWGmV0QBOs9IEd0IuyHegxaJguY92NOU9F664X1+GDqtpdHtzUGxVDTXUii5rn7PWLFuw12aA9ARuqm2tR5mK65keAU4hct7emzotBzL1mHoGrfXtzXwIow2zExGpqJEY+ZKJvyiip541z10ACBaqmE0Ip/lmhyZYanQq+VbbqHy0LFD/2Qig+A9bpjIlPmLIfZ2WionXzoWOjeRj4NsA9fkKArCOg67dWSnBnkaCKy3Yy9HURFSb7dxcmgJdAnd5kq9ioCuOmAvR1ES9PGogWq317uWMwQ4NQ4dlaWid6kFjbeAe7sttwM7pWvobGV3ffMo5i+xYknRE9R0R3r0ckCP0G0uP21B9EM/G8F1OYqigI7LHatt9Rwt9ux7tOiyXy2Ym+bZJxRNlvL/EVwCVDpP+zqpZ+j87O2S8lwxSiafaw1n9nLAOfe99Ku3YwGFouzyBf/qDef1csA5oXPXGL4apRF+/g8RBeXyjC+bObeXA/q4w3O6bZUxwrodr5ejOPBjNKaBtfN6OaCP0DVur29DS3nYhvj0F4QoUKOGTgMveq3LndTXwO/5zVplmMt+ZiZZtaT4GGVUpoDVAd7r/0Y9WWvQ7yAyZ4TQfeXdXq8ffYfu2Uq9KcC9QVrC2+pRnAwZui237tG3geqKz1bq5UGGmSyiUJwM00kIUOqneNJp8GK+skvos5pp+l6DRIMYdGlLgHuDDCs9A4duc/lpSwNr/byXRRSKmwFGZxvPVurlYfYx1LL15kq96vcJ0UQxspNuW6Vhv3noc0WeF5+snjW/43yO4qifIaYAhUHncZ1GOkFrqm0VYOh27ERBOK+YooE7w8zjOo0Uusbt9W0B+i6sEMWZAPf6PevkLCOfiuyu3xVG3Q5RpIl+OGzh5CRfzv9/tlJvauBO52uv9/zYMlG4uh63oh8+Lz5Z9Wsfvl10s7lSr3YGr237tWWi8HQ5bjf8DBzgY+iA08HbPfBz60TB6zxmNfBilKWBXny/vLQzeLv7fm+dKFiHx6zoh1Nta6SlgV7E7w16FmrF1X95Dz/75wx42jPFwqs3wNM/wfc53EmB3Uhhc6Ve/YcJ/GdQ2yfy26s3CDxwQIChA4D/+df6/2rIbpD7IPLL7r58GXTggIBDBwAC+1dB74NoVAc2/vLLf6v9Vxj7Cjx0tu3fTWuJgpIS+e+w9hV46L745GkLGhtB74doBDtWerIa1s5CuSOlqP6uvyMypHLnh/4vDfQS2JLBST/7tlgRjZ+GtT+iPm19/nE9F+YOQ7v3cnrSKoOXAVHE2LZaDXufoYXuzg/Xt0V4GRBFyr0vPvmmEfZOQxteen7xbXFVazwIe79Ex+mHn38c/JpcN6GHDmDwyCwBHt/9uO77icz9MvI8nbsf1asix6+/IwqHfmgycIChns7z898vlwCpApg12Q4aF+aGlJ2Mhg4AfvFtMa81qgA+Nd0WSi4R3Ln70ej3N/GD8cc13v2o3rQsq6BltIdPEvXwQgQ/ikrggAj0dJ3uv7xZUMquAvjQdFsoEe5ZlhXq2Sb9iFToPD//fbEM59btnOvR4DQ2RGHt7kej3Z8yKJEMHQA8+K6U2dtvl3nqGPVNY8PWqmxiwXsQkQ2d5/7LpZxSahXs+aiXmITNE/nQeR58V8rs77dLWqMMzvkIAKAf2vZENS5h88QmdJ2cZQa9BkgJ7P3GzQtoqVrpyWrUCiT9imXoOjkL7CgxgIn2Qgsa+p1d+eKTpy3TjRlV7EPX6f7LmwWZsEuiUQAX22NNgMdaS8PW79aTELROiQpdp/svl3ITE6qgtS4AUgDngdGmsQFBw7ZVI25ztEElNnQnPfiulGm39wqA5KFRgCAPDkdN2RKg6fRk0kx6yE4am9B1c//lUg5I5ZSyC4DOQUsOghuGm5UkO9BoaoWm2NKytTSnplLNuBZA/DLWoevlMIyi8xCdESCvNTLsHbvagkYLoluAtETQevdOtRiu3hi6IXihBACnlwS0ICM28odvinuP2XHbRK3QFI1tALBt1XBePWglrcARFoYuBA++K2Xevj3In3xdKbuw08bcgdZT3mt/25dc53suTWIupTB1oHFBa6R67WNSYefAxtu/7uNV5+tphW1rQh/2OP+YltZRcI6M27zKpP8HvWXG1HoOeOEAAAAASUVORK5CYII=","e":1},{"id":"image_11","w":114,"h":142,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAACOCAYAAADtjVwfAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAHcklEQVR4nO2dTW7iSBTH/88wkF24wXCDZhnYjJcdpqXmAp2QG3CDIScY5gSG5AKJNEr3bsimkyU5wcAJprMLCPxmEdNCCR/GLlOuV/XbRTH2k36qr+fyK8DhcDgcDofD4XA4HA6Hw+FwaIR0B3AI/KBVeSnOa8RcI+YKADDBf3sdMYarf4ee9/r3fD5+vPg2zjzQFIgVeRJ8rHqe1w4JLQI+KLrtM4ARiMcU0pg9HjEKPx6//D1UdP/EiBTZGDS7TPjjwI+dABiDMWLCCOSNDylYnMj69WkfTOe641hhAmAE0JAWPPx+cTfK4iGiRJ5cNdsEBLrj2AYDTwB6j2d3fZX3lSZypHA8zJoJiDsPX77eqLiZGJF+0KpMC7P/dMexN8SD8rzcGV7c/EhzG09VPLp5Kc5rumNIBNP5S2E29INWJc1txIg0GQI+pJUpRuTRvJjJbPBQLGUm/b0YkWnHmDxAwIf69Wk/yW/FiIy41x1AapjO69enrX1/Jkrk21ypsTD19x0vRYlECCVrshxwPPNmnX1+IGYduaR+1RwD+FV3HAp4Li9K1bhjv6wWCQBsZ6sUJ5LDsKc7BlUwoRN3rBQn8vHi2zhKTEvg+KUwizWDFScyQkyrJMBekUeL0g1e3+ZL4HOc7lWkyOHFzQ8QS5n0IE73KlIkAPCcu7pjUEWc7lWsyGjXm/kpu1f8XReIFQkADPR1x6CI45PgY3XbBaJFRvtiREx6qEhbX5yLFgkAYBmtkkLLRUrJ9KzbGb+KeJFSJj0MbF1LihcJyJj07NrmaYVIKZmebRkeK0RKyfRs2/JphcgI40VuwxqR0dZ847vXTVgjMmKoO4A0ELPrWgGADe9el19br8MqkViEQ90hZIVVIqPkwER3HFlglUgAAPFQdwhZYJ9I9oz+2GcT1olkIidSAiZ/fsceb4zdOpEmf37HKGyM3TqRwM/KGqKwUiQBxrbKTVgp0lS2VdJyIoXgRJrD1oyUrSKrugNIwHjbP20Vad4XzYyt61/rRO7asZ1Xds20rRO5a8d2XvlZzXkD1olESL7uEBIxn4+3/ds+kRTvC+C8saumulUiG0GzBhMnOjF2ylslkj20dceQiB0zVsAikX7QqoAMFent3tVgjcio+NCx7jiSwPPN7yGXiCthto6oTPYYZoqcPJzdVXddZEWLnBZmfZgpMfZmMfEio9qnn3XHkRRmGsa5TrRIP2hVwNTXHUcqYm6qFi1yWpjdwNQuFa9bUuIeriZWZP3q9w6A33THkYZ9KkKLFPmaweE/dceRFgrjfzIvbvkRLTVGMDMVt0qsZccScS0yGhdNl7h3JWhRIuuDZg+Gj4tL9ulWAUFdqwlHDu7BXt0qIKRFNoJmTZBEUIKya8aLbATNGhfMrg3wljAM+/v+xmiRftCqcAFGL/rXcJ/khHVjRfpBqxKd7mb+DHWFpOXWjJzsLCUadAxvXPae5CwxskVOi9OeQImJJjlLjBOZw+PpVfFcCkuJa8saJVKwRIDRT/M1tTEiRUtE+krPRoiULhHEgyRLjlVyL1K8RKg5bCbXIm2QSIzLtK0RAIoKYlGOH7Qq0+K0J10iUs5UV8mdyJ+LfSZx68T3UFdV3Z9cZXYEZ2zWkTiLs47cjJGWSQST11Z5v1yIbATN2rQwG9kiEcDttpo5SdA+Rq68T5T0Kmobz+VFqa36plpb5Mn1J98yiQBxO4vChtpEnlw128ThP7BJInAbHVuhHC0ihW2Uisskiy51ycFFNgbNroUSweRl0qUuOehkp3592meG9GzNO4hx+XCmdpb67hlZ3nwVG/KmG7h/OLvzs35I5i3SorzpOiblRekgdX0yFWlX3vQdz7RA61A11DMTaVvK7S0MdB4u7g52okEms1bbJRLj8vHsrn/QZ6q+oe0SQTx4+PK1fejHKm+R08Ksb61E4F6HRECxyPr1aR8Gl0JJAwNPh5qhrkOZyMag2bV0iQEGno4WJV/nKT9KxsiT609+lAC3jjxIBBSINLzOWyryIhFQ0LUaXectBXmSCKRskbZ2qXmTCKRskcRhV1EcJnGbN4lAihZ5EnysUsH7V2UwuUfTYj8OiVskFQpGVutPCgMXeZUIpEmaM1fztb05M56ZvJbq7YuqST5GEow80WYfGHjiRVjLu0QgRYskxpBJRrmwtTD+ejy/6+gOIy6JRYaEsdCe9bUrzXiPjWoSd61Hi9INgGeFseSB2/KiVDWhK31Lqkb1WqXY/AK3ACYg7mS1efgQpO4d61fNGxj86ooYl6Ww1MvbAn9fUu/ZKS9KbUN3BNzzImw/KPjsOw8om68YtG/1nsnrmjgObkPpxDP6pqOHfL4NESlwifIVRJSD7SEv4ybxgObU+37ArYk6yGwpGL3i6kJDjXEGngjULy9+SVUWzCQyX9M3gmaNi9wBUwsZdrkMPBFjSCH60lvfOg6anIkOHGuByUfKgrkMPBHxiJmGWIRDFUWHTEZbls0PWpWX4rzmhaEPAEzwN17MGBHwIySMQd5Y6oTF4XA4HA6Hw+FwOBwOh2Mv/gesSNhqGmQ64QAAAABJRU5ErkJggg==","e":1},{"id":"image_12","w":114,"h":142,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAACOCAYAAADtjVwfAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAH+ElEQVR4nO2dT1bjyhXGvys5NjO8g1ZWAJnZPUGZ0Q7ntLMAsL2CkBU89w54K7CNN+B3Tsf9ZlFPMLPADugd4FnjWLoZWEoIB/9V/VGV6jcFpO+cj7qqunXrFuBwOBwOh8PhcDgcDofD4XA4NEK6BWyiMTgPUKkEAEDMp8Rcz37GhFMA9de/T4xo9TN6ZqKHo2XlIepNnhVK1oZ2Ixvji5AQ1ymhU/Y4AFMAIADwQdArfoAx4SS5ue/9/iTomYVDmZGN8UUITgKPETAhhFizdoPx66wzvVb6TkVIMbIxOA/I99sAhwwEBJzIeM9BEI9ml9+6umWIRqiRjdtWF8B1oYx7B2J8uetM+7p1iKQi4iGN8UVInAyhOlQeCBO6APqaZQjFy/uA5qh1Q5z8E4aYmPKhMTgPdIsQycEjMhy06z/9RYSCh9G1rJY1T5pVCOOgEZmZWPRvYZk4yMgXfzEx3URvmViVKNh71toctW5A+JsMMSqZXU21J0NEsteIbIwvQhtMZOBRtwbR7GVkusQwniwnaxM7G/lx1OrDrCXGejyOdEsQzU7fiXDQrr/4iycAx3LlKGE+u5rWt/+aWew0Ihfe4hp2mAgQT3RLkMFORqYpLSugJd3o1iCDrUY2x5/asOXbCPy4600fdIuQwfYRydSVL0MVdo5GYIuR4aBdB/BZkRbp1OI/DHVrkMVGI18qL6EiHfIhHtlcv7MttLaVqFAAwx/q1iCTzUYyhWpkyIWBx/vLr5FuHTJZa2T6fbRltmrtJCdjrZE/K8tTlUIkMj+Kq1YmAV6z1kgvSUKFOuRBPLF5kpOx1kj2OFCoQxq2ZnLesr5mZ1XxbTQMPM4szeS8ZdOs1YZvZClGI7DZSON3O8owycl410hLaj5/K8MkJ+P9EZkeZTMZBkozGgEBleZFpUxhFbDXyFKFVcBaIynSrUA17xpJzEYvPSi2r0puG+uMNLnKbG5rOccmbAytkW4BOnjXyMTzIsU6hEGM0o1GwMIRafI/YR6sMxLL5ZNuCTqwzkibe+lswjojy8q7Rh4tK0ZOGGw897gr7xppanqLACN1i2BTaJ0rU+HIzSYjjQyvZWWTkSaGqTPdAnSx1siyZkhMZa2RCZnZFaoxvgh1a9DB+tBK3pM6GQLhJNAtQQdrjTR1LUnEoW4NOlhrZLqW/KFQixgsOUG2L9tSdCaOyg9l/E5uNNLUmSsh7urWoJqNRhq7t8fUsaTIemc2GmnqhAcAyPOsvE1gHVtbmDVuWw+m9mblOPljWfYnt+5HmtxJkXxvqFuDKrZvLJvdSfGsefuXUoTYrUbWlrVIgQ6JcL8ME5+tRqaJge8KtMjiuAwhdseaHTL9ZNNZ2jjYWnZr8xnHphsJJvxic8Zn5077zdvWE8xvoDSvxdXA1JqkTexeDslWnAA+Tm8Pso6djeQksaJDBgEnzfGnoW4dotnZyPve70/W1I0yddIrEq1hv3s/QENJOpRDwCBt820FexlpXQdipuHHQcvo09kZexkZ9SbPIB7JEqOBY/YR2ZD52fsQj4WdiI/he5O0P62xHHRjmyVryv+DgcejuBqausY86FgdW3Y/MbBalvz0F5GpI/MgI9OuUtYd8iHg5MVfDHXrOISDjIx6k2dia1tofjYxYXDwieVqUr2BhaMSAMDUMc3Mg420fFQaZ2auHgJWj0rAKDNzXxj9cdTqM+EXEWIKzPdaXG0XeWmSu6tHOirNOyOyH2dFX5rkNjLqTZ5tXFe+pejrzNyhNaN524pQgqPfRc0ACWuYRDFKUT+ajcyi7ZoIM/KuN30A41dRzysyBJywj0KZKbSFWS2p9mH/xCfjuEhmCjUy6k2embyuyGcWnNV+ZgHKRoQ3Fby//BqVJcSmHBMw0G2mlO6QJQuxANIaII0HhoQtP97ycdA6ZR//kvX8wkI8ml1+66p+rbR+ratO//R3Wc8vLJrys9JGZEbztjUB8Fn2ewoH8ai2rF2rShxI76Bci6tdawqb94GpozKlJ31EAv/9Xkaw4E7KfVGV0lPS0/yuN30AcVfFu4qGqmS7sub0s8tvk1JOfqDGTCWh9TXN8achmDqq31sEZIZZ5UYCzkwZZmq596O2rF2XciaLtHa28iK8aE2LkVFv8nwUV8OymgmmTnPUEmqmltCaEQ7a9Z/+IjK1RVpuiP+6mgQKeJSIh+Sh5GbOOU5ORfTL0343VsnDrLBmTtqNBP5nJszusHUoZyKOwGsPrW8p49KEgcf7q2mukpFCjMjXzC6/dUtWYQACTvLW/hTOSACYdabXDPR061CKh1zhtZBGAsD91XRIMf4Emw8JvYIJ9o3IjLve9KEWVwOUYxKUK6FeaCOB1Yx2djUNifFFtxbJ5Mq9Ft7IjLvOtM/k/RnWVudRlOevjTESWNXM1uLqqYWz2nnermKFW0fuSmN8ERInQ1jQ74cYX+46036uZwjSooVw0K4vvMW1ySemRSQDAMONzGgMzgOqUN+0jJDITWYrjMxIw20fZhy4/a0WV7uiKgWsMjKj4IbOAerPrv5hz8aybAoYcr9znHRl3NdltZEZ4aBdf/H/3WVwV9MG9ncmr39/+TWS9YJSGPmaxuA8IN9vKzB1DuIJLelmdaBJLqUz8jWNwXkA3wuJOGSmUwHG/gBxBGAiqhZnV0pt5Hs0xhchOAk8RsBAHRt2JbIrGRPPi46WlYeitWxxOBwOh8PhcDgcDofDYTn/Acl2s1GownE3AAAAAElFTkSuQmCC","e":1},{"id":"image_13","w":82,"h":35,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAAAjCAYAAAAHUl3/AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAACrElEQVRoge2ZMXLaQBSG/ycx2B1cIIOqTDpTCpqoBIVCOUCMdANyA3ICkxNIhiZdyEzCpFSFKaFOY2Z8AOgCsfRSGAgmWEggCcvoq2C1+/Tmm7e7WolwZOROTQG7ksCQWGAJTJKPYRNiDJlowkTD8/vM0Da6k4hT9YTivJliavnf4lwjYoWZigRchBh+DGAIkE0O232jNwwx9k4iFymbFYlEUWOwHrK4XYzB6JILKw6pkYmU26pOgA7gbVT3CMCYGFbWzbaiWgJCFamYWn4m/tEBbgAohBk7NIiv+Z6bA+PnbahhwwpUar9rANwEkAsrZqSELPRgkXKnphC7Fp5rBXozJUarX+81Dw20t0jF1PKzzKwFpvqhSRwbBkaCA/2QTWkvkQmvQg/o483lj9ZeI4MOWKyFV/vcLCF8O3OyetDdPZDIUqdqvYSpvAsGRnBcLchG5FvkqUhcY0oOFL/rpi+RpbZq43k8WMeNb5nCrg6lTtXCaUoEgByLsGWzIu3q6CnyBKfzNnIQha5ianmvTk+KlNuqnkp8gICLmTi3vPqI2xrLplqEgC8AzqNILKG8efX+9fTu66/BtotbK9IVYSEpZ+ZY4auyqRa3XflPZPlabcb83jBRsIitJ59Hjz8Pr8Hmt0ir0RMGjMFlz1pve1SRs8yshVTiTghobratRMpmRUp3ad8U5LaqrzesRAqCoG/2TnmazapciWRCI/Zskk1B7tSU5R8BAEqdqoZ0bQwMwdGXv5cVqR0nlYTDtPImLBqUY+WScHLL6b2syBf2ySA+BNdVAB+v0VK8YUIR+CdyfMRckk4eWIgkhnXUVJIM8S2wEJl1sy2kVbkXDNECFiJtozshBxpSmcFgfB58+G4Da5tN3+gNz5xskRifkAr1hIERA8ZNvZeeBsPmL5S55GGPa+XPAAAAAElFTkSuQmCC","e":1},{"id":"image_14","w":82,"h":35,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFIAAAAjCAYAAAAHUl3/AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAACu0lEQVRoge2av3LaQBDGv71jHHfwAhmryqQz6QRNVNqKC+UBbIs3cN6ANzBvIBmadMEzCUmpyqbEdRoz4weALiKWNoWBsQnoD0jIsvWr0LG3t/PNak+3EiFj1M6RBvYVwVBYsAImJcK0ETEGTDRiosHufWngNLqjlEMNhLa5mGYZlT9yYhCxxkxVAvYTdD8EMADIIY+dq0ZvkKDvUFIXUrUOFJLSYLCZsHBhDMHokg97G6KmJqTa1k0CTAAf01ojBkNi2Dv+TiutEpCokJplVFz51wT4DMBekr4Tg/iC77nZb/y6TdRtUo5q7U9nADcBlJPymSoJC7qxkGrnSCP2bTzXDAxmTIzW1WmvuamjtYXULKPiltwWmE43DSJrGLgRHsxNNqW1hKxbepUlushnFgZAX65PfrTWmhl3wrQWnq+zWE64fOPtmHF391hC1jqH9ku4lcNg4Aaeb8TZiCIJ+ZLqYQzG5EGLWjdFFCNXTrqvTEQAKLOEU7f0ahTjUCFrnUMbz+N0kgVllnBU60AJMwwU8rXUxBDKkKKrWUYlyGilkGpbNwsRHyBg35UTO8hGLhusW3oVAl8B7KYRWE55//bzu/Hdt9/9ZX8uzUhfwkZezsxbhc9XbT7/CVm/0Jtb7hvmCpZYevJ58hz50Aab3KLIxkAYaPRPevbjsScZ6ZbcFgoRQyGguTg2F1K1DpRil47MntrWzccDcyGFEOaidcFqFrNyLiQTzrYeTb7ZUztH2uxCAECtc2igqI2xIXjm7PcsI41sQsk5THPdxHRAyyqWnFOe3d5i2tl4Ya8MtgcxVwFAUIki9dsKghHkF0JuAnnsAIDwhXCyDSXXDGevIkT/+LuDhy+5CuJCPH/2FgBAHgwA48wCyiEMNK6Pf3Zn1wIArhq9AXnQAFxmFVhOGIP4gjx8WOz+FCTEP90c53905F+iAAAAAElFTkSuQmCC","e":1},{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"MainPosition","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[500,500,0],"to":[0,-7.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[500,454,0],"to":[0,0,0],"ti":[0,-7.667,0]},{"t":21.0000008553475,"s":[500,500,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"BodyPosition","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":[0,1,0],"ti":[0,16.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4.114,"s":[0,6,0],"to":[0,-16.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[0,-101,0],"to":[0,0,0],"ti":[0,-16.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":20.571,"s":[0,6,0],"to":[0,16.833,0],"ti":[0,1,0]},{"t":24.00000097754,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"OnEyes","parent":2,"refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60.571,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61.429,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62.286,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82.285,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83.143,"s":[100]},{"t":84.0000034213901,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.5,-71.36,0],"ix":2},"a":{"a":0,"k":[85.21,9.914,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"RightEyesBottom","parent":2,"refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[38.862,-38.621,0],"ix":2},"a":{"a":0,"k":[33,33,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61.429,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83.429,"s":[100,100,100]},{"t":86.0000035028518,"s":[100,0,100]}],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"LeftEyeBottom","parent":2,"refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-69.25,-34.878,0],"ix":2},"a":{"a":0,"k":[34,35,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61.429,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83.429,"s":[100,100,100]},{"t":86.0000035028518,"s":[100,0,100]}],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"RightEye","parent":2,"refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.112,-101.85,0],"ix":2},"a":{"a":0,"k":[33,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61.429,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83.429,"s":[100,100,100]},{"t":86.0000035028518,"s":[100,0,100]}],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"LeftEye","parent":2,"refId":"image_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-69.25,-103.205,0],"ix":2},"a":{"a":0,"k":[34,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":61.429,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":80,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":83.429,"s":[100,100,100]},{"t":86.0000035028518,"s":[100,0,100]}],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"Eyes","parent":2,"refId":"image_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-16.171,-69.611,0],"ix":2},"a":{"a":0,"k":[94.491,40.639,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"RightHand","parent":2,"refId":"image_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.349,122.629,0],"ix":2},"a":{"a":0,"k":[59.828,73.566,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"LeftHand","parent":2,"refId":"image_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-66.773,122.629,0],"ix":2},"a":{"a":0,"k":[59.828,73.566,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":2,"nm":"Mouth","parent":2,"refId":"image_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.049,20.833,0],"ix":2},"a":{"a":0,"k":[104.338,51.169,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":2,"nm":"Head","parent":2,"refId":"image_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-15.049,-2.296,0],"ix":2},"a":{"a":0,"k":[110.199,75.419,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":2,"nm":"Stomach","parent":2,"refId":"image_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-13.927,95.324,0],"ix":2},"a":{"a":0,"k":[110.199,84.406,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":3,"nm":"LegsPosition","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[0,0,0],"to":[0,-4.5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[0,-27,0],"to":[0,0,0],"ti":[0,-4.5,0]},{"t":19.0000007738859,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,108,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":13,"s":[91,99,100]},{"t":22.0000008960784,"s":[100,108,100]}],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":2,"nm":"RightLeg","parent":14,"refId":"image_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13,"s":[-37]},{"t":21.0000008553475,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[74.115,103.934,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[69.115,103.934,0],"to":[0,0,0],"ti":[-0.833,0,0]},{"t":21.0000008553475,"s":[74.115,103.934,0]}],"ix":2},"a":{"a":0,"k":[56.532,70.56,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":2,"nm":"LeftLeg","parent":14,"refId":"image_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13,"s":[37]},{"t":21.0000008553475,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-100.612,103.934,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[-95.612,103.934,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":21.0000008553475,"s":[-100.612,103.934,0]}],"ix":2},"a":{"a":0,"k":[56.533,70.56,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":2,"nm":"RighFoot","parent":14,"refId":"image_13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[104.031,155.896,0],"ix":2},"a":{"a":0,"k":[40.666,17.079,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":2,"nm":"LeftFoot","parent":14,"refId":"image_14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-132.85,155.896,0],"ix":2},"a":{"a":0,"k":[40.667,17.079,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Tong","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[502.555,504.25,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[93.502,101.538,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[23,13],[12,2]],"o":[[0,0],[-23,-13],[-12,-2]],"v":[[3,-6],[-38.931,-13.409],[-138.5,-65]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.764705882353,0.164936559341,0.249609778909,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":12,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[100]},{"t":42.0000017106951,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Mouth","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[498.43,500.25,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":41,"s":[100,100,100]},{"t":43.0000017514259,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18.75,8.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.407843167174,0.215686289469,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[4.125,-0.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"FrogJump","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[522,500,0],"ix":2},"a":{"a":0,"k":[500,500,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1000,"h":1000,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"FlyPosition","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":0.322},"o":{"x":0.333,"y":0},"t":1,"s":[279,686,0],"to":[-2.714,2.544,0],"ti":[-59.875,9.112,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0.613},"t":19,"s":[473.908,678.366,0],"to":[142.428,-21.675,0],"ti":[2.853,1.115,0]},{"t":36.0000014663101,"s":[672,632,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":180.00000733155,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":2.654,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4.308,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5.961,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":7.615,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9.269,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10.924,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.576,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14.231,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15.885,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17.539,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":19.193,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20.846,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22.5,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24.154,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25.808,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27.461,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29.115,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30.769,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32.424,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":34.076,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":35.731,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37.385,"s":[9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39.039,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40.693,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42.346,"s":[9]},{"t":44.0000017921567,"s":[-33]}],"ix":10},"p":{"a":0,"k":[-296.625,-194.312,0],"ix":2},"a":{"a":0,"k":[-295.562,-193.562,0],"ix":1},"s":{"a":0,"k":[105.582,108.337,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[7.125,8.875],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176470588,0.741176470588,0.741176470588,1],"ix":4},"o":{"a":0,"k":99,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-292.312,-191.938],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[61.079,79.568],"ix":3},"r":{"a":0,"k":-69.975,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1.00000004073083,"op":36.0000014663101,"st":13.0000005295009,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-295.727,-194.125,0],"ix":2},"a":{"a":0,"k":[-293.438,-194.125,0],"ix":1},"s":{"a":0,"k":[102.352,55.053,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[13,14],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":99,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.5,-194],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1.00000004073083,"op":36.0000014663101,"st":-13.0000005295009,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[486,496,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[119.015,79.183,100],"ix":6}},"ao":0,"shapes":[],"ip":0,"op":180.00000733155,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/apps/frontend/public/json/loadingAnimation.json b/apps/frontend/public/json/loadingAnimation.json
new file mode 100644
index 00000000..4046a962
--- /dev/null
+++ b/apps/frontend/public/json/loadingAnimation.json
@@ -0,0 +1 @@
+{"v":"5.7.8","fr":29.9700012207031,"ip":0,"op":30.0000012219251,"w":500,"h":500,"nm":"Loading","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[546,266,0],"to":[0,-11,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[546,200,0],"to":[0,0,0],"ti":[0,-11,0]},{"t":21.0000008553475,"s":[546,266,0]}],"ix":2,"l":2,"x":"var $bm_rt;\nvar $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = $bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = $bm_rt = t = 0;\n} else {\n $bm_rt = $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n amp = 0.05;\n freq = 4;\n decay = 8;\n $bm_rt = $bm_rt = add(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[45.137,45.137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.7490196078431373,0.24705882352941178,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.7490196078431373,0.24705882352941178,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-167.432,-17.432],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[454,266,0],"to":[0,-11,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":13,"s":[454,200,0],"to":[0,0,0],"ti":[0,-11,0]},{"t":17.0000006924242,"s":[454,266,0]}],"ix":2,"l":2,"x":"var $bm_rt;\nvar $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = $bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = $bm_rt = t = 0;\n} else {\n $bm_rt = $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n amp = 0.05;\n freq = 4;\n decay = 8;\n $bm_rt = $bm_rt = add(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[45.137,45.137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.3568627450980392,0.7607843137254902,0.9058823529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3568627450980392,0.7607843137254902,0.9058823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-167.432,-17.432],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-359.00001462237,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":4,"s":[365,266,0],"to":[0,-11,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[365,200,0],"to":[0,0,0],"ti":[0,-11,0]},{"t":13.0000005295009,"s":[365,266,0]}],"ix":2,"l":2,"x":"var $bm_rt;\nvar $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = $bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = $bm_rt = t = 0;\n} else {\n $bm_rt = $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n amp = 0.05;\n freq = 4;\n decay = 8;\n $bm_rt = $bm_rt = add(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[45.137,45.137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.7019607843137254,0.5333333333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.7019607843137254,0.5333333333333333,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-167.432,-17.432],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[277,266,0],"to":[0,-11,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":4,"s":[277,200,0],"to":[0,0,0],"ti":[0,-11,0]},{"t":9.00000036657752,"s":[277,266,0]}],"ix":2,"l":2,"x":"var $bm_rt;\nvar $bm_rt;\nvar n, n, t, t, v, amp, freq, decay;\n$bm_rt = $bm_rt = n = 0;\nif (numKeys > 0) {\n $bm_rt = $bm_rt = n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n}\nif (n == 0) {\n $bm_rt = $bm_rt = t = 0;\n} else {\n $bm_rt = $bm_rt = t = sub(time, key(n).time);\n}\nif (n > 0 && t < 1) {\n v = velocityAtTime(sub(key(n).time, div(thisComp.frameDuration, 10)));\n amp = 0.05;\n freq = 4;\n decay = 8;\n $bm_rt = $bm_rt = add(value, div(mul(mul(v, amp), Math.sin(mul(mul(mul(freq, t), 2), Math.PI))), Math.exp(mul(decay, t))));\n} else {\n $bm_rt = $bm_rt = value;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[45.137,45.137],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.06274509803921569,0.023529411764705882,0.6235294117647059,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.06274509803921569,0.023529411764705882,0.6235294117647059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-167.432,-17.432],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/apps/frontend/public/mockServiceWorker.js b/apps/frontend/public/mockServiceWorker.js
new file mode 100644
index 00000000..749090e1
--- /dev/null
+++ b/apps/frontend/public/mockServiceWorker.js
@@ -0,0 +1,291 @@
+/* tslint:disable */
+
+/**
+ * Mock Service Worker.
+ * @see https://github.com/mswjs/msw
+ * - Please do NOT modify this file.
+ * - Please do NOT serve this file on production.
+ */
+
+const PACKAGE_VERSION = '2.6.4';
+const INTEGRITY_CHECKSUM = 'ca7800994cc8bfb5eb961e037c877074';
+const IS_MOCKED_RESPONSE = Symbol('isMockedResponse');
+const activeClientIds = new Set();
+
+self.addEventListener('install', function () {
+ self.skipWaiting();
+});
+
+self.addEventListener('activate', function (event) {
+ event.waitUntil(self.clients.claim());
+});
+
+self.addEventListener('message', async function (event) {
+ const clientId = event.source.id;
+
+ if (!clientId || !self.clients) {
+ return;
+ }
+
+ const client = await self.clients.get(clientId);
+
+ if (!client) {
+ return;
+ }
+
+ const allClients = await self.clients.matchAll({
+ type: 'window'
+ });
+
+ switch (event.data) {
+ case 'KEEPALIVE_REQUEST': {
+ sendToClient(client, {
+ type: 'KEEPALIVE_RESPONSE'
+ });
+ break;
+ }
+
+ case 'INTEGRITY_CHECK_REQUEST': {
+ sendToClient(client, {
+ type: 'INTEGRITY_CHECK_RESPONSE',
+ payload: {
+ packageVersion: PACKAGE_VERSION,
+ checksum: INTEGRITY_CHECKSUM
+ }
+ });
+ break;
+ }
+
+ case 'MOCK_ACTIVATE': {
+ activeClientIds.add(clientId);
+
+ sendToClient(client, {
+ type: 'MOCKING_ENABLED',
+ payload: {
+ client: {
+ id: client.id,
+ frameType: client.frameType
+ }
+ }
+ });
+ break;
+ }
+
+ case 'MOCK_DEACTIVATE': {
+ activeClientIds.delete(clientId);
+ break;
+ }
+
+ case 'CLIENT_CLOSED': {
+ activeClientIds.delete(clientId);
+
+ const remainingClients = allClients.filter((client) => {
+ return client.id !== clientId;
+ });
+
+ // Unregister itself when there are no more clients
+ if (remainingClients.length === 0) {
+ self.registration.unregister();
+ }
+
+ break;
+ }
+ }
+});
+
+self.addEventListener('fetch', function (event) {
+ const { request } = event;
+
+ // Bypass navigation requests.
+ if (request.mode === 'navigate') {
+ return;
+ }
+
+ // Opening the DevTools triggers the "only-if-cached" request
+ // that cannot be handled by the worker. Bypass such requests.
+ if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
+ return;
+ }
+
+ // Bypass all requests when there are no active clients.
+ // Prevents the self-unregistered worked from handling requests
+ // after it's been deleted (still remains active until the next reload).
+ if (activeClientIds.size === 0) {
+ return;
+ }
+
+ // Generate unique request ID.
+ const requestId = crypto.randomUUID();
+ event.respondWith(handleRequest(event, requestId));
+});
+
+async function handleRequest(event, requestId) {
+ const client = await resolveMainClient(event);
+ const response = await getResponse(event, client, requestId);
+
+ // Send back the response clone for the "response:*" life-cycle events.
+ // Ensure MSW is active and ready to handle the message, otherwise
+ // this message will pend indefinitely.
+ if (client && activeClientIds.has(client.id)) {
+ (async function () {
+ const responseClone = response.clone();
+
+ sendToClient(
+ client,
+ {
+ type: 'RESPONSE',
+ payload: {
+ requestId,
+ isMockedResponse: IS_MOCKED_RESPONSE in response,
+ type: responseClone.type,
+ status: responseClone.status,
+ statusText: responseClone.statusText,
+ body: responseClone.body,
+ headers: Object.fromEntries(responseClone.headers.entries())
+ }
+ },
+ [responseClone.body]
+ );
+ })();
+ }
+
+ return response;
+}
+
+// Resolve the main client for the given event.
+// Client that issues a request doesn't necessarily equal the client
+// that registered the worker. It's with the latter the worker should
+// communicate with during the response resolving phase.
+async function resolveMainClient(event) {
+ const client = await self.clients.get(event.clientId);
+
+ if (activeClientIds.has(event.clientId)) {
+ return client;
+ }
+
+ if (client?.frameType === 'top-level') {
+ return client;
+ }
+
+ const allClients = await self.clients.matchAll({
+ type: 'window'
+ });
+
+ return allClients
+ .filter((client) => {
+ // Get only those clients that are currently visible.
+ return client.visibilityState === 'visible';
+ })
+ .find((client) => {
+ // Find the client ID that's recorded in the
+ // set of clients that have registered the worker.
+ return activeClientIds.has(client.id);
+ });
+}
+
+async function getResponse(event, client, requestId) {
+ const { request } = event;
+
+ // Clone the request because it might've been already used
+ // (i.e. its body has been read and sent to the client).
+ const requestClone = request.clone();
+
+ function passthrough() {
+ // Cast the request headers to a new Headers instance
+ // so the headers can be manipulated with.
+ const headers = new Headers(requestClone.headers);
+
+ // Remove the "accept" header value that marked this request as passthrough.
+ // This prevents request alteration and also keeps it compliant with the
+ // user-defined CORS policies.
+ headers.delete('accept', 'msw/passthrough');
+
+ return fetch(requestClone, { headers });
+ }
+
+ // Bypass mocking when the client is not active.
+ if (!client) {
+ return passthrough();
+ }
+
+ // Bypass initial page load requests (i.e. static assets).
+ // The absence of the immediate/parent client in the map of the active clients
+ // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
+ // and is not ready to handle requests.
+ if (!activeClientIds.has(client.id)) {
+ return passthrough();
+ }
+
+ // Notify the client that a request has been intercepted.
+ const requestBuffer = await request.arrayBuffer();
+ const clientMessage = await sendToClient(
+ client,
+ {
+ type: 'REQUEST',
+ payload: {
+ id: requestId,
+ url: request.url,
+ mode: request.mode,
+ method: request.method,
+ headers: Object.fromEntries(request.headers.entries()),
+ cache: request.cache,
+ credentials: request.credentials,
+ destination: request.destination,
+ integrity: request.integrity,
+ redirect: request.redirect,
+ referrer: request.referrer,
+ referrerPolicy: request.referrerPolicy,
+ body: requestBuffer,
+ keepalive: request.keepalive
+ }
+ },
+ [requestBuffer]
+ );
+
+ switch (clientMessage.type) {
+ case 'MOCK_RESPONSE': {
+ return respondWithMock(clientMessage.data);
+ }
+
+ case 'PASSTHROUGH': {
+ return passthrough();
+ }
+ }
+
+ return passthrough();
+}
+
+function sendToClient(client, message, transferrables = []) {
+ return new Promise((resolve, reject) => {
+ const channel = new MessageChannel();
+
+ channel.port1.onmessage = (event) => {
+ if (event.data && event.data.error) {
+ return reject(event.data.error);
+ }
+
+ resolve(event.data);
+ };
+
+ client.postMessage(message, [channel.port2].concat(transferrables.filter(Boolean)));
+ });
+}
+
+async function respondWithMock(response) {
+ // Setting response status code to 0 is a no-op.
+ // However, when responding with a "Response.error()", the produced Response
+ // instance will have status code set to 0. Since it's not possible to create
+ // a Response instance with status code 0, handle that use-case separately.
+ if (response.status === 0) {
+ return Response.error();
+ }
+
+ const mockedResponse = new Response(response.body, response);
+
+ Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
+ value: true,
+ enumerable: true
+ });
+
+ return mockedResponse;
+}
diff --git a/apps/frontend/public/site.webmanifest b/apps/frontend/public/site.webmanifest
new file mode 100644
index 00000000..45dc8a20
--- /dev/null
+++ b/apps/frontend/public/site.webmanifest
@@ -0,0 +1 @@
+{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
\ No newline at end of file
diff --git a/apps/frontend/src/app/main.tsx b/apps/frontend/src/app/main.tsx
new file mode 100644
index 00000000..eb53c5e3
--- /dev/null
+++ b/apps/frontend/src/app/main.tsx
@@ -0,0 +1,35 @@
+import { StrictMode } from 'react';
+import ReactDOM from 'react-dom/client';
+import { QueryProvider } from './query';
+import { RouteProvider } from './router';
+
+import './style/index.css';
+import { OverlayProvider } from '@/shared/overlay';
+
+async function enableMocking() {
+ if (process.env.NODE_ENV !== 'development') {
+ return;
+ }
+
+ const { worker } = await import('./mock/browser');
+
+ return worker.start({
+ onUnhandledRequest: (request, print) => {
+ if (!request.url.includes('/api/')) return;
+ print.warning();
+ }
+ });
+}
+enableMocking();
+
+const root = ReactDOM.createRoot(document.getElementById('root')!);
+
+root.render(
+
+
+
+
+
+
+
+);
diff --git a/apps/frontend/src/app/mock/MockRepository/MockRepository.test.ts b/apps/frontend/src/app/mock/MockRepository/MockRepository.test.ts
new file mode 100644
index 00000000..df3e87a3
--- /dev/null
+++ b/apps/frontend/src/app/mock/MockRepository/MockRepository.test.ts
@@ -0,0 +1,183 @@
+import { describe, expect, test } from 'vitest';
+import { MockRepository } from './MockRepository';
+
+interface User {
+ userId: string;
+ password: string;
+ name: string;
+ email: string;
+ age: number;
+ isAdult: boolean;
+}
+
+const getRepository = (...users: User[]) => {
+ const repository = new MockRepository();
+
+ for (const user of users) {
+ repository.create(user);
+ }
+
+ return repository;
+};
+
+describe('InMemoryRepository', () => {
+ test('create 메서드는 데이터를 생성하고 생성된 데이터를 반환한다.', async () => {
+ //Given
+ const repository = getRepository();
+ const user = users[0];
+ const expected = { id: '0', ...user };
+
+ //When
+ const result = await repository.create(user);
+
+ //Then
+ expect(result).toEqual(expected);
+ });
+
+ test('delete 메서드는 데이터를 삭제하고 삭제된 데이터를 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+ const user = users[1];
+ const expected = { id: '1', ...user };
+
+ //When
+ const result = await repository.delete({ userId: user.userId });
+
+ //Then
+ expect(result).toEqual(expected);
+ });
+
+ test('delete 메서드는 데이터가 없으면 에러를 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+ const notExistId = 'user6';
+
+ // When
+ const run = async () => repository.delete({ userId: notExistId });
+
+ // Then
+ expect(run).rejects.toThrow('Not found');
+ });
+
+ test('update 메서드는 데이터를 수정하고 수정된 데이터를 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+
+ const user = users[4];
+ const updateData = { name: 'updatedUser' };
+ const expected = { id: '4', ...user, ...updateData };
+
+ //When
+ const result = await repository.update({ userId: user.userId }, updateData);
+
+ //Then
+ expect(result).toEqual(expected);
+ });
+
+ test('update 메서드는 데이터가 없으면 에러를 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+ const notExistId = 'user6';
+
+ //When
+ const run = async () => repository.update({ userId: notExistId }, { name: 'updatedUser' });
+
+ //Then
+ expect(run).rejects.toThrow('Not found');
+ });
+
+ test('findMany 메서드는 조건에 맞는 데이터를 찾아 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+
+ const query = { isAdult: true };
+ const expected = users.map((user, id) => ({ id: String(id), ...user })).filter((user) => user.isAdult);
+
+ //When
+ const result = await repository.findMany({ query });
+
+ //Then
+ expect(result).toEqual(expected);
+ });
+
+ test('findMany 메서드는 조건에 맞는 데이터가 없으면 빈 배열을 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+ const query = { age: -1 };
+
+ //When
+ const result = await repository.findMany({ query });
+
+ //Then
+ expect(result).toEqual([]);
+ });
+
+ test('findOne 메서드는 조건에 맞는 데이터를 찾아 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+ const user = users[2];
+ const query = { userId: user.userId };
+ const expected = { id: '2', ...user };
+
+ //When
+ const result = await repository.findOne(query);
+
+ //Then
+ expect(result).toEqual(expected);
+ });
+
+ test('findOne 메서드는 조건에 맞는 데이터가 없으면 에러를 반환한다.', async () => {
+ //Given
+ const repository = getRepository(...users);
+ const query = { age: -1 };
+
+ //When
+ const run = async () => repository.findOne(query);
+
+ //Then
+ expect(run).rejects.toThrow('Not found');
+ });
+});
+
+const users: User[] = [
+ {
+ userId: 'user1',
+ password: 'password1',
+ name: 'Alice',
+ email: 'alice@example.com',
+ age: 25,
+ isAdult: true
+ },
+ {
+ userId: 'user2',
+ password: 'password2',
+ name: 'Bob',
+ email: 'bob@example.com',
+ age: 17,
+ isAdult: false
+ },
+ {
+ userId: 'user3',
+ password: 'password3',
+ name: 'Charlie',
+ email: 'charlie@example.com',
+ age: 30,
+ isAdult: true
+ },
+ {
+ userId: 'user4',
+ password: 'password4',
+ name: 'David',
+ email: 'david@example.com',
+ age: 22,
+ isAdult: true
+ },
+ {
+ userId: 'user5',
+ password: 'password5',
+ name: 'Eve',
+ email: 'eve@example.com',
+ age: 16,
+ isAdult: false
+ }
+];
diff --git a/apps/frontend/src/app/mock/MockRepository/MockRepository.ts b/apps/frontend/src/app/mock/MockRepository/MockRepository.ts
new file mode 100644
index 00000000..20f6646a
--- /dev/null
+++ b/apps/frontend/src/app/mock/MockRepository/MockRepository.ts
@@ -0,0 +1,96 @@
+export type Identifiable = T & { id: string };
+
+export class MockRepository {
+ private _autoId = 0;
+ private memory: Identifiable[] = [];
+
+ private isMatch(owner: Partial, target: Partial): boolean {
+ for (const key in target) {
+ if (
+ !Object.prototype.hasOwnProperty.call(owner, key) ||
+ target[key as keyof typeof target] !== owner[key as keyof typeof owner]
+ ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private isPartialMatch(owner: Partial, target: Partial): boolean {
+ for (const key in target) {
+ if (!Object.prototype.hasOwnProperty.call(owner, key)) return false;
+
+ const ownerValue = owner[key as keyof T];
+ const targetValue = target[key as keyof T];
+
+ if (typeof ownerValue === 'boolean' && ownerValue !== targetValue) {
+ return false;
+ }
+
+ if (typeof targetValue === 'string' && !(ownerValue as string)?.includes(targetValue)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private generateId() {
+ return String(this._autoId++);
+ }
+
+ private paginate(items: Identifiable[], page: number, size: number) {
+ const start = (page - 1) * size;
+ const end = start + size;
+ const data = items.slice(start, end);
+ const maxPage = Math.ceil(items.length / size);
+ return { data, maxPage };
+ }
+
+ async create(arg: T) {
+ const data = { ...arg, id: this.generateId() };
+
+ this.memory.push(data);
+
+ return data;
+ }
+
+ async delete(query: Partial>) {
+ const index = this.memory.findIndex((t) => this.isMatch(t, query));
+
+ if (index === -1) throw new Error('Not found');
+
+ const deletedData = this.memory[index];
+
+ this.memory = this.memory.filter((t) => t.id !== deletedData.id);
+
+ return deletedData;
+ }
+
+ async update(query: Partial>, data: Partial>) {
+ const index = this.memory.findIndex((item) => this.isMatch(item, query));
+
+ if (index === -1) throw new Error('Not found');
+
+ this.memory[index] = { ...this.memory[index], ...data };
+
+ return this.memory[index];
+ }
+
+ async findMany({ query, page = 1, size = 10 }: { query?: Partial>; page?: number; size?: number }) {
+ const filtered = query ? this.memory.filter((item) => this.isMatch(item, query)) : this.memory;
+ return this.paginate(filtered, page, size);
+ }
+
+ async findOne(query: Partial>) {
+ const data = this.memory.find((item) => this.isMatch(item, query));
+
+ if (!data) throw new Error('Not found');
+
+ return data;
+ }
+
+ async search({ query, page = 1, size = 10 }: { query?: Partial>; page?: number; size?: number }) {
+ const filtered = query ? this.memory.filter((item) => this.isPartialMatch(item, query)) : this.memory;
+ return this.paginate(filtered, page, size);
+ }
+}
diff --git a/apps/frontend/src/app/mock/MockRepository/index.ts b/apps/frontend/src/app/mock/MockRepository/index.ts
new file mode 100644
index 00000000..218017f7
--- /dev/null
+++ b/apps/frontend/src/app/mock/MockRepository/index.ts
@@ -0,0 +1 @@
+export * from './MockRepository';
diff --git a/apps/frontend/src/app/mock/browser.ts b/apps/frontend/src/app/mock/browser.ts
new file mode 100644
index 00000000..0a564278
--- /dev/null
+++ b/apps/frontend/src/app/mock/browser.ts
@@ -0,0 +1,4 @@
+import { setupWorker } from 'msw/browser';
+import { handlers } from './handlers';
+
+export const worker = setupWorker(...handlers);
diff --git a/apps/frontend/src/app/mock/gistResolvers.ts b/apps/frontend/src/app/mock/gistResolvers.ts
new file mode 100644
index 00000000..cb6317d9
--- /dev/null
+++ b/apps/frontend/src/app/mock/gistResolvers.ts
@@ -0,0 +1,61 @@
+import { HttpResponse, PathParams } from 'msw';
+
+// 사용자의 Gist 목록 조회
+export const getUserGistList = () => {
+ return HttpResponse.json({
+ gists: [
+ {
+ gistId: 'abc123',
+ title: 'My First Gist',
+ nickname: 'tech_guru'
+ },
+ {
+ gistId: 'def456',
+ title: 'React Hook Tips',
+ nickname: 'frontend_master'
+ },
+ {
+ gistId: 'ghi789',
+ title: 'Node.js Best Practices',
+ nickname: 'backend_expert'
+ }
+ ],
+ page: 1,
+ size: 10,
+ hasNextPage: true
+ });
+};
+
+// 특정 Gist 파일 조회 api
+export const getGistDetail = ({ params }: { params: PathParams }) => {
+ const { gistId } = params;
+
+ if (!gistId) {
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ return HttpResponse.json({
+ files: [
+ {
+ filename: 'index.tsx',
+ language: 'ts',
+ content: 'const a = 1;\nconsole.log(a);\n'
+ },
+ {
+ filename: 'main.tsx',
+ language: 'ts',
+ content: `const a = 1;`
+ },
+ {
+ filename: 'README.md',
+ language: 'md',
+ content: `# Hello World\n\n This is a markdown file.`
+ }
+ ]
+ });
+};
diff --git a/apps/frontend/src/app/mock/handlers.ts b/apps/frontend/src/app/mock/handlers.ts
new file mode 100644
index 00000000..73504cf5
--- /dev/null
+++ b/apps/frontend/src/app/mock/handlers.ts
@@ -0,0 +1,37 @@
+import { http } from 'msw';
+import { getGistDetail, getUserGistList } from './gistResolvers';
+import { getHistory, getHistoryList, getTagList, postCodeRun, postTag } from './historyResolvers';
+import {
+ deleteLotus,
+ getLotusDetail,
+ getPublicLotusList,
+ getUserLotusList,
+ patchLotus,
+ postCreateLotus
+} from './lotusResolvers';
+import { getLogin, getUserInfo, patchUserInfo } from './userResolvers';
+
+const apiUrl = (path: string) => `${import.meta.env.VITE_API_URL}${path}`;
+
+export const handlers = [
+ // user
+ http.get(apiUrl(`/api/user`), getUserInfo),
+ http.patch(apiUrl(`/api/user`), patchUserInfo),
+ http.get(apiUrl(`/api/user/login/callback`), getLogin),
+ http.get(apiUrl(`/api/user/lotus`), getUserLotusList),
+ http.get(apiUrl(`/api/user/gist`), getUserGistList),
+ http.get(apiUrl(`/api/user/gist/:gistId`), getGistDetail),
+ // lotus
+ http.get(apiUrl(`/api/lotus`), getPublicLotusList),
+ http.get(apiUrl(`/api/lotus/:lotusId`), getLotusDetail),
+ http.post(apiUrl(`/api/lotus`), postCreateLotus),
+ http.patch(apiUrl(`/api/lotus/:id`), patchLotus),
+ http.delete(apiUrl(`/api/lotus/:id`), deleteLotus),
+ // history
+ http.get(apiUrl(`/api/lotus/:lotusId/history`), getHistoryList),
+ http.post(apiUrl(`/api/lotus/:lotusId/history`), postCodeRun),
+ http.get(apiUrl(`/api/lotus/:lotusId/history/:historyId`), getHistory),
+ // tag
+ http.get(apiUrl(`/api/tag`), getTagList),
+ http.post(apiUrl(`/api/tag`), postTag)
+];
diff --git a/apps/frontend/src/app/mock/historyResolvers.ts b/apps/frontend/src/app/mock/historyResolvers.ts
new file mode 100644
index 00000000..453de15c
--- /dev/null
+++ b/apps/frontend/src/app/mock/historyResolvers.ts
@@ -0,0 +1,207 @@
+import { DefaultBodyType, HttpResponse, PathParams, StrictRequest } from 'msw';
+import { MockRepository } from './MockRepository';
+import { HistoryDto } from '@/feature/history';
+
+const historyList = new MockRepository>();
+
+const insertHistory = () => {
+ const historyMock: HistoryDto[] = [
+ {
+ id: '2000001',
+ status: 'SUCCESS',
+ date: '2024-11-15T14:30:00Z',
+ filename: 'main.js',
+ input: '11',
+ output: '3'
+ },
+ {
+ id: '2000002',
+ status: 'SUCCESS',
+ date: '2024-11-16T12:00:00Z',
+ filename: 'index.js',
+ input: '12',
+ output: 'console.log(7)'
+ },
+ {
+ id: '2000003',
+ status: 'ERROR',
+ date: '2024-11-14T16:45:00Z',
+ filename: 'main.js',
+ input: '13',
+ output: 'Error: Cannot find module'
+ }
+ ];
+
+ for (const item of historyMock) {
+ historyList.create(item);
+ }
+};
+
+insertHistory();
+
+// Lotus History 목록 조회
+export const getHistoryList = async ({
+ request,
+ params
+}: {
+ request: StrictRequest;
+ params: PathParams;
+}) => {
+ const { lotusId } = params;
+
+ const url = new URL(request.url);
+ const page = Number(url.searchParams.get('page')) || 1;
+
+ if (!lotusId) {
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+ const { data, maxPage: max } = await historyList.findMany({ page });
+ const list = data.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
+
+ return HttpResponse.json({
+ list,
+ page: {
+ current: page,
+ max
+ }
+ });
+};
+
+// 코드 실행
+interface PostCodeRunBody {
+ input?: string;
+ execFileName: string;
+}
+
+export const postCodeRun = async ({ request }: { request: StrictRequest }) => {
+ const body = (await request.json()) as PostCodeRunBody;
+
+ if (!body?.execFileName)
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+
+ const newHistory = await historyList.create({
+ filename: body.execFileName,
+ date: new Date().toISOString(),
+ status: 'PENDING',
+ input: body?.input ?? '',
+ output: ''
+ });
+
+ setTimeout(() => {
+ historyList.update(
+ { id: newHistory.id },
+ {
+ status: 'SUCCESS',
+ output: `입력한 값: ${newHistory.input} `
+ }
+ );
+ }, 2000);
+
+ return HttpResponse.json({
+ status: newHistory.status
+ });
+};
+
+// 해당 히스토리 정보
+export const getHistory = async ({ params }: { params: PathParams }) => {
+ const { lotusId, historyId } = params;
+
+ if (!lotusId || !historyId) {
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ const history = await historyList.findOne({ id: historyId as string });
+
+ return HttpResponse.json(history);
+};
+
+// 태그 조회
+export const getTagList = ({ request }: { request: StrictRequest }) => {
+ const authorization = request.headers.get('Authorization');
+
+ if (!authorization || !authorization.startsWith('Bearer ')) {
+ return new HttpResponse('Unauthorized: Invalid or missing token', {
+ status: 401,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ const url = new URL(request.url);
+ const keyword = url.searchParams.get('keyword');
+
+ if (!keyword) {
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ return HttpResponse.json({
+ tags: [
+ {
+ tagName: 'TypeScript'
+ },
+ {
+ tagName: 'Generics'
+ },
+ {
+ tagName: 'Programming'
+ }
+ ]
+ });
+};
+
+// 태그 생성
+interface PostTagBody {
+ tag: string;
+}
+
+export const postTag = async ({ request }: { request: StrictRequest }) => {
+ const authorization = request.headers.get('Authorization');
+
+ if (!authorization || !authorization.startsWith('Bearer ')) {
+ return new HttpResponse('Unauthorized: Invalid or missing token', {
+ status: 401,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ try {
+ const body = (await request.json()) as PostTagBody;
+
+ if (!body) throw new Error('요청 형식이 올바르지 않음');
+
+ return HttpResponse.json({
+ message: '성공'
+ });
+ } catch (error) {
+ console.error(error);
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+};
diff --git a/apps/frontend/src/app/mock/lotusResolvers.ts b/apps/frontend/src/app/mock/lotusResolvers.ts
new file mode 100644
index 00000000..ba95478c
--- /dev/null
+++ b/apps/frontend/src/app/mock/lotusResolvers.ts
@@ -0,0 +1,362 @@
+import { DefaultBodyType, HttpResponse, PathParams, StrictRequest } from 'msw';
+import { MockRepository } from './MockRepository';
+import { LotusDto } from '@/feature/lotus';
+import { UserDto } from '@/feature/user';
+
+const lotusList = new MockRepository>();
+
+insertLotus();
+
+const MOCK_UUID = 'mock-uuid';
+
+// 사용자의 Lotus 목록 조회
+export const getUserLotusList = async ({ request }: { request: StrictRequest }) => {
+ const authorization = request.headers.get('Authorization');
+
+ const [type, token] = authorization?.split(' ') || [];
+
+ if (token !== MOCK_UUID || type !== 'Bearer') {
+ return new HttpResponse('Unauthorized: Invalid or missing token', {
+ status: 401,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ const url = new URL(request.url);
+ const page = Number(url.searchParams.get('page')) || 1;
+ const size = Number(url.searchParams.get('size')) || 5;
+
+ const { data: lotuses, maxPage: max } = await lotusList.findMany({ page, size });
+
+ return HttpResponse.json({
+ lotuses,
+ page: {
+ current: page,
+ max
+ }
+ });
+};
+
+// public lotus 목록 조회
+export const getPublicLotusList = async ({ request }: { request: StrictRequest }) => {
+ const url = new URL(request.url);
+ const page = Number(url.searchParams.get('page')) || 1;
+ const size = Number(url.searchParams.get('size')) || 5;
+ const search = url.searchParams.get('search') || '';
+
+ const { data: lotuses, maxPage: max } = await lotusList.search({
+ query: { title: search, isPublic: true },
+ page,
+ size
+ });
+
+ return HttpResponse.json({
+ lotuses,
+ page: {
+ current: page,
+ max
+ }
+ });
+};
+
+// public lotus 상세 조회
+export const getLotusDetail = async ({ params }: { params: Record }) => {
+ const lotusId = params.lotusId;
+
+ const lotus = await lotusList.findOne({ id: lotusId });
+
+ return HttpResponse.json({
+ ...lotus,
+ language: 'javascript',
+ files: [
+ {
+ filename: 'index.js',
+ language: 'javascript',
+ content: "console.log('Hello, World!');"
+ },
+ {
+ filename: 'run.js',
+ language: 'javascript',
+ content: `function run() {\n console.log('Running...');\n}`
+ },
+ {
+ filename: 'README.md',
+ language: 'markdown',
+ content:
+ '## #️⃣연관된 이슈\n' +
+ '\n' +
+ '#71\n' +
+ '\n' +
+ '## 📝작업 내용\n' +
+ '\n' +
+ '- MockRepository를 사용해 동적인 Mocking 구현\n' +
+ '- lotusList api 계층\n' +
+ '- lotusList query 계층\n' +
+ '- SuspenseLotusCardList 구현\n' +
+ '\n' +
+ '### 스크린샷 (선택)\n' +
+ '\n' +
+ '![lotusListPage](https://github.com/user-attachments/assets/01fa0ad7-f556-485f-b442-2b9a51161f0d)\n' +
+ '\n' +
+ '## 💬리뷰 요구사항(선택)\n' +
+ '\n' +
+ '> 모킹파일을 건드리고, 구조화 했더니 변경사항이 너무 많네요.. 죄송합니다.\n' +
+ '\n' +
+ '네이밍이 이상하거나 이해가 가지 않는 부분 모두 코멘트 남겨주세요!\n' +
+ '\n' +
+ '모킹은 순차적으로 동적으로 변경해볼 예정입니다.\n' +
+ '\n' +
+ '파일 경로나 query-key 구조화 같은 경우에는 추후에 정리가 필요해보입니다.\n'
+ }
+ ]
+ });
+};
+
+type CreateLotusDto = {
+ title: string;
+ isPublic: false;
+ tags: string[];
+ gistUuid: string;
+};
+
+//lotus 생성
+export const postCreateLotus = async ({ request }: { request: StrictRequest }) => {
+ const body = (await request.json()) as CreateLotusDto;
+
+ const lotus = await lotusList.create({
+ ...body,
+ date: new Date().toISOString(),
+ author: { id: '1', nickname: 'js_master', profile: 'https://devblog.com/authors/js_master', gistUrl: '' },
+ logo: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAkFBMVEX33x4AAAD/5h+KfRF1ag774x//6B9pXw364R703B61oxaRgxLlzxzgyhs/OQi+rBdcUwtDPAhJQgnTvxoXFQPr1B0yLQallRTItRibjBPbxhsqJgWrmhWxoBWNfxGBdBBRSQpiWAw2MQYREAIdGgN8cA9tYg1dVAvDsBgkIQQuKgZVTQoJCAGfjxMgHQQQDgELf9RLAAAG3ElEQVR4nO2cf1/qLBiHBwkxN1s6rWmaWR6zTtb7f3ePsx+PzpsN5iZ0Pt/rr3NSJ5cMGDc3BAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0KME51zs4Lt/uS4Qwa5kRYwKqoSUkyTqLPp3y+HL6+CyE3VTIc0+fD7EZnF5xGJaXUohe7fP7JhBlHKuzlByU3iHKCW74FUfC2d96oM7llEs/XGsZcjD6E3rt2PVq/qNzkYNQ6Fuy/V2zENP2qO9IZ9cGQgyNszk+TRKsDaUUyO/3VW8ULQ1lH+MBRm7Vh50OJaGfGEhuB06QveKdob80kpwqxg4V7Qy5BeWgow9O+9RbQx511pwO2q47m4sDFVcQ5CxruOx38KQ/61lyEZum6K5oUjqCbKB2/vUwvCmpiGbOb1PjQ1rV+GWkQOxH4wN5UNtwXnoQOwHU8OyjvRudX9/cfmiefUm/R3tUGx0fptY5oEPKUezR+LlsXD8VGNqqBsqOsFPyEIJefRIMOi5HvDN65AWjA4FRHg4d5x6ELExNBQpKbgovk8Fg71XRz6EMkwN6UfS+KiKVPj69dpT14MKDIwNeUS9bUU0MjH5fK3zy+I09Nu6lATP41TLzJt4oqkhOfVNyWrifXahPKnA4ETDHllPInU8xh9ykuGEvhM9qsDgRMPMl7ZWhqnhinrb2IfxrgpTwzn1tv4/ZKh58M68anE0pob0/HfpQcS3CkNDNSEN2UPgfS0az55oQ3YV+94WjQ21QYyZHw/YWowNxzpDNkh9S044wDhOo2mIO65T6a+jeaztrkSRPay9dTSPl1Ys3r/MQj8bpHnMOyw3zD/V82ZSuIe5IT3NP2SR+Zf3ZbH2FD5VK7KrWeDZAGlhqIlGFRmOQ68crdaAF0aKjEU+OdoYqnBoqMg8qkerTAVRNuwXmPrS59hlm4jMXPHGk4CibcbQ2lyRrbwICttmfXGLWmRs7UFY0Tpzj/eWFopz16uHdbIvVWCT+tV3fqfWyRGWMwvFp4ljxXpZ0KNrC0d6deNs1MtkVzzRJSYQuK3Fmrn6gQhuK5LZ/+fDad5XXcM8YV8fuilw9TsNt58NNob16DIF8xTD7ad51yxx32H4/zTDfNtUajI83vxew9wxjqpnVTNniqcb5mNHSCZ87fPubL7YhGGQV2RWkUGcuKrEhgy3FSnLG+Szq+60McPdjkRyLfwLV0mmDRrm9Viy68vVbdqoYd4etQ86fxz1NQ0bbqdWuiDA1b9Rh/kV6URNxportF15GjfUbh6ic8RapwXDQNJD49rNbdqGoSaqSuZqto+1oQiqBzY6Kdxgk/8p6NoAnbAW6QwVz147lU8nfEBddNymoVK6WIlc2BjyOH975WSPvjG0P1sDyLSv66vpPJlb0kEEn8vAy6r79NyGPMz3X99r7i1yakd1CkJ2v99b9RRNbz9p6y4V3/HbHvUFakSVhUiNVfl98IPu5/qCThFraRIsJ98FG1isXB+lN/PR4Y03LVPUjBatPHqLcC/zdUMoSnpOV7xMcJReOitR1Iz4LcS+Be8Oy79Cs+fu7aD4iq+J7aNj7fon1yxrND9B5L1CP/kRFxUlPWW95AeXoRcpdOufuhXGu6arUKj7oy8ZFk6NkZpMrv1eT2hPGRgmRC6b0i5MdZodLJRMPqivme0VSkhdltP+7SxKoi+D7PBUKCWkpsJZ04+laqKLfPWTcLflk8tRV7s5e7+FacaTL16iNJCfp33ll0xKVt2abYalB1gM5lEUrUoCnIdb0qry2d768/HtdLoZd0q3s/9tONZW+sNXUZjIidfqj1TT9GhYkrRcyXthGFC6sIQNw8YfSlVpSm8pR3t95Ak/1zfNP7LZZC8VOO4SLE8WImhj7UmSO5UMoLZrKbNVQj2tZCuIeqV6oa6lRu8nCbZz6peod2AOPYFXI5MEYR2DluKImj305eh+bRHX77reW8vF4PYHrpCTyB0qJMNLJhw98DeHtFV8LTl8TAky+lLJW4uCJWsINI/l2wmPD/Yw4KrlLYoi1h8zesR11fFxdvlsO9pPv1T6+V2RqLowinetOpy77ByLhgdBMj2PqVFhRLAxTthn4zPtMFUiqZwdDKfGx1TycGo02XiLznh4ixBJ6TlWj3ZbeQTPKrvVwezMOy6EjDeam/Xu3n5/pJIqm+tb5PVt7GA7ohIyXN9fHhRr+TxPRjUP4FZ8e71oVXz4fehMU8Gd5a+r/KTtUbpOut1kncb5/08qi8jPNg8n2fZ6W5KsF27/5MFeGaHywJFq7HdWSnzhfOcBAAAAAAAAAIBfyX+5SlRZYBgRpgAAAABJRU5ErkJggg==';",
+ link: 'https://devblog.com/articles/1000000001',
+ isPublic: false,
+ gistUrl: ''
+ });
+
+ return HttpResponse.json(lotus);
+};
+
+// lotus 수정
+export const patchLotus = async ({
+ params,
+ request
+}: {
+ params: PathParams;
+ request: StrictRequest;
+}) => {
+ const { id } = params;
+
+ const body = (await request.json()) as Partial;
+
+ if (!id || typeof id !== 'string') return HttpResponse.json({ message: 'id is required' });
+
+ const lotus = await lotusList.findOne({ id });
+
+ const updatedLotus = await lotusList.update(lotus, body);
+
+ return HttpResponse.json(updatedLotus);
+};
+
+// lotus 삭제
+export const deleteLotus = async ({ params }: { params: PathParams }) => {
+ const { id } = params;
+
+ if (!id || typeof id !== 'string') return HttpResponse.json({ message: 'id is required' });
+
+ const lotus = await lotusList.findOne({
+ id
+ });
+
+ await lotusList.delete(lotus);
+
+ return HttpResponse.json(lotus);
+};
+
+function insertLotus() {
+ const jsImage =
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAkFBMVEX33x4AAAD/5h+KfRF1ag774x//6B9pXw364R703B61oxaRgxLlzxzgyhs/OQi+rBdcUwtDPAhJQgnTvxoXFQPr1B0yLQallRTItRibjBPbxhsqJgWrmhWxoBWNfxGBdBBRSQpiWAw2MQYREAIdGgN8cA9tYg1dVAvDsBgkIQQuKgZVTQoJCAGfjxMgHQQQDgELf9RLAAAG3ElEQVR4nO2cf1/qLBiHBwkxN1s6rWmaWR6zTtb7f3ePsx+PzpsN5iZ0Pt/rr3NSJ5cMGDc3BAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0KME51zs4Lt/uS4Qwa5kRYwKqoSUkyTqLPp3y+HL6+CyE3VTIc0+fD7EZnF5xGJaXUohe7fP7JhBlHKuzlByU3iHKCW74FUfC2d96oM7llEs/XGsZcjD6E3rt2PVq/qNzkYNQ6Fuy/V2zENP2qO9IZ9cGQgyNszk+TRKsDaUUyO/3VW8ULQ1lH+MBRm7Vh50OJaGfGEhuB06QveKdob80kpwqxg4V7Qy5BeWgow9O+9RbQx511pwO2q47m4sDFVcQ5CxruOx38KQ/61lyEZum6K5oUjqCbKB2/vUwvCmpiGbOb1PjQ1rV+GWkQOxH4wN5UNtwXnoQOwHU8OyjvRudX9/cfmiefUm/R3tUGx0fptY5oEPKUezR+LlsXD8VGNqqBsqOsFPyEIJefRIMOi5HvDN65AWjA4FRHg4d5x6ELExNBQpKbgovk8Fg71XRz6EMkwN6UfS+KiKVPj69dpT14MKDIwNeUS9bUU0MjH5fK3zy+I09Nu6lATP41TLzJt4oqkhOfVNyWrifXahPKnA4ETDHllPInU8xh9ykuGEvhM9qsDgRMPMl7ZWhqnhinrb2IfxrgpTwzn1tv4/ZKh58M68anE0pob0/HfpQcS3CkNDNSEN2UPgfS0az55oQ3YV+94WjQ21QYyZHw/YWowNxzpDNkh9S044wDhOo2mIO65T6a+jeaztrkSRPay9dTSPl1Ys3r/MQj8bpHnMOyw3zD/V82ZSuIe5IT3NP2SR+Zf3ZbH2FD5VK7KrWeDZAGlhqIlGFRmOQ68crdaAF0aKjEU+OdoYqnBoqMg8qkerTAVRNuwXmPrS59hlm4jMXPHGk4CibcbQ2lyRrbwICttmfXGLWmRs7UFY0Tpzj/eWFopz16uHdbIvVWCT+tV3fqfWyRGWMwvFp4ljxXpZ0KNrC0d6deNs1MtkVzzRJSYQuK3Fmrn6gQhuK5LZ/+fDad5XXcM8YV8fuilw9TsNt58NNob16DIF8xTD7ad51yxx32H4/zTDfNtUajI83vxew9wxjqpnVTNniqcb5mNHSCZ87fPubL7YhGGQV2RWkUGcuKrEhgy3FSnLG+Szq+60McPdjkRyLfwLV0mmDRrm9Viy68vVbdqoYd4etQ86fxz1NQ0bbqdWuiDA1b9Rh/kV6URNxportF15GjfUbh6ic8RapwXDQNJD49rNbdqGoSaqSuZqto+1oQiqBzY6Kdxgk/8p6NoAnbAW6QwVz147lU8nfEBddNymoVK6WIlc2BjyOH975WSPvjG0P1sDyLSv66vpPJlb0kEEn8vAy6r79NyGPMz3X99r7i1yakd1CkJ2v99b9RRNbz9p6y4V3/HbHvUFakSVhUiNVfl98IPu5/qCThFraRIsJ98FG1isXB+lN/PR4Y03LVPUjBatPHqLcC/zdUMoSnpOV7xMcJReOitR1Iz4LcS+Be8Oy79Cs+fu7aD4iq+J7aNj7fon1yxrND9B5L1CP/kRFxUlPWW95AeXoRcpdOufuhXGu6arUKj7oy8ZFk6NkZpMrv1eT2hPGRgmRC6b0i5MdZodLJRMPqivme0VSkhdltP+7SxKoi+D7PBUKCWkpsJZ04+laqKLfPWTcLflk8tRV7s5e7+FacaTL16iNJCfp33ll0xKVt2abYalB1gM5lEUrUoCnIdb0qry2d768/HtdLoZd0q3s/9tONZW+sNXUZjIidfqj1TT9GhYkrRcyXthGFC6sIQNw8YfSlVpSm8pR3t95Ak/1zfNP7LZZC8VOO4SLE8WImhj7UmSO5UMoLZrKbNVQj2tZCuIeqV6oa6lRu8nCbZz6peod2AOPYFXI5MEYR2DluKImj305eh+bRHX77reW8vF4PYHrpCTyB0qJMNLJhw98DeHtFV8LTl8TAky+lLJW4uCJWsINI/l2wmPD/Yw4KrlLYoi1h8zesR11fFxdvlsO9pPv1T6+V2RqLowinetOpy77ByLhgdBMj2PqVFhRLAxTthn4zPtMFUiqZwdDKfGx1TycGo02XiLznh4ixBJ6TlWj3ZbeQTPKrvVwezMOy6EjDeam/Xu3n5/pJIqm+tb5PVt7GA7ohIyXN9fHhRr+TxPRjUP4FZ8e71oVXz4fehMU8Gd5a+r/KTtUbpOut1kncb5/08qi8jPNg8n2fZ6W5KsF27/5MFeGaHywJFq7HdWSnzhfOcBAAAAAAAAAIBfyX+5SlRZYBgRpgAAAABJRU5ErkJggg==';
+
+ const mockLotusData: (LotusDto & { author: UserDto })[] = [
+ {
+ id: '1000000001',
+ link: 'https://devblog.com/articles/1000000001',
+ title: 'Understanding JavaScript Closures',
+ logo: jsImage,
+ date: new Date('2024-11-01').toISOString(),
+ tags: ['JavaScript', 'Closures', 'Web Development'],
+ author: {
+ id: '0',
+ nickname: 'js_master',
+ profile: 'https://devblog.com/authors/js_master',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000002',
+ link: 'https://devblog.com/articles/1000000002',
+ title: 'A Guide to Responsive Design with CSS',
+ logo: jsImage,
+ date: new Date('2024-10-28').toISOString(),
+ tags: ['CSS', 'Responsive Design', 'Frontend'],
+ author: {
+ id: '2',
+ nickname: 'css_wizard',
+ profile: 'https://devblog.com/authors/css_wizard',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000003',
+ link: 'https://devblog.com/articles/1000000003',
+ title: 'TypeScript vs JavaScript: Key Differences',
+ logo: jsImage,
+ date: new Date('2024-10-25').toISOString(),
+ tags: ['TypeScript', 'JavaScript', 'Programming'],
+ author: {
+ id: '3',
+ nickname: 'ts_guru',
+ profile: 'https://devblog.com/authors/ts_guru',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000004',
+ link: 'https://devblog.com/articles/1000000004',
+ title: 'How to Build RESTful APIs with Node.js',
+ logo: jsImage,
+ date: new Date('2024-10-20').toISOString(),
+ tags: ['Node.js', 'API', 'Backend'],
+ author: {
+ id: '4',
+ nickname: 'node_dev',
+ profile: 'https://devblog.com/authors/node_dev',
+ gistUrl: ''
+ },
+ isPublic: false,
+ gistUrl: ''
+ },
+ {
+ id: '1000000005',
+ link: 'https://devblog.com/articles/1000000005',
+ title: 'Top 10 Python Libraries for Data Science',
+ logo: jsImage,
+ date: new Date('2024-10-15').toISOString(),
+ tags: ['Python', 'Data Science', 'Libraries'],
+ author: {
+ id: '5',
+ nickname: 'data_scientist',
+ profile: 'https://devblog.com/authors/data_scientist',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000006',
+ link: 'https://devblog.com/articles/1000000006',
+ title: 'React State Management: Context vs Redux',
+ logo: jsImage,
+ date: new Date('2024-10-10').toISOString(),
+ tags: ['React', 'Redux', 'Frontend'],
+ author: {
+ id: '6',
+ nickname: 'react_expert',
+ profile: 'https://devblog.com/authors/react_expert',
+ gistUrl: ''
+ },
+ isPublic: false,
+ gistUrl: ''
+ },
+ {
+ id: '1000000007',
+ link: 'https://devblog.com/articles/1000000007',
+ title: 'Mastering Git: Branching and Merging',
+ logo: jsImage,
+ date: new Date('2024-10-05').toISOString(),
+ tags: ['Git', 'Version Control', 'DevOps'],
+ author: {
+ id: '7',
+ nickname: 'git_master',
+ profile: 'https://devblog.com/authors/git_master',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000008',
+ link: 'https://devblog.com/articles/1000000008',
+ title: 'Introduction to Kubernetes for Beginners',
+ logo: jsImage,
+ date: new Date('2024-10-01').toISOString(),
+ tags: ['Kubernetes', 'DevOps', 'Containers'],
+ author: {
+ id: '8',
+ nickname: 'k8s_pro',
+ profile: 'https://devblog.com/authors/k8s_pro',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000009',
+ link: 'https://devblog.com/articles/1000000009',
+ title: 'Building Scalable Microservices with Spring Boot',
+ logo: jsImage,
+ date: new Date('2024-09-25').toISOString(),
+ tags: ['Spring Boot', 'Microservices', 'Backend'],
+ author: {
+ id: '9',
+ nickname: 'spring_dev',
+ profile: 'https://devblog.com/authors/spring_dev',
+ gistUrl: ''
+ },
+ isPublic: false,
+ gistUrl: ''
+ },
+ {
+ id: '1000000010',
+ link: 'https://devblog.com/articles/1000000010',
+ title: 'GraphQL Basics: Query Language for APIs',
+ logo: jsImage,
+ date: new Date('2024-09-20').toISOString(),
+ tags: ['GraphQL', 'API', 'Web Development'],
+ author: {
+ id: '10',
+ nickname: 'graphql_guru',
+ profile: 'https://devblog.com/authors/graphql_guru',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ },
+ {
+ id: '1000000011',
+ link: 'https://devblog.com/articles/1000000011',
+ title: 'Understanding Docker: A Comprehensive Guide',
+ logo: jsImage,
+ date: new Date('2024-09-15').toISOString(),
+ tags: ['Docker', 'DevOps', 'Containers'],
+ author: {
+ id: '11',
+ nickname: 'docker_wizard',
+ profile: 'https://devblog.com/authors/docker_wizard',
+ gistUrl: ''
+ },
+ isPublic: true,
+ gistUrl: ''
+ }
+ ];
+ mockLotusData.forEach((lotus) => {
+ lotusList.create(lotus);
+ });
+}
diff --git a/apps/frontend/src/app/mock/userResolvers.ts b/apps/frontend/src/app/mock/userResolvers.ts
new file mode 100644
index 00000000..1dd517f3
--- /dev/null
+++ b/apps/frontend/src/app/mock/userResolvers.ts
@@ -0,0 +1,92 @@
+import { DefaultBodyType, HttpResponse, StrictRequest } from 'msw';
+import { MockRepository } from './MockRepository';
+import { UserDto } from '@/feature/user';
+
+const MOCK_CODE = 'mock-code';
+const MOCK_UUID = 'mock-uuid';
+
+const userList = new MockRepository>();
+
+const insertUser = () => {
+ const userMock: UserDto = {
+ id: '1',
+ nickname: 'mockUser',
+ profile: '/image/exampleImage.jpeg',
+ gistUrl: 'https://github.com'
+ };
+
+ userList.create(userMock);
+};
+
+insertUser();
+
+// github 사용자 기본 정보 조회 api
+export const getUserInfo = async ({ request }: { request: StrictRequest }) => {
+ const authorization = request.headers.get('Authorization');
+
+ const [type, token] = authorization?.split(' ') || [];
+
+ if (token !== MOCK_UUID || type !== 'Bearer') {
+ return new HttpResponse('Unauthorized: Invalid or missing token', {
+ status: 401,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ const user = await userList.findOne({ id: '0' });
+
+ return HttpResponse.json(user);
+};
+
+// 사용자 프로필 수정 api - 일단 닉네임만 수정되도록
+
+export const patchUserInfo = async ({ request }: { request: StrictRequest }) => {
+ const authorization = request.headers.get('Authorization');
+
+ if (!authorization || !authorization.startsWith('Bearer ')) {
+ return new HttpResponse('Unauthorized: Invalid or missing token', {
+ status: 401,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+
+ try {
+ const body = (await request.json()) as Partial;
+
+ const user = await userList.findOne({ id: '0' });
+
+ const updatedUser = await userList.update(user, body);
+
+ return HttpResponse.json(updatedUser);
+ } catch (error) {
+ console.error(error);
+ return new HttpResponse('Bad Request', {
+ status: 400,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+ }
+};
+
+// 로그인 api
+export const getLogin = ({ request }: { request: StrictRequest }) => {
+ const url = new URL(request.url);
+ const code = url.searchParams.get('code');
+
+ if (code !== MOCK_CODE)
+ return new HttpResponse('Unauthorized: Invalid or missing code', {
+ status: 401,
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+
+ return HttpResponse.json({
+ token: MOCK_UUID
+ });
+};
diff --git a/apps/frontend/src/app/query/QueryProvider.tsx b/apps/frontend/src/app/query/QueryProvider.tsx
new file mode 100644
index 00000000..4f7a61b5
--- /dev/null
+++ b/apps/frontend/src/app/query/QueryProvider.tsx
@@ -0,0 +1,16 @@
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
+
+type QueryProviderProps = {
+ children: React.ReactNode;
+};
+
+export const queryClient = new QueryClient();
+
+export function QueryProvider(props: QueryProviderProps) {
+ return (
+
+ {props.children}
+
+ );
+}
diff --git a/apps/frontend/src/app/query/index.ts b/apps/frontend/src/app/query/index.ts
new file mode 100644
index 00000000..daf15d78
--- /dev/null
+++ b/apps/frontend/src/app/query/index.ts
@@ -0,0 +1 @@
+export * from './QueryProvider';
diff --git a/apps/frontend/src/app/router/RouteProvider.tsx b/apps/frontend/src/app/router/RouteProvider.tsx
new file mode 100644
index 00000000..443d08e5
--- /dev/null
+++ b/apps/frontend/src/app/router/RouteProvider.tsx
@@ -0,0 +1,21 @@
+import { RouterProvider as Provider, createRouter } from '@tanstack/react-router';
+import { TanStackRouterDevtools } from '@tanstack/router-devtools';
+import { routeTree } from '@/app/router/routeTree.gen';
+import { NotFoundPage } from '@/page/-NotFoundPage';
+
+const router = createRouter({ routeTree, defaultNotFoundComponent: () => });
+
+declare module '@tanstack/react-router' {
+ interface Register {
+ router: typeof router;
+ }
+}
+
+export function RouteProvider() {
+ return (
+ <>
+
+ {import.meta.env.DEV && }
+ >
+ );
+}
diff --git a/apps/frontend/src/app/router/index.ts b/apps/frontend/src/app/router/index.ts
new file mode 100644
index 00000000..604a2896
--- /dev/null
+++ b/apps/frontend/src/app/router/index.ts
@@ -0,0 +1 @@
+export * from './RouteProvider';
diff --git a/apps/frontend/src/app/router/routeTree.gen.ts b/apps/frontend/src/app/router/routeTree.gen.ts
new file mode 100644
index 00000000..4af4aeb9
--- /dev/null
+++ b/apps/frontend/src/app/router/routeTree.gen.ts
@@ -0,0 +1,259 @@
+/* eslint-disable */
+
+// @ts-nocheck
+
+// noinspection JSUnusedGlobalSymbols
+
+// This file was automatically generated by TanStack Router.
+// You should NOT make any changes in this file as it will be overwritten.
+// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
+
+import { createFileRoute } from '@tanstack/react-router';
+
+// Import Routes
+
+import { Route as rootRoute } from './../../page/__root';
+import { Route as LoginIndexImport } from './../../page/login/index';
+import { Route as mainUserIndexImport } from './../../page/(main)/user/index';
+import { Route as mainLotusIndexImport } from './../../page/(main)/lotus/index';
+import { Route as mainLotusCreateIndexImport } from './../../page/(main)/lotus/create/index';
+import { Route as mainLotusLotusIdIndexImport } from './../../page/(main)/lotus/$lotusId/index';
+
+// Create Virtual Routes
+
+const mainRouteLazyImport = createFileRoute('/(main)')();
+const IndexLazyImport = createFileRoute('/')();
+
+// Create/Update Routes
+
+const mainRouteLazyRoute = mainRouteLazyImport
+ .update({
+ id: '/(main)',
+ path: '/',
+ getParentRoute: () => rootRoute
+ } as any)
+ .lazy(() => import('./../../page/(main)/route.lazy').then((d) => d.Route));
+
+const IndexLazyRoute = IndexLazyImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => rootRoute
+} as any).lazy(() => import('./../../page/index.lazy').then((d) => d.Route));
+
+const LoginIndexRoute = LoginIndexImport.update({
+ id: '/login/',
+ path: '/login/',
+ getParentRoute: () => rootRoute
+} as any);
+
+const mainUserIndexRoute = mainUserIndexImport
+ .update({
+ id: '/user/',
+ path: '/user/',
+ getParentRoute: () => mainRouteLazyRoute
+ } as any)
+ .lazy(() => import('./../../page/(main)/user/index.lazy').then((d) => d.Route));
+
+const mainLotusIndexRoute = mainLotusIndexImport
+ .update({
+ id: '/lotus/',
+ path: '/lotus/',
+ getParentRoute: () => mainRouteLazyRoute
+ } as any)
+ .lazy(() => import('./../../page/(main)/lotus/index.lazy').then((d) => d.Route));
+
+const mainLotusCreateIndexRoute = mainLotusCreateIndexImport
+ .update({
+ id: '/lotus/create/',
+ path: '/lotus/create/',
+ getParentRoute: () => mainRouteLazyRoute
+ } as any)
+ .lazy(() => import('./../../page/(main)/lotus/create/index.lazy').then((d) => d.Route));
+
+const mainLotusLotusIdIndexRoute = mainLotusLotusIdIndexImport
+ .update({
+ id: '/lotus/$lotusId/',
+ path: '/lotus/$lotusId/',
+ getParentRoute: () => mainRouteLazyRoute
+ } as any)
+ .lazy(() => import('./../../page/(main)/lotus/$lotusId/index.lazy').then((d) => d.Route));
+
+// Populate the FileRoutesByPath interface
+
+declare module '@tanstack/react-router' {
+ interface FileRoutesByPath {
+ '/': {
+ id: '/';
+ path: '/';
+ fullPath: '/';
+ preLoaderRoute: typeof IndexLazyImport;
+ parentRoute: typeof rootRoute;
+ };
+ '/(main)': {
+ id: '/(main)';
+ path: '/';
+ fullPath: '/';
+ preLoaderRoute: typeof mainRouteLazyImport;
+ parentRoute: typeof rootRoute;
+ };
+ '/login/': {
+ id: '/login/';
+ path: '/login';
+ fullPath: '/login';
+ preLoaderRoute: typeof LoginIndexImport;
+ parentRoute: typeof rootRoute;
+ };
+ '/(main)/lotus/': {
+ id: '/(main)/lotus/';
+ path: '/lotus';
+ fullPath: '/lotus';
+ preLoaderRoute: typeof mainLotusIndexImport;
+ parentRoute: typeof mainRouteLazyImport;
+ };
+ '/(main)/user/': {
+ id: '/(main)/user/';
+ path: '/user';
+ fullPath: '/user';
+ preLoaderRoute: typeof mainUserIndexImport;
+ parentRoute: typeof mainRouteLazyImport;
+ };
+ '/(main)/lotus/$lotusId/': {
+ id: '/(main)/lotus/$lotusId/';
+ path: '/lotus/$lotusId';
+ fullPath: '/lotus/$lotusId';
+ preLoaderRoute: typeof mainLotusLotusIdIndexImport;
+ parentRoute: typeof mainRouteLazyImport;
+ };
+ '/(main)/lotus/create/': {
+ id: '/(main)/lotus/create/';
+ path: '/lotus/create';
+ fullPath: '/lotus/create';
+ preLoaderRoute: typeof mainLotusCreateIndexImport;
+ parentRoute: typeof mainRouteLazyImport;
+ };
+ }
+}
+
+// Create and export the route tree
+
+interface mainRouteLazyRouteChildren {
+ mainLotusIndexRoute: typeof mainLotusIndexRoute;
+ mainUserIndexRoute: typeof mainUserIndexRoute;
+ mainLotusLotusIdIndexRoute: typeof mainLotusLotusIdIndexRoute;
+ mainLotusCreateIndexRoute: typeof mainLotusCreateIndexRoute;
+}
+
+const mainRouteLazyRouteChildren: mainRouteLazyRouteChildren = {
+ mainLotusIndexRoute: mainLotusIndexRoute,
+ mainUserIndexRoute: mainUserIndexRoute,
+ mainLotusLotusIdIndexRoute: mainLotusLotusIdIndexRoute,
+ mainLotusCreateIndexRoute: mainLotusCreateIndexRoute
+};
+
+const mainRouteLazyRouteWithChildren = mainRouteLazyRoute._addFileChildren(mainRouteLazyRouteChildren);
+
+export interface FileRoutesByFullPath {
+ '/': typeof mainRouteLazyRouteWithChildren;
+ '/login': typeof LoginIndexRoute;
+ '/lotus': typeof mainLotusIndexRoute;
+ '/user': typeof mainUserIndexRoute;
+ '/lotus/$lotusId': typeof mainLotusLotusIdIndexRoute;
+ '/lotus/create': typeof mainLotusCreateIndexRoute;
+}
+
+export interface FileRoutesByTo {
+ '/': typeof mainRouteLazyRouteWithChildren;
+ '/login': typeof LoginIndexRoute;
+ '/lotus': typeof mainLotusIndexRoute;
+ '/user': typeof mainUserIndexRoute;
+ '/lotus/$lotusId': typeof mainLotusLotusIdIndexRoute;
+ '/lotus/create': typeof mainLotusCreateIndexRoute;
+}
+
+export interface FileRoutesById {
+ __root__: typeof rootRoute;
+ '/': typeof IndexLazyRoute;
+ '/(main)': typeof mainRouteLazyRouteWithChildren;
+ '/login/': typeof LoginIndexRoute;
+ '/(main)/lotus/': typeof mainLotusIndexRoute;
+ '/(main)/user/': typeof mainUserIndexRoute;
+ '/(main)/lotus/$lotusId/': typeof mainLotusLotusIdIndexRoute;
+ '/(main)/lotus/create/': typeof mainLotusCreateIndexRoute;
+}
+
+export interface FileRouteTypes {
+ fileRoutesByFullPath: FileRoutesByFullPath;
+ fullPaths: '/' | '/login' | '/lotus' | '/user' | '/lotus/$lotusId' | '/lotus/create';
+ fileRoutesByTo: FileRoutesByTo;
+ to: '/' | '/login' | '/lotus' | '/user' | '/lotus/$lotusId' | '/lotus/create';
+ id:
+ | '__root__'
+ | '/'
+ | '/(main)'
+ | '/login/'
+ | '/(main)/lotus/'
+ | '/(main)/user/'
+ | '/(main)/lotus/$lotusId/'
+ | '/(main)/lotus/create/';
+ fileRoutesById: FileRoutesById;
+}
+
+export interface RootRouteChildren {
+ IndexLazyRoute: typeof IndexLazyRoute;
+ mainRouteLazyRoute: typeof mainRouteLazyRouteWithChildren;
+ LoginIndexRoute: typeof LoginIndexRoute;
+}
+
+const rootRouteChildren: RootRouteChildren = {
+ IndexLazyRoute: IndexLazyRoute,
+ mainRouteLazyRoute: mainRouteLazyRouteWithChildren,
+ LoginIndexRoute: LoginIndexRoute
+};
+
+export const routeTree = rootRoute._addFileChildren(rootRouteChildren)._addFileTypes();
+
+/* ROUTE_MANIFEST_START
+{
+ "routes": {
+ "__root__": {
+ "filePath": "__root.tsx",
+ "children": [
+ "/",
+ "/(main)",
+ "/login/"
+ ]
+ },
+ "/": {
+ "filePath": "index.lazy.tsx"
+ },
+ "/(main)": {
+ "filePath": "(main)/route.lazy.tsx",
+ "children": [
+ "/(main)/lotus/",
+ "/(main)/user/",
+ "/(main)/lotus/$lotusId/",
+ "/(main)/lotus/create/"
+ ]
+ },
+ "/login/": {
+ "filePath": "login/index.tsx"
+ },
+ "/(main)/lotus/": {
+ "filePath": "(main)/lotus/index.tsx",
+ "parent": "/(main)"
+ },
+ "/(main)/user/": {
+ "filePath": "(main)/user/index.tsx",
+ "parent": "/(main)"
+ },
+ "/(main)/lotus/$lotusId/": {
+ "filePath": "(main)/lotus/$lotusId/index.tsx",
+ "parent": "/(main)"
+ },
+ "/(main)/lotus/create/": {
+ "filePath": "(main)/lotus/create/index.tsx",
+ "parent": "/(main)"
+ }
+ }
+}
+ROUTE_MANIFEST_END */
diff --git a/apps/frontend/src/app/style/github.css b/apps/frontend/src/app/style/github.css
new file mode 100644
index 00000000..8ad192a9
--- /dev/null
+++ b/apps/frontend/src/app/style/github.css
@@ -0,0 +1,214 @@
+/* General Styles */
+.github {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji',
+ 'Segoe UI Emoji', 'Segoe UI Symbol';
+ font-size: 16px;
+ line-height: 1.6;
+ color: #24292e;
+}
+
+/* Headings */
+.github h1,
+.github h2,
+.github h3,
+.github h4,
+.github h5,
+.github h6 {
+ font-weight: 600;
+ line-height: 1.25;
+ color: #2c3e50;
+ margin-top: 24px;
+ margin-bottom: 16px;
+ scroll-margin-top: 60px;
+}
+
+.github h1 {
+ font-size: 2.25em;
+ border-bottom: 1px solid #eaecef;
+ padding-bottom: 0.3em;
+}
+.github h2 {
+ font-size: 1.75em;
+ border-bottom: 1px solid #eaecef;
+ padding-bottom: 0.3em;
+}
+.github h3 {
+ font-size: 1.5em;
+}
+.github h4 {
+ font-size: 1.25em;
+}
+.github h5 {
+ font-size: 1em;
+}
+.github h6 {
+ font-size: 0.875em;
+ color: #6a737d;
+}
+
+/* Paragraphs */
+.github p {
+ margin-top: 0;
+ margin-bottom: 16px;
+ color: #333;
+}
+
+/* Lists */
+.github ul,
+.github ol {
+ padding-left: 2em;
+ margin-top: 0;
+ margin-bottom: 16px;
+}
+
+.github ul ul,
+.github ul ol,
+.github ol ol,
+.github ol ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.github li {
+ word-wrap: break-word;
+ margin-bottom: 4px;
+}
+
+.github ul {
+ list-style-type: disc;
+}
+
+.github ol {
+ list-style-type: decimal;
+}
+
+.github li > p {
+ margin: 0;
+}
+
+/* Links */
+.github a {
+ color: #0366d6;
+ text-decoration: none;
+ transition: color 0.2s ease;
+}
+
+.github a:hover {
+ color: #0056b3;
+ text-decoration: underline;
+}
+
+/* Code Blocks */
+.github pre {
+ background-color: #f6f8fa;
+ border-radius: 6px;
+ padding: 16px;
+ overflow: auto;
+ font-size: 0.85em;
+ line-height: 1.45;
+ margin: 16px 0;
+}
+
+.github code {
+ background-color: #f6f8fa;
+ border-radius: 3px;
+ padding: 2px 4px;
+ font-size: 0.9em;
+ color: #e83e8c;
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+}
+
+.github pre code {
+ background-color: transparent;
+ padding: 0;
+ color: #24292e;
+}
+
+/* Tables */
+.github table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ display: block;
+ width: 100%;
+ overflow: auto;
+ margin-bottom: 16px;
+}
+
+.github table th {
+ font-weight: 600;
+ background-color: #f6f8fa;
+ padding: 8px;
+}
+
+.github table th,
+.github table td {
+ padding: 6px 13px;
+ border: 1px solid #dfe2e5;
+ text-align: left;
+}
+
+.github table tr {
+ background-color: #fff;
+ border-top: 1px solid #c6cbd1;
+}
+
+.github table tr:nth-child(2n) {
+ background-color: #f6f8fa;
+}
+
+/* Images */
+.github img {
+ max-width: 100%;
+ height: auto;
+ box-sizing: content-box;
+ background-color: #fff;
+ margin: 16px 0;
+ border-radius: 4px;
+}
+
+/* Blockquotes */
+.github blockquote {
+ padding: 0.5em 1em;
+ color: #6a737d;
+ border-left: 0.25em solid #dfe2e5;
+ margin: 16px 0;
+ background-color: #f9f9f9;
+}
+
+.github blockquote p {
+ margin: 0;
+}
+
+/* Horizontal Rule */
+.github hr {
+ height: 0.25em;
+ padding: 0;
+ margin: 24px 0;
+ background-color: #e1e4e8;
+ border: 0;
+ opacity: 0.8;
+}
+
+/* Inline Code */
+.github code {
+ background: rgba(27, 31, 35, 0.05);
+ border-radius: 3px;
+ font-size: 85%;
+ padding: 0.2em 0.4em;
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+}
+
+/* Inline Math */
+.github .math-inline {
+ font-family: 'Cambria Math', 'STIX Math', 'Avenir Next', sans-serif;
+ font-size: 1em;
+ background: #fafbfc;
+ padding: 2px 6px;
+ border-radius: 3px;
+}
+
+/* Code Spacing */
+.github pre code {
+ font-size: 1em;
+ line-height: 1.4;
+}
diff --git a/apps/frontend/src/app/style/index.css b/apps/frontend/src/app/style/index.css
new file mode 100644
index 00000000..d2ffc043
--- /dev/null
+++ b/apps/frontend/src/app/style/index.css
@@ -0,0 +1,9 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --radius: 0.5rem;
+ }
+}
diff --git a/apps/frontend/src/app/test/e2e/lotusDetail.spec.ts b/apps/frontend/src/app/test/e2e/lotusDetail.spec.ts
new file mode 100644
index 00000000..11874551
--- /dev/null
+++ b/apps/frontend/src/app/test/e2e/lotusDetail.spec.ts
@@ -0,0 +1,109 @@
+import test, { expect } from '@playwright/test';
+
+test('Lotus 상세 페이지에서 코드 실행을 하고 결과를 확인할 수 있다.', async ({ page }) => {
+ // Given
+ await page.goto('/lotus');
+ const lotusLink = page.getByTestId('lotus-link').first();
+ await lotusLink.click();
+ await page.waitForLoadState('load');
+
+ // When
+ await page.getByRole('button', { name: '실행하기' }).click();
+ await page.getByRole('combobox').click();
+ await page.getByRole('listbox').click();
+ await page.getByRole('button', { name: '새로운 항목 추가' }).click();
+ await page.getByPlaceholder('Input').fill('12');
+ await page.getByRole('button', { name: '새로운 항목 추가' }).click();
+ await page.getByPlaceholder('Input 2').click();
+ await page.getByPlaceholder('Input 2').fill('23');
+ await page.locator('form').getByRole('paragraph').nth(1).click();
+ await page.locator('section').getByRole('button', { name: '실행하기' }).click();
+
+ // Then
+ await page.waitForSelector('[data-testid="history-status"]');
+ await expect(page.getByText('코드가 실행되었습니다.')).toBeVisible();
+ const codeRunStatus = page.getByTestId('history-status').first();
+ expect(await codeRunStatus.textContent()).toBe('pending');
+});
+
+test('Lotus 상세 페이지에서 제목과 태그를 수정할 수 있다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+ const lotusLink = page.getByTestId('lotus-link').first();
+ await lotusLink.click();
+ await page.waitForLoadState('load');
+
+ // When
+ await page.getByRole('button', { name: '수정하기' }).click();
+ await page.getByPlaceholder('제목을 입력해주세요').click();
+ await page.getByPlaceholder('제목을 입력해주세요').fill('New Title');
+ await page
+ .locator('form div')
+ .filter({ hasText: /^JavaScript$/ })
+ .getByRole('button')
+ .click();
+ await page.getByPlaceholder('태그를 입력해주세요').click();
+ await page.getByPlaceholder('태그를 입력해주세요').fill('new Tag');
+ await page.getByPlaceholder('태그를 입력해주세요').press('Enter');
+ await page.locator('form').getByRole('button', { name: '수정하기' }).click();
+
+ // Then
+ await expect(page.getByText('New Title')).toBeVisible();
+ await expect(page.getByText('JavaScript')).toBeHidden();
+ await expect(page.getByText('new Tag')).toBeVisible();
+ await expect(page.getByText('Lotus가 수정되었습니다.')).toBeVisible();
+});
+
+test('Lotus 상세 페이지에서 삭제할 수 있다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+ const lotusLink = page.getByTestId('lotus-link').first();
+ await lotusLink.click();
+ await page.waitForLoadState('load');
+
+ // When
+ const deleteButton = page.getByRole('button', { name: '삭제하기' });
+ await deleteButton.waitFor({ state: 'visible' });
+ const deletedTitle = await page.getByTestId('lotus-title').textContent();
+ await deleteButton.click();
+
+ await expect(page.getByText('정말로 삭제하시겠습니까?')).toBeVisible();
+ await page.getByRole('button', { name: '삭제하기' }).nth(1).click();
+
+ // Then
+ await expect(page.getByText('Lotus는 gist 저장소들을 의미합니다')).toBeVisible();
+ await page.waitForSelector('[data-testid="lotus-title"]');
+
+ const lotusTitles = await page.getByTestId('lotus-title').allTextContents();
+ const isDelete = lotusTitles.every((value) => value !== deletedTitle);
+ expect(isDelete).toBe(true);
+ await expect(page.getByText('Lotus가 삭제되었습니다.')).toBeVisible();
+});
+
+test('Lotus 상세 페이지에서 public을 Private으로 바꾸면 Lotus 목록 페이지에서 사라진다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+ const lotusLink = page.getByTestId('lotus-link').first();
+ await lotusLink.click();
+ await page.waitForLoadState('load');
+
+ // When
+ const publicSwitch = page.getByRole('switch');
+ await publicSwitch.waitFor({ state: 'visible' });
+ await publicSwitch.click();
+ await page.waitForTimeout(3000);
+
+ const targetTitle = await page.getByTestId('lotus-title').textContent();
+ await page.getByRole('button', { name: '로고 Froxy' }).click();
+
+ // Then
+ await expect(page.getByText('Lotus는 gist 저장소들을 의미합니다')).toBeVisible();
+ await page.waitForSelector('[data-testid="lotus-title"]');
+
+ const lotusTitles = await page.getByTestId('lotus-title').allTextContents();
+ const isHidden = lotusTitles.every((value) => value !== targetTitle);
+ expect(isHidden).toBe(true);
+});
diff --git a/apps/frontend/src/app/test/e2e/lotusList.spec.ts b/apps/frontend/src/app/test/e2e/lotusList.spec.ts
new file mode 100644
index 00000000..99b7a026
--- /dev/null
+++ b/apps/frontend/src/app/test/e2e/lotusList.spec.ts
@@ -0,0 +1,49 @@
+import test, { expect } from '@playwright/test';
+
+test('온보딩 페이지에서 "공개 프로젝트 보러가기" 버튼을 누르면 public Lotus 목록을 볼 수 있다.', async ({ page }) => {
+ // Give
+ await page.goto('/');
+
+ // When
+ await page.getByRole('button', { name: '공개 프로젝트 보러가기' }).click();
+ await page.waitForSelector('[data-testid="lotus-title"]');
+ const lotusComponents = await page.getByTestId('lotus-title').count();
+
+ // then
+ await expect(page.getByText('Lotus는 gist 저장소들을 의미합니다')).toBeVisible();
+ expect(lotusComponents).toBeGreaterThan(0);
+ await expect(page.getByText('1', { exact: true })).toBeVisible();
+});
+
+test('Lotus 목록 페이지에서 제목 검색이 가능해야 한다.', async ({ page }) => {
+ // Give
+ const searchText = 'test';
+ await page.goto('/lotus');
+
+ // When
+ await page.getByPlaceholder('제목을 검색해주세요').click();
+ await page.getByPlaceholder('제목을 검색해주세요').fill(searchText);
+ await page.getByRole('button', { name: '검색하기' }).click();
+
+ await page.waitForSelector('[data-testid="lotus-title"]', { timeout: 3000 }).catch(() => {});
+ const lotusTitles = await page.getByTestId('lotus-title').allTextContents();
+
+ // then
+ const hasInvalidTitle = lotusTitles?.some((title) => !title.includes(searchText));
+ expect(hasInvalidTitle).toBe(false);
+});
+
+test('Lotus 목록 페이지에서 Lotus 카드를 클릭하면 Lotus 상세 페이지로 이동한다.', async ({ page }) => {
+ // Given
+ await page.goto('/lotus');
+
+ // When
+ const lotusLink = page.getByTestId('lotus-link').first();
+ const expectedUrl = await lotusLink.getAttribute('href');
+ await lotusLink.click();
+ await page.waitForLoadState('load');
+
+ // Then
+ const currentUrl = page.url();
+ expect(currentUrl).toBe('http://localhost:5173' + expectedUrl);
+});
diff --git a/apps/frontend/src/app/test/e2e/user.spec.ts b/apps/frontend/src/app/test/e2e/user.spec.ts
new file mode 100644
index 00000000..87b94f45
--- /dev/null
+++ b/apps/frontend/src/app/test/e2e/user.spec.ts
@@ -0,0 +1,126 @@
+import test, { expect } from '@playwright/test';
+
+test('로그인을 안하면 헤더에서 로그인 버튼을 볼 수 있다.', async ({ page }) => {
+ // Given
+ await page.goto(`/lotus`);
+
+ // When
+ const loginButton = page.getByRole('button', { name: 'Login' });
+ await loginButton.waitFor({ state: 'visible' });
+
+ // Then
+ expect(await loginButton.isVisible()).toBe(true);
+});
+
+test('로그인 상태이면 헤더에서 Lotus 작성, 로그인, 프로필을 볼 수 있다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+
+ // When
+ const createLotusButton = page.getByRole('link', { name: 'Create Lotus' });
+ const logoutButton = page.getByRole('button', { name: 'Logout' });
+ const profile = page.getByTestId('header-profile');
+ await profile.waitFor({ state: 'visible' });
+
+ // Then
+ expect(await page.getByText('mockUser님 환영합니다!').isVisible()).toBe(true);
+ expect(await createLotusButton.isVisible()).toBe(true);
+ expect(await logoutButton.isVisible()).toBe(true);
+ expect(await profile.isVisible()).toBe(true);
+});
+
+test('로그인 상태이면 헤더에서 Lotus를 생성하기를 통해 Lotus를 생성할 수 있다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+
+ // When
+ await page.getByRole('link', { name: 'Create Lotus' }).click();
+
+ await page.getByPlaceholder('제목을 입력해주세요').click();
+ await page.getByPlaceholder('제목을 입력해주세요').fill('테스트 제목');
+ await page.getByPlaceholder('태그를 입력해주세요').click();
+ await page.getByPlaceholder('태그를 입력해주세요').fill('tag1');
+ await page.getByPlaceholder('태그를 입력해주세요').press('Enter');
+ await page.getByPlaceholder('태그를 입력해주세요').fill('tag2');
+ await page.getByPlaceholder('태그를 입력해주세요').press('Enter');
+
+ await page.getByRole('combobox').click();
+ await page.getByLabel('My First Gist').click();
+ await page.getByRole('button', { name: '생성하기' }).click();
+
+ // Then
+ await expect(page.getByText('테스트 제목')).toBeVisible();
+ await expect(page.getByText('tag1')).toBeVisible();
+ await expect(page.getByText('tag2')).toBeVisible();
+ await expect(page.getByText('Lotus가 생성되었습니다.')).toBeVisible();
+});
+
+test('헤더에서 로그아웃 버튼을 누르면 메인 페이지로 이동한다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+
+ // When
+ await page.getByRole('button', { name: 'Logout' }).click();
+ await page.waitForLoadState('load');
+
+ // Then
+ const currentUrl = page.url();
+ expect(currentUrl).toBe('http://localhost:5173/');
+});
+
+test('헤더에서 프로필 버튼을 누르면 사용자 정보 페이지로 이동한다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+
+ // When
+ await page.getByTestId('header-profile').click();
+ await page.waitForLoadState('load');
+ await page.waitForSelector('[data-testid="lotus-title"]');
+
+ // Then
+ const lotusComponents = await page.getByTestId('lotus-title').count();
+ expect(lotusComponents).toBeGreaterThan(0);
+ await expect(page.getByTestId('user-profile')).toBeVisible();
+ await expect(page.getByTestId('user-nickname')).toBeVisible();
+});
+
+test('사용자 정보 페이지에서 자신의 닉네임을 수정할 수 있다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+
+ // When
+ await page.getByTestId('header-profile').click();
+ await page.getByTestId('user-profile').waitFor({ state: 'visible' });
+ await page.locator('.flex > svg').first().click();
+ await page.getByPlaceholder('값을 입력해주세요').click();
+ await page.getByPlaceholder('값을 입력해주세요').fill('new Nickname');
+ await page.getByRole('button', { name: '수정하기' }).click();
+
+ // Then
+ await page.getByText('new Nickname').waitFor({ state: 'visible' });
+ expect(await page.getByText('new Nickname').isVisible()).toBe(true);
+ expect(await page.getByText('닉네임이 수정되었습니다.').isVisible()).toBe(true);
+});
+
+test('사용자 정보 페이지에서 자신이 작성한 Lotus 카드를 클릭하면 Lotus 상세 페이지로 이동한다.', async ({ page }) => {
+ // Given
+ const MOCK_CODE = 'mock-code';
+ await page.goto(`/login?code=${MOCK_CODE}`);
+
+ // When
+ await page.getByTestId('header-profile').click();
+ await page.waitForLoadState('load');
+ const lotusLink = page.getByTestId('lotus-link').first();
+ const expectedUrl = await lotusLink.getAttribute('href');
+ await lotusLink.click();
+ await page.waitForLoadState('load');
+
+ // Then
+ const currentUrl = page.url();
+ expect(currentUrl).toBe('http://localhost:5173' + expectedUrl);
+});
diff --git a/apps/frontend/src/app/test/setupTests.ts b/apps/frontend/src/app/test/setupTests.ts
new file mode 100644
index 00000000..0bcc78cb
--- /dev/null
+++ b/apps/frontend/src/app/test/setupTests.ts
@@ -0,0 +1,7 @@
+import { cleanup } from '@testing-library/react';
+import { afterEach } from 'vitest';
+import '@testing-library/jest-dom/vitest';
+
+afterEach(() => {
+ cleanup();
+});
diff --git a/apps/frontend/src/app/vite-env.d.ts b/apps/frontend/src/app/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/apps/frontend/src/app/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/apps/frontend/src/feature/codeView/.index.tsx.icloud b/apps/frontend/src/feature/codeView/.index.tsx.icloud
new file mode 100644
index 00000000..40fb1f55
Binary files /dev/null and b/apps/frontend/src/feature/codeView/.index.tsx.icloud differ
diff --git a/apps/frontend/src/feature/codeView/.model.ts.icloud b/apps/frontend/src/feature/codeView/.model.ts.icloud
new file mode 100644
index 00000000..50cf5f50
Binary files /dev/null and b/apps/frontend/src/feature/codeView/.model.ts.icloud differ
diff --git a/apps/frontend/src/feature/codeView/.type 2.ts.icloud b/apps/frontend/src/feature/codeView/.type 2.ts.icloud
new file mode 100644
index 00000000..e6ff3988
Binary files /dev/null and b/apps/frontend/src/feature/codeView/.type 2.ts.icloud differ
diff --git a/apps/frontend/src/feature/codeView/.type 3.ts.icloud b/apps/frontend/src/feature/codeView/.type 3.ts.icloud
new file mode 100644
index 00000000..17f887bf
Binary files /dev/null and b/apps/frontend/src/feature/codeView/.type 3.ts.icloud differ
diff --git a/apps/frontend/src/feature/codeView/component/CodeSideBar.tsx b/apps/frontend/src/feature/codeView/component/CodeSideBar.tsx
new file mode 100644
index 00000000..c994bb47
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/component/CodeSideBar.tsx
@@ -0,0 +1,26 @@
+import { HTMLProps } from 'react';
+import { Button } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { useCodeViewActionContext, useCodeViewContext } from '@/feature/codeView/hook';
+
+type CodeSideBarProps = HTMLProps;
+
+export function CodeSideBar({ className, ...props }: CodeSideBarProps) {
+ const { value, current } = useCodeViewContext();
+ const setCurrentCode = useCodeViewActionContext();
+
+ return (
+
+ {value.map((v, i) => (
+ setCurrentCode(i)}
+ >
+ {v.filename}
+
+ ))}
+
+ );
+}
diff --git a/apps/frontend/src/feature/codeView/component/CodeViewProvider.tsx b/apps/frontend/src/feature/codeView/component/CodeViewProvider.tsx
new file mode 100644
index 00000000..e148ec34
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/component/CodeViewProvider.tsx
@@ -0,0 +1,28 @@
+import { useState } from 'react';
+import { CodeViewActionContext, CodeViewContext } from '@/feature/codeView/hook';
+import { CodeFileModel } from '@/feature/codeView/model';
+
+type CodeViewProviderProps = {
+ value: CodeFileModel[];
+ children: React.ReactNode;
+ current?: number;
+};
+
+export function CodeViewProvider({ value, children, current: currentIndex = 0 }: CodeViewProviderProps) {
+ const [current, setCurrent] = useState(currentIndex);
+
+ const setCurrentCode = (index: number) => setCurrent(index);
+
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/apps/frontend/src/feature/codeView/component/CodeViewer.tsx b/apps/frontend/src/feature/codeView/component/CodeViewer.tsx
new file mode 100644
index 00000000..54000e56
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/component/CodeViewer.tsx
@@ -0,0 +1,40 @@
+import { HTMLProps } from 'react';
+import { cn } from '@froxy/design/utils';
+import { Markdown } from '@froxy/react-markdown';
+import { Text } from '@/components';
+import { useCodeViewContext } from '@/feature/codeView/hook';
+
+type CodeViewerProps = {
+ children?: string;
+ theme?: 'github-light' | 'github-dark';
+} & HTMLProps;
+
+// TODO : 아주 막연하게 구현된 컴포넌트, 추후에 스타일 리팩터링 필요
+export function CodeViewer({ className, ...props }: CodeViewerProps) {
+ const { value, current } = useCodeViewContext();
+
+ const file = value[current];
+
+ if (!file.canView)
+ return (
+
+
+
지원하지 않는 확장자입니다.
+
+ );
+
+ return (
+ figure]:h-full [&>figure]:w-full [&>figure>pre]:h-full [&>figure>pre]:w-full [&>figure>pre]:m-0'
+ : 'p-2',
+ 'overflow-scroll',
+ className
+ )}
+ markdown={file.toMarkdown()}
+ {...props}
+ />
+ );
+}
diff --git a/apps/frontend/src/feature/codeView/component/index.ts b/apps/frontend/src/feature/codeView/component/index.ts
new file mode 100644
index 00000000..cb01b0fe
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/component/index.ts
@@ -0,0 +1,5 @@
+import { CodeSideBar } from './CodeSideBar';
+import { CodeViewer } from './CodeViewer';
+import { CodeViewProvider } from './CodeViewProvider';
+
+export const CodeView = Object.assign(CodeViewProvider, { SideBar: CodeSideBar, Viewer: CodeViewer });
diff --git a/apps/frontend/src/feature/codeView/constant.ts b/apps/frontend/src/feature/codeView/constant.ts
new file mode 100644
index 00000000..7bd8f26f
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/constant.ts
@@ -0,0 +1,45 @@
+export const LANGUAGES_EXT = {
+ TypeScript: 'ts',
+ ts: 'ts',
+ Ts: 'ts',
+ JavaScript: 'js',
+ Js: 'js',
+ js: 'js',
+ json: 'json',
+ JSON: 'json',
+ jsx: 'jsx',
+ tsx: 'tsx',
+ css: 'css',
+ scss: 'scss',
+ sass: 'sass',
+ html: 'html',
+ babelrc: 'json',
+ prettierrc: 'json',
+ eslintrc: 'json'
+} as const;
+
+export const CANT_VIEW_EXT = [
+ 'png',
+ 'jpg',
+ 'jpeg',
+ 'gif',
+ 'svg',
+ 'bmp',
+ 'webp',
+ 'ico',
+ 'tiff',
+ 'tif',
+ 'raw',
+ 'heif',
+ 'heic',
+ 'apng',
+ 'avif',
+ 'jxl',
+ 'mp4',
+ 'mov',
+ 'avi',
+ 'wmv',
+ 'flv',
+ 'mkv',
+ 'webm'
+];
diff --git a/apps/frontend/src/feature/codeView/hook.ts b/apps/frontend/src/feature/codeView/hook.ts
new file mode 100644
index 00000000..2c5b401f
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/hook.ts
@@ -0,0 +1,31 @@
+import { createContext, useContext } from 'react';
+import { CodeFileModel } from '.';
+
+export interface CodeViewContext {
+ value: CodeFileModel[];
+ current: number;
+}
+export type CodeViewActionContext = (arg: number) => void;
+
+export const CodeViewContext = createContext(null);
+export const CodeViewActionContext = createContext(null);
+
+export const useCodeViewContext = () => {
+ const value = useContext(CodeViewContext);
+
+ if (!value) {
+ throw new Error('useCodeViewContext must be used within a CodeViewProvider');
+ }
+
+ return value;
+};
+
+export const useCodeViewActionContext = () => {
+ const value = useContext(CodeViewActionContext);
+
+ if (!value) {
+ throw new Error('useCodeViewActionContext must be used within a CodeViewProvider');
+ }
+
+ return value;
+};
diff --git a/apps/frontend/src/feature/codeView/index.ts b/apps/frontend/src/feature/codeView/index.ts
new file mode 100644
index 00000000..cd9ca1c0
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/index.ts
@@ -0,0 +1,2 @@
+export * from './component';
+export * from './model';
diff --git a/apps/frontend/src/feature/codeView/model/index.ts b/apps/frontend/src/feature/codeView/model/index.ts
new file mode 100644
index 00000000..9f8ccadd
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/model/index.ts
@@ -0,0 +1 @@
+export * from './model';
diff --git a/apps/frontend/src/feature/codeView/model/model.test.ts b/apps/frontend/src/feature/codeView/model/model.test.ts
new file mode 100644
index 00000000..b95995b9
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/model/model.test.ts
@@ -0,0 +1,193 @@
+import { describe, expect, it } from 'vitest';
+import { CodeFileModel } from './model';
+
+describe('CodeFileModel', () => {
+ it.each([
+ {
+ description: '올바른 DTO를 받아 CodeFileModel을 생성합니다.',
+ dto: {
+ filename: 'example.js',
+ language: 'JavaScript',
+ content: 'console.log("Hello, world!");'
+ },
+ expected: {
+ filename: 'example.js',
+ language: 'JavaScript',
+ content: 'console.log("Hello, world!");',
+ ext: 'js'
+ }
+ },
+ {
+ description: '비어있는 값은 빈 값으로 처리합니다.',
+ dto: {
+ filename: '',
+ language: '',
+ content: ''
+ },
+ expected: {
+ filename: '',
+ language: '',
+ content: '',
+ ext: ''
+ }
+ }
+ ])('$description', ({ dto, expected }) => {
+ // Given
+ const model = new CodeFileModel(dto);
+
+ //When
+
+ // Then: 필드 검증
+ expect(model).toMatchObject(expected);
+ });
+
+ it.each([
+ {
+ description: 'README 파일일 경우 isREADME가 true입니다.',
+ dto: {
+ filename: 'README.md',
+ language: 'Markdown',
+ content: '# Hello World'
+ },
+ expected: true
+ },
+ {
+ description: 'README 파일이 아닐 경우 isREADME가 false입니다.',
+ dto: {
+ filename: 'example.js',
+ language: 'JavaScript',
+ content: 'console.log("Hello, world!");'
+ },
+ expected: false
+ }
+ ])('$description', ({ dto, expected }) => {
+ // Given
+ const model = new CodeFileModel(dto);
+
+ //When
+
+ // Then: isREADME getter 확인
+ expect(model.isREADME).toBe(expected);
+ });
+
+ it.each([
+ {
+ description: '마크다운 파일인 경우 isMarkdown가 true입니다.',
+ dto: {
+ filename: 'example.md',
+ language: 'Markdown',
+ content: '# Hello World'
+ },
+ expected: true
+ },
+ {
+ description: '마크다운 파일이 아닌 경우 isMarkdown가 false입니다.',
+ dto: {
+ filename: 'example.js',
+ language: 'JavaScript',
+ content: 'console.log("Hello, world!");'
+ },
+ expected: false
+ }
+ ])('$description', ({ dto, expected }) => {
+ // Given
+ const model = new CodeFileModel(dto);
+
+ //When
+
+ // Then: isMarkdown getter 확인
+ expect(model.isMarkdown).toBe(expected);
+ });
+
+ it.each([
+ {
+ description: '지원하는 확장자 형식인 경우 canView가 true입니다.',
+ dto: {
+ filename: 'example.md',
+ language: 'Markdown',
+ content: '# Hello World'
+ },
+ expected: true
+ },
+ {
+ description: '지원하지 않는 확장자의 경우 canView가 false입니다.',
+ dto: {
+ filename: 'example.png',
+ language: 'Binary',
+ content: ''
+ },
+ expected: false
+ }
+ ])('$description', ({ dto, expected }) => {
+ // Given
+ const model = new CodeFileModel(dto);
+
+ //When
+
+ // Then: canView getter 확인
+ expect(model.canView).toBe(expected);
+ });
+
+ it.each([
+ {
+ description: 'README 파일이 존재하는 경우 getDefaultFile은 README 파일을 반환합니다.',
+ files: [
+ new CodeFileModel({ filename: 'README.md', language: 'Markdown', content: '# Hello' }),
+ new CodeFileModel({ filename: 'example.js', language: 'JavaScript', content: 'console.log("test");' }),
+ new CodeFileModel({ filename: 'example.md', language: 'Markdown', content: 'hola' })
+ ],
+ expected: 'README.md'
+ },
+ {
+ description: 'README 파일이 없고 마크다운 파일이 존재하는 경우 getDefaultFile은 마크다운 파일을 반환합니다.',
+ files: [
+ new CodeFileModel({ filename: 'example.md', language: 'Markdown', content: '# Hello' }),
+ new CodeFileModel({ filename: 'example.js', language: 'JavaScript', content: 'console.log("test");' })
+ ],
+ expected: 'example.md'
+ },
+ {
+ description: 'README 파일과 마크다운 파일이 없는 경우 getDefaultFile은 undefined를 반환합니다.',
+ files: [
+ new CodeFileModel({ filename: 'example.js', language: 'JavaScript', content: 'console.log("test");' }),
+ new CodeFileModel({ filename: 'example.py', language: 'Python', content: 'print("Hello")' })
+ ],
+ expected: undefined
+ }
+ ])('$description', ({ files, expected }) => {
+ //Given
+
+ //When
+ const defaultFile = CodeFileModel.getDefaultFile(files);
+
+ //Then
+ expect(defaultFile?.filename).toBe(expected);
+ });
+
+ it.each([
+ {
+ description: '지원하는 언어파일인 경우 언어에 맞는 content를 마크다운 문자열로 반환합니다',
+ dto: {
+ filename: 'example.js',
+ language: 'JavaScript',
+ content: 'console.log("Hello, world!");'
+ },
+ expected: '```js\nconsole.log("Hello, world!");\n ```'
+ },
+ {
+ description: '지원하지 않는 언어 파일이나, 언어 파일이 아닌 경우 그냥 content를 반환합니다',
+ dto: {
+ filename: 'example.txt',
+ language: 'Text',
+ content: 'Just some text'
+ },
+ expected: 'Just some text'
+ }
+ ])('$description', ({ dto, expected }) => {
+ // Given
+ const model = new CodeFileModel(dto);
+
+ // Then: toMarkdown 확인
+ expect(model.toMarkdown()).toBe(expected);
+ });
+});
diff --git a/apps/frontend/src/feature/codeView/model/model.ts b/apps/frontend/src/feature/codeView/model/model.ts
new file mode 100644
index 00000000..063dbea6
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/model/model.ts
@@ -0,0 +1,52 @@
+import { CANT_VIEW_EXT, LANGUAGES_EXT } from '@/feature/codeView/constant';
+
+export interface CodeFileDto {
+ filename: string;
+ language: string;
+ content: string;
+}
+
+export class CodeFileModel {
+ public filename: string;
+ public language: string;
+ public content: string;
+ public ext: string;
+
+ constructor(dto: CodeFileDto) {
+ this.filename = dto?.filename || '';
+ this.language = dto?.language || '';
+ this.content = dto?.content || '';
+ this.ext = dto.filename.split('.').pop() || '';
+ }
+
+ static getDefaultFile(list: CodeFileModel[]) {
+ const readme = CodeFileModel.getREADME(list);
+ const md = list.find((file) => file.isMarkdown);
+
+ return readme || md;
+ }
+
+ static getREADME(list: CodeFileModel[]) {
+ return list.find((file) => file.isREADME);
+ }
+
+ get isREADME() {
+ return this.filename === 'README.md';
+ }
+
+ get isMarkdown() {
+ return this.ext === 'md';
+ }
+
+ get isCode() {
+ return this.ext in LANGUAGES_EXT;
+ }
+
+ get canView() {
+ return !CANT_VIEW_EXT.includes(this.ext);
+ }
+
+ toMarkdown() {
+ return this.isCode ? `\`\`\`${this.ext}\n${this.content}\n \`\`\`` : this.content;
+ }
+}
diff --git a/apps/frontend/src/feature/codeView/type.ts b/apps/frontend/src/feature/codeView/type.ts
new file mode 100644
index 00000000..0f985b88
--- /dev/null
+++ b/apps/frontend/src/feature/codeView/type.ts
@@ -0,0 +1,5 @@
+export interface CodeViewValue {
+ filename: string;
+ language: string;
+ content: string;
+}
diff --git a/apps/frontend/src/feature/comment/component/Comment.tsx b/apps/frontend/src/feature/comment/component/Comment.tsx
new file mode 100644
index 00000000..a9dc55f7
--- /dev/null
+++ b/apps/frontend/src/feature/comment/component/Comment.tsx
@@ -0,0 +1,23 @@
+import { HTMLProps, forwardRef } from 'react';
+import { cn } from '@froxy/design/utils';
+import { Markdown } from '@froxy/react-markdown';
+
+type CommentViewerProps = {
+ children?: string;
+} & HTMLProps;
+
+export function CommentViewer({ className, children, ...props }: CommentViewerProps) {
+ return ;
+}
+
+type CommentEditorProps = {} & HTMLProps;
+
+export const CommentEditor = forwardRef(({ className, ...props }, ref) => {
+ return (
+
+ );
+});
diff --git a/apps/frontend/src/feature/comment/component/CommentCard.tsx b/apps/frontend/src/feature/comment/component/CommentCard.tsx
new file mode 100644
index 00000000..d6945d11
--- /dev/null
+++ b/apps/frontend/src/feature/comment/component/CommentCard.tsx
@@ -0,0 +1,44 @@
+import { HTMLProps } from 'react';
+import { Text } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { CommentViewer } from './Comment';
+import { Time } from '@/shared';
+
+// Todo : UserFeature 추가 이후 author를 User로 타입 변경
+export interface CommentValue {
+ id: string;
+ comment: string;
+ updatedAt: Date;
+ author: {
+ id: string;
+ nickname: string;
+ profile: string;
+ };
+}
+
+type CommentCardProps = {
+ comment: CommentValue;
+} & HTMLProps;
+
+export function CommentCard({ comment, className, ...props }: CommentCardProps) {
+ const { author, updatedAt, comment: content } = comment;
+
+ const tw = cn('px-6 py-5 m-5 border-2 border-slate-200 rounded-[0.75rem]', className);
+
+ return (
+
+
+
+
+
+ {author.nickname}
+
+
+
+
+
+
+
{content}
+
+ );
+}
diff --git a/apps/frontend/src/feature/comment/component/CommentForm.tsx b/apps/frontend/src/feature/comment/component/CommentForm.tsx
new file mode 100644
index 00000000..31110d12
--- /dev/null
+++ b/apps/frontend/src/feature/comment/component/CommentForm.tsx
@@ -0,0 +1,40 @@
+import { HTMLProps, useState } from 'react';
+import { Button, Tabs, TabsContent, TabsList, TabsTrigger } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { CommentEditor, CommentViewer } from './Comment';
+
+type CommentProps = {
+ children?: string;
+ onSubmit?: (comment: string) => void;
+} & HTMLProps;
+
+export function CommentForm({ className, onSubmit, ...props }: CommentProps) {
+ const [comment, setComment] = useState(props.children || '');
+
+ const tw = cn('rounded-md', className);
+
+ return (
+
+
+ Write
+ Preview
+
+
+ setComment(e.currentTarget.value)}
+ />
+
+
+
+
+
+ onSubmit?.(comment)}>
+ Comment
+
+
+
+ );
+}
diff --git a/apps/frontend/src/feature/comment/component/index.ts b/apps/frontend/src/feature/comment/component/index.ts
new file mode 100644
index 00000000..1f3edd68
--- /dev/null
+++ b/apps/frontend/src/feature/comment/component/index.ts
@@ -0,0 +1 @@
+export * from './Comment';
diff --git a/apps/frontend/src/feature/comment/index.ts b/apps/frontend/src/feature/comment/index.ts
new file mode 100644
index 00000000..bb824842
--- /dev/null
+++ b/apps/frontend/src/feature/comment/index.ts
@@ -0,0 +1 @@
+export * from './component';
diff --git a/apps/frontend/src/feature/history/.model.ts.icloud b/apps/frontend/src/feature/history/.model.ts.icloud
new file mode 100644
index 00000000..952837b5
Binary files /dev/null and b/apps/frontend/src/feature/history/.model.ts.icloud differ
diff --git a/apps/frontend/src/feature/history/api.ts b/apps/frontend/src/feature/history/api.ts
new file mode 100644
index 00000000..4f4cb01d
--- /dev/null
+++ b/apps/frontend/src/feature/history/api.ts
@@ -0,0 +1,43 @@
+import { HistoryDto, HistoryModel } from '.';
+import { PageDto, PageModel } from '@/feature/pagination';
+import { api } from '@/shared/common/api';
+
+interface LotusHistoryListDto {
+ list: HistoryDto[];
+ page: PageDto;
+}
+
+export const getLotusHistoryList = async ({ id, page = 1 }: { id: string; page?: number }) => {
+ const response = await api.get(`/api/lotus/${id}/history?page=${page}&size=${5}`);
+
+ const list = response.data.list.map((history) => new HistoryModel(history));
+
+ return {
+ list,
+ page: new PageModel(response.data.page)
+ };
+};
+
+export const getLotusHistory = async ({ id, historyId }: { id: string; historyId: string }) => {
+ const { data } = await api.get(`/api/lotus/${id}/history/${historyId}`);
+
+ return new HistoryModel(data);
+};
+
+export interface PostCodeRunProps {
+ lotusId: string;
+ input: string[];
+ execFileName: string;
+}
+
+export const postCodeRun = async ({ lotusId, input, execFileName }: PostCodeRunProps) => {
+ const body = {
+ input,
+ execFileName
+ };
+ const response = await api.post(`/api/lotus/${lotusId}/history`, body);
+
+ const data = response.data;
+
+ return data;
+};
diff --git a/apps/frontend/src/feature/history/component.tsx b/apps/frontend/src/feature/history/component.tsx
new file mode 100644
index 00000000..a7e34bd1
--- /dev/null
+++ b/apps/frontend/src/feature/history/component.tsx
@@ -0,0 +1,89 @@
+import { ComponentProps, HTMLProps, createContext, useContext } from 'react';
+import { Heading, Text } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { HISTORY_STATUS_COLOR } from './constant';
+import { HistoryModel } from './model';
+import { FormatDateKey, Time } from '@/shared';
+
+const HistoryContext = createContext(null);
+
+const useHistoryContext = () => {
+ const context = useContext(HistoryContext);
+
+ if (!context) {
+ throw new Error('Component must be used within a HistoryProvider');
+ }
+
+ return context;
+};
+
+type HistoryProviderProps = {
+ children: React.ReactNode;
+ value: HistoryModel;
+};
+
+export function HistoryProvider({ children, value }: HistoryProviderProps) {
+ return {children} ;
+}
+
+type HistoryFilenameProps = ComponentProps;
+
+export function HistoryFilename({ className, ...props }: HistoryFilenameProps) {
+ const { filename } = useHistoryContext();
+
+ return (
+
+ {filename}
+
+ );
+}
+
+type HistoryStatusIconProps = { current?: boolean } & HTMLProps;
+
+export function HistoryStatusIcon({ className, current, ...props }: HistoryStatusIconProps) {
+ const { status } = useHistoryContext();
+
+ const color = HISTORY_STATUS_COLOR[status];
+
+ return (
+
+ {current && (
+
+ )}
+
+
+ );
+}
+
+type HistoryStatusLabelProps = ComponentProps;
+
+export function HistoryStatusLabel({ className, ...props }: HistoryStatusLabelProps) {
+ const { status } = useHistoryContext();
+
+ return (
+
+ {status.toLocaleLowerCase()}
+
+ );
+}
+
+type HistoryDateProps = {
+ format?: FormatDateKey;
+} & ComponentProps;
+
+export function HistoryDate({ className, ...props }: HistoryDateProps) {
+ const { date } = useHistoryContext();
+
+ return (
+
+
+
+ );
+}
+
+export const History = Object.assign(HistoryProvider, {
+ Filename: HistoryFilename,
+ StatusIcon: HistoryStatusIcon,
+ StatusLabel: HistoryStatusLabel,
+ Date: HistoryDate
+});
diff --git a/apps/frontend/src/feature/history/constant.ts b/apps/frontend/src/feature/history/constant.ts
new file mode 100644
index 00000000..dfcdda86
--- /dev/null
+++ b/apps/frontend/src/feature/history/constant.ts
@@ -0,0 +1,11 @@
+export const HISTORY_STATUS = {
+ SUCCESS: 'SUCCESS',
+ ERROR: 'ERROR',
+ PENDING: 'PENDING'
+} as const;
+
+export const HISTORY_STATUS_COLOR = {
+ [HISTORY_STATUS.SUCCESS]: 'bg-green-500',
+ [HISTORY_STATUS.ERROR]: 'bg-orange-500',
+ [HISTORY_STATUS.PENDING]: 'bg-sky-500'
+} as const;
diff --git a/apps/frontend/src/feature/history/index.ts b/apps/frontend/src/feature/history/index.ts
new file mode 100644
index 00000000..24b10931
--- /dev/null
+++ b/apps/frontend/src/feature/history/index.ts
@@ -0,0 +1,5 @@
+export * from './component';
+export * from './api';
+export * from './constant';
+export * from './type';
+export * from './model';
diff --git a/apps/frontend/src/feature/history/model/index.ts b/apps/frontend/src/feature/history/model/index.ts
new file mode 100644
index 00000000..9f8ccadd
--- /dev/null
+++ b/apps/frontend/src/feature/history/model/index.ts
@@ -0,0 +1 @@
+export * from './model';
diff --git a/apps/frontend/src/feature/history/model/model.test.ts b/apps/frontend/src/feature/history/model/model.test.ts
new file mode 100644
index 00000000..49b1b50c
--- /dev/null
+++ b/apps/frontend/src/feature/history/model/model.test.ts
@@ -0,0 +1,125 @@
+import { describe, expect, it } from 'vitest';
+import { HistoryModel } from './model';
+import { HISTORY_STATUS } from '@/feature/history/constant';
+
+describe('HistoryModel', () => {
+ it.each([
+ {
+ description: '올바른 DTO를 받아 HistoryModel을 생성합니다.',
+ dto: {
+ id: '1',
+ status: HISTORY_STATUS.SUCCESS,
+ date: '2024-01-01T00:00:00.000Z',
+ input: 'some input',
+ output: 'some output',
+ filename: 'file1.txt'
+ },
+ expected: {
+ id: '1',
+ status: HISTORY_STATUS.SUCCESS,
+ date: new Date('2024-01-01T00:00:00.000Z'),
+ input: 'some input',
+ output: 'some output',
+ filename: 'file1.txt'
+ }
+ },
+ {
+ description: '잘못된 status를 받아 HistoryModel을 생성하면 status는 ERROR로 설정됩니다.',
+ dto: {
+ id: '2',
+ status: 'INVALID_STATUS',
+ date: '2024-02-01T00:00:00.000Z',
+ input: 'input2',
+ output: 'output2',
+ filename: 'file2.txt'
+ },
+ expected: {
+ id: '2',
+ status: HISTORY_STATUS.ERROR,
+ date: new Date('2024-02-01T00:00:00.000Z'),
+ input: 'input2',
+ output: 'output2',
+ filename: 'file2.txt'
+ }
+ }
+ ])('$description', ({ dto, expected }) => {
+ // Given
+ const historyModel = new HistoryModel(dto);
+
+ // Then: 객체 속성 검증
+ expect(historyModel).toMatchObject(expected);
+ });
+
+ it('getPendingHistoriesId는 HistoryModel[]을 인자로 받아 PENDING 상태인 HistoryId를 반환합니다.', () => {
+ // Given
+ const expected = ['1', '3'];
+ const histories = [
+ new HistoryModel({
+ id: '1',
+ status: HISTORY_STATUS.PENDING,
+ date: '2024-01-01T00:00:00.000Z',
+ input: 'input1',
+ output: 'output1',
+ filename: 'file1.txt'
+ }),
+ new HistoryModel({
+ id: '2',
+ status: HISTORY_STATUS.SUCCESS,
+ date: '2024-02-01T00:00:00.000Z',
+ input: 'input2',
+ output: 'output2',
+ filename: 'file2.txt'
+ }),
+ new HistoryModel({
+ id: '3',
+ status: HISTORY_STATUS.PENDING,
+ date: '2024-03-01T00:00:00.000Z',
+ input: 'input3',
+ output: 'output3',
+ filename: 'file3.txt'
+ })
+ ];
+
+ // When
+ const pendingIds = HistoryModel.getPendingHistoriesId(histories);
+
+ // Then
+ expect(pendingIds).toEqual(expected);
+ });
+
+ it.each([
+ {
+ history: new HistoryModel({
+ id: '1',
+ status: HISTORY_STATUS.SUCCESS,
+ date: '2024-01-01T00:00:00.000Z',
+ input: 'input1',
+ output: 'output1',
+ filename: 'file1.txt'
+ }),
+ status: HISTORY_STATUS.SUCCESS,
+ expected: true
+ },
+ {
+ history: new HistoryModel({
+ id: '2',
+ status: HISTORY_STATUS.ERROR,
+ date: '2024-02-01T00:00:00.000Z',
+ input: 'input2',
+ output: 'output2',
+ filename: 'file2.txt'
+ }),
+ status: HISTORY_STATUS.PENDING,
+ expected: false
+ }
+ ])(
+ 'isStatus를 통해 history의 status를 검증할 수 있습니다. ($history.status 일때 history.isStatus($status)는 $expected 입니다.)',
+ ({ history, status, expected }) => {
+ //Given
+ //When
+
+ //Then
+ expect(history.isStatus(status)).toBe(expected);
+ }
+ );
+});
diff --git a/apps/frontend/src/feature/history/model/model.ts b/apps/frontend/src/feature/history/model/model.ts
new file mode 100644
index 00000000..f8b16081
--- /dev/null
+++ b/apps/frontend/src/feature/history/model/model.ts
@@ -0,0 +1,41 @@
+import { HISTORY_STATUS } from '@/feature/history/constant';
+import { HistoryStatus } from '@/feature/history/type';
+
+export interface HistoryDto {
+ id: string;
+ status: string;
+ date: string;
+ input: string;
+ output: string;
+ filename: string;
+}
+
+export class HistoryModel {
+ public id: string;
+ public status: HistoryStatus;
+ public date: Date;
+ public input: string;
+ public output: string;
+ public filename: string;
+
+ constructor(dto: HistoryDto) {
+ this.id = dto.id;
+ this.status = HistoryModel.isValidState(dto.status) ? dto.status : HISTORY_STATUS.ERROR;
+ this.date = new Date(dto.date);
+ this.input = dto.input;
+ this.output = dto.output;
+ this.filename = dto.filename;
+ }
+
+ static isValidState(status: string): status is HistoryStatus {
+ return Object.values(HISTORY_STATUS).includes(status as HistoryStatus);
+ }
+
+ static getPendingHistoriesId(histories: HistoryModel[]) {
+ return histories.filter((history) => history.isStatus(HISTORY_STATUS.PENDING)).map((history) => history.id);
+ }
+
+ isStatus(status: HistoryStatus) {
+ return this.status === status;
+ }
+}
diff --git a/apps/frontend/src/feature/history/query.ts b/apps/frontend/src/feature/history/query.ts
new file mode 100644
index 00000000..b96c6dcc
--- /dev/null
+++ b/apps/frontend/src/feature/history/query.ts
@@ -0,0 +1,16 @@
+import { useMutation } from '@tanstack/react-query';
+import { getLotusHistory, getLotusHistoryList, postCodeRun } from './api';
+import { createQueryOptions } from '@/shared/createQueryOptions';
+
+export const lotusHistoryQueryOptions = createQueryOptions('history', {
+ list: getLotusHistoryList,
+ detail: getLotusHistory
+});
+
+export const useCodeRunMutation = () => {
+ const mutation = useMutation({
+ mutationFn: postCodeRun
+ });
+
+ return mutation;
+};
diff --git a/apps/frontend/src/feature/history/type.ts b/apps/frontend/src/feature/history/type.ts
new file mode 100644
index 00000000..f9bcb7e4
--- /dev/null
+++ b/apps/frontend/src/feature/history/type.ts
@@ -0,0 +1,3 @@
+import { HISTORY_STATUS } from './constant';
+
+export type HistoryStatus = (typeof HISTORY_STATUS)[keyof typeof HISTORY_STATUS];
diff --git a/apps/frontend/src/feature/lotus/.model.ts.icloud b/apps/frontend/src/feature/lotus/.model.ts.icloud
new file mode 100644
index 00000000..c185d569
Binary files /dev/null and b/apps/frontend/src/feature/lotus/.model.ts.icloud differ
diff --git a/apps/frontend/src/feature/lotus/api.ts b/apps/frontend/src/feature/lotus/api.ts
new file mode 100644
index 00000000..7cb7426d
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/api.ts
@@ -0,0 +1,90 @@
+import { LotusDto, LotusModel } from './model';
+import { CodeFileDto, CodeFileModel } from '@/feature/codeView';
+import { PageDto } from '@/feature/pagination';
+import { UserDto, UserModel } from '@/feature/user/model';
+import { api } from '@/shared/common/api';
+
+interface LotusListDto {
+ lotuses: (LotusDto & { author: UserDto })[];
+ page: PageDto;
+}
+
+export interface LotusDetailModel {
+ lotus: LotusModel;
+ author: UserModel;
+ language: string;
+ files: CodeFileModel[];
+}
+
+export const getLotusList = async ({ page = 1, keyword }: { page?: number; keyword?: string }) => {
+ const response = await api.get(
+ `/api/lotus?page=${page}&size=${9}${keyword ? `&search=${keyword}` : ''}`
+ );
+
+ const lotuses = response.data.lotuses.map((lotus) => ({
+ lotus: new LotusModel(lotus),
+ author: new UserModel(lotus.author)
+ }));
+
+ return { lotuses, page: response.data.page };
+};
+
+type LotusDetailDto = LotusDto & { files: CodeFileDto[] } & { language: string } & { author: UserDto };
+
+export const getLotusDetail = async ({ id }: { id: string }) => {
+ const response = await api.get(`/api/lotus/${id}`);
+
+ const data = response.data;
+
+ const lotus = new LotusModel(data);
+ const language = data.language;
+ const files = data.files.map((file) => new CodeFileModel(file));
+ const author = new UserModel(data.author);
+
+ return {
+ lotus,
+ author,
+ language,
+ files
+ };
+};
+
+export const deleteLotus = async ({ id }: { id: string }) => {
+ const response = await api.delete(`/api/lotus/${id}`);
+
+ const data = response.data;
+
+ return data;
+};
+
+interface UpdateLotusDto {
+ title?: string;
+ tags?: string[];
+ isPublic?: boolean;
+}
+
+export const updateLotus = async ({ id, body }: { id: string; body: UpdateLotusDto }) => {
+ const response = await api.patch(`/api/lotus/${id}`, body);
+
+ const data = response.data;
+
+ return data;
+};
+
+interface CreateLotusDto {
+ title: string;
+ isPublic: boolean;
+ tags: string[];
+ gistUuid: string;
+}
+
+export const createLotus = async ({ body }: { body: CreateLotusDto }) => {
+ const response = await api.post(`/api/lotus`, body);
+
+ const data = response.data;
+
+ return {
+ lotus: new LotusModel(data),
+ author: new UserModel(data.author)
+ };
+};
diff --git a/apps/frontend/src/feature/lotus/component.tsx b/apps/frontend/src/feature/lotus/component.tsx
new file mode 100644
index 00000000..f61343d5
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/component.tsx
@@ -0,0 +1,104 @@
+import { ComponentProps, HTMLProps, ReactNode, createContext, useContext } from 'react';
+import { Badge, Button, Text } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { Link } from '@tanstack/react-router';
+import { LotusModel } from '.';
+import { BadgeVariantType } from '@/feature/lotus/type';
+import { Time } from '@/shared';
+
+const lotusContext = createContext(null);
+
+export const useLotusContext = () => {
+ const lotus = useContext(lotusContext);
+
+ if (!lotus) throw new Error('Lotus context is not provided');
+
+ return lotus;
+};
+
+type LotusTitleProps = ComponentProps;
+
+export function LotusTitle(props: LotusTitleProps) {
+ const { title } = useLotusContext();
+
+ return (
+
+ {title}
+
+ );
+}
+
+type LotusTagListProps = HTMLProps & {
+ variant?: BadgeVariantType;
+};
+
+export function LotusTagList({ className, variant = 'default', ...props }: LotusTagListProps) {
+ const { tags } = useLotusContext();
+
+ return (
+
+ {tags.map((tag, index) => (
+
+ {tag}
+
+ ))}
+
+ );
+}
+
+type LotusCreateDateProps = HTMLProps;
+
+export function LotusCreateDate(props: LotusCreateDateProps) {
+ const { date } = useLotusContext();
+
+ return ;
+}
+
+type LotusLinkProps = {
+ children: React.ReactNode;
+ className?: string;
+};
+
+export function LotusLink({ children, className }: LotusLinkProps) {
+ const { id: lotusId } = useLotusContext();
+
+ return (
+
+ {children}
+
+ );
+}
+
+type LotusGistLinkProps = {
+ className?: string;
+ children?: ReactNode;
+};
+
+// a태그 내부에서 사용될 가능성이 높아 Button 컴포넌트로 사용
+export function LotusGistLink({ className, children }: LotusGistLinkProps) {
+ const { gistUrl } = useLotusContext();
+
+ const handleClick = (e: React.MouseEvent) => {
+ e.preventDefault();
+
+ location.href = gistUrl;
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function LotusProvider({ children, lotus }: { children: React.ReactNode; lotus: LotusModel }) {
+ return {children} ;
+}
+
+export const Lotus = Object.assign(LotusProvider, {
+ Title: LotusTitle,
+ CreateDate: LotusCreateDate,
+ TagList: LotusTagList,
+ Link: LotusLink,
+ GistLink: LotusGistLink
+});
diff --git a/apps/frontend/src/feature/lotus/index.ts b/apps/frontend/src/feature/lotus/index.ts
new file mode 100644
index 00000000..03d1f356
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/index.ts
@@ -0,0 +1,6 @@
+export * from './query';
+export * from './component';
+export * from './type';
+export * from './api';
+export * from './util';
+export * from './model';
diff --git a/apps/frontend/src/feature/lotus/model/index.ts b/apps/frontend/src/feature/lotus/model/index.ts
new file mode 100644
index 00000000..9f8ccadd
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/model/index.ts
@@ -0,0 +1 @@
+export * from './model';
diff --git a/apps/frontend/src/feature/lotus/model/model.test.ts b/apps/frontend/src/feature/lotus/model/model.test.ts
new file mode 100644
index 00000000..0a2a0e81
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/model/model.test.ts
@@ -0,0 +1,93 @@
+import { describe, expect, it } from 'vitest';
+import { LotusDto, LotusModel } from './model';
+
+describe('LotusModel', () => {
+ it.each([
+ {
+ description: '올바른 LotusDto로 LotusModel 생성할 수 있다.',
+ lotusDto: {
+ id: '1',
+ link: 'https://example.com',
+ title: 'Example Title',
+ logo: 'https://example.com/logo.png',
+ date: '2024-01-01T00:00:00.000Z',
+ tags: ['tag1', 'tag2'],
+ isPublic: true,
+ gistUrl: 'https://gist.github.com/example'
+ },
+ expected: {
+ id: '1',
+ link: 'https://example.com',
+ title: 'Example Title',
+ logo: 'https://example.com/logo.png',
+ date: new Date('2024-01-01T00:00:00.000Z'),
+ tags: ['tag1', 'tag2'],
+ isPublic: true,
+ gistUrl: 'https://gist.github.com/example',
+ isTagsEmpty: false
+ }
+ },
+ {
+ description: '태그가 없는 LotusDto로 LotusModel 생성할 수 있다.',
+ lotusDto: {
+ id: '2',
+ link: 'https://example.com/2',
+ title: 'Another Title',
+ logo: 'https://example.com/logo2.png',
+ date: '2024-02-01T00:00:00.000Z',
+ tags: [],
+ gistUrl: 'https://gist.github.com/example2'
+ },
+ expected: {
+ id: '2',
+ link: 'https://example.com/2',
+ title: 'Another Title',
+ logo: 'https://example.com/logo2.png',
+ date: new Date('2024-02-01T00:00:00.000Z'),
+ tags: [],
+ isPublic: undefined,
+ gistUrl: 'https://gist.github.com/example2',
+ isTagsEmpty: true
+ }
+ }
+ ])('$description', ({ lotusDto, expected }) => {
+ //Given
+ const lotusModel = new LotusModel(lotusDto);
+
+ //When
+
+ //Then
+ expect(lotusModel).toMatchObject(expected);
+ expect(lotusModel.isTagsEmpty).toBe(expected.isTagsEmpty);
+ });
+
+ it('clone메서드를 통해 새로운 LotusModel 객체를 만들 수 있다.', () => {
+ //Given
+ const originalDto: LotusDto = {
+ id: '3',
+ link: 'https://example.com/3',
+ title: 'Original Title',
+ logo: 'https://example.com/logo3.png',
+ date: '2024-03-01T00:00:00.000Z',
+ tags: ['original'],
+ isPublic: false,
+ gistUrl: 'https://gist.github.com/original'
+ };
+ const originalModel = new LotusModel(originalDto);
+ const cloneDto = {
+ title: 'Updated Title',
+ tags: ['updated'],
+ date: new Date('2024-04-01T00:00:00.000Z')
+ };
+
+ // When
+ const clonedModel = originalModel.clone(cloneDto);
+
+ // Then
+ expect(new LotusModel(originalDto)).toMatchObject(originalModel);
+
+ expect(clonedModel).toMatchObject(
+ new LotusModel({ ...originalDto, ...cloneDto, date: cloneDto.date.toISOString() })
+ );
+ });
+});
diff --git a/apps/frontend/src/feature/lotus/model/model.ts b/apps/frontend/src/feature/lotus/model/model.ts
new file mode 100644
index 00000000..adf69504
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/model/model.ts
@@ -0,0 +1,47 @@
+export interface LotusDto {
+ id: string;
+ link: string;
+ title: string;
+ logo: string;
+ date: string;
+ tags: string[];
+ isPublic?: boolean;
+ gistUrl: string;
+}
+
+export class LotusModel {
+ public id: string;
+ public link: string;
+ public title: string;
+ public logo: string;
+ public date: Date;
+ public tags: string[];
+ public isPublic?: boolean;
+ public gistUrl: string;
+
+ constructor(dto: LotusDto) {
+ this.id = dto.id;
+ this.link = dto.link;
+ this.title = dto.title;
+ this.logo = dto.logo;
+ this.date = new Date(dto.date);
+ this.tags = dto.tags;
+ this.isPublic = dto.isPublic;
+ this.gistUrl = dto.gistUrl;
+ }
+
+ clone(data: Partial) {
+ const { date, ...modelData } = this;
+ const { date: updateDate, ...update } = data;
+
+ return new LotusModel({
+ ...modelData,
+ date: updateDate?.toISOString() || date.toISOString(),
+ ...update
+ });
+ }
+
+ get isTagsEmpty() {
+ return this.tags.length < 1;
+ }
+}
diff --git a/apps/frontend/src/feature/lotus/query.ts b/apps/frontend/src/feature/lotus/query.ts
new file mode 100644
index 00000000..6ae94bda
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/query.ts
@@ -0,0 +1,32 @@
+import { useMutation } from '@tanstack/react-query';
+import { createLotus, deleteLotus, getLotusDetail, getLotusList, updateLotus } from './api';
+import { createQueryOptions } from '@/shared/createQueryOptions';
+
+export const lotusQueryOptions = createQueryOptions('lotus', {
+ list: getLotusList,
+ detail: getLotusDetail
+});
+
+export const useLotusDeleteMutation = () => {
+ const mutation = useMutation({
+ mutationFn: deleteLotus
+ });
+
+ return mutation;
+};
+
+export const useLotusUpdateMutation = () => {
+ const mutation = useMutation({
+ mutationFn: updateLotus
+ });
+
+ return mutation;
+};
+
+export const useLotusCreateMutation = () => {
+ const mutation = useMutation({
+ mutationFn: createLotus
+ });
+
+ return mutation;
+};
diff --git a/apps/frontend/src/feature/lotus/type.ts b/apps/frontend/src/feature/lotus/type.ts
new file mode 100644
index 00000000..b8fc377c
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/type.ts
@@ -0,0 +1 @@
+export type BadgeVariantType = 'default' | 'secondary' | 'destructive' | 'outline' | null | undefined;
diff --git a/apps/frontend/src/feature/lotus/util.ts b/apps/frontend/src/feature/lotus/util.ts
new file mode 100644
index 00000000..8b77b1b4
--- /dev/null
+++ b/apps/frontend/src/feature/lotus/util.ts
@@ -0,0 +1,65 @@
+import axios, { AxiosError } from 'axios';
+
+// NOTE: Lotus 디테일 관련 에러 처리
+export const AxiosErrorLotusData = {
+ ['DEFAULT']: {
+ description: '오류가 발생했습니다.'
+ },
+ [401]: {
+ description: '로그인이 필요합니다.'
+ },
+ [403]: {
+ description: '비공개된 Lotus입니다.'
+ },
+ [404]: {
+ description: '존재하지 않는 Lotus입니다.'
+ }
+} as const;
+
+export const getLotusErrorData = (error: Error) => {
+ if (!axios.isAxiosError(error)) return AxiosErrorLotusData['DEFAULT'];
+
+ const status = error?.status || 'DEFAULT';
+ if (!(status in AxiosErrorLotusData)) return AxiosErrorLotusData['DEFAULT'];
+
+ return AxiosErrorLotusData[status as keyof typeof AxiosErrorLotusData];
+};
+
+// NOTE: toast 관련 에러 처리
+export const AxiosErrorToastData = {
+ ['DEFAULT']: {
+ description: '오류가 발생했습니다. 다시 시도해 주세요.',
+ variant: 'error'
+ },
+ [400]: {
+ description: '잘못된 요청입니다',
+ variant: 'error'
+ },
+ [403]: {
+ description: '권한이 없습니다.',
+ variant: 'error'
+ },
+ [404]: {
+ description: '존재하지 않는 Lotus입니다.',
+ variant: 'error'
+ },
+ [409]: {
+ title: '이미 생성된 Lotus가 존재합니다.',
+ description: '중복된 Gist commit으로 생성할 수 없습니다.',
+ variant: 'error'
+ }
+} as const;
+
+export const getLotusMutationErrorToastData = (error?: unknown) => {
+ const isAxiosError = error instanceof AxiosError;
+
+ if (!isAxiosError) return AxiosErrorToastData['DEFAULT'];
+
+ const inErrorToastData = error.status && error.status in AxiosErrorToastData;
+
+ if (!inErrorToastData) return AxiosErrorToastData['DEFAULT'];
+
+ const status = error.status || 'DEFAULT';
+
+ return AxiosErrorToastData[status as keyof typeof AxiosErrorToastData];
+};
diff --git a/apps/frontend/src/feature/pagination/.model 2.ts.icloud b/apps/frontend/src/feature/pagination/.model 2.ts.icloud
new file mode 100644
index 00000000..cc35ae89
Binary files /dev/null and b/apps/frontend/src/feature/pagination/.model 2.ts.icloud differ
diff --git a/apps/frontend/src/feature/pagination/Pagination.tsx b/apps/frontend/src/feature/pagination/Pagination.tsx
new file mode 100644
index 00000000..4b612bd5
--- /dev/null
+++ b/apps/frontend/src/feature/pagination/Pagination.tsx
@@ -0,0 +1,66 @@
+import {
+ Pagination as PaginationBox,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious
+} from '@froxy/design/components';
+import { Skeleton } from '@froxy/design/components';
+import { usePagination } from '@/feature/pagination/usePagination';
+import { range } from '@/shared/common';
+
+interface PaginationProps {
+ totalPages?: number;
+ initialPage?: number;
+ onChangePage?: (page: number) => void;
+ activeScrollTop?: true;
+}
+
+export function Pagination({ totalPages = 1, initialPage = 1, onChangePage, activeScrollTop }: PaginationProps) {
+ const { currentPage, onClickPage, onClickPrevious, onClickNext, getPaginationItems } = usePagination({
+ totalPages,
+ initialPage,
+ onChangePage,
+ activeScrollTop
+ });
+
+ return (
+
+
+
+
+
+ {getPaginationItems().map((item, index) => (
+
+ {typeof item === 'number' ? (
+ item !== currentPage && onClickPage(item)} isActive={item === currentPage}>
+ {item}
+
+ ) : (
+
+ )}
+
+ ))}
+
+
+
+
+
+ );
+}
+
+export function SkeletonPagination() {
+ return (
+
+
+ {range(5).map((value) => (
+
+ ))}
+
+
+ );
+}
+
+Pagination.Skeleton = SkeletonPagination;
diff --git a/apps/frontend/src/feature/pagination/index.ts b/apps/frontend/src/feature/pagination/index.ts
new file mode 100644
index 00000000..31566ded
--- /dev/null
+++ b/apps/frontend/src/feature/pagination/index.ts
@@ -0,0 +1,3 @@
+export * from './usePagination';
+export * from './Pagination';
+export * from './model';
diff --git a/apps/frontend/src/feature/pagination/model.ts b/apps/frontend/src/feature/pagination/model.ts
new file mode 100644
index 00000000..5ea69d64
--- /dev/null
+++ b/apps/frontend/src/feature/pagination/model.ts
@@ -0,0 +1,14 @@
+export interface PageDto {
+ current: number;
+ max: number;
+}
+
+export class PageModel {
+ public current: number;
+ public max: number;
+
+ constructor(dto: PageDto) {
+ this.current = dto.current;
+ this.max = dto.max;
+ }
+}
diff --git a/apps/frontend/src/feature/pagination/usePagination.tsx b/apps/frontend/src/feature/pagination/usePagination.tsx
new file mode 100644
index 00000000..10bf291c
--- /dev/null
+++ b/apps/frontend/src/feature/pagination/usePagination.tsx
@@ -0,0 +1,59 @@
+import { useState } from 'react';
+
+interface UsePaginationProps {
+ totalPages: number;
+ initialPage?: number;
+ onChangePage?: (page: number) => void;
+ activeScrollTop?: true;
+}
+
+export function usePagination({ totalPages, initialPage = 1, onChangePage, activeScrollTop }: UsePaginationProps) {
+ const [currentPage, setCurrentPage] = useState(initialPage);
+
+ const onClickPage = (page: number) => {
+ setCurrentPage(page);
+ onChangePage?.(page);
+
+ if (activeScrollTop) window.scrollTo({ top: 0, behavior: 'smooth' });
+ };
+
+ const onClickPrevious = () => {
+ if (currentPage > 1) onClickPage(currentPage - 1);
+ };
+
+ const onClickNext = () => {
+ if (currentPage < totalPages) onClickPage(currentPage + 1);
+ };
+
+ // "첫 페이지 ... 현재 페이지와 앞뒤 1페이지 ... 마지막 페이지 "로 구성되도록 구현함
+ const getPaginationItems = () => {
+ const items: (number | 'ellipsis')[] = [];
+ const showStartEllipsis = currentPage > 4;
+ const showEndEllipsis = currentPage < totalPages - 3;
+
+ items.push(1);
+
+ if (showStartEllipsis) items.push('ellipsis');
+
+ const startPage = showStartEllipsis ? Math.max(2, currentPage - 1) : 2;
+ const endPage = showEndEllipsis ? Math.min(totalPages - 1, currentPage + 1) : totalPages - 1;
+
+ for (let page = startPage; page <= endPage; page++) {
+ items.push(page);
+ }
+
+ if (showEndEllipsis) items.push('ellipsis');
+
+ if (totalPages > 1) items.push(totalPages);
+
+ return items;
+ };
+
+ return {
+ currentPage,
+ onClickPage,
+ onClickPrevious,
+ onClickNext,
+ getPaginationItems
+ };
+}
diff --git a/apps/frontend/src/feature/user/.model.ts.icloud b/apps/frontend/src/feature/user/.model.ts.icloud
new file mode 100644
index 00000000..eedc515e
Binary files /dev/null and b/apps/frontend/src/feature/user/.model.ts.icloud differ
diff --git a/apps/frontend/src/feature/user/.type 2.ts.icloud b/apps/frontend/src/feature/user/.type 2.ts.icloud
new file mode 100644
index 00000000..4d6bfce4
Binary files /dev/null and b/apps/frontend/src/feature/user/.type 2.ts.icloud differ
diff --git a/apps/frontend/src/feature/user/.type 3.ts.icloud b/apps/frontend/src/feature/user/.type 3.ts.icloud
new file mode 100644
index 00000000..65a0f4c0
Binary files /dev/null and b/apps/frontend/src/feature/user/.type 3.ts.icloud differ
diff --git a/apps/frontend/src/feature/user/api.ts b/apps/frontend/src/feature/user/api.ts
new file mode 100644
index 00000000..78a9d080
--- /dev/null
+++ b/apps/frontend/src/feature/user/api.ts
@@ -0,0 +1,85 @@
+import { UserDto, UserModel } from './model';
+import { CodeFileDto, CodeFileModel } from '@/feature/codeView';
+import { LotusDto, LotusModel } from '@/feature/lotus';
+import { PageDto } from '@/feature/pagination';
+import { api } from '@/shared/common/api';
+
+interface UserLotusListDto {
+ lotuses: (LotusDto & { author: UserDto })[];
+ page: PageDto;
+}
+
+// 사용자의 Lotus 목록 조회
+export const getUserLotusList = async ({ page = 1, size = 6 }: { page?: number; size?: number }) => {
+ const response = await api.get(`/api/user/lotus?page=${page}&size=${size}`);
+
+ const lotuses = response.data.lotuses.map((lotus) => ({
+ lotus: new LotusModel(lotus),
+ author: new UserModel(lotus.author)
+ }));
+
+ return { lotuses, page: response.data.page };
+};
+
+interface GistType {
+ gistId: string;
+ title: string;
+ nickname: string;
+}
+
+interface UserGistListDto {
+ gists: GistType[];
+ page: number;
+ size: number;
+ hasNextPage: boolean;
+}
+
+// 사용자의 Gist 목록 조회
+export const getUserGistList = async ({ page = 1, size = 10 }: { page?: number; size?: number }) => {
+ const response = await api.get(`/api/user/gist?page=${page}&size=${size}`);
+
+ const data = response.data;
+
+ return data;
+};
+
+// TODO : Gist Feature 분리 고려
+// 특정 gist의 파일 조회
+interface GistFilesDto {
+ files: CodeFileDto[];
+}
+
+export const getUserGistFile = async ({ gistId }: { gistId: string }) => {
+ const response = await api.get(`/api/user/gist/${gistId}`);
+
+ const { files } = response.data;
+
+ return files.map((file) => new CodeFileModel(file));
+};
+
+// 로그인하기
+export const getLogin = async ({ code }: { code: string }) => {
+ const res = await api.get<{ token: string }>(`/api/user/login/callback?code=${code}`);
+
+ const data = res.data;
+
+ return data;
+};
+
+//사용자 기본 정보 조회
+export const getUserInfo = async () => {
+ const res = await api.get('/api/user');
+
+ return new UserModel(res.data);
+};
+
+interface UpdateUserDto {
+ nickname: string;
+}
+
+// 사용자 정보 수정하기
+export const patchUserInfo = async ({ body }: { body: UpdateUserDto }) => {
+ const res = await api.patch('/api/user', body);
+
+ return res.data;
+};
diff --git a/apps/frontend/src/feature/user/component/User.tsx b/apps/frontend/src/feature/user/component/User.tsx
new file mode 100644
index 00000000..ac16fda9
--- /dev/null
+++ b/apps/frontend/src/feature/user/component/User.tsx
@@ -0,0 +1,60 @@
+import { ComponentProps, HTMLProps, createContext, useContext } from 'react';
+import { Link } from '@tanstack/react-router';
+import { Text } from '@/components';
+import { UserModel } from '@/feature/user/model';
+import { cn } from '@/index';
+
+const UserContext = createContext(null);
+
+const useUserContext = () => {
+ const user = useContext(UserContext);
+
+ if (!user) throw new Error('User context is not provided');
+
+ return user;
+};
+
+type UserNameProps = ComponentProps;
+
+export function UserName(props: UserNameProps) {
+ const { nickname } = useUserContext();
+
+ // TODO: 해당 사용자의 마이페이지로 이동하기
+ return (
+
+ {nickname}
+
+ );
+}
+
+type UserAvatarProps = HTMLProps;
+
+export function UserAvatar({ className, ...props }: UserAvatarProps) {
+ const { profile, nickname } = useUserContext();
+
+ const image = profile;
+
+ return ;
+}
+
+type UserLinkProps = {
+ children: React.ReactNode;
+ className?: string;
+};
+
+// TODO: 해당 사용자의 마이페이지로 이동하기
+export function UserLink(props: UserLinkProps) {
+ // const { id } = useUserContext();
+
+ return ;
+}
+
+export function UserProvider({ user, children }: { user: UserModel; children: React.ReactNode }) {
+ return {children} ;
+}
+
+export const User = Object.assign(UserProvider, {
+ Avatar: UserAvatar, //
+ Link: UserLink,
+ Name: UserName
+});
diff --git a/apps/frontend/src/feature/user/component/UserInfoInputForm.tsx b/apps/frontend/src/feature/user/component/UserInfoInputForm.tsx
new file mode 100644
index 00000000..7c1499ac
--- /dev/null
+++ b/apps/frontend/src/feature/user/component/UserInfoInputForm.tsx
@@ -0,0 +1,49 @@
+import { Button, Input } from '@froxy/design/components';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { useForm } from 'react-hook-form';
+import { z } from 'zod';
+
+interface UserEditableInfoProps {
+ disabled?: boolean;
+ value: string;
+ onToggleIsEdit: () => void;
+ onEditValue: (value: string) => void;
+}
+
+const userInfoInputValue = z.object({
+ value: z.string().min(1, { message: '입력값이 존재하지 않습니다.' })
+});
+
+export function UserInfoInputForm({ value, onToggleIsEdit, onEditValue, disabled }: UserEditableInfoProps) {
+ const {
+ register,
+ reset,
+ handleSubmit,
+ formState: { errors }
+ } = useForm<{ value: string }>({
+ defaultValues: { value: value },
+ resolver: zodResolver(userInfoInputValue)
+ });
+
+ const onSubmit = (data: { value: string }) => {
+ onEditValue(data.value);
+ reset();
+ onToggleIsEdit();
+ };
+
+ const onError = () => {
+ if (errors.value) alert(errors.value.message);
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/feature/user/component/index.ts b/apps/frontend/src/feature/user/component/index.ts
new file mode 100644
index 00000000..4c1dd04e
--- /dev/null
+++ b/apps/frontend/src/feature/user/component/index.ts
@@ -0,0 +1,2 @@
+export * from './User';
+export * from './UserInfoInputForm';
diff --git a/apps/frontend/src/feature/user/index.ts b/apps/frontend/src/feature/user/index.ts
new file mode 100644
index 00000000..668e06c2
--- /dev/null
+++ b/apps/frontend/src/feature/user/index.ts
@@ -0,0 +1,5 @@
+export * from './api';
+export * from './component';
+export * from './query';
+export * from './util';
+export * from './model';
diff --git a/apps/frontend/src/feature/user/model/index.ts b/apps/frontend/src/feature/user/model/index.ts
new file mode 100644
index 00000000..9f8ccadd
--- /dev/null
+++ b/apps/frontend/src/feature/user/model/index.ts
@@ -0,0 +1 @@
+export * from './model';
diff --git a/apps/frontend/src/feature/user/model/model.test.ts b/apps/frontend/src/feature/user/model/model.test.ts
new file mode 100644
index 00000000..187e6dc9
--- /dev/null
+++ b/apps/frontend/src/feature/user/model/model.test.ts
@@ -0,0 +1,45 @@
+import { describe, expect, it } from 'vitest';
+import { UserModel } from './model'; // 경로는 실제 파일 경로로 변경
+
+describe('UserModel', () => {
+ it.each([
+ {
+ description: '올바른 UserDto를 전달받으면 UserModel을 생성한다',
+ userDto: {
+ id: '123',
+ nickname: 'testUser',
+ profile: 'https://example.com/profile.png',
+ gistUrl: 'https://gist.github.com/testUser'
+ },
+ expected: {
+ id: '123',
+ nickname: 'testUser',
+ profile: 'https://example.com/profile.png',
+ gistUrl: 'https://gist.github.com/testUser'
+ }
+ },
+ {
+ description: 'profile이 비어있는 UserDto를 전달받으면 기본 이미지를 사용하는 UserModel을 생성한다',
+ userDto: {
+ id: '456',
+ nickname: 'defaultProfileUser',
+ profile: '', // 비어있는 값
+ gistUrl: 'https://gist.github.com/defaultProfileUser'
+ },
+ expected: {
+ id: '456',
+ nickname: 'defaultProfileUser',
+ profile: '/image/logoIcon.svg', // 기본값
+ gistUrl: 'https://gist.github.com/defaultProfileUser'
+ }
+ }
+ ])('$description', ({ userDto, expected }) => {
+ //Given
+ const userModel = new UserModel(userDto);
+
+ //When
+
+ //Then
+ expect(userModel).toEqual(expected);
+ });
+});
diff --git a/apps/frontend/src/feature/user/model/model.ts b/apps/frontend/src/feature/user/model/model.ts
new file mode 100644
index 00000000..87472da7
--- /dev/null
+++ b/apps/frontend/src/feature/user/model/model.ts
@@ -0,0 +1,20 @@
+export interface UserDto {
+ id: string;
+ nickname: string;
+ profile: string;
+ gistUrl: string;
+}
+
+export class UserModel {
+ public id: string;
+ public nickname: string;
+ public profile: string;
+ public gistUrl: string;
+
+ constructor(dto: UserDto) {
+ this.id = dto.id;
+ this.nickname = dto.nickname;
+ this.profile = dto.profile || '/image/logoIcon.svg';
+ this.gistUrl = dto.gistUrl;
+ }
+}
diff --git a/apps/frontend/src/feature/user/query.ts b/apps/frontend/src/feature/user/query.ts
new file mode 100644
index 00000000..9c34e641
--- /dev/null
+++ b/apps/frontend/src/feature/user/query.ts
@@ -0,0 +1,42 @@
+import { useMutation, useQuery, useSuspenseInfiniteQuery } from '@tanstack/react-query';
+import { getLogin, getUserGistFile, getUserGistList, getUserInfo, getUserLotusList, patchUserInfo } from './api';
+import { createQueryOptions } from '@/shared/createQueryOptions';
+
+export const userQueryOptions = createQueryOptions('user', {
+ info: getUserInfo,
+ lotusList: getUserLotusList,
+ gistList: getUserGistList,
+ gistFile: getUserGistFile
+});
+
+export const useUserGistListSuspenseInfinity = ({ page = 1, size }: { page?: number; size?: number } = {}) => {
+ const { queryKey } = userQueryOptions.gistList({ page, size });
+
+ const { data: res, ...query } = useSuspenseInfiniteQuery({
+ queryKey: [...queryKey, 'infinity'],
+ queryFn: async ({ pageParam }) => userQueryOptions.gistList({ page: pageParam, size }).queryFn(),
+ getNextPageParam: (prev) => prev.page + 1,
+ initialPageParam: page
+ });
+
+ const data = res.pages.flatMap((res) => [...res.gists]);
+
+ return { data, ...query };
+};
+
+export const useUserMutation = () => {
+ const mutation = useMutation({
+ mutationFn: patchUserInfo
+ });
+
+ return mutation;
+};
+
+export const useLoginQuery = ({ code }: { code: string }) => {
+ const query = useQuery({
+ queryKey: ['token'],
+ queryFn: () => getLogin({ code })
+ });
+
+ return query;
+};
diff --git a/apps/frontend/src/feature/user/type.ts b/apps/frontend/src/feature/user/type.ts
new file mode 100644
index 00000000..e3aa9ae1
--- /dev/null
+++ b/apps/frontend/src/feature/user/type.ts
@@ -0,0 +1,5 @@
+export interface UserType {
+ id: string;
+ nickname: string;
+ profile: string;
+}
diff --git a/apps/frontend/src/feature/user/util.ts b/apps/frontend/src/feature/user/util.ts
new file mode 100644
index 00000000..6cdc3b97
--- /dev/null
+++ b/apps/frontend/src/feature/user/util.ts
@@ -0,0 +1,12 @@
+import { userQueryOptions } from './query';
+import { queryClient } from '@/app/query';
+
+export const isAuthUser = async () => {
+ try {
+ const user = await queryClient.fetchQuery(userQueryOptions.info());
+
+ return !!user?.id && !!user?.nickname && !!user?.profile;
+ } catch {
+ return false;
+ }
+};
diff --git a/apps/frontend/src/page/(main)/lotus/$lotusId/index.lazy.tsx b/apps/frontend/src/page/(main)/lotus/$lotusId/index.lazy.tsx
new file mode 100644
index 00000000..40fd9c86
--- /dev/null
+++ b/apps/frontend/src/page/(main)/lotus/$lotusId/index.lazy.tsx
@@ -0,0 +1,80 @@
+import { Suspense } from 'react';
+import { useQueryErrorResetBoundary } from '@tanstack/react-query';
+import { createLazyFileRoute, getRouteApi } from '@tanstack/react-router';
+import { lotusHistoryQueryOptions } from '@/feature/history/query';
+import { getLotusErrorData } from '@/feature/lotus';
+import { GlobalError } from '@/shared';
+import { AsyncBoundary, ErrorBoundary } from '@/shared/boundary';
+import { SuspenseLotusHistoryList } from '@/widget/history';
+import { CodeRunButton } from '@/widget/lotusCodeRun';
+import { SuspenseLotusDetail, SuspenseLotusEdit } from '@/widget/lotusDetail';
+import { SuspenseLotusFiles } from '@/widget/lotusDetail/SuspenseLotusFiles';
+import { SuspensePagination } from '@/widget/SuspensePagination';
+
+import '@/app/style/github.css';
+
+export const Route = createLazyFileRoute('/(main)/lotus/$lotusId/')({
+ component: RouteComponent,
+ errorComponent: ErrorComponent
+});
+
+const { useSearch, useNavigate, useParams } = getRouteApi('/(main)/lotus/$lotusId/');
+
+function RouteComponent() {
+ const { lotusId: id } = useParams();
+
+ const { page = 1 } = useSearch();
+
+ const navigate = useNavigate();
+
+ const handleChangePage = (page: number) => navigate({ search: { page } });
+
+ return (
+
+
+
}>
+
+
+
+
} rejected={() =>
}>
+
+
+
+
+
}>
+
+
+
+
+
+
(
+
+ )}
+ >
+ }>
+
+
+
+ }>
+
+
+
+
+ );
+}
+
+function ErrorComponent({ error, reset }: { error: Error; reset: () => void }) {
+ const { reset: retry } = useQueryErrorResetBoundary();
+
+ const handleRetry = () => {
+ retry();
+ reset();
+ };
+
+ return ;
+}
diff --git a/apps/frontend/src/page/(main)/lotus/$lotusId/index.tsx b/apps/frontend/src/page/(main)/lotus/$lotusId/index.tsx
new file mode 100644
index 00000000..cbed9f15
--- /dev/null
+++ b/apps/frontend/src/page/(main)/lotus/$lotusId/index.tsx
@@ -0,0 +1,10 @@
+import { createFileRoute } from '@tanstack/react-router';
+import { z } from 'zod';
+
+const historySearchPageValidate = z.object({
+ page: z.number().default(1).optional()
+});
+
+export const Route = createFileRoute('/(main)/lotus/$lotusId/')({
+ validateSearch: (search) => historySearchPageValidate.parse(search)
+});
diff --git a/apps/frontend/src/page/(main)/lotus/create/index.lazy.tsx b/apps/frontend/src/page/(main)/lotus/create/index.lazy.tsx
new file mode 100644
index 00000000..6cfffa5f
--- /dev/null
+++ b/apps/frontend/src/page/(main)/lotus/create/index.lazy.tsx
@@ -0,0 +1,36 @@
+import { useQueryErrorResetBoundary } from '@tanstack/react-query';
+import { createLazyFileRoute } from '@tanstack/react-router';
+import axios from 'axios';
+import { GlobalError } from '@/shared';
+import { LotusCreateForm } from '@/widget/lotusCreate/LotusCreateForm';
+
+export const Route = createLazyFileRoute('/(main)/lotus/create/')({
+ component: RouteComponent,
+ errorComponent: ErrorComponent
+});
+
+function RouteComponent() {
+ return (
+
+
+
+ );
+}
+
+function ErrorComponent({ error, reset }: { error: Error; reset: () => void }) {
+ const { reset: retry } = useQueryErrorResetBoundary();
+
+ const isLoginRequired = axios.isAxiosError(error) && error?.status === 401;
+
+ const handleRetry = () => {
+ retry();
+ reset();
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/page/(main)/lotus/create/index.tsx b/apps/frontend/src/page/(main)/lotus/create/index.tsx
new file mode 100644
index 00000000..1c598cc5
--- /dev/null
+++ b/apps/frontend/src/page/(main)/lotus/create/index.tsx
@@ -0,0 +1,9 @@
+import { createFileRoute, redirect } from '@tanstack/react-router';
+import { isAuthUser } from '@/feature/user/util';
+
+export const Route = createFileRoute('/(main)/lotus/create/')({
+ beforeLoad: async () => {
+ const isAuth = await isAuthUser();
+ if (!isAuth) throw redirect({ to: '/' });
+ }
+});
diff --git a/apps/frontend/src/page/(main)/lotus/index.lazy.tsx b/apps/frontend/src/page/(main)/lotus/index.lazy.tsx
new file mode 100644
index 00000000..f91a7cc3
--- /dev/null
+++ b/apps/frontend/src/page/(main)/lotus/index.lazy.tsx
@@ -0,0 +1,41 @@
+import { Suspense } from 'react';
+import { createLazyFileRoute, getRouteApi } from '@tanstack/react-router';
+import { lotusQueryOptions } from '@/feature/lotus';
+import { ErrorBoundary } from '@/shared/boundary';
+import { LotusSearchBar, SuspenseLotusList } from '@/widget/lotusList';
+import { SuspensePagination } from '@/widget/SuspensePagination';
+
+const { useSearch, useNavigate } = getRouteApi('/(main)/lotus/');
+
+export const Route = createLazyFileRoute('/(main)/lotus/')({
+ component: RouteComponent
+});
+
+function RouteComponent() {
+ const { page, keyword } = useSearch();
+ const navigate = useNavigate();
+
+ const lotusListQueryOptions = lotusQueryOptions.list({ page, keyword });
+
+ const onChangePage = (page: number = 1) => navigate({ to: '/lotus', search: { page } });
+
+ return (
+
+
+
+ (
+
+ )}
+ >
+ }>
+
+
+
+ }>
+
+
+
+
+ );
+}
diff --git a/apps/frontend/src/page/(main)/lotus/index.tsx b/apps/frontend/src/page/(main)/lotus/index.tsx
new file mode 100644
index 00000000..edb2a2f4
--- /dev/null
+++ b/apps/frontend/src/page/(main)/lotus/index.tsx
@@ -0,0 +1,11 @@
+import { createFileRoute } from '@tanstack/react-router';
+import { z } from 'zod';
+
+const lotusSearchValidation = z.object({
+ page: z.number().default(1).optional(),
+ keyword: z.string().optional()
+});
+
+export const Route = createFileRoute('/(main)/lotus/')({
+ validateSearch: (search) => lotusSearchValidation.parse(search)
+});
diff --git a/apps/frontend/src/page/(main)/route.lazy.tsx b/apps/frontend/src/page/(main)/route.lazy.tsx
new file mode 100644
index 00000000..4183c29b
--- /dev/null
+++ b/apps/frontend/src/page/(main)/route.lazy.tsx
@@ -0,0 +1,17 @@
+import { Outlet, createLazyFileRoute } from '@tanstack/react-router';
+import { Header } from '@/widget/Header';
+
+export const Route = createLazyFileRoute('/(main)')({
+ component: RouteComponent
+});
+
+function RouteComponent() {
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/page/(main)/user/index.lazy.tsx b/apps/frontend/src/page/(main)/user/index.lazy.tsx
new file mode 100644
index 00000000..711b27fe
--- /dev/null
+++ b/apps/frontend/src/page/(main)/user/index.lazy.tsx
@@ -0,0 +1,76 @@
+import { Suspense } from 'react';
+import { Heading } from '@froxy/design/components';
+import { useQueryErrorResetBoundary } from '@tanstack/react-query';
+import { createLazyFileRoute, getRouteApi } from '@tanstack/react-router';
+import axios from 'axios';
+import { userQueryOptions } from '@/feature/user';
+import { GlobalError } from '@/shared';
+import { AsyncBoundary, ErrorBoundary } from '@/shared/boundary';
+import { SuspenseLotusList } from '@/widget/lotusList';
+import { CreateLotusButton } from '@/widget/navigation';
+import { SuspensePagination } from '@/widget/SuspensePagination';
+import { SuspenseUserInfoBox } from '@/widget/user/SuspenseUserInfoBox';
+
+const { useSearch, useNavigate } = getRouteApi('/(main)/user/');
+
+export const Route = createLazyFileRoute('/(main)/user/')({
+ component: RouteComponent,
+ errorComponent: ErrorComponent
+});
+
+function RouteComponent() {
+ const { page } = useSearch();
+ const navigate = useNavigate();
+
+ const userLotusListQueryOptions = userQueryOptions.lotusList({ page });
+
+ const onChangePage = (page: number = 1) => navigate({ to: '/user', search: { page } });
+
+ return (
+
+
}
+ rejected={({ error, retry }) =>
}
+ >
+
+
+
+
+ 내가 작성한 Lotus
+
+
+ (
+
+ )}
+ >
+ }>
+
+
+
+ }>
+
+
+
+
+
+ );
+}
+
+function ErrorComponent({ error, reset }: { error: Error; reset: () => void }) {
+ const { reset: retry } = useQueryErrorResetBoundary();
+
+ const isLoginRequired = axios.isAxiosError(error) && error?.status === 401;
+
+ const handleRetry = () => {
+ retry();
+ reset();
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/page/(main)/user/index.tsx b/apps/frontend/src/page/(main)/user/index.tsx
new file mode 100644
index 00000000..ee6b4036
--- /dev/null
+++ b/apps/frontend/src/page/(main)/user/index.tsx
@@ -0,0 +1,15 @@
+import { createFileRoute, redirect } from '@tanstack/react-router';
+import { z } from 'zod';
+import { isAuthUser } from '@/feature/user/util';
+
+const userLotusSearchValidation = z.object({
+ page: z.number().default(1).optional()
+});
+
+export const Route = createFileRoute('/(main)/user/')({
+ beforeLoad: async () => {
+ const isAuth = await isAuthUser();
+ if (!isAuth) throw redirect({ to: '/' });
+ },
+ validateSearch: (search) => userLotusSearchValidation.parse(search)
+});
diff --git a/apps/frontend/src/page/-LoadingPage.tsx b/apps/frontend/src/page/-LoadingPage.tsx
new file mode 100644
index 00000000..b0a6c0b1
--- /dev/null
+++ b/apps/frontend/src/page/-LoadingPage.tsx
@@ -0,0 +1,11 @@
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+
+// NOTE: Loading 시 사용되는 로딩 페이지
+export function LoadingPage() {
+ return (
+
+
+
+
+ );
+}
diff --git a/apps/frontend/src/page/-NotFoundPage.tsx b/apps/frontend/src/page/-NotFoundPage.tsx
new file mode 100644
index 00000000..c07b8da4
--- /dev/null
+++ b/apps/frontend/src/page/-NotFoundPage.tsx
@@ -0,0 +1,16 @@
+import { Button } from '@froxy/design/components';
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+import { Link } from '@tanstack/react-router';
+
+// NOTE: createRouter에서 defaultNotFoundComponent 호출 시 사용됨
+export function NotFoundPage() {
+ return (
+
+
+
+
+ Go to Froxy site
+
+
+ );
+}
diff --git a/apps/frontend/src/page/__root.tsx b/apps/frontend/src/page/__root.tsx
new file mode 100644
index 00000000..029fb25d
--- /dev/null
+++ b/apps/frontend/src/page/__root.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react';
+import { Outlet, createRootRoute } from '@tanstack/react-router';
+
+export const Route = createRootRoute({
+ component: RootComponent
+});
+
+function RootComponent() {
+ return (
+
+
+
+ );
+}
diff --git a/apps/frontend/src/page/index.lazy.tsx b/apps/frontend/src/page/index.lazy.tsx
new file mode 100644
index 00000000..a0e9a08f
--- /dev/null
+++ b/apps/frontend/src/page/index.lazy.tsx
@@ -0,0 +1,37 @@
+import { Button, Heading } from '@froxy/design/components';
+import { createLazyFileRoute, getRouteApi } from '@tanstack/react-router';
+import { FaGithub } from 'react-icons/fa';
+import { LoginButton } from '@/widget/navigation/LoginButton';
+import { OnBoardingCarousel } from '@/widget/onboarding/OnBoardingCarousel';
+
+const { useNavigate } = getRouteApi('/');
+
+export const Route = createLazyFileRoute('/')({
+ component: RouteComponent
+});
+
+function RouteComponent() {
+ const navigate = useNavigate();
+
+ return (
+
+
+
+
+
+
+ FROXY
+
+
+
+ navigate({ to: '/lotus' })}>
+ 공개 프로젝트 보러가기
+
+
+
+ GitHub로 로그인하기
+
+
+
+ );
+}
diff --git a/apps/frontend/src/page/login/index.tsx b/apps/frontend/src/page/login/index.tsx
new file mode 100644
index 00000000..a43d5a77
--- /dev/null
+++ b/apps/frontend/src/page/login/index.tsx
@@ -0,0 +1,65 @@
+import { useEffect } from 'react';
+import { useQuery } from '@tanstack/react-query';
+import { Navigate, createFileRoute } from '@tanstack/react-router';
+import { z } from 'zod';
+import { useLoginQuery, userQueryOptions } from '@/feature/user/query';
+import { LoadingPage } from '@/page/-LoadingPage';
+import { useLocalStorage } from '@/shared';
+import { useToast } from '@/shared/toast';
+
+const loginTokenValidation = z.object({
+ code: z.string().min(1, '깃허브 인증에 실패했습니다.')
+});
+
+export const Route = createFileRoute('/login/')({
+ validateSearch: (search) => loginTokenValidation.parse(search),
+ component: RouteComponent,
+ errorComponent: ErrorComponent
+});
+
+function RouteComponent() {
+ const { code } = Route.useSearch();
+
+ const [, set] = useLocalStorage({ key: 'token', initialValue: '' });
+
+ const { data, error: loginError } = useLoginQuery({ code });
+
+ const { data: user, error: userInfoError } = useQuery({
+ ...userQueryOptions.info(),
+ enabled: !!data?.token
+ });
+
+ useEffect(() => {
+ if (data?.token) set(data.token);
+ }, [set, data]);
+
+ if (loginError || userInfoError) throw new Error('유저 정보 조회에 실패했습니다.');
+
+ if (!user) return ;
+
+ return ;
+}
+
+function SuccessComponent({ nickname }: { nickname: string }) {
+ const { toast } = useToast({ isCloseOnUnmount: false });
+
+ useEffect(() => {
+ toast({ description: `${nickname}님 환영합니다!`, duration: 2000 });
+ }, [toast, nickname]);
+
+ return ;
+}
+
+function ErrorComponent() {
+ const { toast } = useToast({ isCloseOnUnmount: false });
+
+ useEffect(() => {
+ toast({
+ variant: 'error',
+ description: '로그인에 실패했습니다.',
+ duration: 2000
+ });
+ }, [toast]);
+
+ return ;
+}
diff --git a/apps/frontend/src/shared/boundary/AsyncBoundary.tsx b/apps/frontend/src/shared/boundary/AsyncBoundary.tsx
new file mode 100644
index 00000000..890db90c
--- /dev/null
+++ b/apps/frontend/src/shared/boundary/AsyncBoundary.tsx
@@ -0,0 +1,42 @@
+import { Suspense } from 'react';
+import { ErrorBoundary } from './ErrorBoundary';
+
+export type AsyncBoundaryProps = {
+ children: React.ReactNode;
+ pending: React.ReactNode;
+ rejected: (args: { error: unknown; retry: () => void }) => React.ReactNode;
+ handleError?: (error: unknown) => void;
+};
+
+/**
+ * `AsyncBoundary` 컴포넌트는 비동기 작업의 경계(boundary)를 설정하여 에러와 로딩 상태를 처리합니다.
+ *
+ * @param {React.ReactNode} props.children - 비동기 작업이 완료되었을 때 렌더링할 자식 요소들
+ * @param {React.ReactNode} props.pending - 비동기 작업이 진행 중일 때 렌더링할 대기 요소
+ * @param {(error: Error, retry: () => void) => React.ReactNode} props.rejected - 비동기 작업이 실패했을 때 렌더링할 에러 처리 요소
+ * @param {(error: unknown) => void} [props.handleError] - 에러가 발생했을 때 추가적인 처리를 위한 콜백 함수
+ *
+ * @returns {JSX.Element} 에러 경계와 서스펜스를 포함한 JSX 요소
+ *
+ * @example
+ * ```tsx
+ * Loading...}
+ * rejected={({ error, retry }) => (
+ *
+ *
Error: {error.message}
+ *
Retry
+ *
+ * )}
+ * >
+ *
+ *
+ * ```
+ */
+export function AsyncBoundary(props: AsyncBoundaryProps) {
+ return (
+ props.rejected({ error, retry: reset })}>
+ {props.children}
+
+ );
+}
diff --git a/apps/frontend/src/shared/boundary/ErrorBoundary.test.tsx b/apps/frontend/src/shared/boundary/ErrorBoundary.test.tsx
new file mode 100644
index 00000000..c80b1ac1
--- /dev/null
+++ b/apps/frontend/src/shared/boundary/ErrorBoundary.test.tsx
@@ -0,0 +1,84 @@
+import { render, screen } from '@testing-library/react';
+import { afterAll, beforeAll, describe, expect, test, vitest } from 'vitest';
+import { ErrorBoundary, ErrorBoundaryProps } from './ErrorBoundary';
+
+const renderComponent = ({ children, fallback, handleError }: ErrorBoundaryProps) => {
+ render(
+
+ {children}
+
+ );
+};
+
+const ErrorComponent = () => {
+ throw new Error('Error');
+};
+
+describe('ErrorBoundary', () => {
+ beforeAll(() => {
+ vitest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterAll(() => {
+ vitest.restoreAllMocks();
+ });
+
+ test('ErrorBoundary의 자식 컴포넌트에서 에러가 발생하지 않으면 자식 컴포넌트를 렌더링 한다.', () => {
+ renderComponent({
+ children: test
,
+ fallback: () => Error
+ });
+
+ const child = screen.getByRole('child');
+
+ expect(child).toBeInTheDocument();
+ });
+
+ test('ErrorBoundary의 자식 컴포넌트에서 에러가 발생하면 fallback을 렌더링 한다.', () => {
+ renderComponent({
+ children: ,
+ fallback: () => Error
+ });
+
+ const error = screen.getByRole('error');
+
+ expect(error).toHaveTextContent('Error');
+ });
+
+ test('fallback은 error를 전달받는다.', () => {
+ renderComponent({
+ children: ,
+ fallback: ({ error }) => {String(error)}
+ });
+
+ const error = screen.getByRole('error');
+
+ expect(error).toHaveTextContent('Error');
+ });
+
+ test('fallback의 reset을 호출하면 에러를 초기화한다.', () => {
+ renderComponent({
+ children: ,
+ fallback: ({ reset }) => Reset
+ });
+
+ const button = screen.getByRole('button');
+ const error = screen.queryByRole('error');
+
+ button.click();
+
+ expect(error).not.toBeInTheDocument();
+ });
+
+ test('handleError가 주어지면 에러가 발생할 때 호출된다.', () => {
+ const handleError = vitest.fn();
+
+ renderComponent({
+ children: ,
+ fallback: () => Error
,
+ handleError
+ });
+
+ expect(handleError).toHaveBeenCalled();
+ });
+});
diff --git a/apps/frontend/src/shared/boundary/ErrorBoundary.tsx b/apps/frontend/src/shared/boundary/ErrorBoundary.tsx
new file mode 100644
index 00000000..3ca4e8c6
--- /dev/null
+++ b/apps/frontend/src/shared/boundary/ErrorBoundary.tsx
@@ -0,0 +1,50 @@
+import { Component } from 'react';
+
+export interface ErrorBoundaryProps {
+ children: React.ReactNode;
+ fallback?: (args: { error: unknown; reset: () => void }) => React.ReactNode;
+ handleError?: (error: unknown) => void;
+}
+
+/**
+ * ErrorBoundary는 자식 컴포넌트 트리에서 JavaScript 에러를 감지하는 React 컴포넌트입니다.
+ * 에러가 발생하면, 제공된 fallback UI를 렌더링합니다.
+ *
+ * @property children - 에러가 발생하지 않을 때 렌더링될 자식 컴포넌트들.
+ * @property fallback - 선택적인 렌더 함수로, 에러가 발생했을 때 표시할 UI를 반환합니다.
+ * 이 함수는 `error`와 `reset` 속성이 포함된 객체를 받습니다:
+ * - `error`: ErrorBoundary에서 잡은 에러 객체.
+ * - `reset`: 에러 상태를 초기화하는 함수.
+ * @property handleError - 선택적인 콜백 함수로, 에러 발생 시 컴포넌트 외부에서 로그 기록이나 에러 추적 등의 추가 처리를 할 때 사용됩니다.
+ *
+ * @example
+ * ```typescript
+ * }
+ * handleError={(error) => console.error("에러가 감지되었습니다:", error)}
+ * >
+ *
+ *
+ * ```
+ */
+export class ErrorBoundary extends Component {
+ state = { hasError: false, error: null };
+
+ static getDerivedStateFromError(error: unknown) {
+ return { hasError: true, error };
+ }
+
+ private resetError() {
+ this.setState({ hasError: false, error: null });
+ }
+
+ render() {
+ if (this.state.hasError) {
+ this.props.handleError?.(this.state.error);
+
+ return this.props.fallback?.({ error: this.state.error, reset: () => this.resetError() });
+ }
+
+ return this.props.children;
+ }
+}
diff --git a/apps/frontend/src/shared/boundary/index.ts b/apps/frontend/src/shared/boundary/index.ts
new file mode 100644
index 00000000..ce6d3115
--- /dev/null
+++ b/apps/frontend/src/shared/boundary/index.ts
@@ -0,0 +1,2 @@
+export * from './AsyncBoundary';
+export * from './ErrorBoundary';
diff --git a/apps/frontend/src/shared/common/api.ts b/apps/frontend/src/shared/common/api.ts
new file mode 100644
index 00000000..ce28f788
--- /dev/null
+++ b/apps/frontend/src/shared/common/api.ts
@@ -0,0 +1,17 @@
+import axios from 'axios';
+
+export const api = axios.create({
+ baseURL: import.meta.env.VITE_API_URL
+});
+
+api.interceptors.request.use((config) => {
+ const raw = localStorage.getItem('token');
+
+ const token = raw ? JSON.parse(raw) : null;
+
+ if (token) {
+ config.headers.Authorization = `Bearer ${token}`;
+ }
+
+ return config;
+});
diff --git a/apps/frontend/src/shared/common/component/GlobalError.tsx b/apps/frontend/src/shared/common/component/GlobalError.tsx
new file mode 100644
index 00000000..eb4e8d78
--- /dev/null
+++ b/apps/frontend/src/shared/common/component/GlobalError.tsx
@@ -0,0 +1,25 @@
+import { Button, Heading } from '@froxy/design/components';
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+import { Link } from '@tanstack/react-router';
+
+interface GlobalErrorProps {
+ description?: string;
+ handleRetry: () => void;
+}
+
+export function GlobalError({ description, handleRetry }: GlobalErrorProps) {
+ return (
+
+
+
{description ?? '오류가 발생했습니다'}
+
+
+ 메인 페이지로 이동하기
+
+
+ 다시 시도하기
+
+
+
+ );
+}
diff --git a/apps/frontend/src/shared/common/component/ModalBox.tsx b/apps/frontend/src/shared/common/component/ModalBox.tsx
new file mode 100644
index 00000000..366fe6dd
--- /dev/null
+++ b/apps/frontend/src/shared/common/component/ModalBox.tsx
@@ -0,0 +1,24 @@
+import { HTMLProps } from 'react';
+import { cn } from '@froxy/design/utils';
+
+type ModalBoxProps = {
+ onClose: () => void;
+} & HTMLProps;
+
+export function ModalBox({ children, className, onClose, ...props }: ModalBoxProps) {
+ const handleClose = (e: React.MouseEvent) => {
+ if (e.target === e.currentTarget) {
+ onClose();
+ }
+ };
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/apps/frontend/src/shared/common/component/Time.tsx b/apps/frontend/src/shared/common/component/Time.tsx
new file mode 100644
index 00000000..c2b3f4b1
--- /dev/null
+++ b/apps/frontend/src/shared/common/component/Time.tsx
@@ -0,0 +1,36 @@
+import { Slot, SlotComponentProps } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+
+export const formatDate = {
+ day: (date: Date, locales: Intl.LocalesArgument) => date.toLocaleDateString(locales, { weekday: 'long' }),
+ 'YYYY.MM.DD.': (date: Date, locales: Intl.LocalesArgument) => date.toLocaleDateString(locales).split('T')[0],
+ 'YYYY-MM-DD': (date: Date, locales: Intl.LocalesArgument) =>
+ date.toLocaleDateString(locales).slice(0, 11).replaceAll('. ', '-')
+} as const;
+
+export type FormatDateKey = keyof typeof formatDate;
+
+export interface TimeProps extends SlotComponentProps {
+ date: Date;
+ format?: FormatDateKey;
+ locale?: Intl.LocalesArgument;
+}
+
+export const Time = ({
+ date,
+ format = 'YYYY.MM.DD.',
+ locale = 'ko-KR',
+ className,
+ asChild,
+ ...props
+}: TimeProps) => {
+ const tw = cn('text-gray-600', className);
+
+ const Element = asChild ? Slot : 'span';
+
+ return (
+
+ {formatDate[format](date, locale)}
+
+ );
+};
diff --git a/apps/frontend/src/shared/common/component/index.ts b/apps/frontend/src/shared/common/component/index.ts
new file mode 100644
index 00000000..ee15273c
--- /dev/null
+++ b/apps/frontend/src/shared/common/component/index.ts
@@ -0,0 +1,3 @@
+export * from './ModalBox';
+export * from './Time';
+export * from './GlobalError';
diff --git a/apps/frontend/src/shared/common/hook/index.ts b/apps/frontend/src/shared/common/hook/index.ts
new file mode 100644
index 00000000..2a7128fe
--- /dev/null
+++ b/apps/frontend/src/shared/common/hook/index.ts
@@ -0,0 +1,3 @@
+export * from './useDebounce';
+export * from './useLocalStorage';
+export * from './useTimer';
diff --git a/apps/frontend/src/shared/common/hook/useDebounce.test.ts b/apps/frontend/src/shared/common/hook/useDebounce.test.ts
new file mode 100644
index 00000000..c86e9088
--- /dev/null
+++ b/apps/frontend/src/shared/common/hook/useDebounce.test.ts
@@ -0,0 +1,72 @@
+import { renderHook } from '@testing-library/react';
+import { afterEach, beforeEach, describe, expect, test, vitest } from 'vitest';
+import { useDebounce } from './useDebounce';
+
+const testFn = vitest.fn(() => console.log('executed'));
+
+const delay = 300;
+
+describe('useDebounce', () => {
+ beforeEach(() => {
+ vitest.useFakeTimers();
+ testFn.mockClear();
+ });
+
+ afterEach(() => {
+ vitest.useRealTimers();
+ });
+
+ test('delay값만큼 시간이 지나기 전에는 함수가 호출되지 않아야 한다.', () => {
+ //Given
+ const { result } = renderHook(() => useDebounce(testFn, delay));
+
+ //When
+ result.current();
+ vitest.advanceTimersByTime(299);
+
+ //Then
+ expect(testFn).not.toHaveBeenCalled();
+ });
+
+ test('delay값만큼 시간이 지났을 때 함수가 호출되어야 한다.', () => {
+ //Given
+ const { result } = renderHook(() => useDebounce(testFn, delay));
+
+ //When
+ result.current();
+ vitest.advanceTimersByTime(300);
+
+ //Then
+ expect(testFn).toHaveBeenCalledTimes(1);
+ });
+
+ test('연속 호출 시에 이전 타이머가 취소되어 이전 호출은 실행되지 않아야 한다.', () => {
+ //Given
+ const { result } = renderHook(() => useDebounce(testFn, delay));
+
+ //When
+ result.current();
+ vitest.advanceTimersByTime(200);
+
+ result.current();
+ vitest.advanceTimersByTime(299);
+
+ //Then
+ expect(testFn).not.toHaveBeenCalled();
+ });
+
+ test('연속 호출 시에 이전 타이머가 취소되고 마지막 호출만 실행되어야 한다.', () => {
+ //Given
+ const { result } = renderHook(() => useDebounce(testFn, delay));
+
+ //When
+ result.current();
+ vitest.advanceTimersByTime(200);
+
+ result.current();
+ vitest.advanceTimersByTime(300);
+
+ //Then
+ expect(testFn).toHaveBeenCalledTimes(1);
+ });
+});
diff --git a/apps/frontend/src/shared/common/hook/useDebounce.ts b/apps/frontend/src/shared/common/hook/useDebounce.ts
new file mode 100644
index 00000000..d50edf85
--- /dev/null
+++ b/apps/frontend/src/shared/common/hook/useDebounce.ts
@@ -0,0 +1,13 @@
+import { useCallback, useRef } from 'react';
+
+export const useDebounce = (fn: () => void, delay: number) => {
+ const timeoutRef = useRef(null);
+
+ return useCallback(() => {
+ if (timeoutRef.current) {
+ clearTimeout(timeoutRef.current);
+ }
+
+ timeoutRef.current = window.setTimeout(() => fn(), delay);
+ }, [fn, delay]);
+};
diff --git a/apps/frontend/src/shared/common/hook/useLocalStorage.ts b/apps/frontend/src/shared/common/hook/useLocalStorage.ts
new file mode 100644
index 00000000..ce1953ac
--- /dev/null
+++ b/apps/frontend/src/shared/common/hook/useLocalStorage.ts
@@ -0,0 +1,16 @@
+import { useEffect, useState } from 'react';
+
+//TODO : 간단한 로컬스토리지 훅이니까 추후 수정이 필요할 수 있음
+export const useLocalStorage = ({ key, initialValue }: { key: string; initialValue: T }) => {
+ const [storage, setStorage] = useState(() => {
+ const item = window.localStorage.getItem(key) || '';
+
+ return item ? JSON.parse(item) : initialValue;
+ });
+
+ useEffect(() => {
+ window.localStorage.setItem(key, JSON.stringify(storage));
+ }, [key, storage]);
+
+ return [storage, setStorage];
+};
diff --git a/apps/frontend/src/shared/common/hook/useTimer.ts b/apps/frontend/src/shared/common/hook/useTimer.ts
new file mode 100644
index 00000000..81c4154d
--- /dev/null
+++ b/apps/frontend/src/shared/common/hook/useTimer.ts
@@ -0,0 +1,52 @@
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+
+/**
+ * 타이머 기능을 제공하는 커스텀 훅입니다.
+ *
+ * @param callback - 타이머가 완료되었을 때 호출될 함수입니다.
+ * @param ms - 타이머의 지속 시간(밀리초)입니다.
+ * @returns 현재 시간, 타이머를 일시 중지하는 함수, 타이머를 시작하는 함수를 포함하는 객체를 반환합니다.
+ *
+ * @example
+ * const { time, pauseTimer, startTimer } = useTimer(() => {
+ * console.log('타이머 완료');
+ * }, 1000);
+ *
+ * useEffect(() => {
+ * startTimer();
+ * return () => pauseTimer();
+ * }, [startTimer, pauseTimer]);
+ */
+export const useTimer = (callback: () => void, ms: number) => {
+ const [time, setTime] = useState(0);
+
+ const timerRef = useRef(null);
+
+ const pauseTimer = useCallback(() => {
+ if (!timerRef.current) return;
+
+ clearInterval(timerRef.current);
+ }, []);
+
+ // NOTE: Interval을 사용하여 시간을 증가시키는 로직입니다. 최적화 된 타이머 로직을 고려해봐야 합니다.
+ const startTimer = useCallback(() => {
+ if (ms === Infinity) return;
+
+ timerRef.current = setInterval(() => {
+ setTime((prev) => (prev < ms ? prev + 5 : prev));
+ }, 5);
+ }, [ms]);
+
+ useEffect(() => {
+ if (time < ms) return;
+
+ clearInterval(timerRef.current!);
+ callback();
+ }, [callback, ms, time]);
+
+ const isTimeEnd = time >= ms;
+
+ const value = useMemo(() => ({ time, pauseTimer, startTimer, isTimeEnd }), [time, pauseTimer, startTimer, isTimeEnd]);
+
+ return value;
+};
diff --git a/apps/frontend/src/shared/common/index.ts b/apps/frontend/src/shared/common/index.ts
new file mode 100644
index 00000000..603c5fcb
--- /dev/null
+++ b/apps/frontend/src/shared/common/index.ts
@@ -0,0 +1,4 @@
+export * from './component';
+export * from './hook';
+export * from './api';
+export * from './util';
diff --git a/apps/frontend/src/shared/common/util.ts b/apps/frontend/src/shared/common/util.ts
new file mode 100644
index 00000000..93683322
--- /dev/null
+++ b/apps/frontend/src/shared/common/util.ts
@@ -0,0 +1 @@
+export const range = (length: number) => Array.from({ length }, (_, index) => index);
diff --git a/apps/frontend/src/shared/createQueryOptions/createQueryOptions.test.ts b/apps/frontend/src/shared/createQueryOptions/createQueryOptions.test.ts
new file mode 100644
index 00000000..6c155288
--- /dev/null
+++ b/apps/frontend/src/shared/createQueryOptions/createQueryOptions.test.ts
@@ -0,0 +1,68 @@
+import { describe, expect, it } from 'vitest';
+import { createQueryOptions } from './createQueryOptions';
+import { Fn } from './type';
+
+const API = {
+ list: () => Promise.resolve([]),
+ get: ({ id }: { id: number }) => Promise.resolve({ id }),
+ search: ({ keyword }: { keyword: string }) => Promise.resolve({ keyword }),
+ hello: (name: string) => Promise.resolve({ name })
+};
+
+const getQueryOptions = (scope: string, api: Record) => {
+ const query = createQueryOptions(scope, api);
+
+ return { scope, query };
+};
+
+describe('createQueryOptions', () => {
+ it('query.all()은 스코프의 쿼리키를 반환한다.', () => {
+ // Given
+ const { scope, query } = getQueryOptions('post', API);
+
+ // When
+ const result = query.all();
+
+ // Then
+ expect(result).toEqual({ queryKey: [{ scope }] });
+ });
+
+ it('query.type()은 타입의 쿼리키를 반환한다.', () => {
+ // Given
+ const { scope, query } = getQueryOptions('post', API);
+ const type = 'list';
+
+ // When
+ const result = query.type(type);
+
+ // Then
+ expect(result.queryKey).toEqual([{ scope, type }]);
+ });
+
+ it.each([
+ ['list', { id: 1 }, [{ scope: 'post', type: 'list', id: 1 }]],
+ ['get', { id: 1 }, [{ scope: 'post', type: 'get', id: 1 }]],
+ ['search', { keyword: 'hello' }, [{ scope: 'post', type: 'search', keyword: 'hello' }]]
+ ])('query.%s()은 %p를 인자로 받아 각각 쿼리키를 반환한다.', (type, data, expectedKey) => {
+ // Given
+ const { query } = getQueryOptions('post', API);
+
+ // When
+ const result = query[type](data);
+ const { queryKey } = result;
+
+ // Then
+ expect(queryKey).toEqual(expectedKey);
+ });
+
+ it("API 파라미터가 object 리터럴이 아닌 경우, 'data' 키로 감싼다.", () => {
+ // Given
+ const { query } = getQueryOptions('post', API);
+
+ // When
+ const result = query.hello('world');
+
+ // Then
+ expect(result.queryKey).toEqual([{ scope: 'post', type: 'hello', data: 'world' }]);
+ });
+});
diff --git a/apps/frontend/src/shared/createQueryOptions/createQueryOptions.ts b/apps/frontend/src/shared/createQueryOptions/createQueryOptions.ts
new file mode 100644
index 00000000..986f6fbb
--- /dev/null
+++ b/apps/frontend/src/shared/createQueryOptions/createQueryOptions.ts
@@ -0,0 +1,25 @@
+import { CreateQueryOptions, Fn } from './type';
+
+const isLiteralObject = (data: unknown): data is Record => data !== null && typeof data === 'object';
+
+export function createQueryOptions, Scope extends string>(
+ scope: Scope,
+ actions: Actions
+) {
+ const options: CreateQueryOptions = Object.fromEntries(
+ Object.entries(actions).map(([type, action]) => {
+ const handler = (data: unknown) => ({
+ queryKey: [{ scope, type, ...(isLiteralObject(data) ? data : data !== undefined ? { data } : {}) }],
+ queryFn: async () => action(data)
+ });
+
+ return [type, handler];
+ })
+ ) as CreateQueryOptions;
+
+ return {
+ all: () => ({ queryKey: [{ scope }] }),
+ type: (typeKey: keyof Actions) => ({ queryKey: [{ scope, type: typeKey }] }),
+ ...options
+ };
+}
diff --git a/apps/frontend/src/shared/createQueryOptions/index.ts b/apps/frontend/src/shared/createQueryOptions/index.ts
new file mode 100644
index 00000000..5e619524
--- /dev/null
+++ b/apps/frontend/src/shared/createQueryOptions/index.ts
@@ -0,0 +1 @@
+export * from './createQueryOptions';
diff --git a/apps/frontend/src/shared/createQueryOptions/type.ts b/apps/frontend/src/shared/createQueryOptions/type.ts
new file mode 100644
index 00000000..a32f43dd
--- /dev/null
+++ b/apps/frontend/src/shared/createQueryOptions/type.ts
@@ -0,0 +1,12 @@
+export type CreateQueryOptions unknown>, Scope extends string> = {
+ [K in keyof Actions]: (data: Parameters[0] extends undefined ? void : Parameters[0]) => {
+ queryKey: [
+ { scope: Scope; type: K } & (Parameters[0] extends undefined
+ ? Record
+ : Parameters[0])
+ ];
+ queryFn: () => ReturnType;
+ };
+};
+
+export type Fn = (data: any) => unknown;
diff --git a/apps/frontend/src/shared/index.ts b/apps/frontend/src/shared/index.ts
new file mode 100644
index 00000000..d0b93236
--- /dev/null
+++ b/apps/frontend/src/shared/index.ts
@@ -0,0 +1 @@
+export * from './common';
diff --git a/apps/frontend/src/shared/overlay/OverlayController.tsx b/apps/frontend/src/shared/overlay/OverlayController.tsx
new file mode 100644
index 00000000..4b47038e
--- /dev/null
+++ b/apps/frontend/src/shared/overlay/OverlayController.tsx
@@ -0,0 +1,64 @@
+import { Ref, forwardRef, useCallback, useEffect, useImperativeHandle, useState } from 'react';
+
+export interface OverlayControlRef {
+ close: () => void;
+}
+
+export type CreateOverlayElement = (props: { isOpen: boolean; close: () => void; exit: () => void }) => React.ReactNode;
+
+interface Props {
+ overlayElement: CreateOverlayElement;
+ onExit: () => void;
+}
+
+/**
+ * OverlayController 컴포넌트는 오버레이 요소의 상태와 동작을 관리합니다.
+ *
+ * @param {Object} props - 속성 객체입니다.
+ * @param {React.ElementType} props.overlayElement - 제어할 오버레이 요소입니다.
+ * @param {Function} props.onExit - 오버레이가 종료될 때 호출되는 콜백 함수입니다.
+ * @param {React.Ref} ref - 외부에서 오버레이를 제어하기 위한 참조 객체입니다.
+ *
+ * @returns {JSX.Element} 제어 속성이 포함된 렌더링된 오버레이 요소입니다.
+ *
+ * @example
+ * const overlayRef = useRef(null);
+ *
+ * const handleExit = () => {
+ * console.log('오버레이가 종료되었습니다');
+ * };
+ *
+ *
+ *
+ * // 프로그래밍 방식으로 오버레이를 닫으려면
+ * overlayRef.current?.close();
+ */
+export const OverlayController = forwardRef(function OverlayController(
+ { overlayElement: OverlayElement, onExit }: Props,
+ ref: Ref
+) {
+ const [isOpenOverlay, setIsOpenOverlay] = useState(false);
+
+ const handleOverlayClose = useCallback(() => setIsOpenOverlay(false), []);
+
+ useImperativeHandle(
+ ref,
+ () => {
+ return { close: handleOverlayClose };
+ },
+ [handleOverlayClose]
+ );
+
+ useEffect(() => {
+ // NOTE: open 에니메이션이 종종 안열리는 문제를 해결하기 위해 requestAnimationFrame을 사용합니다.
+ requestAnimationFrame(() => {
+ setIsOpenOverlay(true);
+ });
+ }, []);
+
+ return ;
+});
diff --git a/apps/frontend/src/shared/overlay/OverlayProvider.tsx b/apps/frontend/src/shared/overlay/OverlayProvider.tsx
new file mode 100644
index 00000000..c5e2cee3
--- /dev/null
+++ b/apps/frontend/src/shared/overlay/OverlayProvider.tsx
@@ -0,0 +1,33 @@
+import { Fragment, useCallback, useMemo, useState } from 'react';
+import { OverlayContext } from './useOverlay';
+
+export const OverlayProvider = ({ children }: { children: React.ReactNode }) => {
+ const [overlays, setOverlays] = useState>(new Map());
+
+ const mount = useCallback((id: string, overlay: React.ReactNode) => {
+ setOverlays((prev) => {
+ const cloned = new Map(prev);
+ cloned.set(id, overlay);
+ return cloned;
+ });
+ }, []);
+
+ const unmount = useCallback((id: string) => {
+ setOverlays((prev) => {
+ const newMap = new Map(prev);
+ newMap.delete(id);
+ return newMap;
+ });
+ }, []);
+
+ const value = useMemo(() => ({ mount, unmount }), [mount, unmount]);
+
+ return (
+
+ {children}
+ {[...overlays.entries()].map(([id, overlay]) => {
+ return {overlay} ;
+ })}
+
+ );
+};
diff --git a/apps/frontend/src/shared/overlay/index.ts b/apps/frontend/src/shared/overlay/index.ts
new file mode 100644
index 00000000..5ee06d0c
--- /dev/null
+++ b/apps/frontend/src/shared/overlay/index.ts
@@ -0,0 +1,2 @@
+export * from './OverlayProvider';
+export * from './useOverlay';
diff --git a/apps/frontend/src/shared/overlay/useOverlay.test.tsx b/apps/frontend/src/shared/overlay/useOverlay.test.tsx
new file mode 100644
index 00000000..7edb8155
--- /dev/null
+++ b/apps/frontend/src/shared/overlay/useOverlay.test.tsx
@@ -0,0 +1,75 @@
+import { useEffect } from 'react';
+import { render, renderHook, screen, waitFor } from '@testing-library/react';
+import { afterAll, beforeAll, describe, expect, test, vitest } from 'vitest';
+import { OverlayProvider, useOverlay } from './';
+
+describe('useOverlay', () => {
+ beforeAll(() => {
+ vitest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterAll(() => {
+ vitest.restoreAllMocks();
+ });
+
+ test('OverlayProvider 내에서만 사용할 수 있어야 한다.', () => {
+ expect(() => renderHook(() => useOverlay())).toThrow('useOverlay는 OverlayProvider 내에서만 사용할 수 있습니다.');
+ });
+
+ test('open, close 함수를 반환해야 한다.', () => {
+ const { result } = renderHook(() => useOverlay(), {
+ wrapper: ({ children }) => {children}
+ });
+
+ expect(result.current).toHaveProperty('open');
+ expect(result.current).toHaveProperty('close');
+ });
+
+ test('open 함수를 호출하면 인자로 받은 Element가 렌더링 되어야 한다.', () => {
+ const OverlayComponent = () => {
+ const { open } = useOverlay();
+
+ open(() => test
);
+
+ return <>>;
+ };
+
+ render(
+
+
+
+ );
+
+ const overlay = screen.getByRole('overlay');
+
+ expect(overlay).toBeInTheDocument();
+ });
+
+ test('close 함수를 호출하면 렌더링 된 Element를 unmount 해야한다.', () => {
+ const OverlayComponent = () => {
+ const { open, close } = useOverlay();
+
+ useEffect(() => {
+ open(() => test
);
+
+ setTimeout(() => {
+ close();
+ }, 300);
+ }, [open, close]);
+
+ return <>>;
+ };
+
+ render(
+
+
+
+ );
+
+ const overlay = screen.getByRole('overlay');
+
+ waitFor(() => {
+ expect(overlay).not.toBeInTheDocument();
+ });
+ });
+});
diff --git a/apps/frontend/src/shared/overlay/useOverlay.tsx b/apps/frontend/src/shared/overlay/useOverlay.tsx
new file mode 100644
index 00000000..9fb2ab86
--- /dev/null
+++ b/apps/frontend/src/shared/overlay/useOverlay.tsx
@@ -0,0 +1,86 @@
+import { createContext, useContext, useEffect, useMemo, useRef } from 'react';
+import { CreateOverlayElement, OverlayControlRef, OverlayController } from './OverlayController';
+
+interface OverlayContextValue {
+ id?: string;
+ mount?: (id: string, overlay: React.ReactNode) => void;
+ unmount?: (id: string) => void;
+}
+
+export const OverlayContext = createContext({});
+
+const useOverlayContext = () => {
+ const { mount, unmount } = useContext(OverlayContext);
+
+ const InvalidContext = !(mount && unmount);
+
+ if (InvalidContext) {
+ throw new Error('useOverlay는 OverlayProvider 내에서만 사용할 수 있습니다.');
+ }
+
+ return useMemo(() => ({ mount, unmount }), [mount, unmount]);
+};
+
+const uniqueId = () => Date.now().toString() + Math.random().toString();
+
+const useUniqueIdRef = () => {
+ const id = useRef(uniqueId()).current;
+ return id;
+};
+
+/**
+ * 오버레이를 관리하기 위한 커스텀 훅입니다.
+ *
+ * @param {Object} [options] - 오버레이에 대한 설정 옵션입니다.
+ * @param {boolean} [options.isCloseOnUnmount=true] - 컴포넌트가 언마운트될 때 오버레이를 닫을지 여부를 결정합니다.
+ * @returns {Object} - 오버레이를 열고 닫는 메서드를 포함하는 객체를 반환합니다.
+ * @returns {Function} return.open - 주어진 React 엘리먼트로 오버레이를 여는 함수입니다.
+ * @returns {Function} return.close - 오버레이를 닫는 함수입니다.
+ *
+ * @example
+ * const { open } = useOverlay();
+ *
+ * open(({isOpen, close})=>
+ *
오버레이
+ * 닫기
+ *
+ * );
+ */
+export const useOverlay = ({ isCloseOnUnmount = true }: { isCloseOnUnmount?: boolean } = {}) => {
+ const { mount, unmount } = useOverlayContext();
+ const id = useUniqueIdRef();
+
+ const overlayRef = useRef(null);
+
+ useEffect(() => {
+ return () => {
+ if (isCloseOnUnmount) unmount(id);
+ };
+ }, [id, unmount, isCloseOnUnmount]);
+
+ return useMemo(
+ () => ({
+ open: (overlayElement: CreateOverlayElement) => {
+ mount(
+ id,
+ {
+ unmount(id);
+ }}
+ />
+ );
+ },
+ close: () => {
+ overlayRef.current?.close();
+ },
+ exit: () => {
+ unmount(id);
+ }
+ }),
+ [id, mount, unmount]
+ );
+};
diff --git a/apps/frontend/src/shared/tagInput/TagInput.tsx b/apps/frontend/src/shared/tagInput/TagInput.tsx
new file mode 100644
index 00000000..966f2dde
--- /dev/null
+++ b/apps/frontend/src/shared/tagInput/TagInput.tsx
@@ -0,0 +1,37 @@
+import { Badge, Button, Input, Text } from '@froxy/design/components';
+import { TiDelete } from 'react-icons/ti';
+import { useTagInput } from './useTagInput';
+
+interface TagInputProp {
+ value: string[];
+ onChange: (tags: string[]) => void;
+}
+
+export function TagInput({ value, onChange }: TagInputProp) {
+ const { inputRef, setIsComposing, onInputKeyDown, removeTag } = useTagInput(value, onChange);
+
+ return (
+
+
setIsComposing(true)}
+ onCompositionEnd={() => {
+ setIsComposing(false);
+ }}
+ placeholder="태그를 입력해주세요"
+ />
+
+ {value.map((tag, i) => (
+
+ {tag}
+ removeTag(i)}>
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/apps/frontend/src/shared/tagInput/index.ts b/apps/frontend/src/shared/tagInput/index.ts
new file mode 100644
index 00000000..2dcba2a4
--- /dev/null
+++ b/apps/frontend/src/shared/tagInput/index.ts
@@ -0,0 +1 @@
+export * from './TagInput';
diff --git a/apps/frontend/src/shared/tagInput/useTagInput.test.tsx b/apps/frontend/src/shared/tagInput/useTagInput.test.tsx
new file mode 100644
index 00000000..8c13951b
--- /dev/null
+++ b/apps/frontend/src/shared/tagInput/useTagInput.test.tsx
@@ -0,0 +1,60 @@
+import { fireEvent, render, renderHook } from '@testing-library/react';
+import { afterEach, beforeEach, describe, expect, test, vitest } from 'vitest';
+import { useTagInput } from './useTagInput';
+
+const mockOnChange = vitest.fn();
+
+function TagInputComponent({ value, onChange }: { value: string[]; onChange: (tags: string[]) => void }) {
+ const { inputRef, onInputKeyDown } = useTagInput(value, onChange);
+
+ return ;
+}
+
+describe('useTagInput', () => {
+ beforeEach(() => {
+ vitest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ vitest.restoreAllMocks();
+ });
+
+ test('Enter 키 입력으로 태그가 추가되어야 한다.', () => {
+ //Given
+ const { getByLabelText } = render( );
+ const input = getByLabelText('tag-input');
+
+ //When
+ fireEvent.change(input, { target: { value: 'new tag' } });
+ fireEvent.keyDown(input, { key: 'Enter' });
+
+ //Then
+ expect(mockOnChange).toHaveBeenCalledWith(['new tag']);
+ expect(input).toHaveValue('');
+ });
+
+ test('공백 문자열은 태그로 추가되지 않아야 한다.', () => {
+ //Given
+ const { getByLabelText } = render( );
+ const input = getByLabelText('tag-input');
+
+ //When
+ fireEvent.change(input, { target: { value: ' ' } });
+ fireEvent.keyDown(input, { key: 'Enter' });
+
+ //Then
+ expect(mockOnChange).not.toHaveBeenCalled();
+ });
+
+ test('removeTag 함수는 해당 태그를 삭제시켜야한다.', () => {
+ //Given
+ const initialTags = ['tag1', 'tag2', 'tag3'];
+ const { result } = renderHook(() => useTagInput(initialTags, mockOnChange));
+
+ //When
+ result.current.removeTag(0);
+
+ //Then
+ expect(mockOnChange).toHaveBeenCalledWith(['tag2', 'tag3']);
+ });
+});
diff --git a/apps/frontend/src/shared/tagInput/useTagInput.ts b/apps/frontend/src/shared/tagInput/useTagInput.ts
new file mode 100644
index 00000000..17fafda1
--- /dev/null
+++ b/apps/frontend/src/shared/tagInput/useTagInput.ts
@@ -0,0 +1,33 @@
+import { useRef, useState } from 'react';
+
+export const useTagInput = (value: string[], onChange: (tags: string[]) => void) => {
+ const inputRef = useRef(null);
+ const [isComposing, setIsComposing] = useState(false);
+
+ const addTag = (tagValue: string) => {
+ if (tagValue.trim()) {
+ onChange([...value, tagValue.trim()]);
+
+ if (inputRef.current?.value) inputRef.current.value = '';
+ }
+ };
+
+ const onInputKeyDown = (event: React.KeyboardEvent) => {
+ // Enter 키 입력 시
+ if (event.key === 'Enter') {
+ event.preventDefault();
+
+ // 입력 중이 아닐 때만 태그 추가
+ if (!isComposing && inputRef.current) {
+ addTag(inputRef.current.value);
+ }
+ }
+ };
+
+ const removeTag = (index: number) => {
+ const updated = value.filter((_, i) => index !== i);
+ onChange(updated);
+ };
+
+ return { inputRef, setIsComposing, onInputKeyDown, removeTag };
+};
diff --git a/apps/frontend/src/shared/toast/Toast.tsx b/apps/frontend/src/shared/toast/Toast.tsx
new file mode 100644
index 00000000..28a2ee98
--- /dev/null
+++ b/apps/frontend/src/shared/toast/Toast.tsx
@@ -0,0 +1,87 @@
+import { useEffect } from 'react';
+import { Heading, Text } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { AnimatePresence, motion } from 'framer-motion';
+import { useTimer } from '@/shared/common';
+
+export interface ToastProps {
+ variant?: 'default' | 'success' | 'error';
+ title?: string;
+ description?: string;
+ action?: React.ReactNode;
+ isOpen: boolean;
+ close: () => void;
+ duration?: number;
+ exit?: () => void;
+}
+
+const TOAST_VARIANT_STYLE = {
+ default: 'bg-white text-black',
+ success: 'bg-green-100 text-green-800',
+ error: 'bg-red-100 text-red-800'
+};
+
+export function Toast({
+ variant = 'default',
+ title,
+ description,
+ action,
+ isOpen,
+ close,
+ exit,
+ duration = Infinity
+}: ToastProps) {
+ const { time, pauseTimer, startTimer, isTimeEnd } = useTimer(() => {
+ close();
+ }, duration);
+
+ const progress = ((duration - time) / duration) * 100;
+
+ useEffect(() => {
+ if (isTimeEnd) return exit?.();
+
+ if (isOpen) startTimer();
+
+ return () => pauseTimer();
+ //NOTE: timer와 startTimer를 deps에 추가하면 무한루프가 발생합니다.
+ }, [isOpen, duration, close]);
+
+ return (
+
+ {isOpen && (
+
+
+
+ {title && {title} }
+ {description && {description} }
+
+ {action}
+
+
+ {duration !== Infinity && (
+
+ )}
+
+ )}
+
+ );
+}
diff --git a/apps/frontend/src/shared/toast/index.ts b/apps/frontend/src/shared/toast/index.ts
new file mode 100644
index 00000000..44a723a0
--- /dev/null
+++ b/apps/frontend/src/shared/toast/index.ts
@@ -0,0 +1 @@
+export * from './useToast';
diff --git a/apps/frontend/src/shared/toast/useToast.tsx b/apps/frontend/src/shared/toast/useToast.tsx
new file mode 100644
index 00000000..86dc73bd
--- /dev/null
+++ b/apps/frontend/src/shared/toast/useToast.tsx
@@ -0,0 +1,18 @@
+import { Toast, ToastProps } from './Toast';
+import { useOverlay } from '@/shared/overlay/useOverlay';
+
+export const useToast = ({ isCloseOnUnmount = true }: { isCloseOnUnmount?: boolean } = {}) => {
+ const { open, close, exit } = useOverlay({ isCloseOnUnmount });
+
+ //NOTE: Navigation이 발생할 때 컴포넌트가 언마운트된 이후 자동으로 exit를 실행하지 않는 경우 setTimeout을 사용합니다.
+ const closeAndExit = () => {
+ close();
+ if (!isCloseOnUnmount) setTimeout(exit, 300);
+ };
+
+ const toast = ({ ...props }: Partial) => {
+ open(({ isOpen }) => );
+ };
+
+ return { toast, close, exit };
+};
diff --git a/apps/frontend/src/widget/Header.tsx b/apps/frontend/src/widget/Header.tsx
new file mode 100644
index 00000000..98b484a7
--- /dev/null
+++ b/apps/frontend/src/widget/Header.tsx
@@ -0,0 +1,48 @@
+import { Button, Heading } from '@froxy/design/components';
+import { useQuery } from '@tanstack/react-query';
+import { Link, useNavigate } from '@tanstack/react-router';
+import { CreateLotusButton, LogoutButton } from './navigation';
+import { LoginButton } from './navigation/LoginButton';
+import { userQueryOptions } from '@/feature/user/query';
+
+export function Header() {
+ const { data } = useQuery({
+ ...userQueryOptions.info(),
+ retry: 0
+ });
+
+ const navigate = useNavigate();
+
+ const handleClick = () => {
+ navigate({ to: '/lotus' });
+ };
+
+ const image = data?.profile || '/image/exampleImage.jpeg';
+
+ return (
+
+
+
handleClick()}>
+
+ Froxy
+
+
+ {data ? (
+ <>
+
+
+
+
+
+
+
+
+ >
+ ) : (
+
Login
+ )}
+
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/SuspensePagination.tsx b/apps/frontend/src/widget/SuspensePagination.tsx
new file mode 100644
index 00000000..9990aa79
--- /dev/null
+++ b/apps/frontend/src/widget/SuspensePagination.tsx
@@ -0,0 +1,33 @@
+import { useSuspenseQuery } from '@tanstack/react-query';
+import { Pagination } from '@/feature/pagination';
+
+interface Page {
+ max: number;
+ current: number;
+}
+
+interface PaginationQueryOptions {
+ queryKey: Record[];
+ queryFn: (...args: any[]) => Promise<{ page: Page }>;
+}
+
+interface SuspensePaginationProps {
+ queryOptions: PaginationQueryOptions;
+ onChangePage: (page: number) => void;
+ activeScrollTop?: true;
+}
+
+export function SuspensePagination({ queryOptions, onChangePage, activeScrollTop }: SuspensePaginationProps) {
+ const { data } = useSuspenseQuery(queryOptions);
+
+ return (
+
+ );
+}
+
+SuspensePagination.Skeleton = Pagination.Skeleton;
diff --git a/apps/frontend/src/widget/history/HistoryTrigger.tsx b/apps/frontend/src/widget/history/HistoryTrigger.tsx
new file mode 100644
index 00000000..9704330e
--- /dev/null
+++ b/apps/frontend/src/widget/history/HistoryTrigger.tsx
@@ -0,0 +1,22 @@
+import { Text } from '@froxy/design/components';
+import { History, HistoryModel } from '@/feature/history';
+
+export function HistoryTrigger({ history }: { history: HistoryModel }) {
+ return (
+
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/history/SuspenseLotusHistoryDetail.tsx b/apps/frontend/src/widget/history/SuspenseLotusHistoryDetail.tsx
new file mode 100644
index 00000000..119adfb9
--- /dev/null
+++ b/apps/frontend/src/widget/history/SuspenseLotusHistoryDetail.tsx
@@ -0,0 +1,78 @@
+import { useEffect } from 'react';
+import { Button, Heading } from '@froxy/design/components';
+import { Markdown } from '@froxy/react-markdown';
+import { useQueryClient, useQueryErrorResetBoundary, useSuspenseQuery } from '@tanstack/react-query';
+import { AiOutlineLoading } from 'react-icons/ai';
+import { lotusHistoryQueryOptions } from '@/feature/history/query';
+
+export function SuspenseLotusHistoryDetail({ lotusId, historyId }: { lotusId: string; historyId: string }) {
+ const lotusDetailQueryOptions = lotusHistoryQueryOptions.detail({ id: lotusId, historyId });
+
+ const { data } = useSuspenseQuery(lotusDetailQueryOptions);
+
+ const queryClient = useQueryClient();
+
+ // 우선 폴링을 사용하여 데이터를 가져오는 것을 구현해보았습니다.
+ useEffect(() => {
+ if (data.status !== 'PENDING') return;
+
+ const interval = setInterval(async () => {
+ const updatedData = await queryClient.fetchQuery(lotusDetailQueryOptions);
+
+ if (!updatedData || updatedData.status === 'PENDING') return;
+
+ queryClient.invalidateQueries(lotusHistoryQueryOptions.list({ id: lotusId }));
+ }, 1000);
+
+ return () => clearInterval(interval);
+ }, [data, lotusDetailQueryOptions, lotusId, queryClient]);
+
+ const terminal = '```bash\n' + data.output + '\n```';
+
+ if (data.status === 'PENDING') {
+ return ;
+ }
+
+ return (
+
+
+
+ );
+}
+
+function LotusHistoryDetailFallback({ title }: { title: string }) {
+ return (
+
+ );
+}
+
+SuspenseLotusHistoryDetail.Fallback = LotusHistoryDetailFallback;
+
+function LotusHistoryDetailError({ retry }: { retry?: () => void }) {
+ const { reset } = useQueryErrorResetBoundary();
+
+ const handleClick = () => {
+ reset();
+ retry?.();
+ };
+
+ return (
+
+
+
+
OOPS
+
+
+ {retry && (
+
+ 재시도
+
+ )}
+
+ );
+}
+
+SuspenseLotusHistoryDetail.Error = LotusHistoryDetailError;
diff --git a/apps/frontend/src/widget/history/SuspenseLotusHistoryList.tsx b/apps/frontend/src/widget/history/SuspenseLotusHistoryList.tsx
new file mode 100644
index 00000000..eac795cd
--- /dev/null
+++ b/apps/frontend/src/widget/history/SuspenseLotusHistoryList.tsx
@@ -0,0 +1,120 @@
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+ Button,
+ Heading,
+ Skeleton,
+ Text
+} from '@froxy/design/components';
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+import { useQueryErrorResetBoundary, useSuspenseQuery } from '@tanstack/react-query';
+import axios from 'axios';
+import { HistoryTrigger } from './HistoryTrigger';
+import { SuspenseLotusHistoryDetail } from './SuspenseLotusHistoryDetail';
+import { HistoryModel } from '@/feature/history';
+import { lotusHistoryQueryOptions } from '@/feature/history/query';
+import { range } from '@/shared';
+import { AsyncBoundary } from '@/shared/boundary';
+
+export function SuspenseLotusHistoryList({ id, page = 1 }: { id: string; page?: number }) {
+ const {
+ data: { list }
+ } = useSuspenseQuery(lotusHistoryQueryOptions.list({ id, page }));
+
+ if (list.length < 1) return ;
+
+ const pendingHistoriesId = HistoryModel.getPendingHistoriesId(list);
+
+ const firstPageFirstItem = page === 1 ? [list[0]?.id] : [];
+
+ return (
+
+ {/* NOTE : key를 이용해 갱신해야 Pending 상태인 Content 고정 가능 */}
+
+ {list.map((history) => (
+
+
+
+
+
+ }
+ rejected={({ retry }) => }
+ >
+
+
+
+
+ ))}
+
+
+ );
+}
+
+export function SuspenseLotusHistoryListEmpty() {
+ return (
+
+
+
+ History가 없습니다.
+
+ Lotus를 실행해보세요!
+
+ );
+}
+
+export function SkeletonLotusHistoryList() {
+ return (
+
+ {range(5).map((value) => (
+
+ ))}
+
+ );
+}
+
+SuspenseLotusHistoryList.Skeleton = SkeletonLotusHistoryList;
+
+interface ErrorProps {
+ error: unknown;
+ retry: () => void;
+ onChangePage: (page: number) => Promise;
+}
+
+function ErrorLotusHistoryList({ error, retry, onChangePage }: ErrorProps) {
+ const { reset } = useQueryErrorResetBoundary();
+
+ if (axios.isAxiosError(error) && (error?.status === 401 || error?.status === 403)) throw error;
+
+ const handleRetry = async () => {
+ if (axios.isAxiosError(error) && error?.status === 404) {
+ await onChangePage(1);
+ } else {
+ reset();
+ }
+ retry();
+ };
+
+ return (
+
+
+ History 목록 조회에 실패했습니다
+ 재시도
+
+ );
+}
+
+SuspenseLotusHistoryList.Error = ErrorLotusHistoryList;
diff --git a/apps/frontend/src/widget/history/index.ts b/apps/frontend/src/widget/history/index.ts
new file mode 100644
index 00000000..0c8fabe8
--- /dev/null
+++ b/apps/frontend/src/widget/history/index.ts
@@ -0,0 +1,3 @@
+export * from './SuspenseLotusHistoryList';
+export * from './HistoryTrigger';
+export * from './SuspenseLotusHistoryDetail';
diff --git a/apps/frontend/src/widget/lotusCodeRun/CodeRunButton.tsx b/apps/frontend/src/widget/lotusCodeRun/CodeRunButton.tsx
new file mode 100644
index 00000000..73f3d8bf
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCodeRun/CodeRunButton.tsx
@@ -0,0 +1,56 @@
+import { Button } from '@froxy/design/components';
+import { useQueryClient } from '@tanstack/react-query';
+import { useNavigate } from '@tanstack/react-router';
+import { LotusRunCodeForm } from './LotusRunCodeForm';
+import { lotusHistoryQueryOptions, useCodeRunMutation } from '@/feature/history/query';
+import { ModalBox } from '@/shared';
+import { useOverlay } from '@/shared/overlay';
+import { useToast } from '@/shared/toast';
+
+export function CodeRunButton({ lotusId }: { lotusId: string }) {
+ const navigate = useNavigate();
+
+ const { open, exit } = useOverlay();
+
+ const { toast } = useToast();
+
+ const { mutate, isPending } = useCodeRunMutation();
+
+ const queryClient = useQueryClient();
+
+ const handleCodeRun = ({ execFileName, inputs }: { execFileName: string; inputs: string[] }) => {
+ exit();
+
+ mutate(
+ { lotusId, input: inputs, execFileName },
+ {
+ onSuccess: () => {
+ toast({ description: '코드가 실행되었습니다.', variant: 'success', duration: 2000 });
+
+ queryClient.invalidateQueries(lotusHistoryQueryOptions.list({ id: lotusId }));
+ navigate({ to: '/lotus/$lotusId', params: { lotusId } });
+ },
+ onError: () => {
+ toast({
+ description: '코드 실행 중 오류가 발생했습니다. 다시 시도해 주세요.',
+ variant: 'error',
+ duration: 2000
+ });
+ }
+ }
+ );
+ };
+
+ const handleOpenModal = () =>
+ open(() => (
+
+ exit()} onSubmit={handleCodeRun} lotusId={lotusId} />
+
+ ));
+
+ return (
+
+ 실행하기
+
+ );
+}
diff --git a/apps/frontend/src/widget/lotusCodeRun/LotusCodeDynamicInput.tsx b/apps/frontend/src/widget/lotusCodeRun/LotusCodeDynamicInput.tsx
new file mode 100644
index 00000000..dc34ffd9
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCodeRun/LotusCodeDynamicInput.tsx
@@ -0,0 +1,83 @@
+import { useEffect } from 'react';
+import { Button, Input, Text } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { Reorder } from 'framer-motion';
+import { useFieldArray, useForm } from 'react-hook-form';
+import { z } from 'zod';
+
+export const lotusCodeInputValue = z.object({
+ items: z.array(
+ z.object({
+ input: z.string().min(1, '입력값은 필수 항목입니다.')
+ })
+ )
+});
+
+export type LotusCodeDynamicInputValue = z.infer;
+
+interface LotusCodeDynamicInputProps {
+ className?: string;
+ onChangeValue?: (data: LotusCodeDynamicInputValue) => void;
+ isDisabled?: boolean;
+}
+
+export function LotusCodeDynamicInput(props: LotusCodeDynamicInputProps) {
+ const {
+ register,
+ control,
+ watch,
+ formState: { errors }
+ } = useForm({
+ defaultValues: lotusCodeInputValue.parse({ items: [] }),
+ resolver: zodResolver(lotusCodeInputValue)
+ });
+
+ const { fields, append, remove, swap } = useFieldArray({
+ control,
+ name: 'items'
+ });
+
+ const values = watch();
+
+ const handleReorder = (newFields: typeof fields) => {
+ const firstDiffIndex = fields.findIndex((field, index) => field.id !== newFields[index].id);
+
+ if (firstDiffIndex === -1) return;
+
+ const newIndex = newFields.findIndex((field) => field.id === fields[firstDiffIndex].id);
+
+ swap(firstDiffIndex, newIndex);
+ };
+
+ useEffect(() => {
+ props.onChangeValue?.(values);
+ }, [values, props]);
+
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/widget/lotusCodeRun/LotusRunCodeForm.tsx b/apps/frontend/src/widget/lotusCodeRun/LotusRunCodeForm.tsx
new file mode 100644
index 00000000..c6256640
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCodeRun/LotusRunCodeForm.tsx
@@ -0,0 +1,54 @@
+import { useState } from 'react';
+import { Button, Heading, Text } from '@froxy/design/components';
+import { LotusCodeDynamicInput } from './LotusCodeDynamicInput';
+import { SuspenseLotusRunFileSelect } from './LotusRunFileSelect';
+import { AsyncBoundary } from '@/shared/boundary';
+
+interface LotusRunCodeFormProps {
+ lotusId: string;
+ onSubmit?: ({ execFileName, inputs }: { execFileName: string; inputs: string[] }) => void;
+ onCancel?: () => void;
+}
+
+export function LotusRunCodeForm({ lotusId, onCancel, onSubmit }: LotusRunCodeFormProps) {
+ const [execFileName, setExecFileName] = useState('');
+ const [inputs, setInputs] = useState([]);
+
+ const handleSubmit = () => {
+ onSubmit?.({ execFileName, inputs });
+ };
+
+ const handleCancel = () => {
+ onCancel?.();
+ };
+
+ const handleExecFileChange = (value: string) => {
+ setExecFileName(value);
+ };
+
+ return (
+ } rejected={() => Error!
}>
+
+
+
+
+ 실행 입력 코드
+ 다음의 코드가 실행 시 순서대로 입력됩니다. 드래그를 통해 순서를 변경할 수 있습니다.
+ setInputs(data.items.map((item) => item.input))}
+ />
+
+
+
+ 취소하기
+
+ handleSubmit()}>
+ 실행하기
+
+
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/lotusCodeRun/LotusRunFileSelect.tsx b/apps/frontend/src/widget/lotusCodeRun/LotusRunFileSelect.tsx
new file mode 100644
index 00000000..4a3a4ebf
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCodeRun/LotusRunFileSelect.tsx
@@ -0,0 +1,33 @@
+import { ComponentProps } from 'react';
+import { Heading, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Text } from '@froxy/design/components';
+import { useSuspenseQuery } from '@tanstack/react-query';
+import { lotusQueryOptions } from '@/feature/lotus';
+
+type LotusRunFileSelectProps = ComponentProps & { lotusId: string };
+
+export function SuspenseLotusRunFileSelect({ lotusId, onValueChange }: LotusRunFileSelectProps) {
+ const {
+ data: { files }
+ } = useSuspenseQuery(lotusQueryOptions.detail({ id: lotusId }));
+
+ return (
+
+ 실행할 파일
+
+ 실행할 파일을 선택해 주세요.
+
+
+
+
+
+
+ {files.map((file) => (
+
+ {file.filename}
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/lotusCodeRun/index.tsx b/apps/frontend/src/widget/lotusCodeRun/index.tsx
new file mode 100644
index 00000000..9c9509b6
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCodeRun/index.tsx
@@ -0,0 +1,4 @@
+export * from './LotusCodeDynamicInput';
+export * from './LotusRunFileSelect';
+export * from './LotusRunCodeForm';
+export * from './CodeRunButton';
diff --git a/apps/frontend/src/widget/lotusCreate/LotusCreateForm.tsx b/apps/frontend/src/widget/lotusCreate/LotusCreateForm.tsx
new file mode 100644
index 00000000..a9f19c87
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCreate/LotusCreateForm.tsx
@@ -0,0 +1,113 @@
+import { Suspense, useState } from 'react';
+import { Button, Heading, Input, Switch, Text } from '@froxy/design/components';
+import { useNavigate } from '@tanstack/react-router';
+import { TiPencil } from 'react-icons/ti';
+import { SuspenseGistFiles } from './SuspenseGistFiles';
+import { SuspenseUserGistSelect } from './SuspenseUserGistSelect';
+import { getLotusMutationErrorToastData, useLotusCreateMutation } from '@/feature/lotus';
+import { AsyncBoundary } from '@/shared/boundary';
+import { TagInput } from '@/shared/tagInput/TagInput';
+import { useToast } from '@/shared/toast';
+
+interface LotusCreateFormValue {
+ title: string;
+ tags: string[];
+ gistUuid: string;
+ isPublic: boolean;
+}
+
+export function LotusCreateForm() {
+ const { mutate, isPending } = useLotusCreateMutation();
+
+ const { toast } = useToast({ isCloseOnUnmount: false });
+
+ const navigate = useNavigate();
+
+ const [formValue, setFormValue] = useState({
+ title: '',
+ tags: [],
+ isPublic: true,
+ gistUuid: ''
+ });
+
+ const isValidateFormValue = formValue.title !== '' && formValue.gistUuid !== '' && !isPending;
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+
+ mutate(
+ {
+ body: formValue
+ },
+ {
+ onSuccess: ({ lotus }) => {
+ navigate({ to: `/lotus/$lotusId`, params: { lotusId: lotus.id } });
+
+ toast({ description: 'Lotus가 생성되었습니다.', variant: 'success', duration: 2000 });
+ },
+ onError: (error) => {
+ toast({
+ ...getLotusMutationErrorToastData(error),
+ duration: 2000
+ });
+ }
+ }
+ );
+ };
+
+ return (
+ <>
+
+
+ {formValue.gistUuid && (
+ }
+ rejected={({ error, retry }) => }
+ >
+
+
+ )}
+ >
+ );
+}
diff --git a/apps/frontend/src/widget/lotusCreate/SuspenseGistFiles.tsx b/apps/frontend/src/widget/lotusCreate/SuspenseGistFiles.tsx
new file mode 100644
index 00000000..13837c59
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCreate/SuspenseGistFiles.tsx
@@ -0,0 +1,60 @@
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+import { useQueryErrorResetBoundary, useSuspenseQuery } from '@tanstack/react-query';
+import axios from 'axios';
+import { Button, Heading, Skeleton } from '@/components';
+import { CodeFileModel, CodeView } from '@/feature/codeView';
+import { userQueryOptions } from '@/feature/user/query';
+import '@/app/style/github.css';
+
+export function SuspenseGistFiles({ gistId }: { gistId: string }) {
+ const { data: files } = useSuspenseQuery(userQueryOptions.gistFile({ gistId }));
+
+ const defaultFile = CodeFileModel.getDefaultFile(files);
+ const defaultFileIndex = defaultFile ? files.findIndex((file) => defaultFile?.filename === file.filename) : 0;
+
+ return (
+
+
+
+
+
+
+ );
+}
+
+export function SkeletonGistFiles() {
+ return (
+
+
+
+
+ );
+}
+
+SuspenseGistFiles.Skeleton = SkeletonGistFiles;
+
+interface ErrorProps {
+ error: unknown;
+ retry: () => void;
+}
+
+function ErrorGistFiles({ error, retry }: ErrorProps) {
+ const { reset } = useQueryErrorResetBoundary();
+
+ if (axios.isAxiosError(error) && error?.status === 401) throw error;
+
+ const handleRetry = async () => {
+ reset();
+ retry();
+ };
+
+ return (
+
+
+ 선택한 Gist의 파일 조회에 실패했습니다
+ 재시도
+
+ );
+}
+
+SuspenseGistFiles.Error = ErrorGistFiles;
diff --git a/apps/frontend/src/widget/lotusCreate/SuspenseUserGistSelect.tsx b/apps/frontend/src/widget/lotusCreate/SuspenseUserGistSelect.tsx
new file mode 100644
index 00000000..f7ccdd24
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCreate/SuspenseUserGistSelect.tsx
@@ -0,0 +1,74 @@
+import {
+ Button,
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+ Skeleton,
+ Text
+} from '@froxy/design/components';
+import { useUserGistListSuspenseInfinity } from '@/feature/user/query';
+import { range } from '@/shared';
+
+export function SuspenseUserGistSelect({ onValueChange }: { onValueChange: (value: string) => void }) {
+ const { data, fetchNextPage, isFetchingNextPage } = useUserGistListSuspenseInfinity();
+
+ return (
+
+
+
+
+
+
+ {data?.map((gist) => (
+
+ {gist.title}
+
+ ))}
+
+ {isFetchingNextPage && }
+
+
+ fetchNextPage()}
+ >
+ + 더보기
+
+
+
+
+
+ );
+}
+
+function SkeletonNextPages({ size = 5 }: { size?: number }) {
+ return new Array(size).fill(0).map((_, i) => (
+
+ Loading....
+
+ ));
+}
+
+function SkeletonUserGistSelect() {
+ return (
+
+
+
+
+
+
+ {range(5).map((value) => (
+
+ ))}
+
+
+
+ );
+}
+
+SuspenseUserGistSelect.Skeleton = SkeletonUserGistSelect;
diff --git a/apps/frontend/src/widget/lotusCreate/index.ts b/apps/frontend/src/widget/lotusCreate/index.ts
new file mode 100644
index 00000000..270082d9
--- /dev/null
+++ b/apps/frontend/src/widget/lotusCreate/index.ts
@@ -0,0 +1,3 @@
+export * from './LotusCreateForm';
+export * from './SuspenseGistFiles';
+export * from './SuspenseUserGistSelect';
diff --git a/apps/frontend/src/widget/lotusDelete/index.tsx b/apps/frontend/src/widget/lotusDelete/index.tsx
new file mode 100644
index 00000000..8c083606
--- /dev/null
+++ b/apps/frontend/src/widget/lotusDelete/index.tsx
@@ -0,0 +1,78 @@
+import { Button, Heading, Text } from '@froxy/design/components';
+import { useQueryClient } from '@tanstack/react-query';
+import { useNavigate } from '@tanstack/react-router';
+import { RiDeleteBin5Fill } from 'react-icons/ri';
+import { getLotusMutationErrorToastData, lotusQueryOptions, useLotusDeleteMutation } from '@/feature/lotus';
+import { ModalBox } from '@/shared';
+import { useOverlay } from '@/shared/overlay';
+import { useToast } from '@/shared/toast';
+
+export function LotusDeleteButton({ lotusId }: { lotusId: string }) {
+ const { mutate, isPending } = useLotusDeleteMutation();
+
+ const queryClient = useQueryClient();
+
+ const { open, exit } = useOverlay();
+ const { toast } = useToast({ isCloseOnUnmount: false });
+
+ const navigate = useNavigate();
+
+ const handleDeleteLotus = () => {
+ exit();
+
+ mutate(
+ { id: lotusId },
+ {
+ onSuccess: () => {
+ toast({ description: 'Lotus가 삭제되었습니다.', variant: 'success', duration: 2000 });
+ queryClient.invalidateQueries(lotusQueryOptions.list({}));
+ navigate({ to: '/lotus' });
+ },
+ onError: (error) => {
+ toast({
+ ...getLotusMutationErrorToastData(error),
+ duration: 2000
+ });
+ }
+ }
+ );
+ };
+
+ const handleOpenDeleteModal = () => {
+ open(() => (
+
+
+
+ 정말로 삭제하시겠습니까?
+
+
+
+ 취소하기
+
+
+ 삭제하기
+
+
+
+
+ ));
+ };
+
+ return (
+
+
+ 삭제하기
+
+ );
+}
+
+function SkeletonLotusDeleteButton() {
+ return (
+
+
+ 삭제하기
+
+ );
+}
+
+LotusDeleteButton.Skeleton = SkeletonLotusDeleteButton;
diff --git a/apps/frontend/src/widget/lotusDetail/SuspenseLotusDetail.tsx b/apps/frontend/src/widget/lotusDetail/SuspenseLotusDetail.tsx
new file mode 100644
index 00000000..b82cef9a
--- /dev/null
+++ b/apps/frontend/src/widget/lotusDetail/SuspenseLotusDetail.tsx
@@ -0,0 +1,53 @@
+import { Skeleton } from '@froxy/design/components';
+import { useSuspenseQuery } from '@tanstack/react-query';
+import { FaGithub } from 'react-icons/fa';
+import { Lotus } from '@/feature/lotus';
+import { lotusQueryOptions } from '@/feature/lotus';
+import { User } from '@/feature/user';
+
+export function SuspenseLotusDetail({ id }: { id: string }) {
+ const { data } = useSuspenseQuery(lotusQueryOptions.detail({ id }));
+
+ const { lotus, author } = data;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
{!lotus.isTagsEmpty && }
+
+
+
+
+
+
+ );
+}
+
+function SkeletonLotusDetail() {
+ return (
+
+
+
+
+
+
+ {new Array(3).fill(0).map((_, index) => (
+
+ ))}
+
+
+
+
+
+ );
+}
+
+SuspenseLotusDetail.Skeleton = SkeletonLotusDetail;
diff --git a/apps/frontend/src/widget/lotusDetail/SuspenseLotusEdit.tsx b/apps/frontend/src/widget/lotusDetail/SuspenseLotusEdit.tsx
new file mode 100644
index 00000000..7279011e
--- /dev/null
+++ b/apps/frontend/src/widget/lotusDetail/SuspenseLotusEdit.tsx
@@ -0,0 +1,37 @@
+import { useSuspenseQuery } from '@tanstack/react-query';
+import { lotusQueryOptions } from '@/feature/lotus';
+import { userQueryOptions } from '@/feature/user';
+import { LotusDeleteButton } from '@/widget/lotusDelete';
+import { LotusUpdateButton, SuspenseLotusPublicToggle } from '@/widget/lotusUpdate';
+
+export function SuspenseLotusEdit({ id }: { id: string }) {
+ const { data: user } = useSuspenseQuery(userQueryOptions.info());
+
+ const { data } = useSuspenseQuery(lotusQueryOptions.detail({ id }));
+
+ const { author } = data;
+
+ return (
+ user?.id === author.id && (
+
+
+
+
+
+ )
+ );
+}
+
+function SuspenseLotusEditSkeleton() {
+ return (
+
+
+
+
+
+ );
+}
+
+SuspenseLotusEdit.Skeleton = SuspenseLotusEditSkeleton;
+
+SuspenseLotusEdit.Error = () =>
;
diff --git a/apps/frontend/src/widget/lotusDetail/SuspenseLotusFiles.tsx b/apps/frontend/src/widget/lotusDetail/SuspenseLotusFiles.tsx
new file mode 100644
index 00000000..32e621c2
--- /dev/null
+++ b/apps/frontend/src/widget/lotusDetail/SuspenseLotusFiles.tsx
@@ -0,0 +1,33 @@
+import { useSuspenseQuery } from '@tanstack/react-query';
+import { Skeleton } from '@/components';
+import { CodeFileModel, CodeView } from '@/feature/codeView';
+import { lotusQueryOptions } from '@/feature/lotus';
+
+export function SuspenseLotusFiles({ id }: { id: string }) {
+ const {
+ data: { files }
+ } = useSuspenseQuery(lotusQueryOptions.detail({ id }));
+
+ const defaultFile = CodeFileModel.getDefaultFile(files);
+ const defaultFileIndex = defaultFile ? files.findIndex((file) => defaultFile?.filename === file.filename) : 0;
+
+ return (
+
+
+
+
+
+
+ );
+}
+
+export function LotusFileSkeleton() {
+ return (
+
+
+
+
+ );
+}
+
+SuspenseLotusFiles.Skeleton = LotusFileSkeleton;
diff --git a/apps/frontend/src/widget/lotusDetail/index.ts b/apps/frontend/src/widget/lotusDetail/index.ts
new file mode 100644
index 00000000..eeed2f2b
--- /dev/null
+++ b/apps/frontend/src/widget/lotusDetail/index.ts
@@ -0,0 +1,3 @@
+export * from './SuspenseLotusDetail';
+export * from './SuspenseLotusFiles';
+export * from './SuspenseLotusEdit';
diff --git a/apps/frontend/src/widget/lotusList/.SuspenseLotusCardList.tsx.icloud b/apps/frontend/src/widget/lotusList/.SuspenseLotusCardList.tsx.icloud
new file mode 100644
index 00000000..51aa25e1
Binary files /dev/null and b/apps/frontend/src/widget/lotusList/.SuspenseLotusCardList.tsx.icloud differ
diff --git a/apps/frontend/src/widget/lotusList/LotusSearchBar.tsx b/apps/frontend/src/widget/lotusList/LotusSearchBar.tsx
new file mode 100644
index 00000000..cbb1f667
--- /dev/null
+++ b/apps/frontend/src/widget/lotusList/LotusSearchBar.tsx
@@ -0,0 +1,47 @@
+import { useState } from 'react';
+import { Button, Heading, Input, Text } from '@froxy/design/components';
+import { getRouteApi } from '@tanstack/react-router';
+import { IoIosSearch } from 'react-icons/io';
+
+const { useNavigate } = getRouteApi('/(main)/lotus/');
+
+export function LotusSearchBar({ current = '' }: { current?: string }) {
+ const [keyword, setKeyword] = useState(current);
+
+ const navigate = useNavigate();
+
+ const submit = (e: React.FormEvent) => {
+ e.preventDefault();
+
+ navigate({ search: { keyword } });
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/widget/lotusList/SuspenseLotusList.tsx b/apps/frontend/src/widget/lotusList/SuspenseLotusList.tsx
new file mode 100644
index 00000000..1f683755
--- /dev/null
+++ b/apps/frontend/src/widget/lotusList/SuspenseLotusList.tsx
@@ -0,0 +1,117 @@
+import { Button, Heading, Skeleton, Text } from '@froxy/design/components';
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+import { useQueryErrorResetBoundary, useSuspenseQuery } from '@tanstack/react-query';
+import axios from 'axios';
+import { FaGithub } from 'react-icons/fa';
+import { LotusLostQueryOptions } from './type';
+import { Lotus } from '@/feature/lotus';
+import { User } from '@/feature/user';
+import { range } from '@/shared';
+
+export function SuspenseLotusList({ queryOptions }: { queryOptions: LotusLostQueryOptions }) {
+ const {
+ data: { lotuses }
+ } = useSuspenseQuery(queryOptions);
+
+ if (lotuses.length < 1) return ;
+
+ return (
+
+ {lotuses?.map(({ lotus, author }) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {!lotus.isTagsEmpty && (
+ <>
+
+
+ >
+ )}
+
+
+
+
+ ))}
+
+ );
+}
+
+function SuspenseLotusListEmpty() {
+ return (
+
+
+
+ 작성된 Lotus가 없습니다.
+
+ Lotus를 작성해보세요!
+
+ );
+}
+
+function SkeletonLotusList() {
+ return (
+
+ {range(5).map((value) => (
+
+ ))}
+
+ );
+}
+
+SuspenseLotusList.Skeleton = SkeletonLotusList;
+
+interface ErrorProps {
+ error: unknown;
+ retry: () => void;
+ onChangePage: (page?: number) => Promise;
+}
+
+function ErrorLotusList({ error, retry, onChangePage }: ErrorProps) {
+ const { reset } = useQueryErrorResetBoundary();
+
+ if (axios.isAxiosError(error) && error?.status === 401) throw error;
+
+ const handleRetry = async () => {
+ if (axios.isAxiosError(error) && error?.status === 404) {
+ await onChangePage(1);
+ } else {
+ reset();
+ }
+ retry();
+ };
+
+ return (
+
+
+ Lotus 목록 조회에 실패했습니다
+ 재시도
+
+ );
+}
+
+SuspenseLotusList.Error = ErrorLotusList;
diff --git a/apps/frontend/src/widget/lotusList/index.ts b/apps/frontend/src/widget/lotusList/index.ts
new file mode 100644
index 00000000..941bda33
--- /dev/null
+++ b/apps/frontend/src/widget/lotusList/index.ts
@@ -0,0 +1,2 @@
+export * from './SuspenseLotusList';
+export * from './LotusSearchBar';
diff --git a/apps/frontend/src/widget/lotusList/type.ts b/apps/frontend/src/widget/lotusList/type.ts
new file mode 100644
index 00000000..6fb4350f
--- /dev/null
+++ b/apps/frontend/src/widget/lotusList/type.ts
@@ -0,0 +1,8 @@
+import { LotusModel } from '@/feature/lotus';
+import { PageModel } from '@/feature/pagination';
+import { UserModel } from '@/feature/user';
+
+export type LotusLostQueryOptions = {
+ queryKey: any[];
+ queryFn: (arg: any) => Promise<{ lotuses: { lotus: LotusModel; author: UserModel }[]; page: PageModel }>;
+};
diff --git a/apps/frontend/src/widget/lotusUpdate/LotusUpdateButton.tsx b/apps/frontend/src/widget/lotusUpdate/LotusUpdateButton.tsx
new file mode 100644
index 00000000..a0860590
--- /dev/null
+++ b/apps/frontend/src/widget/lotusUpdate/LotusUpdateButton.tsx
@@ -0,0 +1,66 @@
+import { Button, Text } from '@froxy/design/components';
+import { useQueryClient } from '@tanstack/react-query';
+import { IoSettingsSharp } from 'react-icons/io5';
+import { LotusUpdateForm } from './LotusUpdateForm';
+import { getLotusMutationErrorToastData, lotusQueryOptions, useLotusUpdateMutation } from '@/feature/lotus';
+import { ModalBox } from '@/shared';
+import { useOverlay } from '@/shared/overlay';
+import { useToast } from '@/shared/toast';
+
+export function LotusUpdateButton({ lotusId }: { lotusId: string }) {
+ const { mutate, isPending } = useLotusUpdateMutation();
+
+ const { open, exit } = useOverlay();
+ const { toast } = useToast();
+
+ const queryClient = useQueryClient();
+
+ const onSubmit = (body: { title: string; tags: string[] }) => {
+ exit();
+
+ mutate(
+ { body, id: lotusId },
+ {
+ onSuccess: () => {
+ queryClient.invalidateQueries(lotusQueryOptions.detail({ id: lotusId }));
+
+ toast({ description: 'Lotus가 수정되었습니다.', variant: 'success', duration: 2000 });
+ },
+ onError: (error) => {
+ toast({
+ ...getLotusMutationErrorToastData(error),
+ duration: 2000
+ });
+ }
+ }
+ );
+ };
+
+ const handleOpenUpdateModal = () => {
+ open(() => (
+
+
+
+
+
+ ));
+ };
+
+ return (
+
+
+ 수정하기
+
+ );
+}
+
+function SkeletonLotusUpdateButton() {
+ return (
+
+
+ 수정하기
+
+ );
+}
+
+LotusUpdateButton.Skeleton = SkeletonLotusUpdateButton;
diff --git a/apps/frontend/src/widget/lotusUpdate/LotusUpdateForm.tsx b/apps/frontend/src/widget/lotusUpdate/LotusUpdateForm.tsx
new file mode 100644
index 00000000..6fa0a4bb
--- /dev/null
+++ b/apps/frontend/src/widget/lotusUpdate/LotusUpdateForm.tsx
@@ -0,0 +1,50 @@
+import { useState } from 'react';
+import { Button, Heading, Input, Text } from '@froxy/design/components';
+import { useSuspenseQuery } from '@tanstack/react-query';
+import { lotusQueryOptions } from '@/feature/lotus';
+import { TagInput } from '@/shared/tagInput';
+
+interface LotusUpdateFormProps {
+ lotusId: string;
+ onSubmit?: (args: { title: string; tags: string[] }) => void;
+ onCancel?: () => void;
+}
+
+export function LotusUpdateForm({ lotusId, onSubmit, onCancel }: LotusUpdateFormProps) {
+ const {
+ data: { lotus }
+ } = useSuspenseQuery(lotusQueryOptions.detail({ id: lotusId }));
+
+ const [title, setTitle] = useState(lotus.title);
+
+ const [tags, setTags] = useState(lotus.tags);
+
+ const handleSubmit = () => {
+ onSubmit?.({ title, tags });
+ };
+
+ return (
+
+ );
+}
diff --git a/apps/frontend/src/widget/lotusUpdate/SuspenseLotusPublicToggle.tsx b/apps/frontend/src/widget/lotusUpdate/SuspenseLotusPublicToggle.tsx
new file mode 100644
index 00000000..a38898a5
--- /dev/null
+++ b/apps/frontend/src/widget/lotusUpdate/SuspenseLotusPublicToggle.tsx
@@ -0,0 +1,68 @@
+import { Switch, Text } from '@froxy/design/components';
+import { cn } from '@froxy/design/utils';
+import { useQueryClient } from '@tanstack/react-query';
+import { LotusDetailModel, useLotusUpdateMutation } from '@/feature/lotus';
+import { lotusQueryOptions } from '@/feature/lotus';
+import { useDebounce } from '@/shared';
+
+interface SuspenseLotusPublicToggleProps {
+ data: LotusDetailModel;
+ className?: string;
+}
+
+export function SuspenseLotusPublicToggle({ data: { lotus }, className }: SuspenseLotusPublicToggleProps) {
+ const { mutate } = useLotusUpdateMutation();
+
+ const queryClient = useQueryClient();
+
+ const lotusDetailOptions = lotusQueryOptions.detail({ id: lotus.id });
+
+ const toggleClick = () => {
+ mutate(
+ { id: lotus.id, body: { isPublic: !lotus.isPublic } },
+ {
+ onSuccess: () => {
+ queryClient.invalidateQueries(lotusDetailOptions);
+ }
+ }
+ );
+ };
+
+ const debounceToggleClick = useDebounce(toggleClick, 500);
+
+ //낙관적 업데이트
+ const optimisticToggle = () => {
+ debounceToggleClick();
+
+ queryClient.setQueryData(lotusDetailOptions.queryKey, (oldData: LotusDetailModel) => {
+ const lotus = oldData.lotus.clone({ isPublic: !oldData.lotus.isPublic });
+
+ return {
+ ...oldData,
+ lotus
+ };
+ });
+ };
+
+ return (
+
+
+
+ private / public
+
+
+ );
+}
+
+function SkeletonSuspenseLotusPublicToggle() {
+ return (
+
+
+
+ private / public
+
+
+ );
+}
+
+SuspenseLotusPublicToggle.Skeleton = SkeletonSuspenseLotusPublicToggle;
diff --git a/apps/frontend/src/widget/lotusUpdate/index.ts b/apps/frontend/src/widget/lotusUpdate/index.ts
new file mode 100644
index 00000000..860fa9c6
--- /dev/null
+++ b/apps/frontend/src/widget/lotusUpdate/index.ts
@@ -0,0 +1,3 @@
+export * from './LotusUpdateButton';
+export * from './LotusUpdateForm';
+export * from './SuspenseLotusPublicToggle';
diff --git a/apps/frontend/src/widget/navigation/.index 2.tsx.icloud b/apps/frontend/src/widget/navigation/.index 2.tsx.icloud
new file mode 100644
index 00000000..530578cc
Binary files /dev/null and b/apps/frontend/src/widget/navigation/.index 2.tsx.icloud differ
diff --git a/apps/frontend/src/widget/navigation/.index 3.tsx.icloud b/apps/frontend/src/widget/navigation/.index 3.tsx.icloud
new file mode 100644
index 00000000..2a070fef
Binary files /dev/null and b/apps/frontend/src/widget/navigation/.index 3.tsx.icloud differ
diff --git a/apps/frontend/src/widget/navigation/CreateLotusButton.tsx b/apps/frontend/src/widget/navigation/CreateLotusButton.tsx
new file mode 100644
index 00000000..16e07693
--- /dev/null
+++ b/apps/frontend/src/widget/navigation/CreateLotusButton.tsx
@@ -0,0 +1,12 @@
+import { Button, Text } from '@froxy/design/components';
+import { Link } from '@tanstack/react-router';
+
+export function CreateLotusButton() {
+ return (
+
+
+ Create Lotus
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/navigation/LoginButton.tsx b/apps/frontend/src/widget/navigation/LoginButton.tsx
new file mode 100644
index 00000000..38f28e12
--- /dev/null
+++ b/apps/frontend/src/widget/navigation/LoginButton.tsx
@@ -0,0 +1,22 @@
+import { ComponentProps } from 'react';
+import { Button } from '@froxy/design/components';
+
+type LoginButtonProps = ComponentProps;
+
+export function LoginButton(props: LoginButtonProps) {
+ const githubURL = `https://github.com/login/oauth/authorize?client_id=${
+ import.meta.env.VITE_OAUTH_CLIENT_ID
+ }&redirect_uri=${import.meta.env.VITE_OAUTH_LOGIN_CALLBACK_URL}`;
+
+ const handleLogin = async () => {
+ window.location.href = githubURL;
+ };
+
+ return (
+ <>
+
+ {props.children}
+
+ >
+ );
+}
diff --git a/apps/frontend/src/widget/navigation/LogoutButton.tsx b/apps/frontend/src/widget/navigation/LogoutButton.tsx
new file mode 100644
index 00000000..f03ecfff
--- /dev/null
+++ b/apps/frontend/src/widget/navigation/LogoutButton.tsx
@@ -0,0 +1,28 @@
+import { Button, Text } from '@froxy/design/components';
+import { useQueryClient } from '@tanstack/react-query';
+import { useNavigate } from '@tanstack/react-router';
+import { userQueryOptions } from '@/feature/user';
+import { useLocalStorage } from '@/shared';
+
+export function LogoutButton() {
+ const [, set] = useLocalStorage({ key: 'token', initialValue: '' });
+
+ const queryClient = useQueryClient();
+
+ const navigate = useNavigate();
+
+ const handleClick = () => {
+ set('');
+
+ queryClient.removeQueries(userQueryOptions.info());
+ navigate({ to: '/' });
+ };
+
+ return (
+
+
+ Logout
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/navigation/index.ts b/apps/frontend/src/widget/navigation/index.ts
new file mode 100644
index 00000000..64d0b2f0
--- /dev/null
+++ b/apps/frontend/src/widget/navigation/index.ts
@@ -0,0 +1,3 @@
+export * from './CreateLotusButton';
+export * from './LogoutButton';
+export * from './LoginButton';
diff --git a/apps/frontend/src/widget/navigation/index.tsx b/apps/frontend/src/widget/navigation/index.tsx
new file mode 100644
index 00000000..7d4eecd3
--- /dev/null
+++ b/apps/frontend/src/widget/navigation/index.tsx
@@ -0,0 +1,2 @@
+export * from './CreateLotusButton';
+export * from './LogoutButton';
diff --git a/apps/frontend/src/widget/onboarding/OnBoardingCarousel.tsx b/apps/frontend/src/widget/onboarding/OnBoardingCarousel.tsx
new file mode 100644
index 00000000..4ce66bc7
--- /dev/null
+++ b/apps/frontend/src/widget/onboarding/OnBoardingCarousel.tsx
@@ -0,0 +1,58 @@
+import { useEffect, useRef, useState } from 'react';
+import { AutoPlay, cn } from '@froxy/design';
+import { OnBoardingItems } from './constant';
+import { Carousel, CarouselApi, CarouselContent, CarouselItem, Heading } from '@/components';
+
+export function OnBoardingCarousel() {
+ const [api, setApi] = useState();
+ const ref = useRef(null);
+
+ useEffect(() => {
+ if (!api) {
+ return;
+ }
+
+ api.on('select', () => {
+ if (!ref.current) return;
+
+ ref.current.style.backgroundColor = `#${Math.floor(Math.random() * 16777215).toString(16)}`;
+ });
+ }, [api]);
+
+ return (
+
+
+ {OnBoardingItems.map((item) => (
+
+
+
+
{item.icon}
+
+
+
+
+ {item?.description && (
+
+ {item.description}
+
+ )}
+
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/apps/frontend/src/widget/onboarding/constant.tsx b/apps/frontend/src/widget/onboarding/constant.tsx
new file mode 100644
index 00000000..7e3aa9e6
--- /dev/null
+++ b/apps/frontend/src/widget/onboarding/constant.tsx
@@ -0,0 +1,23 @@
+import { FaCheckCircle, FaGithub } from 'react-icons/fa';
+
+export const OnBoardingItems = [
+ {
+ icon: ,
+ title: 'Gist clone과정을 폴짝! 건너뛰고 테스트',
+ description: '손쉽게 Gist를 실행하고, 공유하세요.'
+ },
+ {
+ icon: ⚡️
,
+ title: 'Gist 실행, Froxy와 함께라면 순식간에!',
+ description: 'Froxy는 당신의 시간과 노력을 아껴주는 완벽한 도우미입니다.'
+ },
+ {
+ icon: ,
+ title: '하나하나 clone하기 힘들죠?',
+ description: 'Froxy는 Gist를 clone하고, 실행하는 과정을 간소화합니다.'
+ },
+ {
+ icon: 🔥
,
+ title: 'Froxy에 맡기고 코드에 집중하세요!'
+ }
+];
diff --git a/apps/frontend/src/widget/onboarding/index.ts b/apps/frontend/src/widget/onboarding/index.ts
new file mode 100644
index 00000000..641c4026
--- /dev/null
+++ b/apps/frontend/src/widget/onboarding/index.ts
@@ -0,0 +1 @@
+export * from './OnBoardingCarousel';
diff --git a/apps/frontend/src/widget/user/SuspenseUserInfoBox.tsx b/apps/frontend/src/widget/user/SuspenseUserInfoBox.tsx
new file mode 100644
index 00000000..668ce437
--- /dev/null
+++ b/apps/frontend/src/widget/user/SuspenseUserInfoBox.tsx
@@ -0,0 +1,125 @@
+import { useState } from 'react';
+import { Text } from '@froxy/design/components';
+import { Button, Heading, Skeleton } from '@froxy/design/components';
+import { DotLottieReact } from '@lottiefiles/dotlottie-react';
+import { useQueryClient, useQueryErrorResetBoundary, useSuspenseQuery } from '@tanstack/react-query';
+import axios from 'axios';
+import { FaGithub } from 'react-icons/fa';
+import { GoPencil } from 'react-icons/go';
+import { UserInfoInputForm } from '@/feature/user/component';
+import { useUserMutation, userQueryOptions } from '@/feature/user/query';
+import { useToast } from '@/shared/toast';
+
+export function SuspenseUserInfoBox() {
+ const queryClient = useQueryClient();
+ const { data: user } = useSuspenseQuery(userQueryOptions.info());
+
+ const { mutate, isPending } = useUserMutation();
+
+ const { toast } = useToast();
+ const [isEdit, setIsEdit] = useState(false);
+
+ const onToggleIsEdit = () => {
+ setIsEdit(!isEdit);
+ };
+
+ const onEditUserInfo = (nickname: string) => {
+ mutate(
+ { body: { nickname } },
+ {
+ onSuccess: () => {
+ queryClient.invalidateQueries(userQueryOptions.info());
+
+ toast({
+ variant: 'success',
+ description: '닉네임이 수정되었습니다.',
+ duration: 2000
+ });
+ },
+ onError: () => {
+ toast({
+ variant: 'error',
+ description: '닉네임 수정 중 오류가 발생했습니다. 다시 시도해 주세요.',
+ duration: 2000
+ });
+ }
+ }
+ );
+ };
+
+ return (
+
+
+
+ {isEdit ? (
+
onEditUserInfo(value)}
+ />
+ ) : (
+ <>
+
+
+ {user.nickname}
+
+ setIsEdit(true)} />
+ >
+ )}
+
+
+ );
+}
+
+function SkeletonUserInfoBox() {
+ return (
+
+ );
+}
+
+SuspenseUserInfoBox.Skeleton = SkeletonUserInfoBox;
+
+interface ErrorProps {
+ error: unknown;
+ retry: () => void;
+}
+
+function ErrorUserInfoBox({ error, retry }: ErrorProps) {
+ const { reset } = useQueryErrorResetBoundary();
+
+ if (axios.isAxiosError(error)) throw error;
+
+ const handleRetry = async () => {
+ reset();
+ retry();
+ };
+
+ return (
+
+
+ 사용자 정보 조회에 실패했습니다.
+ 재시도
+
+ );
+}
+
+SuspenseUserInfoBox.Error = ErrorUserInfoBox;
diff --git a/apps/frontend/src/widget/user/index.ts b/apps/frontend/src/widget/user/index.ts
new file mode 100644
index 00000000..ba9142af
--- /dev/null
+++ b/apps/frontend/src/widget/user/index.ts
@@ -0,0 +1 @@
+export * from './SuspenseUserInfoBox';
diff --git a/apps/frontend/tailwind.config.js b/apps/frontend/tailwind.config.js
new file mode 100644
index 00000000..020ad00a
--- /dev/null
+++ b/apps/frontend/tailwind.config.js
@@ -0,0 +1,16 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ darkMode: ['class'],
+ content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}', '../../packages/design/src/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ extend: {
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ colors: {}
+ }
+ },
+ plugins: []
+};
diff --git a/apps/frontend/tsconfig.app.json b/apps/frontend/tsconfig.app.json
new file mode 100644
index 00000000..df26486b
--- /dev/null
+++ b/apps/frontend/tsconfig.app.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2021", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true,
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*", "../../packages/design/src/*"]
+ }
+ },
+ "include": ["src", "src/widget/.gitkeep"]
+}
diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json
new file mode 100644
index 00000000..b42f234c
--- /dev/null
+++ b/apps/frontend/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "files": [],
+ "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
+ "include": ["src/**/*.{ts,tsx,css}"]
+}
diff --git a/apps/frontend/tsconfig.node.json b/apps/frontend/tsconfig.node.json
new file mode 100644
index 00000000..77b61970
--- /dev/null
+++ b/apps/frontend/tsconfig.node.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true,
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*", "../../packages/design/src/*"]
+ }
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts
new file mode 100644
index 00000000..d2778b2e
--- /dev/null
+++ b/apps/frontend/vite.config.ts
@@ -0,0 +1,24 @@
+///
+
+import { TanStackRouterVite } from '@tanstack/router-plugin/vite';
+import react from '@vitejs/plugin-react-swc';
+import { defineConfig } from 'vite';
+import tsconfigPaths from 'vite-tsconfig-paths';
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [
+ react(),
+ tsconfigPaths(),
+ TanStackRouterVite({
+ routesDirectory: './src/page',
+ generatedRouteTree: './src/app/router/routeTree.gen.ts'
+ })
+ ],
+ base: '/',
+ test: {
+ globals: true,
+ environment: 'jsdom',
+ setupFiles: ['./src/app/test/setupTests.ts']
+ }
+});
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 00000000..5073c20d
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1 @@
+module.exports = { extends: ["@commitlint/config-conventional"] };
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 00000000..e013181f
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,25 @@
+version: '3.8'
+
+services:
+ froxy:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ container_name: froxy-api
+ ports:
+ - '3000:3000'
+ depends_on:
+ - mysql
+
+ mysql:
+ image: mysql
+ container_name: froxy-mysql
+ env_file:
+ - ./apps/backend/.env
+ ports:
+ - '3306:3306'
+ volumes:
+ - ./mysql-data:/var/lib/mysql
+
+volumes:
+ mysql-data:
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..8ce40e15
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,4009 @@
+{
+ "name": "web38-froxy",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "web38-froxy",
+ "dependencies": {
+ "@octokit/rest": "^21.0.2",
+ "nestjs-octokit": "^0.2.0",
+ "octokit": "^4.0.2"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^19.5.0",
+ "@commitlint/config-conventional": "^19.5.0",
+ "husky": "^9.1.6",
+ "lint-staged": "^15.2.10",
+ "turbo": "^2.2.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@commitlint/cli": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.5.0.tgz",
+ "integrity": "sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/format": "^19.5.0",
+ "@commitlint/lint": "^19.5.0",
+ "@commitlint/load": "^19.5.0",
+ "@commitlint/read": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "tinyexec": "^0.3.0",
+ "yargs": "^17.0.0"
+ },
+ "bin": {
+ "commitlint": "cli.js"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-conventional": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz",
+ "integrity": "sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-conventionalcommits": "^7.0.2"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/config-validator": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz",
+ "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "ajv": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/ensure": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz",
+ "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "lodash.camelcase": "^4.3.0",
+ "lodash.kebabcase": "^4.1.1",
+ "lodash.snakecase": "^4.1.1",
+ "lodash.startcase": "^4.4.0",
+ "lodash.upperfirst": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/execute-rule": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz",
+ "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==",
+ "dev": true,
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/format": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz",
+ "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/is-ignored": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.5.0.tgz",
+ "integrity": "sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "semver": "^7.6.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/lint": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.5.0.tgz",
+ "integrity": "sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/is-ignored": "^19.5.0",
+ "@commitlint/parse": "^19.5.0",
+ "@commitlint/rules": "^19.5.0",
+ "@commitlint/types": "^19.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/load": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.5.0.tgz",
+ "integrity": "sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/execute-rule": "^19.5.0",
+ "@commitlint/resolve-extends": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "chalk": "^5.3.0",
+ "cosmiconfig": "^9.0.0",
+ "cosmiconfig-typescript-loader": "^5.0.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.uniq": "^4.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/message": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz",
+ "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/parse": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz",
+ "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/types": "^19.5.0",
+ "conventional-changelog-angular": "^7.0.0",
+ "conventional-commits-parser": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/read": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz",
+ "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/top-level": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "git-raw-commits": "^4.0.0",
+ "minimist": "^1.2.8",
+ "tinyexec": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/resolve-extends": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz",
+ "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/config-validator": "^19.5.0",
+ "@commitlint/types": "^19.5.0",
+ "global-directory": "^4.0.1",
+ "import-meta-resolve": "^4.0.0",
+ "lodash.mergewith": "^4.6.2",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/rules": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.5.0.tgz",
+ "integrity": "sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/ensure": "^19.5.0",
+ "@commitlint/message": "^19.5.0",
+ "@commitlint/to-lines": "^19.5.0",
+ "@commitlint/types": "^19.5.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/to-lines": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz",
+ "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/top-level": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz",
+ "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@commitlint/types": {
+ "version": "19.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz",
+ "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==",
+ "dev": true,
+ "dependencies": {
+ "@types/conventional-commits-parser": "^5.0.0",
+ "chalk": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=v18"
+ }
+ },
+ "node_modules/@nestjs/common": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-8.4.7.tgz",
+ "integrity": "sha512-m/YsbcBal+gA5CFrDpqXqsSfylo+DIQrkFY3qhVIltsYRfu8ct8J9pqsTO6OPf3mvqdOpFGrV5sBjoyAzOBvsw==",
+ "dependencies": {
+ "axios": "0.27.2",
+ "iterare": "1.2.1",
+ "tslib": "2.4.0",
+ "uuid": "8.3.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "cache-manager": "*",
+ "class-transformer": "*",
+ "class-validator": "*",
+ "reflect-metadata": "^0.1.12",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "cache-manager": {
+ "optional": true
+ },
+ "class-transformer": {
+ "optional": true
+ },
+ "class-validator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nestjs/core": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-8.4.7.tgz",
+ "integrity": "sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@nuxtjs/opencollective": "0.3.2",
+ "fast-safe-stringify": "2.1.1",
+ "iterare": "1.2.1",
+ "object-hash": "3.0.0",
+ "path-to-regexp": "3.2.0",
+ "tslib": "2.4.0",
+ "uuid": "8.3.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nest"
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^8.0.0",
+ "@nestjs/microservices": "^8.0.0",
+ "@nestjs/platform-express": "^8.0.0",
+ "@nestjs/websockets": "^8.0.0",
+ "reflect-metadata": "^0.1.12",
+ "rxjs": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@nestjs/microservices": {
+ "optional": true
+ },
+ "@nestjs/platform-express": {
+ "optional": true
+ },
+ "@nestjs/websockets": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nuxtjs/opencollective": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz",
+ "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "consola": "^2.15.0",
+ "node-fetch": "^2.6.1"
+ },
+ "bin": {
+ "opencollective": "bin/opencollective.js"
+ },
+ "engines": {
+ "node": ">=8.0.0",
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/@nuxtjs/opencollective/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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@nuxtjs/opencollective/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "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/@octokit/app": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/app/-/app-15.1.0.tgz",
+ "integrity": "sha512-TkBr7QgOmE6ORxvIAhDbZsqPkF7RSqTY4pLTtUQCvr6dTXqvi2fFo46q3h1lxlk/sGMQjqyZ0kEahkD/NyzOHg==",
+ "dependencies": {
+ "@octokit/auth-app": "^7.0.0",
+ "@octokit/auth-unauthenticated": "^6.0.0",
+ "@octokit/core": "^6.1.2",
+ "@octokit/oauth-app": "^7.0.0",
+ "@octokit/plugin-paginate-rest": "^11.0.0",
+ "@octokit/types": "^13.0.0",
+ "@octokit/webhooks": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/auth-app": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-7.1.1.tgz",
+ "integrity": "sha512-kRAd6yelV9OgvlEJE88H0VLlQdZcag9UlLr7dV0YYP37X8PPDvhgiTy66QVhDXdyoT0AleFN2w/qXkPdrSzINg==",
+ "dependencies": {
+ "@octokit/auth-oauth-app": "^8.1.0",
+ "@octokit/auth-oauth-user": "^5.1.0",
+ "@octokit/request": "^9.1.1",
+ "@octokit/request-error": "^6.1.1",
+ "@octokit/types": "^13.4.1",
+ "lru-cache": "^10.0.0",
+ "universal-github-app-jwt": "^2.2.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/auth-oauth-app": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-8.1.1.tgz",
+ "integrity": "sha512-5UtmxXAvU2wfcHIPPDWzVSAWXVJzG3NWsxb7zCFplCWEmMCArSZV0UQu5jw5goLQXbFyOr5onzEH37UJB3zQQg==",
+ "dependencies": {
+ "@octokit/auth-oauth-device": "^7.0.0",
+ "@octokit/auth-oauth-user": "^5.0.1",
+ "@octokit/request": "^9.0.0",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/auth-oauth-device": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-7.1.1.tgz",
+ "integrity": "sha512-HWl8lYueHonuyjrKKIup/1tiy0xcmQCdq5ikvMO1YwkNNkxb6DXfrPjrMYItNLyCP/o2H87WuijuE+SlBTT8eg==",
+ "dependencies": {
+ "@octokit/oauth-methods": "^5.0.0",
+ "@octokit/request": "^9.0.0",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/auth-oauth-user": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-5.1.1.tgz",
+ "integrity": "sha512-rRkMz0ErOppdvEfnemHJXgZ9vTPhBuC6yASeFaB7I2yLMd7QpjfrL1mnvRPlyKo+M6eeLxrKanXJ9Qte29SRsw==",
+ "dependencies": {
+ "@octokit/auth-oauth-device": "^7.0.1",
+ "@octokit/oauth-methods": "^5.0.0",
+ "@octokit/request": "^9.0.1",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz",
+ "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/auth-unauthenticated": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-6.1.0.tgz",
+ "integrity": "sha512-zPSmfrUAcspZH/lOFQnVnvjQZsIvmfApQH6GzJrkIunDooU1Su2qt2FfMTSVPRp7WLTQyC20Kd55lF+mIYaohQ==",
+ "dependencies": {
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz",
+ "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==",
+ "dependencies": {
+ "@octokit/auth-token": "^5.0.0",
+ "@octokit/graphql": "^8.0.0",
+ "@octokit/request": "^9.0.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^13.0.0",
+ "before-after-hook": "^3.0.2",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz",
+ "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==",
+ "dependencies": {
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz",
+ "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==",
+ "dependencies": {
+ "@octokit/request": "^9.0.0",
+ "@octokit/types": "^13.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/oauth-app": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-7.1.3.tgz",
+ "integrity": "sha512-EHXbOpBkSGVVGF1W+NLMmsnSsJRkcrnVmDKt0TQYRBb6xWfWzoi9sBD4DIqZ8jGhOWO/V8t4fqFyJ4vDQDn9bg==",
+ "dependencies": {
+ "@octokit/auth-oauth-app": "^8.0.0",
+ "@octokit/auth-oauth-user": "^5.0.1",
+ "@octokit/auth-unauthenticated": "^6.0.0-beta.1",
+ "@octokit/core": "^6.0.0",
+ "@octokit/oauth-authorization-url": "^7.0.0",
+ "@octokit/oauth-methods": "^5.0.0",
+ "@types/aws-lambda": "^8.10.83",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/oauth-authorization-url": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-7.1.1.tgz",
+ "integrity": "sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/oauth-methods": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-5.1.2.tgz",
+ "integrity": "sha512-C5lglRD+sBlbrhCUTxgJAFjWgJlmTx5bQ7Ch0+2uqRjYv7Cfb5xpX4WuSC9UgQna3sqRGBL9EImX9PvTpMaQ7g==",
+ "dependencies": {
+ "@octokit/oauth-authorization-url": "^7.0.0",
+ "@octokit/request": "^9.1.0",
+ "@octokit/request-error": "^6.1.0",
+ "@octokit/types": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "22.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz",
+ "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg=="
+ },
+ "node_modules/@octokit/openapi-webhooks-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-8.3.0.tgz",
+ "integrity": "sha512-vKLsoR4xQxg4Z+6rU/F65ItTUz/EXbD+j/d4mlq2GW8TsA4Tc8Kdma2JTAAJ5hrKWUQzkR/Esn2fjsqiVRYaQg=="
+ },
+ "node_modules/@octokit/plugin-paginate-graphql": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-5.2.4.tgz",
+ "integrity": "sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==",
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "11.3.5",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz",
+ "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==",
+ "dependencies": {
+ "@octokit/types": "^13.6.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-request-log": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz",
+ "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==",
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "13.2.6",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz",
+ "integrity": "sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==",
+ "dependencies": {
+ "@octokit/types": "^13.6.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-retry": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.2.tgz",
+ "integrity": "sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==",
+ "dependencies": {
+ "@octokit/request-error": "^6.0.0",
+ "@octokit/types": "^13.0.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-throttling": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.2.tgz",
+ "integrity": "sha512-FqpvcTpIWFpMMwIeSoypoJXysSAQ3R+ALJhXXSG1HTP3YZOIeLmcNcimKaXxTcws+Sh6yoRl13SJ5r8sXc1Fhw==",
+ "dependencies": {
+ "@octokit/types": "^13.0.0",
+ "bottleneck": "^2.15.3"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz",
+ "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==",
+ "dependencies": {
+ "@octokit/endpoint": "^10.0.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/types": "^13.1.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz",
+ "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==",
+ "dependencies": {
+ "@octokit/types": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/rest": {
+ "version": "21.0.2",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.0.2.tgz",
+ "integrity": "sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==",
+ "dependencies": {
+ "@octokit/core": "^6.1.2",
+ "@octokit/plugin-paginate-rest": "^11.0.0",
+ "@octokit/plugin-request-log": "^5.3.1",
+ "@octokit/plugin-rest-endpoint-methods": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/types": {
+ "version": "13.6.1",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.1.tgz",
+ "integrity": "sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==",
+ "dependencies": {
+ "@octokit/openapi-types": "^22.2.0"
+ }
+ },
+ "node_modules/@octokit/webhooks": {
+ "version": "13.3.0",
+ "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-13.3.0.tgz",
+ "integrity": "sha512-TUkJLtI163Bz5+JK0O+zDkQpn4gKwN+BovclUvCj6pI/6RXrFqQvUMRS2M+Rt8Rv0qR3wjoMoOPmpJKeOh0nBg==",
+ "dependencies": {
+ "@octokit/openapi-webhooks-types": "8.3.0",
+ "@octokit/request-error": "^6.0.1",
+ "@octokit/webhooks-methods": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/webhooks-methods": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-5.1.0.tgz",
+ "integrity": "sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ==",
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@octokit/webhooks-types": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.8.0.tgz",
+ "integrity": "sha512-8adktjIb76A7viIdayQSFuBEwOzwhDC+9yxZpKNHjfzrlostHCw0/N7JWpWMObfElwvJMk2fY2l1noENCk9wmw=="
+ },
+ "node_modules/@types/aws-lambda": {
+ "version": "8.10.145",
+ "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.145.tgz",
+ "integrity": "sha512-dtByW6WiFk5W5Jfgz1VM+YPA21xMXTuSFoLYIDY0L44jDLLflVPtZkYuu3/YxpGcvjzKFBZLU+GyKjR0HOYtyw=="
+ },
+ "node_modules/@types/btoa-lite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz",
+ "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg=="
+ },
+ "node_modules/@types/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/jsonwebtoken": {
+ "version": "9.0.7",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz",
+ "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw=="
+ },
+ "node_modules/@types/node": {
+ "version": "22.8.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.7.tgz",
+ "integrity": "sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==",
+ "dependencies": {
+ "undici-types": "~6.19.8"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "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
+ },
+ "node_modules/array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "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==",
+ "optional": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/aws-lambda": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/aws-lambda/-/aws-lambda-1.0.7.tgz",
+ "integrity": "sha512-9GNFMRrEMG5y3Jvv+V4azWvc+qNWdWLTjDdhf/zgMlz8haaaLWv0xeAIWxz9PuWUBawsVxy0zZotjCdR3Xq+2w==",
+ "optional": true,
+ "dependencies": {
+ "aws-sdk": "^2.814.0",
+ "commander": "^3.0.2",
+ "js-yaml": "^3.14.1",
+ "watchpack": "^2.0.0-beta.10"
+ },
+ "bin": {
+ "lambda": "bin/lambda"
+ }
+ },
+ "node_modules/aws-lambda/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "optional": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aws-lambda/node_modules/commander": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
+ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
+ "optional": true
+ },
+ "node_modules/aws-lambda/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "optional": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/aws-sdk": {
+ "version": "2.1691.0",
+ "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1691.0.tgz",
+ "integrity": "sha512-/F2YC+DlsY3UBM2Bdnh5RLHOPNibS/+IcjUuhP8XuctyrN+MlL+fWDAiela32LTDk7hMy4rx8MTgvbJ+0blO5g==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "buffer": "4.9.2",
+ "events": "1.1.1",
+ "ieee754": "1.1.13",
+ "jmespath": "0.16.0",
+ "querystring": "0.2.0",
+ "sax": "1.2.1",
+ "url": "0.10.3",
+ "util": "^0.12.4",
+ "uuid": "8.0.0",
+ "xml2js": "0.6.2"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/aws-sdk/node_modules/uuid": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz",
+ "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==",
+ "optional": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/axios": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "dependencies": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true
+ },
+ "node_modules/before-after-hook": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="
+ },
+ "node_modules/bottleneck": {
+ "version": "2.19.5",
+ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
+ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
+ },
+ "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,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/btoa-lite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz",
+ "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA=="
+ },
+ "node_modules/buffer": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "optional": true,
+ "dependencies": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "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,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/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,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/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==",
+ "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=="
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "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==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
+ "dev": true,
+ "dependencies": {
+ "array-ify": "^1.0.0",
+ "dot-prop": "^5.1.0"
+ }
+ },
+ "node_modules/consola": {
+ "version": "2.15.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
+ "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
+ },
+ "node_modules/conventional-changelog-angular": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz",
+ "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==",
+ "dev": true,
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-changelog-conventionalcommits": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz",
+ "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==",
+ "dev": true,
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/conventional-commits-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz",
+ "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==",
+ "dev": true,
+ "dependencies": {
+ "is-text-path": "^2.0.0",
+ "JSONStream": "^1.3.5",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cosmiconfig-typescript-loader": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.1.0.tgz",
+ "integrity": "sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==",
+ "dev": true,
+ "dependencies": {
+ "jiti": "^1.21.6"
+ },
+ "engines": {
+ "node": ">=v16"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "cosmiconfig": ">=8.2",
+ "typescript": ">=4"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/dargs": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz",
+ "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "optional": true,
+ "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/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "optional": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "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==",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "optional": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+ "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "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
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
+ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+ "dev": true
+ },
+ "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,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz",
+ "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^7.2.0",
+ "path-exists": "^5.0.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "optional": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fromentries": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz",
+ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "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==",
+ "optional": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "optional": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/git-raw-commits": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz",
+ "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==",
+ "dev": true,
+ "dependencies": {
+ "dargs": "^8.0.0",
+ "meow": "^12.0.1",
+ "split2": "^4.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "cli.mjs"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "optional": true
+ },
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
+ "dev": true,
+ "dependencies": {
+ "ini": "4.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "optional": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "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==",
+ "optional": true
+ },
+ "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==",
+ "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==",
+ "optional": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "optional": true,
+ "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==",
+ "optional": true,
+ "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==",
+ "optional": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.1.6",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz",
+ "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==",
+ "dev": true,
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+ "optional": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/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,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "optional": true
+ },
+ "node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "optional": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "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==",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "optional": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "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,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-text-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz",
+ "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==",
+ "dev": true,
+ "dependencies": {
+ "text-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "optional": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "optional": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/iterare": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
+ "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.6",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/jmespath": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz",
+ "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "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,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.2.0"
+ ]
+ },
+ "node_modules/JSONStream": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
+ "dev": true,
+ "dependencies": {
+ "jsonparse": "^1.2.0",
+ "through": ">=2.2.7 <3"
+ },
+ "bin": {
+ "JSONStream": "bin.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/lint-staged": {
+ "version": "15.2.10",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz",
+ "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "~5.3.0",
+ "commander": "~12.1.0",
+ "debug": "~4.3.6",
+ "execa": "~8.0.1",
+ "lilconfig": "~3.1.2",
+ "listr2": "~8.2.4",
+ "micromatch": "~4.0.8",
+ "pidtree": "~0.6.0",
+ "string-argv": "~0.3.2",
+ "yaml": "~2.5.0"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
+ "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true
+ },
+ "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
+ },
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
+ },
+ "node_modules/lodash.snakecase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
+ "dev": true
+ },
+ "node_modules/lodash.startcase": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz",
+ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==",
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "node_modules/lodash.upperfirst": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
+ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==",
+ "dev": true
+ },
+ "node_modules/log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/meow": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz",
+ "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "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,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "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==",
+ "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==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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=="
+ },
+ "node_modules/nestjs-octokit": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nestjs-octokit/-/nestjs-octokit-0.2.0.tgz",
+ "integrity": "sha512-ZHjknzQ7KXlvIjTiFLBg+KWmuPjxBYlArqm0UD5s2DufevA/vFmXYPvWSC3mLMZ6V7O+tu6mNQcNXGQprHJWjA==",
+ "dependencies": {
+ "@nestjs/common": "^8.2.5",
+ "@nestjs/core": "^8.2.5",
+ "octokit": "^1.7.1",
+ "reflect-metadata": "^0.1.13"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "octokit": "^1.7.1"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/app": {
+ "version": "12.0.7",
+ "resolved": "https://registry.npmjs.org/@octokit/app/-/app-12.0.7.tgz",
+ "integrity": "sha512-NqgLlaaf7Yy1s5ghhiiBRGzstICpBYnVX5ce3Klk3iKaGeXJDBLVyrJ6e6sYOiTXolFK56Nx5QWS6oUBgP6rSw==",
+ "dependencies": {
+ "@octokit/auth-app": "^3.3.0",
+ "@octokit/auth-unauthenticated": "^2.0.4",
+ "@octokit/core": "^3.4.0",
+ "@octokit/oauth-app": "^3.3.2",
+ "@octokit/plugin-paginate-rest": "^2.13.3",
+ "@octokit/types": "^6.27.1",
+ "@octokit/webhooks": "^9.0.1"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-app": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-3.6.1.tgz",
+ "integrity": "sha512-6oa6CFphIYI7NxxHrdVOzhG7hkcKyGyYocg7lNDSJVauVOLtylg8hNJzoUyPAYKKK0yUeoZamE/lMs2tG+S+JA==",
+ "dependencies": {
+ "@octokit/auth-oauth-app": "^4.3.0",
+ "@octokit/auth-oauth-user": "^1.2.3",
+ "@octokit/request": "^5.6.0",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.0.3",
+ "@types/lru-cache": "^5.1.0",
+ "deprecation": "^2.3.1",
+ "lru-cache": "^6.0.0",
+ "universal-github-app-jwt": "^1.0.1",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-4.3.4.tgz",
+ "integrity": "sha512-OYOTSSINeUAiLMk1uelaGB/dEkReBqHHr8+hBejzMG4z1vA4c7QSvDAS0RVZSr4oD4PEUPYFzEl34K7uNrXcWA==",
+ "dependencies": {
+ "@octokit/auth-oauth-device": "^3.1.1",
+ "@octokit/auth-oauth-user": "^2.0.0",
+ "@octokit/request": "^5.6.3",
+ "@octokit/types": "^6.0.3",
+ "@types/btoa-lite": "^1.0.0",
+ "btoa-lite": "^1.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/auth-oauth-user": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz",
+ "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==",
+ "dependencies": {
+ "@octokit/auth-oauth-device": "^4.0.0",
+ "@octokit/oauth-methods": "^2.0.0",
+ "@octokit/request": "^6.0.0",
+ "@octokit/types": "^9.0.0",
+ "btoa-lite": "^1.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/auth-oauth-user/node_modules/@octokit/auth-oauth-device": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz",
+ "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==",
+ "dependencies": {
+ "@octokit/oauth-methods": "^2.0.0",
+ "@octokit/request": "^6.0.0",
+ "@octokit/types": "^9.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/auth-oauth-user/node_modules/@octokit/request": {
+ "version": "6.2.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+ "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+ "dependencies": {
+ "@octokit/endpoint": "^7.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/endpoint": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+ "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/endpoint/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": {
+ "version": "18.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz",
+ "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw=="
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/request-error": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+ "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-app/node_modules/@octokit/request-error/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-3.1.4.tgz",
+ "integrity": "sha512-6sHE/++r+aEFZ/BKXOGPJcH/nbgbBjS1A4CHfq/PbPEwb0kZEt43ykW98GBO/rYBPAYaNpCPvXfGwzgR9yMCXg==",
+ "dependencies": {
+ "@octokit/oauth-methods": "^2.0.0",
+ "@octokit/request": "^6.0.0",
+ "@octokit/types": "^6.10.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/endpoint": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+ "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/endpoint/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": {
+ "version": "18.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz",
+ "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw=="
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/request": {
+ "version": "6.2.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+ "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+ "dependencies": {
+ "@octokit/endpoint": "^7.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/request-error": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+ "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/request-error/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-device/node_modules/@octokit/request/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-user": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-1.3.0.tgz",
+ "integrity": "sha512-3QC/TAdk7onnxfyZ24BnJRfZv8TRzQK7SEFUS9vLng4Vv6Hv6I64ujdk/CUkREec8lhrwU764SZ/d+yrjjqhaQ==",
+ "dependencies": {
+ "@octokit/auth-oauth-device": "^3.1.1",
+ "@octokit/oauth-methods": "^1.1.0",
+ "@octokit/request": "^5.4.14",
+ "@octokit/types": "^6.12.2",
+ "btoa-lite": "^1.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-oauth-user/node_modules/@octokit/oauth-methods": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-1.2.6.tgz",
+ "integrity": "sha512-nImHQoOtKnSNn05uk2o76om1tJWiAo4lOu2xMAHYsNr0fwopP+Dv+2MlGvaMMlFjoqVd3fF3X5ZDTKCsqgmUaQ==",
+ "dependencies": {
+ "@octokit/oauth-authorization-url": "^4.3.1",
+ "@octokit/request": "^5.4.14",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.12.2",
+ "btoa-lite": "^1.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-token": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/auth-unauthenticated": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-2.1.0.tgz",
+ "integrity": "sha512-+baofLfSL0CAv3CfGQ9rxiZZQEX8VNJMGuuS4PgrMRBUL52Ho5+hQYb63UJQshw7EXYMPDZxbXznc0y33cbPqw==",
+ "dependencies": {
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/core": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
+ "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
+ "dependencies": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.3",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.0.3",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/endpoint": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "dependencies": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-app": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-3.7.1.tgz",
+ "integrity": "sha512-NTmFuB4jcwnxj7xlipHuuX9DRprfb7vHGSBIizIygx2u8LlNYqGvHYWNgw3TpxRxYrFA+SMIfjoVgrtnYpdbrA==",
+ "dependencies": {
+ "@octokit/auth-oauth-app": "^4.0.0",
+ "@octokit/auth-oauth-user": "^1.3.0",
+ "@octokit/auth-unauthenticated": "^2.0.0",
+ "@octokit/core": "^3.3.2",
+ "@octokit/oauth-authorization-url": "^4.2.1",
+ "@octokit/oauth-methods": "^1.2.2",
+ "@types/aws-lambda": "^8.10.83",
+ "fromentries": "^1.3.1",
+ "universal-user-agent": "^6.0.0"
+ },
+ "optionalDependencies": {
+ "aws-lambda": "^1.0.7"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-app/node_modules/@octokit/oauth-methods": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-1.2.6.tgz",
+ "integrity": "sha512-nImHQoOtKnSNn05uk2o76om1tJWiAo4lOu2xMAHYsNr0fwopP+Dv+2MlGvaMMlFjoqVd3fF3X5ZDTKCsqgmUaQ==",
+ "dependencies": {
+ "@octokit/oauth-authorization-url": "^4.3.1",
+ "@octokit/request": "^5.4.14",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.12.2",
+ "btoa-lite": "^1.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-authorization-url": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-4.3.3.tgz",
+ "integrity": "sha512-lhP/t0i8EwTmayHG4dqLXgU+uPVys4WD/qUNvC+HfB1S1dyqULm5Yx9uKc1x79aP66U1Cb4OZeW8QU/RA9A4XA=="
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz",
+ "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==",
+ "dependencies": {
+ "@octokit/oauth-authorization-url": "^5.0.0",
+ "@octokit/request": "^6.2.3",
+ "@octokit/request-error": "^3.0.3",
+ "@octokit/types": "^9.0.0",
+ "btoa-lite": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods/node_modules/@octokit/endpoint": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+ "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods/node_modules/@octokit/oauth-authorization-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz",
+ "integrity": "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": {
+ "version": "18.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz",
+ "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw=="
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods/node_modules/@octokit/request": {
+ "version": "6.2.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+ "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+ "dependencies": {
+ "@octokit/endpoint": "^7.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods/node_modules/@octokit/request-error": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+ "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/oauth-methods/node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/plugin-paginate-rest": {
+ "version": "2.21.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+ "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
+ "dependencies": {
+ "@octokit/types": "^6.40.0"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=2"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "5.16.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+ "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
+ "dependencies": {
+ "@octokit/types": "^6.39.0",
+ "deprecation": "^2.3.1"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/plugin-retry": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-3.0.9.tgz",
+ "integrity": "sha512-r+fArdP5+TG6l1Rv/C9hVoty6tldw6cE2pRHNGmFPdyfrc696R6JjrQ3d7HdVqGwuzfyrcaLAKD7K8TX8aehUQ==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "bottleneck": "^2.15.3"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/plugin-throttling": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-3.7.0.tgz",
+ "integrity": "sha512-qrKT1Yl/KuwGSC6/oHpLBot3ooC9rq0/ryDYBCpkRtoj+R8T47xTMDT6Tk2CxWopFota/8Pi/2SqArqwC0JPow==",
+ "dependencies": {
+ "@octokit/types": "^6.0.1",
+ "bottleneck": "^2.15.3"
+ },
+ "peerDependencies": {
+ "@octokit/core": "^3.5.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/request": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
+ "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
+ "dependencies": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "dependencies": {
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/webhooks": {
+ "version": "9.26.3",
+ "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-9.26.3.tgz",
+ "integrity": "sha512-DLGk+gzeVq5oK89Bo601txYmyrelMQ7Fi5EnjHE0Xs8CWicy2xkmnJMKptKJrBJpstqbd/9oeDFi/Zj2pudBDQ==",
+ "dependencies": {
+ "@octokit/request-error": "^2.0.2",
+ "@octokit/webhooks-methods": "^2.0.0",
+ "@octokit/webhooks-types": "5.8.0",
+ "aggregate-error": "^3.1.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/@octokit/webhooks-methods": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-2.0.0.tgz",
+ "integrity": "sha512-35cfQ4YWlnZnmZKmIxlGPUPLtbkF8lr/A/1Sk1eC0ddLMwQN06dOuLc+dI3YLQS+T+MoNt3DIQ0NynwgKPilig=="
+ },
+ "node_modules/nestjs-octokit/node_modules/before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
+ },
+ "node_modules/nestjs-octokit/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==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/octokit": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/octokit/-/octokit-1.8.1.tgz",
+ "integrity": "sha512-xBLKFIivbl7wnLwxzLYuDO/JDNYxdyxoSjFrl/QMrY/fwGGQYYklvKUDTUyGMU0aXPrQtJ0IZnG3BXpCkDQzWg==",
+ "dependencies": {
+ "@octokit/app": "^12.0.4",
+ "@octokit/core": "^3.5.1",
+ "@octokit/oauth-app": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.18.0",
+ "@octokit/plugin-rest-endpoint-methods": "^5.14.0",
+ "@octokit/plugin-retry": "^3.0.9",
+ "@octokit/plugin-throttling": "^3.5.1",
+ "@octokit/types": "^6.35.0"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/universal-github-app-jwt": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz",
+ "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==",
+ "dependencies": {
+ "@types/jsonwebtoken": "^9.0.0",
+ "jsonwebtoken": "^9.0.2"
+ }
+ },
+ "node_modules/nestjs-octokit/node_modules/universal-user-agent": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
+ "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/octokit": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/octokit/-/octokit-4.0.2.tgz",
+ "integrity": "sha512-wbqF4uc1YbcldtiBFfkSnquHtECEIpYD78YUXI6ri1Im5OO2NLo6ZVpRdbJpdnpZ05zMrVPssNiEo6JQtea+Qg==",
+ "dependencies": {
+ "@octokit/app": "^15.0.0",
+ "@octokit/core": "^6.0.0",
+ "@octokit/oauth-app": "^7.0.0",
+ "@octokit/plugin-paginate-graphql": "^5.0.0",
+ "@octokit/plugin-paginate-rest": "^11.0.0",
+ "@octokit/plugin-rest-endpoint-methods": "^13.0.0",
+ "@octokit/plugin-retry": "^7.0.0",
+ "@octokit/plugin-throttling": "^9.0.0",
+ "@octokit/request-error": "^6.0.0",
+ "@octokit/types": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "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,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz",
+ "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
+ "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==",
+ "optional": true
+ },
+ "node_modules/querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "optional": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/reflect-metadata": {
+ "version": "0.1.14",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz",
+ "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A=="
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "peer": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/sax": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
+ "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==",
+ "optional": true
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "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==",
+ "optional": true,
+ "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/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,
+ "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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "optional": true
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
+ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-extensions": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz",
+ "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
+ "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
+ "dev": true
+ },
+ "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,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
+ "node_modules/turbo": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.2.3.tgz",
+ "integrity": "sha512-5lDvSqIxCYJ/BAd6rQGK/AzFRhBkbu4JHVMLmGh/hCb7U3CqSnr5Tjwfy9vc+/5wG2DJ6wttgAaA7MoCgvBKZQ==",
+ "dev": true,
+ "bin": {
+ "turbo": "bin/turbo"
+ },
+ "optionalDependencies": {
+ "turbo-darwin-64": "2.2.3",
+ "turbo-darwin-arm64": "2.2.3",
+ "turbo-linux-64": "2.2.3",
+ "turbo-linux-arm64": "2.2.3",
+ "turbo-windows-64": "2.2.3",
+ "turbo-windows-arm64": "2.2.3"
+ }
+ },
+ "node_modules/turbo-darwin-64": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.2.3.tgz",
+ "integrity": "sha512-Rcm10CuMKQGcdIBS3R/9PMeuYnv6beYIHqfZFeKWVYEWH69sauj4INs83zKMTUiZJ3/hWGZ4jet9AOwhsssLyg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/turbo-darwin-arm64": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.2.3.tgz",
+ "integrity": "sha512-+EIMHkuLFqUdJYsA3roj66t9+9IciCajgj+DVek+QezEdOJKcRxlvDOS2BUaeN8kEzVSsNiAGnoysFWYw4K0HA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/turbo-linux-64": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.2.3.tgz",
+ "integrity": "sha512-UBhJCYnqtaeOBQLmLo8BAisWbc9v9daL9G8upLR+XGj6vuN/Nz6qUAhverN4Pyej1g4Nt1BhROnj6GLOPYyqxQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/turbo-linux-arm64": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.2.3.tgz",
+ "integrity": "sha512-hJYT9dN06XCQ3jBka/EWvvAETnHRs3xuO/rb5bESmDfG+d9yQjeTMlhRXKrr4eyIMt6cLDt1LBfyi+6CQ+VAwQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/turbo-windows-64": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.2.3.tgz",
+ "integrity": "sha512-NPrjacrZypMBF31b4HE4ROg4P3nhMBPHKS5WTpMwf7wydZ8uvdEHpESVNMOtqhlp857zbnKYgP+yJF30H3N2dQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/turbo-windows-arm64": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.2.3.tgz",
+ "integrity": "sha512-fnNrYBCqn6zgKPKLHu4sOkihBI/+0oYFr075duRxqUZ+1aLWTAGfHZLgjVeLh3zR37CVzuerGIPWAEkNhkWEIw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/universal-github-app-jwt": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.0.tgz",
+ "integrity": "sha512-G5o6f95b5BggDGuUfKDApKaCgNYy2x7OdHY0zSMF081O0EJobw+1130VONhrA7ezGSV2FNOGyM+KQpQZAr9bIQ=="
+ },
+ "node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q=="
+ },
+ "node_modules/url": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
+ "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==",
+ "optional": true,
+ "dependencies": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "optional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "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==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "optional": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.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,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "optional": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/xml2js": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
+ "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+ "optional": true,
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "optional": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/yaml": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz",
+ "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
+ "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..7bb03f74
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "web38-froxy",
+ "private": true,
+ "scripts": {
+ "build": "turbo build",
+ "dev": "turbo dev",
+ "lint": "turbo lint",
+ "format": "prettier --write \"**/*.{ts,tsx,md}\"",
+ "prepare": "husky"
+ },
+ "lint-staged": {
+ "*.{ts,tsx}": [
+ "eslint",
+ "prettier --list-different"
+ ]
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^19.5.0",
+ "@commitlint/config-conventional": "^19.5.0",
+ "husky": "^9.1.6",
+ "lint-staged": "^15.2.10",
+ "turbo": "^2.2.3"
+ },
+ "packageManager": "pnpm@8.15.6",
+ "engines": {
+ "node": ">=18"
+ }
+}
diff --git a/packages/design/.gitignore b/packages/design/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/packages/design/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/packages/design/README.md b/packages/design/README.md
new file mode 100644
index 00000000..d5166d1e
--- /dev/null
+++ b/packages/design/README.md
@@ -0,0 +1 @@
+# design
diff --git a/packages/design/components.json b/packages/design/components.json
new file mode 100644
index 00000000..31514bfa
--- /dev/null
+++ b/packages/design/components.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "src/index.css",
+ "baseColor": "neutral",
+ "cssVariables": false,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ }
+}
diff --git a/packages/design/eslint.config.js b/packages/design/eslint.config.js
new file mode 100644
index 00000000..092408a9
--- /dev/null
+++ b/packages/design/eslint.config.js
@@ -0,0 +1,28 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+
+export default tseslint.config(
+ { ignores: ['dist'] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ plugins: {
+ 'react-hooks': reactHooks,
+ 'react-refresh': reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ 'react-refresh/only-export-components': [
+ 'warn',
+ { allowConstantExport: true },
+ ],
+ },
+ },
+)
diff --git a/packages/design/index.html b/packages/design/index.html
new file mode 100644
index 00000000..e4b78eae
--- /dev/null
+++ b/packages/design/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + React + TS
+
+
+
+
+
+
diff --git a/packages/design/package.json b/packages/design/package.json
new file mode 100644
index 00000000..e5d2e509
--- /dev/null
+++ b/packages/design/package.json
@@ -0,0 +1,62 @@
+{
+ "name": "@froxy/design",
+ "private": true,
+ "version": "0.1.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "exports": {
+ ".": {
+ "import": "./src/index.ts",
+ "require": "./src/index.ts",
+ "types": "./src/index.ts"
+ },
+ "./components": "./src/components/index.tsx",
+ "./utils": "./src/lib/utils.ts",
+ "./config": "./tailwind.config.js"
+ },
+ "lint-staged": {
+ "*.{ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ]
+ },
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.2.1",
+ "@radix-ui/react-select": "^2.1.2",
+ "@radix-ui/react-separator": "^1.1.0",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-switch": "^1.1.1",
+ "@radix-ui/react-tabs": "^1.1.1",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.1",
+ "embla-carousel-autoplay": "^8.5.1",
+ "embla-carousel-react": "^8.3.1",
+ "lucide-react": "^0.454.0",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "tailwind-merge": "^2.5.4",
+ "tailwindcss-animate": "^1.0.7"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@types/react": "^18.3.12",
+ "@types/react-dom": "^18.3.1",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "eslint": "^9.13.0",
+ "eslint-plugin-react-hooks": "^5.0.0",
+ "eslint-plugin-react-refresh": "^0.4.14",
+ "globals": "^15.11.0",
+ "typescript": "~5.6.2",
+ "typescript-eslint": "^8.11.0",
+ "vite": "^5.4.10"
+ },
+ "peerDependencies": {
+ "autoprefixer": "^10.4.20",
+ "postcss": "^8.4.47",
+ "tailwindcss": "^3.4.14"
+ }
+}
diff --git a/packages/design/postcss.config.js b/packages/design/postcss.config.js
new file mode 100644
index 00000000..2e7af2b7
--- /dev/null
+++ b/packages/design/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/packages/design/src/components/Slot/index.ts b/packages/design/src/components/Slot/index.ts
new file mode 100644
index 00000000..a440bf11
--- /dev/null
+++ b/packages/design/src/components/Slot/index.ts
@@ -0,0 +1,2 @@
+export * from '@radix-ui/react-slot';
+export * from './types';
diff --git a/packages/design/src/components/Slot/types.ts b/packages/design/src/components/Slot/types.ts
new file mode 100644
index 00000000..84398692
--- /dev/null
+++ b/packages/design/src/components/Slot/types.ts
@@ -0,0 +1,3 @@
+import { HTMLProps } from 'react';
+
+export type SlotComponentProps = HTMLProps & { asChild?: true };
diff --git a/packages/design/src/components/index.tsx b/packages/design/src/components/index.tsx
new file mode 100644
index 00000000..519a9a74
--- /dev/null
+++ b/packages/design/src/components/index.tsx
@@ -0,0 +1,12 @@
+export * from './ui/badge';
+export * from './ui/button';
+export * from './ui/carousel';
+export * from './ui/input';
+export * from './ui/pagination';
+export * from './ui/select';
+export * from './ui/typography';
+export * from './ui/tabs';
+export * from './ui/switch';
+export * from './ui/accordion';
+export * from './ui/skeleton';
+export * from './Slot';
diff --git a/packages/design/src/components/ui/accordion.tsx b/packages/design/src/components/ui/accordion.tsx
new file mode 100644
index 00000000..48e6bf7f
--- /dev/null
+++ b/packages/design/src/components/ui/accordion.tsx
@@ -0,0 +1,52 @@
+import * as React from 'react';
+import * as AccordionPrimitive from '@radix-ui/react-accordion';
+import { ChevronDown } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const Accordion = AccordionPrimitive.Root;
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+AccordionItem.displayName = 'AccordionItem';
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180',
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+));
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+));
+
+AccordionContent.displayName = AccordionPrimitive.Content.displayName;
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
diff --git a/packages/design/src/components/ui/badge.tsx b/packages/design/src/components/ui/badge.tsx
new file mode 100644
index 00000000..64cffc1f
--- /dev/null
+++ b/packages/design/src/components/ui/badge.tsx
@@ -0,0 +1,28 @@
+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-full 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-neutral-900 text-neutral-50 hover:bg-neutral-900/90',
+ secondary: 'border-transparent bg-neutral-100 text-neutral-900 hover:bg-neutral-100/80',
+ destructive: 'bg-red-500 text-neutral-50 hover:bg-red-500/90',
+ outline: 'text-neutral-900'
+ }
+ },
+ defaultVariants: {
+ variant: 'default'
+ }
+ }
+);
+
+export interface BadgeProps extends React.HTMLAttributes, VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return
;
+}
+
+export { Badge, badgeVariants };
diff --git a/packages/design/src/components/ui/button.tsx b/packages/design/src/components/ui/button.tsx
new file mode 100644
index 00000000..087b2d7b
--- /dev/null
+++ b/packages/design/src/components/ui/button.tsx
@@ -0,0 +1,51 @@
+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 ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 dark:ring-offset-neutral-950 dark:focus-visible:ring-neutral-300',
+ {
+ variants: {
+ variant: {
+ default:
+ 'bg-neutral-900 text-neutral-50 hover:bg-neutral-900/90 dark:bg-neutral-50 dark:text-neutral-900 dark:hover:bg-neutral-50/90',
+ destructive:
+ 'bg-red-500 text-neutral-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-neutral-50 dark:hover:bg-red-900/90',
+ outline:
+ 'border border-neutral-200 bg-white hover:bg-neutral-100 hover:text-neutral-900 dark:border-neutral-800 dark:bg-neutral-950 dark:hover:bg-neutral-800 dark:hover:text-neutral-50',
+ secondary:
+ 'bg-neutral-100 text-neutral-900 hover:bg-neutral-100/80 dark:bg-neutral-800 dark:text-neutral-50 dark:hover:bg-neutral-800/80',
+ ghost: 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-800 dark:hover:text-neutral-50',
+ link: 'text-neutral-900 underline-offset-4 hover:underline dark:text-neutral-50'
+ },
+ size: {
+ default: 'h-10 px-4 py-2',
+ sm: 'h-9 rounded-md px-3',
+ lg: 'h-11 rounded-md px-8',
+ icon: 'h-10 w-10'
+ }
+ },
+ 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/packages/design/src/components/ui/carousel.tsx b/packages/design/src/components/ui/carousel.tsx
new file mode 100644
index 00000000..cc541a8c
--- /dev/null
+++ b/packages/design/src/components/ui/carousel.tsx
@@ -0,0 +1,224 @@
+import * as React from 'react';
+import useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react';
+import { ArrowLeft, ArrowRight } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+import { Button } from '@/components/ui/button';
+
+type CarouselApi = UseEmblaCarouselType[1];
+type UseCarouselParameters = Parameters;
+type CarouselOptions = UseCarouselParameters[0];
+type CarouselPlugin = UseCarouselParameters[1];
+
+type CarouselProps = {
+ opts?: CarouselOptions;
+ plugins?: CarouselPlugin;
+ orientation?: 'horizontal' | 'vertical';
+ setApi?: (api: CarouselApi) => void;
+};
+
+type CarouselContextProps = {
+ carouselRef: ReturnType[0];
+ api: ReturnType[1];
+ scrollPrev: () => void;
+ scrollNext: () => void;
+ canScrollPrev: boolean;
+ canScrollNext: boolean;
+} & CarouselProps;
+
+const CarouselContext = React.createContext(null);
+
+function useCarousel() {
+ const context = React.useContext(CarouselContext);
+
+ if (!context) {
+ throw new Error('useCarousel must be used within a ');
+ }
+
+ return context;
+}
+
+const Carousel = React.forwardRef & CarouselProps>(
+ ({ orientation = 'horizontal', opts, setApi, plugins, className, children, ...props }, ref) => {
+ const [carouselRef, api] = useEmblaCarousel(
+ {
+ ...opts,
+ axis: orientation === 'horizontal' ? 'x' : 'y'
+ },
+ plugins
+ );
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false);
+ const [canScrollNext, setCanScrollNext] = React.useState(false);
+
+ const onSelect = React.useCallback((api: CarouselApi) => {
+ if (!api) {
+ return;
+ }
+
+ setCanScrollPrev(api.canScrollPrev());
+ setCanScrollNext(api.canScrollNext());
+ }, []);
+
+ const scrollPrev = React.useCallback(() => {
+ api?.scrollPrev();
+ }, [api]);
+
+ const scrollNext = React.useCallback(() => {
+ api?.scrollNext();
+ }, [api]);
+
+ const handleKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (event.key === 'ArrowLeft') {
+ event.preventDefault();
+ scrollPrev();
+ } else if (event.key === 'ArrowRight') {
+ event.preventDefault();
+ scrollNext();
+ }
+ },
+ [scrollPrev, scrollNext]
+ );
+
+ React.useEffect(() => {
+ if (!api || !setApi) {
+ return;
+ }
+
+ setApi(api);
+ }, [api, setApi]);
+
+ React.useEffect(() => {
+ if (!api) {
+ return;
+ }
+
+ onSelect(api);
+ api.on('reInit', onSelect);
+ api.on('select', onSelect);
+
+ return () => {
+ api?.off('select', onSelect);
+ };
+ }, [api, onSelect]);
+
+ return (
+
+
+ {children}
+
+
+ );
+ }
+);
+Carousel.displayName = 'Carousel';
+
+const CarouselContent = React.forwardRef>(
+ ({ className, ...props }, ref) => {
+ const { carouselRef, orientation } = useCarousel();
+
+ return (
+
+ );
+ }
+);
+CarouselContent.displayName = 'CarouselContent';
+
+const CarouselItem = React.forwardRef>(
+ ({ className, ...props }, ref) => {
+ const { orientation } = useCarousel();
+
+ return (
+
+ );
+ }
+);
+CarouselItem.displayName = 'CarouselItem';
+
+const CarouselPrevious = React.forwardRef>(
+ ({ className, variant = 'outline', size = 'icon', ...props }, ref) => {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel();
+
+ return (
+
+
+ Previous slide
+
+ );
+ }
+);
+CarouselPrevious.displayName = 'CarouselPrevious';
+
+const CarouselNext = React.forwardRef>(
+ ({ className, variant = 'outline', size = 'icon', ...props }, ref) => {
+ const { orientation, scrollNext, canScrollNext } = useCarousel();
+
+ return (
+
+
+ Next slide
+
+ );
+ }
+);
+CarouselNext.displayName = 'CarouselNext';
+
+export { type CarouselApi, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext };
diff --git a/packages/design/src/components/ui/input.tsx b/packages/design/src/components/ui/input.tsx
new file mode 100644
index 00000000..3de1e6af
--- /dev/null
+++ b/packages/design/src/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/packages/design/src/components/ui/pagination.tsx b/packages/design/src/components/ui/pagination.tsx
new file mode 100644
index 00000000..834c0f79
--- /dev/null
+++ b/packages/design/src/components/ui/pagination.tsx
@@ -0,0 +1,81 @@
+import * as React from 'react';
+import { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';
+import { ButtonProps, buttonVariants } from './button';
+import { cn } from '@/lib/utils';
+
+const Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => (
+
+);
+Pagination.displayName = 'Pagination';
+
+const PaginationContent = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+);
+PaginationContent.displayName = 'PaginationContent';
+
+const PaginationItem = React.forwardRef>(({ className, ...props }, ref) => (
+
+));
+PaginationItem.displayName = 'PaginationItem';
+
+type PaginationLinkProps = {
+ isActive?: boolean;
+} & Pick &
+ React.ComponentProps<'a'>;
+
+const PaginationLink = ({ className, isActive, size = 'icon', ...props }: PaginationLinkProps) => (
+
+);
+PaginationLink.displayName = 'PaginationLink';
+
+const PaginationPrevious = ({ className, ...props }: React.ComponentProps) => (
+
+
+ Prev
+
+);
+PaginationPrevious.displayName = 'PaginationPrevious';
+
+const PaginationNext = ({ className, ...props }: React.ComponentProps) => (
+
+ Next
+
+
+);
+PaginationNext.displayName = 'PaginationNext';
+
+const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (
+
+
+ More pages
+
+);
+PaginationEllipsis.displayName = 'PaginationEllipsis';
+
+export {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious
+};
diff --git a/packages/design/src/components/ui/select.tsx b/packages/design/src/components/ui/select.tsx
new file mode 100644
index 00000000..2d8101ac
--- /dev/null
+++ b/packages/design/src/components/ui/select.tsx
@@ -0,0 +1,147 @@
+import * as React from 'react';
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { Check, ChevronDown, ChevronUp } from 'lucide-react';
+
+import { cn } from '@/lib/utils';
+
+const Select = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1 dark:border-neutral-800 dark:bg-neutral-950 dark:ring-offset-neutral-950 dark:placeholder:text-neutral-400 dark:focus:ring-neutral-300',
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = 'popper', ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton
+};
diff --git a/packages/design/src/components/ui/skeleton.tsx b/packages/design/src/components/ui/skeleton.tsx
new file mode 100644
index 00000000..7082e14d
--- /dev/null
+++ b/packages/design/src/components/ui/skeleton.tsx
@@ -0,0 +1,7 @@
+import { cn } from '@/lib/utils';
+
+function Skeleton({ className, ...props }: React.HTMLAttributes) {
+ return
;
+}
+
+export { Skeleton };
diff --git a/packages/design/src/components/ui/switch.tsx b/packages/design/src/components/ui/switch.tsx
new file mode 100644
index 00000000..73663f4e
--- /dev/null
+++ b/packages/design/src/components/ui/switch.tsx
@@ -0,0 +1,27 @@
+import * as React from 'react';
+import * as SwitchPrimitives from '@radix-ui/react-switch';
+
+import { cn } from '@/lib/utils';
+
+const Switch = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+Switch.displayName = SwitchPrimitives.Root.displayName;
+
+export { Switch };
diff --git a/packages/design/src/components/ui/tabs.tsx b/packages/design/src/components/ui/tabs.tsx
new file mode 100644
index 00000000..c6ae5c22
--- /dev/null
+++ b/packages/design/src/components/ui/tabs.tsx
@@ -0,0 +1,53 @@
+import * as React from 'react';
+import * as TabsPrimitive from '@radix-ui/react-tabs';
+
+import { cn } from '@/lib/utils';
+
+const Tabs = TabsPrimitive.Root;
+
+const TabsList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsList.displayName = TabsPrimitive.List.displayName;
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
+
+const TabsContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsContent.displayName = TabsPrimitive.Content.displayName;
+
+export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/packages/design/src/components/ui/typography.tsx b/packages/design/src/components/ui/typography.tsx
new file mode 100644
index 00000000..b85af74e
--- /dev/null
+++ b/packages/design/src/components/ui/typography.tsx
@@ -0,0 +1,54 @@
+import { cn } from '@/lib/utils';
+import { Slot } from '@radix-ui/react-slot';
+
+const TypographyVariants = {
+ bold: 'font-bold',
+ muted: 'text-gray-500',
+ destructive: 'text-red-500',
+ none: ''
+};
+
+const HeadingSize = {
+ '2xl': 'text-4xl font-bold',
+ xl: 'text-3xl font-bold',
+ lg: 'text-2xl font-bold',
+ md: 'text-xl font-bold',
+ sm: 'text-lg font-bold'
+} as const;
+
+type HeadingProps = {
+ asChild?: boolean;
+ size?: keyof typeof HeadingSize;
+ variant?: keyof typeof TypographyVariants;
+} & React.HTMLAttributes;
+
+export function Heading({ asChild, size = 'md', variant = 'none', className, ...props }: HeadingProps) {
+ const Element = asChild ? Slot : 'h1';
+
+ const tw = cn(HeadingSize[size], TypographyVariants[variant], className);
+
+ return ;
+}
+
+const TextSize = {
+ '3xl': 'text-3xl',
+ '2xl': 'text-2xl',
+ xl: 'text-xl',
+ lg: 'text-lg',
+ md: 'text-base',
+ sm: 'text-sm'
+} as const;
+
+type TextProps = {
+ asChild?: boolean;
+ size?: keyof typeof TextSize;
+ variant?: keyof typeof TypographyVariants;
+} & React.HTMLAttributes;
+
+export function Text({ asChild, size = 'md', variant = 'none', className, ...props }: TextProps) {
+ const Element = asChild ? Slot : 'p';
+
+ const tw = cn(TextSize[size], TypographyVariants[variant], className);
+
+ return ;
+}
diff --git a/packages/design/src/index.css b/packages/design/src/index.css
new file mode 100644
index 00000000..6361318f
--- /dev/null
+++ b/packages/design/src/index.css
@@ -0,0 +1,7 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+@layer base {
+ :root {
+ --radius: 0.5rem}
+}
diff --git a/packages/design/src/index.ts b/packages/design/src/index.ts
new file mode 100644
index 00000000..5837bfb0
--- /dev/null
+++ b/packages/design/src/index.ts
@@ -0,0 +1,7 @@
+import AutoPlay from 'embla-carousel-autoplay';
+
+export * from '@/components';
+export * from '@/lib/utils';
+export * from '@radix-ui/react-slot';
+
+export { AutoPlay };
diff --git a/packages/design/src/lib/utils.ts b/packages/design/src/lib/utils.ts
new file mode 100644
index 00000000..2819a830
--- /dev/null
+++ b/packages/design/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/packages/design/src/vite-env.d.ts b/packages/design/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/packages/design/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/packages/design/tailwind.config.js b/packages/design/tailwind.config.js
new file mode 100644
index 00000000..ac9bc8ac
--- /dev/null
+++ b/packages/design/tailwind.config.js
@@ -0,0 +1,38 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ darkMode: ['class'],
+ content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}', '../../packages/design/src/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ extend: {
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)'
+ },
+ colors: {},
+ keyframes: {
+ 'accordion-down': {
+ from: {
+ height: '0'
+ },
+ to: {
+ height: 'var(--radix-accordion-content-height)'
+ }
+ },
+ 'accordion-up': {
+ from: {
+ height: 'var(--radix-accordion-content-height)'
+ },
+ to: {
+ height: '0'
+ }
+ }
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out'
+ }
+ }
+ },
+ plugins: [require('tailwindcss-animate')]
+};
diff --git a/packages/design/tsconfig.app.json b/packages/design/tsconfig.app.json
new file mode 100644
index 00000000..9e42e387
--- /dev/null
+++ b/packages/design/tsconfig.app.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true,
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src"]
+}
diff --git a/packages/design/tsconfig.json b/packages/design/tsconfig.json
new file mode 100644
index 00000000..2b78387c
--- /dev/null
+++ b/packages/design/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "files": [],
+ "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/packages/design/tsconfig.node.json b/packages/design/tsconfig.node.json
new file mode 100644
index 00000000..abcd7f0d
--- /dev/null
+++ b/packages/design/tsconfig.node.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/packages/design/vite.config.ts b/packages/design/vite.config.ts
new file mode 100644
index 00000000..024b35b4
--- /dev/null
+++ b/packages/design/vite.config.ts
@@ -0,0 +1,17 @@
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react-swc';
+
+import path from 'path';
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src')
+ }
+ },
+ build: {
+ outDir: path.resolve(__dirname, './dist')
+ }
+});
diff --git a/packages/react-markdown/.gitignore b/packages/react-markdown/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/packages/react-markdown/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/packages/react-markdown/README.md b/packages/react-markdown/README.md
new file mode 100644
index 00000000..dfc8d468
--- /dev/null
+++ b/packages/react-markdown/README.md
@@ -0,0 +1,29 @@
+# @froxy/react-markdown
+
+마크다운을 렌더링하는 React 컴포넌트 라이브러리입니다.
+
+[react-markdown](https://github.com/remarkjs/react-markdown) 라이브러리는 비동기 rehype 플러그인을 지원하지 않습니다. 따라서 비동기 플러그인 라이브러리들과 함께 사용하기 위해 만들었습니다.
+
+## 사용방법
+
+```ts
+
+```
+
+```ts
+
+
Hello world
+
+ hola
+
+
+```
+
+Markdown 컴포넌트를 통해 markdown 형식의 문자열을 React 컴포넌트로 파싱해 랜더링할 수 있습니다.
+
+## Options
+
+@froxy/react-markdown 컴포넌트는 다음 옵션을 제공합니다:
+
+- markdown : 마크다운 문자열입니다.
+- components : 사용자 커스텀 마크다운 컴포넌트를 받아 랜더링 시 해당 컴포넌트로 랜더링합니다.
diff --git a/packages/react-markdown/eslint.config.js b/packages/react-markdown/eslint.config.js
new file mode 100644
index 00000000..02c7ade1
--- /dev/null
+++ b/packages/react-markdown/eslint.config.js
@@ -0,0 +1,108 @@
+import js from '@eslint/js';
+import globals from 'globals';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+import tseslint from 'typescript-eslint';
+import eslintImport from 'eslint-plugin-import';
+import prettierPlugin from 'eslint-plugin-prettier';
+import noRelativeImportPathsPlugin from 'eslint-plugin-no-relative-import-paths';
+
+import typescriptParser from '@typescript-eslint/parser';
+
+export default tseslint.config(
+ { ignores: ['dist'] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ parser: typescriptParser,
+ ecmaVersion: 2020,
+ globals: globals.browser
+ },
+ plugins: {
+ 'react-hooks': reactHooks,
+ 'react-refresh': reactRefresh,
+ 'no-relative-import-paths': noRelativeImportPathsPlugin,
+ import: eslintImport,
+ prettier: prettierPlugin
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ 'prettier/prettier': 'error', // Prettier 규칙을 ESLint에서 에러로 표시
+ '@typescript-eslint/no-explicit-any': 'off', // any 사용 허용
+ 'import/order': [
+ 'error',
+ {
+ groups: [
+ ['builtin', 'external'], // 내장 모듈과 외부 모듈 그룹
+ ['internal', 'parent', 'sibling', 'index'] // 내부 모듈 그룹
+ ],
+ pathGroups: [
+ {
+ pattern: 'react',
+ group: 'builtin',
+ position: 'before' // react를 최상위에 오도록 설정
+ },
+ {
+ pattern: 'react-dom',
+ group: 'builtin',
+ position: 'before'
+ }
+ ],
+ pathGroupsExcludedImportTypes: ['builtin'],
+ alphabetize: { order: 'asc', caseInsensitive: true } // 알파벳 순 정렬
+ }
+ ],
+ 'sort-imports': [
+ 'error',
+ {
+ ignoreDeclarationSort: true, // `import` 자체의 정렬은 무시
+ ignoreMemberSort: false // 세부 항목 정렬은 적용
+ }
+ ],
+ 'no-relative-import-paths/no-relative-import-paths': [
+ 'warn',
+ { allowSameFolder: true, rootDir: 'src', prefix: '@' }
+ ],
+ '@typescript-eslint/naming-convention': [
+ 'warn',
+ {
+ selector: 'variable',
+ format: ['camelCase', 'PascalCase', 'UPPER_CASE']
+ }, // 변수명은 camelCase, PascalCase, UPPER_CASE 형식 중 하나여야 함
+ {
+ selector: 'function',
+ format: ['camelCase', 'PascalCase']
+ }, // 함수명은 camelCase, PascalCase 형식 중 하나여야 함
+ {
+ selector: 'typeLike',
+ format: ['PascalCase']
+ }, // 타입명은 PascalCase 형식이어야 함
+ {
+ selector: 'interface',
+ format: ['PascalCase'],
+ custom: {
+ regex: '^I[A-Z]',
+ match: false
+ }
+ }, // 인터페이스명은 PascalCase이고 I로 시작하면 안됨
+ {
+ selector: 'typeAlias',
+ format: ['PascalCase'],
+ custom: {
+ regex: '^T[A-Z]',
+ match: false
+ }
+ }, // 타입 별칭명은 PascalCase이고 T로 시작하면 안됨
+ {
+ selector: 'typeParameter',
+ format: ['PascalCase'],
+ custom: {
+ regex: '^T[A-Z]',
+ match: false
+ }
+ } // 타입 매개변수명은 PascalCase이고 T로 시작하면 안됨
+ ]
+ }
+ }
+);
diff --git a/packages/react-markdown/index.html b/packages/react-markdown/index.html
new file mode 100644
index 00000000..1284b533
--- /dev/null
+++ b/packages/react-markdown/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Froxy
+
+
+
+
+
diff --git a/packages/react-markdown/package.json b/packages/react-markdown/package.json
new file mode 100644
index 00000000..64fbf6b9
--- /dev/null
+++ b/packages/react-markdown/package.json
@@ -0,0 +1,61 @@
+{
+ "name": "@froxy/react-markdown",
+ "private": true,
+ "version": "0.2.0",
+ "type": "module",
+ "module": "./src/index.ts",
+ "exports": {
+ ".": {
+ "import": "./src/index.ts"
+ },
+ "./github.css": "./src/github.css"
+ },
+ "scripts": {
+ "dev": "vite",
+ "lint": "eslint .",
+ "preview": "vite preview",
+ "test": "vitest"
+ },
+ "lint-staged": {
+ "*.{ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ]
+ },
+ "dependencies": {
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "rehype": "^13.0.2",
+ "rehype-pretty-code": "^0.14.0",
+ "rehype-react": "^8.0.0",
+ "remark-gfm": "^4.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.1.1",
+ "unified": "^11.0.5"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@testing-library/jest-dom": "^6.6.3",
+ "@testing-library/react": "^16.0.1",
+ "@types/react": "^18.3.12",
+ "@types/react-dom": "^18.3.1",
+ "@typescript-eslint/parser": "^5.59.11",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "eslint": "^9.13.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-no-relative-import-paths": "^1.5.5",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-react-hooks": "^5.0.0",
+ "eslint-plugin-react-refresh": "^0.4.14",
+ "globals": "^15.11.0",
+ "jsdom": "^25.0.1",
+ "prettier": "2.x",
+ "typescript": "~5.6.2",
+ "typescript-eslint": "^8.11.0",
+ "vite": "^5.4.10",
+ "vite-plugin-dts": "^4.3.0",
+ "vite-tsconfig-paths": "^5.0.1",
+ "vitest": "^2.1.4"
+ }
+}
diff --git a/packages/react-markdown/src/Markdown.tsx b/packages/react-markdown/src/Markdown.tsx
new file mode 100644
index 00000000..7791d3e1
--- /dev/null
+++ b/packages/react-markdown/src/Markdown.tsx
@@ -0,0 +1,48 @@
+import React, { Fragment } from 'react';
+import { jsxDEV } from 'react/jsx-dev-runtime';
+import { jsx, jsxs } from 'react/jsx-runtime';
+import rehypePrettyCode from 'rehype-pretty-code';
+import rehypeReact from 'rehype-react';
+import remarkGfm from 'remark-gfm';
+import remarkParse from 'remark-parse';
+import remarkRehype from 'remark-rehype';
+import { unified } from 'unified';
+
+import './github.css';
+
+type MarkdownProps = {
+ markdown?: string;
+ theme?: 'github-light' | 'github-dark';
+ components?: Record;
+} & React.HTMLAttributes;
+
+export function Markdown({ markdown, theme = 'github-light', components, ...props }: MarkdownProps) {
+ const [content, setContent] = React.useState(null);
+
+ React.useEffect(() => {
+ processMarkdown({ markdown, theme, components }).then(setContent);
+ }, [markdown, theme, components]);
+
+ return {content}
;
+}
+
+const processMarkdown = async ({ markdown, theme, components }: MarkdownProps) => {
+ const processor = unified()
+ .use(remarkParse)
+ .use(remarkGfm)
+ .use(remarkRehype)
+ .use(rehypePrettyCode, {
+ theme,
+ keepBackground: theme === 'github-dark'
+ })
+ .use(rehypeReact, {
+ createElement: React.createElement,
+ Fragment,
+ jsx,
+ jsxs,
+ jsxDEV,
+ components
+ });
+
+ return processor.process(markdown).then((file) => file.result);
+};
diff --git a/packages/react-markdown/src/github.css b/packages/react-markdown/src/github.css
new file mode 100644
index 00000000..7d39d0d3
--- /dev/null
+++ b/packages/react-markdown/src/github.css
@@ -0,0 +1,156 @@
+/* 공통 레이아웃 스타일 */
+[data-rehype-pretty-code-figure] {
+ margin: 0;
+ overflow-x: auto;
+ scrollbar-width: none;
+ border-radius: 6px;
+ font-family: Consolas, 'Courier New', monospace;
+}
+
+[data-rehype-pretty-code-figure] pre {
+ margin: 0;
+ padding: 1.5rem;
+ background-color: #f6f8fa;
+}
+
+[data-rehype-pretty-code-figure] [data-line] {
+ display: block;
+}
+
+code {
+ counter-reset: line;
+}
+
+code > [data-line]:not([data-highlighted-line-id])::before {
+ counter-increment: line;
+ content: counter(line);
+ display: inline-block;
+ width: 2rem;
+ margin-right: 1rem;
+ text-align: right;
+ font-size: 0.875rem;
+}
+
+code span[data-highlighted-line-id='add'] {
+ border-left: 3px solid #28a745;
+ display: block;
+ background-color: rgba(40, 167, 69, 0.1);
+}
+
+code span[data-highlighted-line-id='rm'] {
+ border-left: 3px solid #d73a49;
+ display: block;
+ background-color: rgba(215, 58, 73, 0.1);
+}
+
+[data-highlighted-line-id='add']::before {
+ content: '+';
+}
+
+[data-highlighted-line-id='rm']::before {
+ content: '-';
+}
+
+[data-rehype-pretty-code-title] {
+ font-size: 0.875rem;
+ font-weight: 600;
+ border-top-left-radius: 6px;
+ border-top-right-radius: 6px;
+ border-bottom: none;
+}
+
+/* 테마 색상 관련 스타일 */
+[data-theme='github-light'] {
+ --background-color: #f6f8fa;
+ --line-number-color: #6a737d;
+ --text-color: #24292e;
+ --title-color: #586069;
+ --highlight-add-bg: rgba(40, 167, 69, 0.1);
+ --highlight-rm-bg: rgba(215, 58, 73, 0.1);
+ --highlight-char-bg: rgba(156, 163, 175, 0.2);
+}
+
+[data-theme='github-light'] [data-rehype-pretty-code-figure] {
+ background-color: var(--background-color);
+}
+
+[data-theme='github-light'] [data-rehype-pretty-code-figure] pre {
+ background-color: var(--background-color);
+}
+
+[data-theme='github-light'] code > [data-line]:not([data-highlighted-line-id])::before {
+ color: var(--line-number-color);
+}
+
+[data-theme='github-light'] code,
+[data-theme='github-light'] code span {
+ color: var(--text-color);
+}
+
+[data-theme='github-light'] [data-rehype-pretty-code-title] {
+ background-color: var(--background-color);
+ color: var(--title-color);
+}
+
+[data-theme='github-light'] code span[data-highlighted-line-id='add'] {
+ background-color: var(--highlight-add-bg);
+}
+
+[data-theme='github-light'] code span[data-highlighted-line-id='rm'] {
+ background-color: var(--highlight-rm-bg);
+}
+
+[data-theme='github-light'] [data-highlighted-chars] {
+ background-color: var(--highlight-char-bg);
+}
+
+/* 다크모드 코드블럭 스타일 */
+[data-theme='github-dark'] {
+ --background-color: #2d333b;
+ --line-number-color: #768390;
+ --text-color: #adbac7;
+ --title-color: #768390;
+ --highlight-add-bg: rgba(87, 171, 90, 0.15);
+ --highlight-rm-bg: rgba(229, 83, 75, 0.15);
+ --highlight-char-bg: rgba(166, 174, 183, 0.2);
+}
+
+[data-theme='github-dark'] [data-rehype-pretty-code-figure] {
+ background-color: var(--background-color);
+}
+
+[data-theme='github-dark'] [data-rehype-pretty-code-figure] pre {
+ background-color: var(--background-color);
+}
+
+[data-theme='github-dark'] code > [data-line]:not([data-highlighted-line-id])::before {
+ color: var(--line-number-color);
+}
+
+[data-theme='github-dark'] code,
+[data-theme='github-dark'] code span {
+ color: var(--text-color);
+}
+
+[data-theme='github-dark'] code span[data-highlighted-line-id='add'] {
+ border-left: 3px solid #57ab5a;
+ background-color: var(--highlight-add-bg);
+}
+
+[data-theme='github-dark'] code span[data-highlighted-line-id='rm'] {
+ border-left: 3px solid #e5534b;
+ background-color: var(--highlight-rm-bg);
+}
+
+[data-theme='github-dark'] [data-rehype-pretty-code-title] {
+ background-color: var(--background-color);
+ color: var(--title-color);
+}
+
+[data-theme='github-dark'] [data-highlighted-chars] {
+ background-color: var(--highlight-char-bg);
+}
+
+.terminal code > [data-line]::before {
+ content: '❯';
+}
diff --git a/packages/react-markdown/src/index.ts b/packages/react-markdown/src/index.ts
new file mode 100644
index 00000000..a5b9f6ef
--- /dev/null
+++ b/packages/react-markdown/src/index.ts
@@ -0,0 +1 @@
+export * from './Markdown';
diff --git a/packages/react-markdown/src/test/setupTests.ts b/packages/react-markdown/src/test/setupTests.ts
new file mode 100644
index 00000000..0bcc78cb
--- /dev/null
+++ b/packages/react-markdown/src/test/setupTests.ts
@@ -0,0 +1,7 @@
+import { cleanup } from '@testing-library/react';
+import { afterEach } from 'vitest';
+import '@testing-library/jest-dom/vitest';
+
+afterEach(() => {
+ cleanup();
+});
diff --git a/packages/react-markdown/src/vite-env.d.ts b/packages/react-markdown/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/packages/react-markdown/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/packages/react-markdown/tsconfig.app.json b/packages/react-markdown/tsconfig.app.json
new file mode 100644
index 00000000..7ed6f758
--- /dev/null
+++ b/packages/react-markdown/tsconfig.app.json
@@ -0,0 +1,31 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "jsx": "react-jsx",
+ "declaration": true, // 타입 선언 파일을 생성하도록 설정
+ "declarationDir": "dist", // 선언 파일을 저장할 디렉터리 지정
+ "outDir": "./dist", // 빌드 결과물을 저장할 디렉터리
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"]
+ }
+ },
+ "include": ["src"]
+}
diff --git a/packages/react-markdown/tsconfig.json b/packages/react-markdown/tsconfig.json
new file mode 100644
index 00000000..b42f234c
--- /dev/null
+++ b/packages/react-markdown/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "files": [],
+ "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
+ "include": ["src/**/*.{ts,tsx,css}"]
+}
diff --git a/packages/react-markdown/tsconfig.node.json b/packages/react-markdown/tsconfig.node.json
new file mode 100644
index 00000000..ac3a0fcc
--- /dev/null
+++ b/packages/react-markdown/tsconfig.node.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true,
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"]
+ }
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/packages/react-markdown/vite.config.ts b/packages/react-markdown/vite.config.ts
new file mode 100644
index 00000000..81ddd373
--- /dev/null
+++ b/packages/react-markdown/vite.config.ts
@@ -0,0 +1,22 @@
+///
+
+import react from '@vitejs/plugin-react-swc';
+import { resolve } from 'path';
+import { defineConfig } from 'vite';
+import tsconfigPaths from 'vite-tsconfig-paths';
+
+// https://vite.dev/config/
+export default defineConfig({
+ base: './',
+ test: {
+ globals: true,
+ environment: 'jsdom',
+ setupFiles: ['./src/test/setupTests.ts']
+ },
+ resolve: {
+ alias: {
+ '@': resolve(__dirname, './src')
+ }
+ },
+ plugins: [react(), tsconfigPaths()]
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 00000000..64509a5b
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,14051 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ '@commitlint/cli':
+ specifier: ^19.5.0
+ version: 19.5.0(@types/node@20.17.5)(typescript@5.6.3)
+ '@commitlint/config-conventional':
+ specifier: ^19.5.0
+ version: 19.5.0
+ husky:
+ specifier: ^9.1.6
+ version: 9.1.6
+ lint-staged:
+ specifier: ^15.2.10
+ version: 15.2.10
+ turbo:
+ specifier: ^2.2.3
+ version: 2.2.3
+
+ apps/backend:
+ dependencies:
+ '@nestjs/bull':
+ specifier: ^10.2.2
+ version: 10.2.2(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(bull@4.16.4)
+ '@nestjs/common':
+ specifier: ^10.0.0
+ version: 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core':
+ specifier: ^10.0.0
+ version: 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/jwt':
+ specifier: ^10.2.0
+ version: 10.2.0(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))
+ '@nestjs/platform-express':
+ specifier: ^10.0.0
+ version: 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)
+ '@nestjs/swagger':
+ specifier: ^8.0.7
+ version: 8.0.7(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)
+ '@nestjs/typeorm':
+ specifier: ^10.0.2
+ version: 10.0.2(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)(typeorm@0.3.20(ioredis@5.4.1)(mysql2@3.11.4)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)))
+ bull:
+ specifier: ^4.16.4
+ version: 4.16.4
+ class-transformer:
+ specifier: ^0.5.1
+ version: 0.5.1
+ class-validator:
+ specifier: ^0.14.1
+ version: 0.14.1
+ dockerode:
+ specifier: ^4.0.2
+ version: 4.0.2
+ dotenv:
+ specifier: ^16.4.5
+ version: 16.4.5
+ mysql2:
+ specifier: ^3.11.4
+ version: 3.11.4
+ reflect-metadata:
+ specifier: ^0.1.13
+ version: 0.1.14
+ rxjs:
+ specifier: ^7.8.1
+ version: 7.8.1
+ swagger-ui-express:
+ specifier: ^5.0.1
+ version: 5.0.1(express@4.21.1)
+ tar-stream:
+ specifier: ^3.1.7
+ version: 3.1.7
+ typeorm:
+ specifier: ^0.3.20
+ version: 0.3.20(ioredis@5.4.1)(mysql2@3.11.4)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ devDependencies:
+ '@nestjs/cli':
+ specifier: ^10.0.0
+ version: 10.4.5(@swc/core@1.7.42)
+ '@nestjs/config':
+ specifier: ^3.3.0
+ version: 3.3.0(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(rxjs@7.8.1)
+ '@nestjs/schematics':
+ specifier: ^10.0.0
+ version: 10.2.3(chokidar@3.6.0)(typescript@5.6.3)
+ '@nestjs/testing':
+ specifier: ^10.0.0
+ version: 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(@nestjs/platform-express@10.4.6)
+ '@types/express':
+ specifier: ^4.17.17
+ version: 4.17.21
+ '@types/jest':
+ specifier: ^29.5.2
+ version: 29.5.14
+ '@types/node':
+ specifier: ^20.3.1
+ version: 20.17.5
+ '@types/supertest':
+ specifier: ^2.0.12
+ version: 2.0.16
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^5.59.11
+ version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/parser':
+ specifier: ^5.59.11
+ version: 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ eslint:
+ specifier: ^8.42.0
+ version: 8.57.1
+ eslint-config-prettier:
+ specifier: ^8.8.0
+ version: 8.10.0(eslint@8.57.1)
+ eslint-plugin-import:
+ specifier: ^2.31.0
+ version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)
+ eslint-plugin-no-relative-import-paths:
+ specifier: ^1.5.5
+ version: 1.5.5
+ eslint-plugin-prettier:
+ specifier: ^4.2.1
+ version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8)
+ jest:
+ specifier: ^29.5.0
+ version: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ prettier:
+ specifier: ^2.8.8
+ version: 2.8.8
+ source-map-support:
+ specifier: ^0.5.21
+ version: 0.5.21
+ supertest:
+ specifier: ^6.3.3
+ version: 6.3.4
+ ts-jest:
+ specifier: ^29.1.0
+ version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.6.3)
+ ts-loader:
+ specifier: ^9.4.3
+ version: 9.5.1(typescript@5.6.3)(webpack@5.94.0(@swc/core@1.7.42))
+ ts-node:
+ specifier: ^10.9.1
+ version: 10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)
+ tsconfig-paths:
+ specifier: ^4.2.0
+ version: 4.2.0
+ typescript:
+ specifier: ^5.1.3
+ version: 5.6.3
+
+ apps/frontend:
+ dependencies:
+ '@froxy/design':
+ specifier: workspace:^
+ version: link:../../packages/design
+ '@froxy/react-markdown':
+ specifier: workspace:^
+ version: link:../../packages/react-markdown
+ '@hookform/resolvers':
+ specifier: ^3.9.1
+ version: 3.9.1(react-hook-form@7.53.2(react@18.3.1))
+ '@lottiefiles/dotlottie-react':
+ specifier: ^0.10.0
+ version: 0.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@tanstack/react-query':
+ specifier: ^5.59.19
+ version: 5.59.19(react@18.3.1)
+ '@tanstack/react-router':
+ specifier: ^1.78.3
+ version: 1.78.3(@tanstack/router-generator@1.78.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ axios:
+ specifier: ^1.7.7
+ version: 1.7.7
+ framer-motion:
+ specifier: ^11.11.11
+ version: 11.11.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ react-hook-form:
+ specifier: ^7.53.2
+ version: 7.53.2(react@18.3.1)
+ react-icons:
+ specifier: ^5.3.0
+ version: 5.3.0(react@18.3.1)
+ zod:
+ specifier: ^3.23.8
+ version: 3.23.8
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.13.0
+ version: 9.13.0
+ '@playwright/test':
+ specifier: ^1.49.0
+ version: 1.49.0
+ '@tanstack/react-query-devtools':
+ specifier: ^5.59.19
+ version: 5.59.19(@tanstack/react-query@5.59.19(react@18.3.1))(react@18.3.1)
+ '@tanstack/router-devtools':
+ specifier: ^1.78.3
+ version: 1.78.3(@tanstack/react-router@1.78.3(@tanstack/router-generator@1.78.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@tanstack/router-plugin':
+ specifier: ^1.78.3
+ version: 1.78.3(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))(webpack-sources@3.2.3)(webpack@5.96.1(@swc/core@1.7.42))
+ '@testing-library/jest-dom':
+ specifier: ^6.6.3
+ version: 6.6.3
+ '@testing-library/react':
+ specifier: ^16.0.1
+ version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/node':
+ specifier: ^20.3.1
+ version: 20.17.5
+ '@types/react':
+ specifier: ^18.3.12
+ version: 18.3.12
+ '@types/react-dom':
+ specifier: ^18.3.1
+ version: 18.3.1
+ '@typescript-eslint/parser':
+ specifier: ^5.59.11
+ version: 5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@vitejs/plugin-react-swc':
+ specifier: ^3.5.0
+ version: 3.7.1(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.47)
+ eslint:
+ specifier: ^9.13.0
+ version: 9.13.0(jiti@1.21.6)
+ eslint-config-prettier:
+ specifier: ^8.8.0
+ version: 8.10.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-import:
+ specifier: ^2.31.0
+ version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-no-relative-import-paths:
+ specifier: ^1.5.5
+ version: 1.5.5
+ eslint-plugin-prettier:
+ specifier: ^4.2.1
+ version: 4.2.1(eslint-config-prettier@8.10.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@2.8.8)
+ eslint-plugin-react-hooks:
+ specifier: ^5.0.0
+ version: 5.0.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.14
+ version: 0.4.14(eslint@9.13.0(jiti@1.21.6))
+ globals:
+ specifier: ^15.11.0
+ version: 15.11.0
+ jsdom:
+ specifier: ^25.0.1
+ version: 25.0.1
+ msw:
+ specifier: ^2.6.4
+ version: 2.6.4(@types/node@20.17.5)(typescript@5.6.3)
+ postcss:
+ specifier: ^8.4.47
+ version: 8.4.47
+ prettier:
+ specifier: 2.x
+ version: 2.8.8
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ typescript:
+ specifier: ~5.6.2
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.11.0
+ version: 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ vite:
+ specifier: ^5.4.10
+ version: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ vite-tsconfig-paths:
+ specifier: ^5.0.1
+ version: 5.0.1(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ vitest:
+ specifier: ^2.1.4
+ version: 2.1.4(@types/node@20.17.5)(jsdom@25.0.1)(msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3))(terser@5.36.0)
+
+ packages/design:
+ dependencies:
+ '@radix-ui/react-accordion':
+ specifier: ^1.2.1
+ version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-select':
+ specifier: ^2.1.2
+ version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-separator':
+ specifier: ^1.1.0
+ version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot':
+ specifier: ^1.1.0
+ version: 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-switch':
+ specifier: ^1.1.1
+ version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-tabs':
+ specifier: ^1.1.1
+ version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ autoprefixer:
+ specifier: ^10.4.20
+ version: 10.4.20(postcss@8.4.47)
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ embla-carousel-autoplay:
+ specifier: ^8.5.1
+ version: 8.5.1(embla-carousel@8.3.1)
+ embla-carousel-react:
+ specifier: ^8.3.1
+ version: 8.3.1(react@18.3.1)
+ lucide-react:
+ specifier: ^0.454.0
+ version: 0.454.0(react@18.3.1)
+ postcss:
+ specifier: ^8.4.47
+ version: 8.4.47
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ tailwind-merge:
+ specifier: ^2.5.4
+ version: 2.5.4
+ tailwindcss:
+ specifier: ^3.4.14
+ version: 3.4.14(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)))
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.13.0
+ version: 9.13.0
+ '@types/react':
+ specifier: ^18.3.12
+ version: 18.3.12
+ '@types/react-dom':
+ specifier: ^18.3.1
+ version: 18.3.1
+ '@vitejs/plugin-react-swc':
+ specifier: ^3.5.0
+ version: 3.7.1(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ eslint:
+ specifier: ^9.13.0
+ version: 9.13.0(jiti@1.21.6)
+ eslint-plugin-react-hooks:
+ specifier: ^5.0.0
+ version: 5.0.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.14
+ version: 0.4.14(eslint@9.13.0(jiti@1.21.6))
+ globals:
+ specifier: ^15.11.0
+ version: 15.11.0
+ typescript:
+ specifier: ~5.6.2
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.11.0
+ version: 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ vite:
+ specifier: ^5.4.10
+ version: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+
+ packages/react-markdown:
+ dependencies:
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ rehype:
+ specifier: ^13.0.2
+ version: 13.0.2
+ rehype-pretty-code:
+ specifier: ^0.14.0
+ version: 0.14.0(shiki@1.22.2)
+ rehype-react:
+ specifier: ^8.0.0
+ version: 8.0.0
+ remark-gfm:
+ specifier: ^4.0.0
+ version: 4.0.0
+ remark-parse:
+ specifier: ^11.0.0
+ version: 11.0.0
+ remark-rehype:
+ specifier: ^11.1.1
+ version: 11.1.1
+ unified:
+ specifier: ^11.0.5
+ version: 11.0.5
+ devDependencies:
+ '@eslint/js':
+ specifier: ^9.13.0
+ version: 9.13.0
+ '@testing-library/jest-dom':
+ specifier: ^6.6.3
+ version: 6.6.3
+ '@testing-library/react':
+ specifier: ^16.0.1
+ version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/react':
+ specifier: ^18.3.12
+ version: 18.3.12
+ '@types/react-dom':
+ specifier: ^18.3.1
+ version: 18.3.1
+ '@typescript-eslint/parser':
+ specifier: ^5.59.11
+ version: 5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@vitejs/plugin-react-swc':
+ specifier: ^3.5.0
+ version: 3.7.1(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ eslint:
+ specifier: ^9.13.0
+ version: 9.13.0(jiti@1.21.6)
+ eslint-config-prettier:
+ specifier: ^8.8.0
+ version: 8.10.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-import:
+ specifier: ^2.31.0
+ version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-no-relative-import-paths:
+ specifier: ^1.5.5
+ version: 1.5.5
+ eslint-plugin-prettier:
+ specifier: ^4.2.1
+ version: 4.2.1(eslint-config-prettier@8.10.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@2.8.8)
+ eslint-plugin-react-hooks:
+ specifier: ^5.0.0
+ version: 5.0.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.14
+ version: 0.4.14(eslint@9.13.0(jiti@1.21.6))
+ globals:
+ specifier: ^15.11.0
+ version: 15.11.0
+ jsdom:
+ specifier: ^25.0.1
+ version: 25.0.1
+ prettier:
+ specifier: 2.x
+ version: 2.8.8
+ typescript:
+ specifier: ~5.6.2
+ version: 5.6.3
+ typescript-eslint:
+ specifier: ^8.11.0
+ version: 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ vite:
+ specifier: ^5.4.10
+ version: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ vite-plugin-dts:
+ specifier: ^4.3.0
+ version: 4.3.0(@types/node@20.17.5)(rollup@4.24.3)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ vite-tsconfig-paths:
+ specifier: ^5.0.1
+ version: 5.0.1(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ vitest:
+ specifier: ^2.1.4
+ version: 2.1.4(@types/node@20.17.5)(jsdom@25.0.1)(msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3))(terser@5.36.0)
+
+packages:
+
+ '@adobe/css-tools@4.4.0':
+ resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==}
+
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@angular-devkit/core@17.3.11':
+ resolution: {integrity: sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==}
+ engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ chokidar: ^3.5.2
+ peerDependenciesMeta:
+ chokidar:
+ optional: true
+
+ '@angular-devkit/core@17.3.8':
+ resolution: {integrity: sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==}
+ engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ chokidar: ^3.5.2
+ peerDependenciesMeta:
+ chokidar:
+ optional: true
+
+ '@angular-devkit/schematics-cli@17.3.8':
+ resolution: {integrity: sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==}
+ engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ hasBin: true
+
+ '@angular-devkit/schematics@17.3.11':
+ resolution: {integrity: sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==}
+ engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@angular-devkit/schematics@17.3.8':
+ resolution: {integrity: sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==}
+ engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@babel/code-frame@7.26.2':
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.26.2':
+ resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.26.2':
+ resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.25.9':
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.25.9':
+ resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.26.2':
+ resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-async-generators@7.8.4':
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-bigint@7.8.3':
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-properties@7.12.13':
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-static-block@7.14.5':
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.26.0':
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-meta@7.10.4':
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-json-strings@7.8.3':
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4':
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3':
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3':
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5':
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-top-level-await@7.14.5':
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.25.9':
+ resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.26.0':
+ resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
+ engines: {node: '>=6.9.0'}
+
+ '@balena/dockerignore@1.0.2':
+ resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==}
+
+ '@bcoe/v8-coverage@0.2.3':
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+
+ '@bundled-es-modules/cookie@2.0.1':
+ resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==}
+
+ '@bundled-es-modules/statuses@1.0.1':
+ resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==}
+
+ '@bundled-es-modules/tough-cookie@0.1.6':
+ resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==}
+
+ '@colors/colors@1.5.0':
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+
+ '@commitlint/cli@19.5.0':
+ resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==}
+ engines: {node: '>=v18'}
+ hasBin: true
+
+ '@commitlint/config-conventional@19.5.0':
+ resolution: {integrity: sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/config-validator@19.5.0':
+ resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/ensure@19.5.0':
+ resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/execute-rule@19.5.0':
+ resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/format@19.5.0':
+ resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/is-ignored@19.5.0':
+ resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/lint@19.5.0':
+ resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/load@19.5.0':
+ resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/message@19.5.0':
+ resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/parse@19.5.0':
+ resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/read@19.5.0':
+ resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/resolve-extends@19.5.0':
+ resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/rules@19.5.0':
+ resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/to-lines@19.5.0':
+ resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/top-level@19.5.0':
+ resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/types@19.5.0':
+ resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==}
+ engines: {node: '>=v18'}
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
+ '@esbuild/aix-ppc64@0.21.5':
+ resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.23.1':
+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.21.5':
+ resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.23.1':
+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.21.5':
+ resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.23.1':
+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.21.5':
+ resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.23.1':
+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.21.5':
+ resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.23.1':
+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.21.5':
+ resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.23.1':
+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.21.5':
+ resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.23.1':
+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.21.5':
+ resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.23.1':
+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.21.5':
+ resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.23.1':
+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.21.5':
+ resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.23.1':
+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.21.5':
+ resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.23.1':
+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.21.5':
+ resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.23.1':
+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.21.5':
+ resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.23.1':
+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.21.5':
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.23.1':
+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.21.5':
+ resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.23.1':
+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.21.5':
+ resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.23.1':
+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.21.5':
+ resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.21.5':
+ resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.21.5':
+ resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.23.1':
+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.21.5':
+ resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.23.1':
+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.21.5':
+ resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.23.1':
+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.21.5':
+ resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.23.1':
+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.18.0':
+ resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.7.0':
+ resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@2.1.4':
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@eslint/eslintrc@3.1.0':
+ resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@8.57.1':
+ resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@eslint/js@9.13.0':
+ resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.4':
+ resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.2':
+ resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.6.8':
+ resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+
+ '@floating-ui/dom@1.6.12':
+ resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
+
+ '@floating-ui/react-dom@2.1.2':
+ resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.8':
+ resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+
+ '@hookform/resolvers@3.9.1':
+ resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==}
+ peerDependencies:
+ react-hook-form: ^7.0.0
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/config-array@0.13.0':
+ resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
+ engines: {node: '>=10.10.0'}
+ deprecated: Use @eslint/config-array instead
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/object-schema@2.0.3':
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ deprecated: Use @eslint/object-schema instead
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@inquirer/confirm@5.0.2':
+ resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/core@10.1.0':
+ resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/figures@1.0.8':
+ resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==}
+ engines: {node: '>=18'}
+
+ '@inquirer/type@3.0.1':
+ resolution: {integrity: sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@ioredis/commands@1.2.0':
+ resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
+ '@jest/console@29.7.0':
+ resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/core@29.7.0':
+ resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
+ '@jest/environment@29.7.0':
+ resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/expect-utils@29.7.0':
+ resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/expect@29.7.0':
+ resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/fake-timers@29.7.0':
+ resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/globals@29.7.0':
+ resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/reporters@29.7.0':
+ resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
+ '@jest/schemas@29.6.3':
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/source-map@29.6.3':
+ resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/test-result@29.7.0':
+ resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/test-sequencer@29.7.0':
+ resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/transform@29.7.0':
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/types@29.6.3':
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jridgewell/gen-mapping@0.3.5':
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.6':
+ resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
+ '@ljharb/through@2.3.13':
+ resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==}
+ engines: {node: '>= 0.4'}
+
+ '@lottiefiles/dotlottie-react@0.10.0':
+ resolution: {integrity: sha512-krPJUIqpt7VluWc0aRWk0lYScCDSlbCpWvImU5eyJZeyroZ87bZYb+YlgUbtLHZ77DWmIBl4kGMhupU8+ugPSw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ '@lottiefiles/dotlottie-web@0.37.0':
+ resolution: {integrity: sha512-dCtQkYlq9GDswJNmcIlUaAskxrsJ56SRhY8woNsHuIPWy+tfP9tgf1fA9fZ1Oj72DVdyYkK0DxLk58HhBrmpBQ==}
+
+ '@lukeed/csprng@1.1.0':
+ resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==}
+ engines: {node: '>=8'}
+
+ '@microsoft/api-extractor-model@7.29.8':
+ resolution: {integrity: sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==}
+
+ '@microsoft/api-extractor@7.47.11':
+ resolution: {integrity: sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==}
+ hasBin: true
+
+ '@microsoft/tsdoc-config@0.17.0':
+ resolution: {integrity: sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==}
+
+ '@microsoft/tsdoc@0.15.0':
+ resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==}
+
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
+ resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3':
+ resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3':
+ resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3':
+ resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3':
+ resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
+ resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@mswjs/interceptors@0.36.10':
+ resolution: {integrity: sha512-GXrJgakgJW3DWKueebkvtYgGKkxA7s0u5B0P5syJM5rvQUnrpLPigvci8Hukl7yEM+sU06l+er2Fgvx/gmiRgg==}
+ engines: {node: '>=18'}
+
+ '@nestjs/bull-shared@10.2.2':
+ resolution: {integrity: sha512-bMIEILYYovQWfdz6fCSTgqb/zuKyGmNSc7guB56MiZVW84JloUHb8330nNh3VWaamJKGtUzawbEoG2VR3uVeOg==}
+ peerDependencies:
+ '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
+ '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
+
+ '@nestjs/bull@10.2.2':
+ resolution: {integrity: sha512-5UW1X82C03EUm4DH/Cj+zeN2YdcfWUJnNji4tIXHMJplYKLKQA3QXIiwtttLBDO0omYx5WL0MyteRc69CDjoNg==}
+ peerDependencies:
+ '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
+ '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
+ bull: ^3.3 || ^4.0.0
+
+ '@nestjs/cli@10.4.5':
+ resolution: {integrity: sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==}
+ engines: {node: '>= 16.14'}
+ hasBin: true
+ peerDependencies:
+ '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0
+ '@swc/core': ^1.3.62
+ peerDependenciesMeta:
+ '@swc/cli':
+ optional: true
+ '@swc/core':
+ optional: true
+
+ '@nestjs/common@10.4.6':
+ resolution: {integrity: sha512-KkezkZvU9poWaNq4L+lNvx+386hpOxPJkfXBBeSMrcqBOx8kVr36TGN2uYkF4Ta4zNu1KbCjmZbc0rhHSg296g==}
+ peerDependencies:
+ class-transformer: '*'
+ class-validator: '*'
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ rxjs: ^7.1.0
+ peerDependenciesMeta:
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nestjs/config@3.3.0':
+ resolution: {integrity: sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==}
+ peerDependencies:
+ '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
+ rxjs: ^7.1.0
+
+ '@nestjs/core@10.4.6':
+ resolution: {integrity: sha512-zXVPxCNRfO6gAy0yvEDjUxE/8gfZICJFpsl2lZAUH31bPb6m+tXuhUq2mVCTEltyMYQ+DYtRe+fEYM2v152N1g==}
+ peerDependencies:
+ '@nestjs/common': ^10.0.0
+ '@nestjs/microservices': ^10.0.0
+ '@nestjs/platform-express': ^10.0.0
+ '@nestjs/websockets': ^10.0.0
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ rxjs: ^7.1.0
+ peerDependenciesMeta:
+ '@nestjs/microservices':
+ optional: true
+ '@nestjs/platform-express':
+ optional: true
+ '@nestjs/websockets':
+ optional: true
+
+ '@nestjs/jwt@10.2.0':
+ resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==}
+ peerDependencies:
+ '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
+
+ '@nestjs/mapped-types@2.0.6':
+ resolution: {integrity: sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==}
+ peerDependencies:
+ '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
+ class-transformer: ^0.4.0 || ^0.5.0
+ class-validator: ^0.13.0 || ^0.14.0
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ peerDependenciesMeta:
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nestjs/platform-express@10.4.6':
+ resolution: {integrity: sha512-HcyCpAKccAasrLSGRTGWv5BKRs0rwTIFOSsk6laNyqfqvgvYcJQAedarnm4jmaemtmSJ0PFI9PmtEZADd2ahCg==}
+ peerDependencies:
+ '@nestjs/common': ^10.0.0
+ '@nestjs/core': ^10.0.0
+
+ '@nestjs/schematics@10.2.3':
+ resolution: {integrity: sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==}
+ peerDependencies:
+ typescript: '>=4.8.2'
+
+ '@nestjs/swagger@8.0.7':
+ resolution: {integrity: sha512-zaTMCEZ/CxX7QYF110nTqJsn7eCXp4VI9kv7+AdUcIlBmhhgJpggBw2Mx2p6xVjyz1EoWXGfxxWKnxEyaQwFlg==}
+ peerDependencies:
+ '@fastify/static': ^6.0.0 || ^7.0.0
+ '@nestjs/common': ^9.0.0 || ^10.0.0
+ '@nestjs/core': ^9.0.0 || ^10.0.0
+ class-transformer: '*'
+ class-validator: '*'
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ peerDependenciesMeta:
+ '@fastify/static':
+ optional: true
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nestjs/testing@10.4.6':
+ resolution: {integrity: sha512-aiDicKhlGibVGNYuew399H5qZZXaseOBT/BS+ERJxxCmco7ZdAqaujsNjSaSbTK9ojDPf27crLT0C4opjqJe3A==}
+ peerDependencies:
+ '@nestjs/common': ^10.0.0
+ '@nestjs/core': ^10.0.0
+ '@nestjs/microservices': ^10.0.0
+ '@nestjs/platform-express': ^10.0.0
+ peerDependenciesMeta:
+ '@nestjs/microservices':
+ optional: true
+ '@nestjs/platform-express':
+ optional: true
+
+ '@nestjs/typeorm@10.0.2':
+ resolution: {integrity: sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==}
+ peerDependencies:
+ '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0
+ '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0
+ reflect-metadata: ^0.1.13 || ^0.2.0
+ rxjs: ^7.2.0
+ typeorm: ^0.3.0
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nuxtjs/opencollective@0.3.2':
+ resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==}
+ engines: {node: '>=8.0.0', npm: '>=5.0.0'}
+ hasBin: true
+
+ '@open-draft/deferred-promise@2.2.0':
+ resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
+
+ '@open-draft/logger@0.3.0':
+ resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==}
+
+ '@open-draft/until@2.1.0':
+ resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@playwright/test@1.49.0':
+ resolution: {integrity: sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ '@radix-ui/number@1.1.0':
+ resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
+
+ '@radix-ui/primitive@1.1.0':
+ resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
+
+ '@radix-ui/react-accordion@1.2.1':
+ resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==}
+ 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
+
+ '@radix-ui/react-arrow@1.1.0':
+ resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+ 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
+
+ '@radix-ui/react-collapsible@1.1.1':
+ resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==}
+ 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
+
+ '@radix-ui/react-collection@1.1.0':
+ resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
+ 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
+
+ '@radix-ui/react-compose-refs@1.1.0':
+ resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.0':
+ resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.1':
+ resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.1':
+ resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==}
+ 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
+
+ '@radix-ui/react-focus-guards@1.1.1':
+ resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.0':
+ resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+ 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
+
+ '@radix-ui/react-id@1.1.0':
+ resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-popper@1.2.0':
+ resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+ 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
+
+ '@radix-ui/react-portal@1.1.2':
+ resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==}
+ 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
+
+ '@radix-ui/react-presence@1.1.1':
+ resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==}
+ 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
+
+ '@radix-ui/react-primitive@2.0.0':
+ resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+ 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
+
+ '@radix-ui/react-roving-focus@1.1.0':
+ resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==}
+ 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
+
+ '@radix-ui/react-select@2.1.2':
+ resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==}
+ 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
+
+ '@radix-ui/react-separator@1.1.0':
+ resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==}
+ 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
+
+ '@radix-ui/react-slot@1.1.0':
+ resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-switch@1.1.1':
+ resolution: {integrity: sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==}
+ 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
+
+ '@radix-ui/react-tabs@1.1.1':
+ resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==}
+ 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
+
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-controllable-state@1.1.0':
+ resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.0':
+ resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.1.0':
+ resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
+ 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
+
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+
+ '@rollup/pluginutils@5.1.3':
+ resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.24.3':
+ resolution: {integrity: sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.24.3':
+ resolution: {integrity: sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.24.3':
+ resolution: {integrity: sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.24.3':
+ resolution: {integrity: sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.24.3':
+ resolution: {integrity: sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.24.3':
+ resolution: {integrity: sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.3':
+ resolution: {integrity: sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.24.3':
+ resolution: {integrity: sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.24.3':
+ resolution: {integrity: sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.24.3':
+ resolution: {integrity: sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.3':
+ resolution: {integrity: sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.24.3':
+ resolution: {integrity: sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.24.3':
+ resolution: {integrity: sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.24.3':
+ resolution: {integrity: sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.24.3':
+ resolution: {integrity: sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.24.3':
+ resolution: {integrity: sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.24.3':
+ resolution: {integrity: sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.24.3':
+ resolution: {integrity: sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@rushstack/node-core-library@5.9.0':
+ resolution: {integrity: sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/rig-package@0.5.3':
+ resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==}
+
+ '@rushstack/terminal@0.14.2':
+ resolution: {integrity: sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/ts-command-line@4.23.0':
+ resolution: {integrity: sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==}
+
+ '@scarf/scarf@1.4.0':
+ resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==}
+
+ '@shikijs/core@1.22.2':
+ resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==}
+
+ '@shikijs/engine-javascript@1.22.2':
+ resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==}
+
+ '@shikijs/engine-oniguruma@1.22.2':
+ resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==}
+
+ '@shikijs/types@1.22.2':
+ resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==}
+
+ '@shikijs/vscode-textmate@9.3.0':
+ resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==}
+
+ '@sinclair/typebox@0.27.8':
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+
+ '@sinonjs/commons@3.0.1':
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+
+ '@sinonjs/fake-timers@10.3.0':
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+
+ '@sqltools/formatter@1.2.5':
+ resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==}
+
+ '@swc/core-darwin-arm64@1.7.42':
+ resolution: {integrity: sha512-fWhaCs2+8GDRIcjExVDEIfbptVrxDqG8oHkESnXgymmvqTWzWei5SOnPNMS8Q+MYsn/b++Y2bDxkcwmq35Bvxg==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@swc/core-darwin-x64@1.7.42':
+ resolution: {integrity: sha512-ZaVHD2bijrlkCyD7NDzLmSK849Jgcx+6DdL4x1dScoz1slJ8GTvLtEu0JOUaaScQwA+cVlhmrmlmi9ssjbRLGQ==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@swc/core-linux-arm-gnueabihf@1.7.42':
+ resolution: {integrity: sha512-iF0BJj7hVTbY/vmbvyzVTh/0W80+Q4fbOYschdUM3Bsud39TA+lSaPOefOHywkNH58EQ1z3EAxYcJOWNES7GFQ==}
+ engines: {node: '>=10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@swc/core-linux-arm64-gnu@1.7.42':
+ resolution: {integrity: sha512-xGu8j+DOLYTLkVmsfZPJbNPW1EkiWgSucT0nOlz77bLxImukt/0+HVm2hOwHSKuArQ8C3cjahAMY3b/s4VH2ww==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@swc/core-linux-arm64-musl@1.7.42':
+ resolution: {integrity: sha512-qtW3JNO7i1yHEko59xxz+jY38+tYmB96JGzj6XzygMbYJYZDYbrOpXQvKbMGNG3YeTDan7Fp2jD0dlKf7NgDPA==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@swc/core-linux-x64-gnu@1.7.42':
+ resolution: {integrity: sha512-F9WY1TN+hhhtiEzZjRQziNLt36M5YprMeOBHjsLVNqwgflzleSI7ulgnlQECS8c8zESaXj3ksGduAoJYtPC1cA==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@swc/core-linux-x64-musl@1.7.42':
+ resolution: {integrity: sha512-7YMdOaYKLMQ8JGfnmRDwidpLFs/6ka+80zekeM0iCVO48yLrJR36G0QGXzMjKsXI0BPhq+mboZRRENK4JfQnEA==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@swc/core-win32-arm64-msvc@1.7.42':
+ resolution: {integrity: sha512-C5CYWaIZEyqPl5W/EwcJ/mLBJFHVoUEa/IwWi0b4q2fCXcSCktQGwKXOQ+d67GneiZoiq0HasgcdMmMpGS9YRQ==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@swc/core-win32-ia32-msvc@1.7.42':
+ resolution: {integrity: sha512-3j47seZ5pO62mbrqvPe1iwhe2BXnM5q7iB+n2xgA38PCGYt0mnaJafqmpCXm/uYZOCMqSNynaoOWCMMZm4sqtA==}
+ engines: {node: '>=10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@swc/core-win32-x64-msvc@1.7.42':
+ resolution: {integrity: sha512-FXl9MdeUogZLGDcLr6QIRdDVkpG0dkN4MLM4dwQ5kcAk+XfKPrQibX6M2kcfhsCx+jtBqtK7hRFReRXPWJZGbA==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@swc/core@1.7.42':
+ resolution: {integrity: sha512-iQrRk3SKndQZ4ptJv1rzeQSiCYQIhMjiO97QXOlCcCoaazOLKPnLnXzU4Kv0FuBFyYfG2FE94BoR0XI2BN02qw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@swc/helpers': '*'
+ peerDependenciesMeta:
+ '@swc/helpers':
+ optional: true
+
+ '@swc/counter@0.1.3':
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+
+ '@swc/types@0.1.13':
+ resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==}
+
+ '@tanstack/history@1.61.1':
+ resolution: {integrity: sha512-2CqERleeqO3hkhJmyJm37tiL3LYgeOpmo8szqdjgtnnG0z7ZpvzkZz6HkfOr9Ca/ha7mhAiouSvLYuLkM37AMg==}
+ engines: {node: '>=12'}
+
+ '@tanstack/query-core@5.59.17':
+ resolution: {integrity: sha512-jWdDiif8kaqnRGHNXAa9CnudtxY5v9DUxXhodgqX2Rwzj+1UwStDHEbBd9IA5C7VYAaJ2s+BxFR6PUBs8ERorA==}
+
+ '@tanstack/query-devtools@5.59.19':
+ resolution: {integrity: sha512-Gw+3zsADpqiYgx/6MMr9bP1+x2LR8vOuGjo5Un/89qwwP3z7WAHPWFagLFDYkLq68NX7ekUpW/EOYlUMugMXGA==}
+
+ '@tanstack/react-query-devtools@5.59.19':
+ resolution: {integrity: sha512-mYFWTHLtJr2HdyYPZPzzvQ2ksCsSL6L04fCtusPFD3waskXrtmvWvyuDIGeEGdVAYS0Urwxw/0sYvcTVQZH+zQ==}
+ peerDependencies:
+ '@tanstack/react-query': ^5.59.19
+ react: ^18 || ^19
+
+ '@tanstack/react-query@5.59.19':
+ resolution: {integrity: sha512-xLRfyFyQOFcLltKCds0LijfC6/HQJrrTTnZB8ciyn74LIkVAm++vZJ6eUVG20RmJtdP8REdy7vSOYW4M3//XLA==}
+ peerDependencies:
+ react: ^18 || ^19
+
+ '@tanstack/react-router@1.78.3':
+ resolution: {integrity: sha512-e4Mws3QTLDs++EyP3HwYKz+yZP3LyO5LonqEXngHYM8UjF2lvn6BnNR4vCmFNZfMFXpafR7jHSh7VOdBwnCngA==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@tanstack/router-generator': 1.78.3
+ react: '>=18'
+ react-dom: '>=18'
+ peerDependenciesMeta:
+ '@tanstack/router-generator':
+ optional: true
+
+ '@tanstack/react-store@0.5.6':
+ resolution: {integrity: sha512-SitIpS5jTj28DajjLpWbIX+YetmJL+6PRY0DKKiCGBKfYIqj3ryODQYF3jB3SNoR9ifUA/jFkqbJdBKFtWd+AQ==}
+ peerDependencies:
+ react: ^17.0.0 || ^18.0.0
+ react-dom: ^17.0.0 || ^18.0.0
+
+ '@tanstack/router-devtools@1.78.3':
+ resolution: {integrity: sha512-JwlW6m5C1hzfw2roHvxptwf8l4xREWFhP7FZ6lu/tZZcFnBY4G5vrEhtbXdOBRXFOn3Y8AzD4+A1a52qpWcNWg==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@tanstack/react-router': ^1.78.3
+ react: '>=18'
+ react-dom: '>=18'
+
+ '@tanstack/router-generator@1.78.3':
+ resolution: {integrity: sha512-8/gy2+dzXeovCYsTeQZO8XvKqU5+cZi/QEIta8p74jmS0fftsIOFb1gV33cGoz+qts5ZThizDP9k8fIqHpOSQA==}
+ engines: {node: '>=12'}
+
+ '@tanstack/router-plugin@1.78.3':
+ resolution: {integrity: sha512-u8xkTfITnbri0VUvI3/nHGfzX11E0lLKs4MNEyMWemDptjgj70yRr+UeU/wcg44PFhwjVFIJ2xZSnBoMtDMh3Q==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@rsbuild/core': '>=1.0.2'
+ vite: '>=5.0.0'
+ webpack: '>=5.92.0'
+ peerDependenciesMeta:
+ '@rsbuild/core':
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
+
+ '@tanstack/store@0.5.5':
+ resolution: {integrity: sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==}
+
+ '@tanstack/virtual-file-routes@1.64.0':
+ resolution: {integrity: sha512-soW+gE9QTmMaqXM17r7y1p8NiQVIIECjdTaYla8BKL5Flj030m3KuxEQoiG1XgjtA0O7ayznFz2YvPcXIy3qDg==}
+ engines: {node: '>=12'}
+
+ '@testing-library/dom@10.4.0':
+ resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
+ engines: {node: '>=18'}
+
+ '@testing-library/jest-dom@6.6.3':
+ resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==}
+ engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
+ '@testing-library/react@16.0.1':
+ resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@testing-library/dom': ^10.0.0
+ '@types/react': ^18.0.0
+ '@types/react-dom': ^18.0.0
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@tsconfig/node10@1.0.11':
+ resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+
+ '@types/argparse@1.0.38':
+ resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
+
+ '@types/aria-query@5.0.4':
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.6':
+ resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+ '@types/body-parser@1.19.5':
+ resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/conventional-commits-parser@5.0.0':
+ resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==}
+
+ '@types/cookie@0.6.0':
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+
+ '@types/cookiejar@2.1.5':
+ resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/eslint-scope@3.7.7':
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/express-serve-static-core@4.19.6':
+ resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
+
+ '@types/express@4.17.21':
+ resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+
+ '@types/graceful-fs@4.1.9':
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/http-errors@2.0.4':
+ resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
+
+ '@types/istanbul-lib-coverage@2.0.6':
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+ '@types/istanbul-lib-report@3.0.3':
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+ '@types/istanbul-reports@3.0.4':
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+ '@types/jest@29.5.14':
+ resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/jsonwebtoken@9.0.5':
+ resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/methods@1.1.4':
+ resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==}
+
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ '@types/node@20.17.5':
+ resolution: {integrity: sha512-n8FYY/pRxu496441gIcAQFZPKXbhsd6VZygcq+PTSZ75eMh/Ke0hCAROdUa21qiFqKNsPPYic46yXDO1JGiPBQ==}
+
+ '@types/prop-types@15.7.13':
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+
+ '@types/qs@6.9.16':
+ resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/react-dom@18.3.1':
+ resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==}
+
+ '@types/react@18.3.12':
+ resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
+
+ '@types/semver@7.5.8':
+ resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+
+ '@types/send@0.17.4':
+ resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+
+ '@types/serve-static@1.15.7':
+ resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
+
+ '@types/stack-utils@2.0.3':
+ resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+
+ '@types/statuses@2.0.5':
+ resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==}
+
+ '@types/superagent@8.1.9':
+ resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==}
+
+ '@types/supertest@2.0.16':
+ resolution: {integrity: sha512-6c2ogktZ06tr2ENoZivgm7YnprnhYE4ZoXGMY+oA7IuAf17M8FWvujXZGmxLv8y0PTyts4x5A+erSwVUFA8XSg==}
+
+ '@types/tough-cookie@4.0.5':
+ resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
+
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/validator@13.12.2':
+ resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==}
+
+ '@types/yargs-parser@21.0.3':
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+ '@types/yargs@17.0.33':
+ resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+
+ '@typescript-eslint/eslint-plugin@5.62.0':
+ resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/eslint-plugin@8.12.2':
+ resolution: {integrity: sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/parser@5.62.0':
+ resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/parser@8.12.2':
+ resolution: {integrity: sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/scope-manager@8.12.2':
+ resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@5.62.0':
+ resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/type-utils@8.12.2':
+ resolution: {integrity: sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/types@5.62.0':
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/types@8.12.2':
+ resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@5.62.0':
+ resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/typescript-estree@8.12.2':
+ resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@typescript-eslint/utils@5.62.0':
+ resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ '@typescript-eslint/utils@8.12.2':
+ resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+
+ '@typescript-eslint/visitor-keys@5.62.0':
+ resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ '@typescript-eslint/visitor-keys@8.12.2':
+ resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@ungap/structured-clone@1.2.0':
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
+ '@vitejs/plugin-react-swc@3.7.1':
+ resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==}
+ peerDependencies:
+ vite: ^4 || ^5
+
+ '@vitest/expect@2.1.4':
+ resolution: {integrity: sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==}
+
+ '@vitest/mocker@2.1.4':
+ resolution: {integrity: sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@2.1.4':
+ resolution: {integrity: sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==}
+
+ '@vitest/runner@2.1.4':
+ resolution: {integrity: sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==}
+
+ '@vitest/snapshot@2.1.4':
+ resolution: {integrity: sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==}
+
+ '@vitest/spy@2.1.4':
+ resolution: {integrity: sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==}
+
+ '@vitest/utils@2.1.4':
+ resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==}
+
+ '@volar/language-core@2.4.10':
+ resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==}
+
+ '@volar/source-map@2.4.10':
+ resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==}
+
+ '@volar/typescript@2.4.10':
+ resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==}
+
+ '@vue/compiler-core@3.5.12':
+ resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==}
+
+ '@vue/compiler-dom@3.5.12':
+ resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==}
+
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/language-core@2.1.6':
+ resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@vue/shared@3.5.12':
+ resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==}
+
+ '@webassemblyjs/ast@1.12.1':
+ resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.11.6':
+ resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
+
+ '@webassemblyjs/helper-api-error@1.11.6':
+ resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
+
+ '@webassemblyjs/helper-buffer@1.12.1':
+ resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==}
+
+ '@webassemblyjs/helper-numbers@1.11.6':
+ resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.11.6':
+ resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
+
+ '@webassemblyjs/helper-wasm-section@1.12.1':
+ resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==}
+
+ '@webassemblyjs/ieee754@1.11.6':
+ resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
+
+ '@webassemblyjs/leb128@1.11.6':
+ resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
+
+ '@webassemblyjs/utf8@1.11.6':
+ resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
+
+ '@webassemblyjs/wasm-edit@1.12.1':
+ resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==}
+
+ '@webassemblyjs/wasm-gen@1.12.1':
+ resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==}
+
+ '@webassemblyjs/wasm-opt@1.12.1':
+ resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==}
+
+ '@webassemblyjs/wasm-parser@1.12.1':
+ resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==}
+
+ '@webassemblyjs/wast-printer@1.12.1':
+ resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-import-attributes@1.9.5:
+ resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
+ peerDependencies:
+ acorn: ^8
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.1:
+ resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+ engines: {node: '>= 14'}
+
+ ajv-draft-04@1.0.0:
+ resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
+ peerDependencies:
+ ajv: ^8.5.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@3.5.2:
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+
+ ajv@8.13.0:
+ resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==}
+
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
+ ansi-escapes@7.0.0:
+ resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+ engines: {node: '>=18'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ app-root-path@3.1.0:
+ resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==}
+ engines: {node: '>= 6.0.0'}
+
+ append-field@1.0.0:
+ resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==}
+
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
+
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
+
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+ array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+
+ array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+ engines: {node: '>= 0.4'}
+
+ array-timsort@1.0.3:
+ resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
+
+ array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+
+ array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
+
+ asap@2.0.6:
+ resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+
+ asn1@0.2.6:
+ resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ autoprefixer@10.4.20:
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ aws-ssl-profiles@1.1.2:
+ resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==}
+ engines: {node: '>= 6.0.0'}
+
+ axios@1.7.7:
+ resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
+
+ b4a@1.6.7:
+ resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==}
+
+ babel-dead-code-elimination@1.0.6:
+ resolution: {integrity: sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==}
+
+ babel-jest@29.7.0:
+ resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+
+ babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+
+ babel-plugin-jest-hoist@29.6.3:
+ resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ babel-preset-current-node-syntax@1.1.0:
+ resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ babel-preset-jest@29.6.3:
+ resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ bare-events@2.5.0:
+ resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ bcrypt-pbkdf@1.0.2:
+ resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.24.2:
+ resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ bs-logger@0.2.6:
+ resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
+ engines: {node: '>= 6'}
+
+ bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+ buffer-equal-constant-time@1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ buildcheck@0.0.6:
+ resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==}
+ engines: {node: '>=10.0.0'}
+
+ bull@4.16.4:
+ resolution: {integrity: sha512-CF+nGsJyfsCC9MJL8hFxqXzbwq+jGBXhaz1j15G+5N/XtKIPFUUy5O1mfWWKbKunfuH/x+UV4NYRQDHSkjCOgA==}
+ engines: {node: '>=12'}
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ caniuse-lite@1.0.30001676:
+ resolution: {integrity: sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chai@5.1.2:
+ resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
+ engines: {node: '>=12'}
+
+ chalk@3.0.0:
+ resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
+ engines: {node: '>=8'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+ check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ chownr@1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+
+ cjs-module-lexer@1.4.1:
+ resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==}
+
+ class-transformer@0.5.1:
+ resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==}
+
+ class-validator@0.14.1:
+ resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==}
+
+ class-variance-authority@0.7.0:
+ resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
+ cli-cursor@5.0.0:
+ resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+ engines: {node: '>=18'}
+
+ cli-highlight@2.1.11:
+ resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==}
+ engines: {node: '>=8.0.0', npm: '>=5.0.0'}
+ hasBin: true
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cli-table3@0.6.5:
+ resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ engines: {node: 10.* || >= 12.*}
+
+ cli-truncate@4.0.0:
+ resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+ engines: {node: '>=18'}
+
+ cli-width@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ clsx@2.0.0:
+ resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
+ engines: {node: '>=6'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ cluster-key-slot@1.1.2:
+ resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
+ engines: {node: '>=0.10.0'}
+
+ co@4.6.0:
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+
+ collect-v8-coverage@1.0.2:
+ resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@12.1.0:
+ resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+ engines: {node: '>=18'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ comment-json@4.2.5:
+ resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==}
+ engines: {node: '>= 6'}
+
+ compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+
+ compare-versions@6.1.1:
+ resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
+
+ component-emitter@1.3.1:
+ resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+ computeds@0.0.1:
+ resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ concat-stream@1.6.2:
+ resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+ engines: {'0': node >= 0.8}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ consola@2.15.3:
+ resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ conventional-changelog-angular@7.0.0:
+ resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+ engines: {node: '>=16'}
+
+ conventional-changelog-conventionalcommits@7.0.2:
+ resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
+ engines: {node: '>=16'}
+
+ conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ cookiejar@2.1.4:
+ resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig-typescript-loader@5.1.0:
+ resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==}
+ engines: {node: '>=v16'}
+ peerDependencies:
+ '@types/node': '*'
+ cosmiconfig: '>=8.2'
+ typescript: '>=4'
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cosmiconfig@9.0.0:
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cpu-features@0.0.10:
+ resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==}
+ engines: {node: '>=10.0.0'}
+
+ create-jest@29.7.0:
+ resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+
+ cron-parser@4.9.0:
+ resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==}
+ engines: {node: '>=12.0.0'}
+
+ cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+
+ css.escape@1.5.1:
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ cssstyle@4.1.0:
+ resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
+ engines: {node: '>=18'}
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ dargs@8.1.0:
+ resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
+ engines: {node: '>=12'}
+
+ data-urls@5.0.0:
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+ engines: {node: '>=18'}
+
+ data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+ de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decimal.js@10.4.3:
+ resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
+ dedent@1.5.3:
+ resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ denque@2.1.0:
+ resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
+ engines: {node: '>=0.10'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ detect-libc@2.0.3:
+ resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+ engines: {node: '>=8'}
+
+ detect-newline@3.1.0:
+ resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+ engines: {node: '>=8'}
+
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ dezalgo@1.0.4:
+ resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==}
+
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+ diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ docker-modem@5.0.3:
+ resolution: {integrity: sha512-89zhop5YVhcPEt5FpUFGr3cDyceGhq/F9J+ZndQ4KfqNvfbJpPMfgeixFgUj5OjCYAboElqODxY5Z1EBsSa6sg==}
+ engines: {node: '>= 8.0'}
+
+ dockerode@4.0.2:
+ resolution: {integrity: sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w==}
+ engines: {node: '>= 8.0'}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dom-accessibility-api@0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+
+ dom-accessibility-api@0.6.3:
+ resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
+ dotenv-expand@10.0.0:
+ resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==}
+ engines: {node: '>=12'}
+
+ dotenv@16.4.5:
+ resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
+ engines: {node: '>=12'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ ecdsa-sig-formatter@1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ ejs@3.1.10:
+ resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
+ electron-to-chromium@1.5.50:
+ resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==}
+
+ embla-carousel-autoplay@8.5.1:
+ resolution: {integrity: sha512-FnZklFpePfp8wbj177UwVaGFehgs+ASVcJvYLWTtHuYKURynCc3IdDn2qrn0E5Qpa3g9yeGwCS4p8QkrZmO8xg==}
+ peerDependencies:
+ embla-carousel: 8.5.1
+
+ embla-carousel-react@8.3.1:
+ resolution: {integrity: sha512-gBY0zM+2ASvKFwRpTIOn2SLifFqOKKap9R/y0iCpJWS3bc8OHVEn2gAThGYl2uq0N+hu9aBiswffL++OYZOmDQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+
+ embla-carousel-reactive-utils@8.3.1:
+ resolution: {integrity: sha512-Js6rTTINNGnUGPu7l5kTcheoSbEnP5Ak2iX0G9uOoI8okTNLMzuWlEIpYFd1WP0Sq82FFcLkKM2oiO6jcElZ/Q==}
+ peerDependencies:
+ embla-carousel: 8.3.1
+
+ embla-carousel@8.3.1:
+ resolution: {integrity: sha512-DutFjtEO586XptDn4cwvBJwsR/8fMa4jUk5Jk2g+/elKgu8mdn0Z2sx33g4JskvbLc1/6P8Xg4QlfELGJFcP5A==}
+
+ emittery@0.13.1:
+ resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+ engines: {node: '>=12'}
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+ enhanced-resolve@5.17.1:
+ resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
+ engines: {node: '>=10.13.0'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
+ error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+ es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@1.5.4:
+ resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+
+ es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+
+ es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.21.5:
+ resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ esbuild@0.23.1:
+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-config-prettier@8.10.0:
+ resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-module-utils@2.12.0:
+ resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-import@2.31.0:
+ resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-no-relative-import-paths@1.5.5:
+ resolution: {integrity: sha512-UjudFFdBbv93v0CsVdEKcMLbBzRIjeK2PubTctX57tgnHxZcMj1Jm8lDBWoETnPxk0S5g5QLSltEM+511yL4+w==}
+
+ eslint-plugin-prettier@4.2.1:
+ resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ eslint-config-prettier: '*'
+ prettier: '>=2.0.0'
+ peerDependenciesMeta:
+ eslint-config-prettier:
+ optional: true
+
+ eslint-plugin-react-hooks@5.0.0:
+ resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==}
+ 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
+
+ eslint-plugin-react-refresh@0.4.14:
+ resolution: {integrity: sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==}
+ peerDependencies:
+ eslint: '>=7'
+
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-scope@8.2.0:
+ resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@8.57.1:
+ resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
+ hasBin: true
+
+ eslint@9.13.0:
+ resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.3.0:
+ resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+
+ execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+
+ exit@0.1.2:
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+ engines: {node: '>= 0.8.0'}
+
+ expect-type@1.1.0:
+ resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
+ engines: {node: '>=12.0.0'}
+
+ expect@29.7.0:
+ resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ express@4.21.1:
+ resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
+ engines: {node: '>= 0.10.0'}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+ fast-fifo@1.3.2:
+ resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
+
+ fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
+ fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+
+ fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+ figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+
+ file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ filelist@1.0.4:
+ resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ find-up@7.0.0:
+ resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+ engines: {node: '>=18'}
+
+ flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+
+ fork-ts-checker-webpack-plugin@9.0.2:
+ resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==}
+ engines: {node: '>=12.13.0', yarn: '>=1.0.0'}
+ peerDependencies:
+ typescript: '>3.6.0'
+ webpack: ^5.11.0
+
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
+ formidable@2.1.2:
+ resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+ framer-motion@11.11.13:
+ resolution: {integrity: sha512-aoEA83gsqRRsnh4TN7S9YNcKVLrg+GtPNnxNMd9bGn23+pLmuKGQeccPnqffEKzlkgmy2MkMo0jRkK41S2LzWw==}
+ peerDependencies:
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ peerDependenciesMeta:
+ '@emotion/is-prop-valid':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ fs-constants@1.0.0:
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
+
+ fs-monkey@1.0.6:
+ resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ generate-function@2.3.1:
+ resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+
+ get-port@5.1.1:
+ resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
+ engines: {node: '>=8'}
+
+ get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+
+ get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+ git-raw-commits@4.0.0:
+ resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ glob@10.4.2:
+ resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==}
+ engines: {node: '>=16 || 14 >=14.18'}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.11.0:
+ resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+
+ globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+
+ goober@2.1.16:
+ resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==}
+ peerDependencies:
+ csstype: ^3.0.10
+
+ gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ graphql@16.9.0:
+ resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+
+ has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-own-prop@2.0.0:
+ resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hast-util-from-html@2.0.3:
+ resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+ hast-util-from-parse5@8.0.1:
+ resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-to-html@9.0.3:
+ resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==}
+
+ hast-util-to-jsx-runtime@2.3.2:
+ resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==}
+
+ hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ hastscript@8.0.0:
+ resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ headers-polyfill@4.0.3:
+ resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
+
+ hexoid@1.0.0:
+ resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==}
+ engines: {node: '>=8'}
+
+ highlight.js@10.7.3:
+ resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
+ html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+
+ html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ https-proxy-agent@7.0.5:
+ resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+ engines: {node: '>= 14'}
+
+ human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+
+ husky@9.1.6:
+ resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+
+ import-local@3.2.0:
+ resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+
+ inflight@1.0.6:
+ resolution: {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.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
+ inquirer@8.2.6:
+ resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+ engines: {node: '>=12.0.0'}
+
+ inquirer@9.2.15:
+ resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==}
+ engines: {node: '>=18'}
+
+ internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ engines: {node: '>= 0.4'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ ioredis@5.4.1:
+ resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==}
+ engines: {node: '>=12.22.0'}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+
+ is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
+
+ is-generator-fn@2.1.0:
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+ engines: {node: '>=6'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-node-process@1.2.0:
+ resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
+
+ is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
+ is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+ is-property@1.0.2:
+ resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
+
+ is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
+
+ is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+
+ is-text-path@2.0.0:
+ resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+ engines: {node: '>=8'}
+
+ is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ engines: {node: '>= 0.4'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+
+ isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@6.0.3:
+ resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
+ engines: {node: '>=10'}
+
+ istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+
+ istanbul-lib-source-maps@4.0.1:
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+ engines: {node: '>=10'}
+
+ istanbul-reports@3.1.7:
+ resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ engines: {node: '>=8'}
+
+ iterare@1.2.1:
+ resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==}
+ engines: {node: '>=6'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jake@10.9.2:
+ resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ jest-changed-files@29.7.0:
+ resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-circus@29.7.0:
+ resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-cli@29.7.0:
+ resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
+ jest-config@29.7.0:
+ resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@types/node': '*'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ ts-node:
+ optional: true
+
+ jest-diff@29.7.0:
+ resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-docblock@29.7.0:
+ resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-each@29.7.0:
+ resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-environment-node@29.7.0:
+ resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-get-type@29.6.3:
+ resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-leak-detector@29.7.0:
+ resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-matcher-utils@29.7.0:
+ resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-message-util@29.7.0:
+ resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-mock@29.7.0:
+ resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-pnp-resolver@1.2.3:
+ resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ jest-resolve: '*'
+ peerDependenciesMeta:
+ jest-resolve:
+ optional: true
+
+ jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-resolve-dependencies@29.7.0:
+ resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-resolve@29.7.0:
+ resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-runner@29.7.0:
+ resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-runtime@29.7.0:
+ resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-snapshot@29.7.0:
+ resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-validate@29.7.0:
+ resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-watcher@29.7.0:
+ resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
+ jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest@29.7.0:
+ resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+ peerDependencies:
+ node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ node-notifier:
+ optional: true
+
+ jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
+
+ jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsdom@25.0.1:
+ resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^2.11.2
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@3.2.1:
+ resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
+
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
+ jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ jsonwebtoken@9.0.2:
+ resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
+ engines: {node: '>=12', npm: '>=6'}
+
+ jwa@1.4.1:
+ resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
+
+ jws@3.2.2:
+ resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ libphonenumber-js@1.11.14:
+ resolution: {integrity: sha512-sexvAfwcW1Lqws4zFp8heAtAEXbEDnvkYCEGzvOoMgZR7JhXo/IkE9MkkGACgBed5fWqh3ShBGnJBdDnU9N8EQ==}
+
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+
+ lilconfig@3.1.2:
+ resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ lint-staged@15.2.10:
+ resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+
+ listr2@8.2.5:
+ resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
+ engines: {node: '>=18.0.0'}
+
+ loader-runner@4.3.0:
+ resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+ engines: {node: '>=6.11.5'}
+
+ local-pkg@0.5.0:
+ resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+ engines: {node: '>=14'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ locate-path@7.2.0:
+ resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+ lodash.defaults@4.2.0:
+ resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
+
+ lodash.includes@4.3.0:
+ resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
+
+ lodash.isarguments@3.1.0:
+ resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
+
+ lodash.isboolean@3.0.3:
+ resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
+
+ lodash.isinteger@4.0.4:
+ resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
+
+ lodash.isnumber@3.0.3:
+ resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
+
+ lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ lodash.isstring@4.0.1:
+ resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
+
+ lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+
+ lodash.memoize@4.1.2:
+ resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+
+ lodash.once@4.1.1:
+ resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
+
+ lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+
+ lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+
+ lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+
+ lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ log-update@6.1.0:
+ resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+ engines: {node: '>=18'}
+
+ long@5.2.3:
+ resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ loupe@3.1.2:
+ resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
+ engines: {node: '>=12'}
+
+ lru.min@1.1.1:
+ resolution: {integrity: sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==}
+ engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
+
+ lucide-react@0.454.0:
+ resolution: {integrity: sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
+
+ luxon@3.5.0:
+ resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
+ engines: {node: '>=12'}
+
+ lz-string@1.5.0:
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+ hasBin: true
+
+ magic-string@0.30.12:
+ resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
+
+ magic-string@0.30.8:
+ resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
+ engines: {node: '>=12'}
+
+ make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ mdast-util-find-and-replace@3.0.1:
+ resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+
+ mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.0.0:
+ resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.1.3:
+ resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.0:
+ resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ memfs@3.5.3:
+ resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+ engines: {node: '>= 4.0.0'}
+
+ meow@12.1.1:
+ resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+ engines: {node: '>=16.10'}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
+ micromark-core-commonmark@2.0.1:
+ resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.0:
+ resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-factory-destination@2.0.0:
+ resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+
+ micromark-factory-label@2.0.0:
+ resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+
+ micromark-factory-space@2.0.0:
+ resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+
+ micromark-factory-title@2.0.0:
+ resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+
+ micromark-factory-whitespace@2.0.0:
+ resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+
+ micromark-util-character@2.1.0:
+ resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+
+ micromark-util-chunked@2.0.0:
+ resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+
+ micromark-util-classify-character@2.0.0:
+ resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+
+ micromark-util-combine-extensions@2.0.0:
+ resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+
+ micromark-util-decode-string@2.0.0:
+ resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+
+ micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
+ micromark-util-html-tag-name@2.0.0:
+ resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+
+ micromark-util-normalize-identifier@2.0.0:
+ resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+
+ micromark-util-resolve-all@2.0.0:
+ resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+
+ micromark-util-sanitize-uri@2.0.0:
+ resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+
+ micromark-util-subtokenize@2.0.1:
+ resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+
+ micromark-util-symbol@2.0.0:
+ resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+
+ micromark-util-types@2.0.0:
+ resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+
+ micromark@4.0.0:
+ resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mime@2.6.0:
+ resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
+ engines: {node: '>=4.0.0'}
+ hasBin: true
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minimatch@3.0.8:
+ resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mkdirp-classic@0.5.3:
+ resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
+
+ mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+
+ mkdirp@2.1.6:
+ resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ mlly@1.7.2:
+ resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==}
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ msgpackr-extract@3.0.3:
+ resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
+ hasBin: true
+
+ msgpackr@1.11.2:
+ resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==}
+
+ msw@2.6.4:
+ resolution: {integrity: sha512-Pm4LmWQeytDsNCR+A7gt39XAdtH6zQb6jnIKRig0FlvYOn8eksn3s1nXxUfz5KYUjbckof7Z4p2ewzgffPoCbg==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>= 4.8.x'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ multer@1.4.4-lts.1:
+ resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==}
+ engines: {node: '>= 6.0.0'}
+
+ mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+
+ mute-stream@1.0.0:
+ resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ mysql2@3.11.4:
+ resolution: {integrity: sha512-Z2o3tY4Z8EvSRDwknaC40MdZ3+m0sKbpnXrShQLdxPrAvcNli7jLrD2Zd2IzsRMw4eK9Yle500FDmlkIqp+krg==}
+ engines: {node: '>= 8.0'}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ named-placeholders@1.1.3:
+ resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==}
+ engines: {node: '>=12.0.0'}
+
+ nan@2.22.0:
+ resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==}
+
+ nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare-lite@1.4.0:
+ resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-abort-controller@3.1.1:
+ resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+ node-emoji@1.11.0:
+ resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-gyp-build-optional-packages@5.2.2:
+ resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==}
+ hasBin: true
+
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+ node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ nwsapi@2.2.13:
+ resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ object-inspect@1.13.2:
+ resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+ engines: {node: '>= 0.4'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+
+ onetime@7.0.0:
+ resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+ engines: {node: '>=18'}
+
+ oniguruma-to-js@0.4.3:
+ resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ outvariant@1.4.3:
+ resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-limit@4.0.0:
+ resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-locate@6.0.0:
+ resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-entities@4.0.1:
+ resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse-numeric-range@1.3.0:
+ resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
+
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
+
+ parse5@5.1.1:
+ resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==}
+
+ parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
+
+ parse5@7.2.1:
+ resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-exists@5.0.0:
+ resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ path-to-regexp@0.1.10:
+ resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
+
+ path-to-regexp@3.3.0:
+ resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
+
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ pathval@2.0.0:
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+ engines: {node: '>= 14.16'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.1:
+ resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==}
+ engines: {node: '>=12'}
+
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pidtree@0.6.0:
+ resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
+ pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+
+ pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+
+ pkg-types@1.2.1:
+ resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
+
+ playwright-core@1.49.0:
+ resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ playwright@1.49.0:
+ resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-js@4.0.1:
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ prettier@3.3.3:
+ resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ pretty-format@27.5.1:
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+ pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ psl@1.10.0:
+ resolution: {integrity: sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==}
+
+ pump@3.0.2:
+ resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ pure-rand@6.1.0:
+ resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+
+ querystringify@2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ queue-tick@1.0.1:
+ resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-hook-form@7.53.2:
+ resolution: {integrity: sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
+ react-icons@5.3.0:
+ resolution: {integrity: sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==}
+ peerDependencies:
+ react: '*'
+
+ react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-remove-scroll-bar@2.3.6:
+ resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.6.0:
+ resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-style-singleton@2.2.1:
+ resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+ readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ redent@3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+
+ redis-errors@1.2.0:
+ resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
+ engines: {node: '>=4'}
+
+ redis-parser@3.0.0:
+ resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
+ engines: {node: '>=4'}
+
+ reflect-metadata@0.1.14:
+ resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==}
+
+ reflect-metadata@0.2.2:
+ resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regex@4.4.0:
+ resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==}
+
+ regexp.prototype.flags@1.5.3:
+ resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
+ engines: {node: '>= 0.4'}
+
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
+ rehype-pretty-code@0.14.0:
+ resolution: {integrity: sha512-hBeKF/Wkkf3zyUS8lal9RCUuhypDWLQc+h9UrP9Pav25FUm/AQAVh4m5gdvJxh4Oz+U+xKvdsV01p1LdvsZTiQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ shiki: ^1.3.0
+
+ rehype-react@8.0.0:
+ resolution: {integrity: sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw==}
+
+ rehype-stringify@10.0.1:
+ resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
+
+ rehype@13.0.2:
+ resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
+
+ remark-gfm@4.0.0:
+ resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.1:
+ resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
+ resolve-cwd@3.0.0:
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+ engines: {node: '>=8'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve.exports@2.0.2:
+ resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
+ engines: {node: '>=10'}
+
+ resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
+ restore-cursor@5.1.0:
+ resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+ engines: {node: '>=18'}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rollup@4.24.3:
+ resolution: {integrity: sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rrweb-cssom@0.7.1:
+ resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
+
+ run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+
+ run-async@3.0.0:
+ resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
+ engines: {node: '>=0.12.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+ safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ engines: {node: '>= 0.4'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ schema-utils@3.3.0:
+ resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+ engines: {node: '>= 10.13.0'}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+
+ seq-queue@0.0.5:
+ resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
+
+ serialize-javascript@6.0.2:
+ resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ sha.js@2.4.11:
+ resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+ hasBin: true
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shiki@1.22.2:
+ resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==}
+
+ side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+
+ slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.13:
+ resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ split-ca@1.0.1:
+ resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ sqlstring@2.3.3:
+ resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
+ engines: {node: '>= 0.6'}
+
+ ssh2@1.16.0:
+ resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==}
+ engines: {node: '>=10.16.0'}
+
+ stack-utils@2.0.6:
+ resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+ engines: {node: '>=10'}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ standard-as-callback@2.1.0:
+ resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
+
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
+ std-env@3.7.0:
+ resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ streamx@2.20.1:
+ resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==}
+
+ strict-event-emitter@0.5.1:
+ resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-length@4.0.2:
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+ engines: {node: '>=10'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+
+ strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+
+ strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ style-to-object@1.0.8:
+ resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
+
+ sucrase@3.35.0:
+ resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ superagent@8.1.2:
+ resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==}
+ engines: {node: '>=6.4.0 <13 || >=14'}
+ deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net
+
+ supertest@6.3.4:
+ resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==}
+ engines: {node: '>=6.4.0'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ swagger-ui-dist@5.18.2:
+ resolution: {integrity: sha512-J+y4mCw/zXh1FOj5wGJvnAajq6XgHOyywsa9yITmwxIlJbMqITq3gYRZHaeqLVH/eV/HOPphE6NjF+nbSNC5Zw==}
+
+ swagger-ui-express@5.0.1:
+ resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==}
+ engines: {node: '>= v0.10.32'}
+ peerDependencies:
+ express: '>=4.0.0 || >=5.0.0-beta'
+
+ symbol-observable@4.0.0:
+ resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
+ engines: {node: '>=0.10'}
+
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+ tailwind-merge@2.5.4:
+ resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==}
+
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
+ tailwindcss@3.4.14:
+ resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ tar-fs@2.0.1:
+ resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==}
+
+ tar-stream@2.2.0:
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ engines: {node: '>=6'}
+
+ tar-stream@3.1.7:
+ resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
+
+ terser-webpack-plugin@5.3.10:
+ resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+
+ terser@5.36.0:
+ resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+
+ text-decoder@1.2.1:
+ resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==}
+
+ text-extensions@2.4.0:
+ resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
+ engines: {node: '>=8'}
+
+ text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+ tiny-warning@1.0.3:
+ resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinyexec@0.3.1:
+ resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+
+ tinypool@1.0.1:
+ resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@1.2.0:
+ resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ engines: {node: '>=14.0.0'}
+
+ tldts-core@6.1.58:
+ resolution: {integrity: sha512-dR936xmhBm7AeqHIhCWwK765gZ7dFyL+IqLSFAjJbFlUXGMLCb8i2PzlzaOuWBuplBTaBYseSb565nk/ZEM0Bg==}
+
+ tldts@6.1.58:
+ resolution: {integrity: sha512-MQJrJhjHOYGYb8DobR6Y4AdDbd4TYkyQ+KBDVc5ODzs1cbrvPpfN1IemYi9jfipJ/vR1YWvrDli0hg1y19VRoA==}
+ hasBin: true
+
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
+ tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ tough-cookie@4.1.4:
+ resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
+ engines: {node: '>=6'}
+
+ tough-cookie@5.0.0:
+ resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+ engines: {node: '>=16'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ tr46@5.0.0:
+ resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
+ engines: {node: '>=18'}
+
+ tree-kill@1.2.2:
+ resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+ hasBin: true
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-api-utils@1.4.0:
+ resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ ts-jest@29.2.5:
+ resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@babel/core': '>=7.0.0-beta.0 <8'
+ '@jest/transform': ^29.0.0
+ '@jest/types': ^29.0.0
+ babel-jest: ^29.0.0
+ esbuild: '*'
+ jest: ^29.0.0
+ typescript: '>=4.3 <6'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ '@jest/transform':
+ optional: true
+ '@jest/types':
+ optional: true
+ babel-jest:
+ optional: true
+ esbuild:
+ optional: true
+
+ ts-loader@9.5.1:
+ resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ typescript: '*'
+ webpack: ^5.0.0
+
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
+
+ tsconfck@3.1.4:
+ resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tsconfig-paths-webpack-plugin@4.1.0:
+ resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==}
+ engines: {node: '>=10.13.0'}
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ tslib@2.7.0:
+ resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+ tslib@2.8.0:
+ resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsutils@3.21.0:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+
+ tsx@4.19.2:
+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ turbo-darwin-64@2.2.3:
+ resolution: {integrity: sha512-Rcm10CuMKQGcdIBS3R/9PMeuYnv6beYIHqfZFeKWVYEWH69sauj4INs83zKMTUiZJ3/hWGZ4jet9AOwhsssLyg==}
+ cpu: [x64]
+ os: [darwin]
+
+ turbo-darwin-arm64@2.2.3:
+ resolution: {integrity: sha512-+EIMHkuLFqUdJYsA3roj66t9+9IciCajgj+DVek+QezEdOJKcRxlvDOS2BUaeN8kEzVSsNiAGnoysFWYw4K0HA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ turbo-linux-64@2.2.3:
+ resolution: {integrity: sha512-UBhJCYnqtaeOBQLmLo8BAisWbc9v9daL9G8upLR+XGj6vuN/Nz6qUAhverN4Pyej1g4Nt1BhROnj6GLOPYyqxQ==}
+ cpu: [x64]
+ os: [linux]
+
+ turbo-linux-arm64@2.2.3:
+ resolution: {integrity: sha512-hJYT9dN06XCQ3jBka/EWvvAETnHRs3xuO/rb5bESmDfG+d9yQjeTMlhRXKrr4eyIMt6cLDt1LBfyi+6CQ+VAwQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ turbo-windows-64@2.2.3:
+ resolution: {integrity: sha512-NPrjacrZypMBF31b4HE4ROg4P3nhMBPHKS5WTpMwf7wydZ8uvdEHpESVNMOtqhlp857zbnKYgP+yJF30H3N2dQ==}
+ cpu: [x64]
+ os: [win32]
+
+ turbo-windows-arm64@2.2.3:
+ resolution: {integrity: sha512-fnNrYBCqn6zgKPKLHu4sOkihBI/+0oYFr075duRxqUZ+1aLWTAGfHZLgjVeLh3zR37CVzuerGIPWAEkNhkWEIw==}
+ cpu: [arm64]
+ os: [win32]
+
+ turbo@2.2.3:
+ resolution: {integrity: sha512-5lDvSqIxCYJ/BAd6rQGK/AzFRhBkbu4JHVMLmGh/hCb7U3CqSnr5Tjwfy9vc+/5wG2DJ6wttgAaA7MoCgvBKZQ==}
+ hasBin: true
+
+ tweetnacl@0.14.5:
+ resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
+ type-fest@4.27.0:
+ resolution: {integrity: sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==}
+ engines: {node: '>=16'}
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
+ typeorm@0.3.20:
+ resolution: {integrity: sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==}
+ engines: {node: '>=16.13.0'}
+ hasBin: true
+ peerDependencies:
+ '@google-cloud/spanner': ^5.18.0
+ '@sap/hana-client': ^2.12.25
+ better-sqlite3: ^7.1.2 || ^8.0.0 || ^9.0.0
+ hdb-pool: ^0.1.6
+ ioredis: ^5.0.4
+ mongodb: ^5.8.0
+ mssql: ^9.1.1 || ^10.0.1
+ mysql2: ^2.2.5 || ^3.0.1
+ oracledb: ^6.3.0
+ pg: ^8.5.1
+ pg-native: ^3.0.0
+ pg-query-stream: ^4.0.0
+ redis: ^3.1.1 || ^4.0.0
+ sql.js: ^1.4.0
+ sqlite3: ^5.0.3
+ ts-node: ^10.7.0
+ typeorm-aurora-data-api-driver: ^2.0.0
+ peerDependenciesMeta:
+ '@google-cloud/spanner':
+ optional: true
+ '@sap/hana-client':
+ optional: true
+ better-sqlite3:
+ optional: true
+ hdb-pool:
+ optional: true
+ ioredis:
+ optional: true
+ mongodb:
+ optional: true
+ mssql:
+ optional: true
+ mysql2:
+ optional: true
+ oracledb:
+ optional: true
+ pg:
+ optional: true
+ pg-native:
+ optional: true
+ pg-query-stream:
+ optional: true
+ redis:
+ optional: true
+ sql.js:
+ optional: true
+ sqlite3:
+ optional: true
+ ts-node:
+ optional: true
+ typeorm-aurora-data-api-driver:
+ optional: true
+
+ typescript-eslint@8.12.2:
+ resolution: {integrity: sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ typescript@5.3.3:
+ resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.4.2:
+ resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+ uid@2.0.2:
+ resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==}
+ engines: {node: '>=8'}
+
+ unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+ universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+
+ universalify@0.2.0:
+ resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+ engines: {node: '>= 4.0.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ unplugin@1.15.0:
+ resolution: {integrity: sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ webpack-sources: ^3
+ peerDependenciesMeta:
+ webpack-sources:
+ optional: true
+
+ update-browserslist-db@1.1.1:
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ url-parse@1.5.10:
+ resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+
+ use-callback-ref@1.3.2:
+ resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sidecar@1.1.2:
+ resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sync-external-store@1.2.2:
+ resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
+ v8-to-istanbul@9.3.0:
+ resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
+ engines: {node: '>=10.12.0'}
+
+ validator@13.12.0:
+ resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==}
+ engines: {node: '>= 0.10'}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vite-node@2.1.4:
+ resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
+ vite-plugin-dts@4.3.0:
+ resolution: {integrity: sha512-LkBJh9IbLwL6/rxh0C1/bOurDrIEmRE7joC+jFdOEEciAFPbpEKOLSAr5nNh5R7CJ45cMbksTrFfy52szzC5eA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite-tsconfig-paths@5.0.1:
+ resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite@5.4.10:
+ resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vitest@2.1.4:
+ resolution: {integrity: sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 2.1.4
+ '@vitest/ui': 2.1.4
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
+ walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+ watchpack@2.4.2:
+ resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
+ engines: {node: '>=10.13.0'}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
+ webpack-node-externals@3.0.0:
+ resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==}
+ engines: {node: '>=6'}
+
+ webpack-sources@3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+ webpack@5.94.0:
+ resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ webpack@5.96.1:
+ resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+
+ whatwg-url@14.0.0:
+ resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==}
+ engines: {node: '>=18'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+
+ which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@2.5.1:
+ resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yargs-parser@20.2.9:
+ resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+ engines: {node: '>=10'}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ yocto-queue@1.1.1:
+ resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+ engines: {node: '>=12.20'}
+
+ yoctocolors-cjs@2.1.2:
+ resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
+ engines: {node: '>=18'}
+
+ zod@3.23.8:
+ resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@adobe/css-tools@4.4.0': {}
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@angular-devkit/core@17.3.11(chokidar@3.6.0)':
+ dependencies:
+ ajv: 8.12.0
+ ajv-formats: 2.1.1(ajv@8.12.0)
+ jsonc-parser: 3.2.1
+ picomatch: 4.0.1
+ rxjs: 7.8.1
+ source-map: 0.7.4
+ optionalDependencies:
+ chokidar: 3.6.0
+
+ '@angular-devkit/core@17.3.8(chokidar@3.6.0)':
+ dependencies:
+ ajv: 8.12.0
+ ajv-formats: 2.1.1(ajv@8.12.0)
+ jsonc-parser: 3.2.1
+ picomatch: 4.0.1
+ rxjs: 7.8.1
+ source-map: 0.7.4
+ optionalDependencies:
+ chokidar: 3.6.0
+
+ '@angular-devkit/schematics-cli@17.3.8(chokidar@3.6.0)':
+ dependencies:
+ '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0)
+ ansi-colors: 4.1.3
+ inquirer: 9.2.15
+ symbol-observable: 4.0.0
+ yargs-parser: 21.1.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@angular-devkit/schematics@17.3.11(chokidar@3.6.0)':
+ dependencies:
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ jsonc-parser: 3.2.1
+ magic-string: 0.30.8
+ ora: 5.4.1
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@angular-devkit/schematics@17.3.8(chokidar@3.6.0)':
+ dependencies:
+ '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
+ jsonc-parser: 3.2.1
+ magic-string: 0.30.8
+ ora: 5.4.1
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@babel/code-frame@7.26.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.26.2': {}
+
+ '@babel/core@7.26.0':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.2
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.2
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ convert-source-map: 2.0.0
+ debug: 4.3.7
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.26.2':
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.0.2
+
+ '@babel/helper-compilation-targets@7.25.9':
+ dependencies:
+ '@babel/compat-data': 7.26.2
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.25.9': {}
+
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helpers@7.26.0':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+
+ '@babel/parser@7.26.2':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/runtime@7.26.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/template@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+
+ '@babel/traverse@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.2
+ '@babel/parser': 7.26.2
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ debug: 4.3.7
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.26.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@balena/dockerignore@1.0.2': {}
+
+ '@bcoe/v8-coverage@0.2.3': {}
+
+ '@bundled-es-modules/cookie@2.0.1':
+ dependencies:
+ cookie: 0.7.2
+
+ '@bundled-es-modules/statuses@1.0.1':
+ dependencies:
+ statuses: 2.0.1
+
+ '@bundled-es-modules/tough-cookie@0.1.6':
+ dependencies:
+ '@types/tough-cookie': 4.0.5
+ tough-cookie: 4.1.4
+
+ '@colors/colors@1.5.0':
+ optional: true
+
+ '@commitlint/cli@19.5.0(@types/node@20.17.5)(typescript@5.6.3)':
+ dependencies:
+ '@commitlint/format': 19.5.0
+ '@commitlint/lint': 19.5.0
+ '@commitlint/load': 19.5.0(@types/node@20.17.5)(typescript@5.6.3)
+ '@commitlint/read': 19.5.0
+ '@commitlint/types': 19.5.0
+ tinyexec: 0.3.1
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ '@commitlint/config-conventional@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ conventional-changelog-conventionalcommits: 7.0.2
+
+ '@commitlint/config-validator@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ ajv: 8.12.0
+
+ '@commitlint/ensure@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ lodash.startcase: 4.4.0
+ lodash.upperfirst: 4.3.1
+
+ '@commitlint/execute-rule@19.5.0': {}
+
+ '@commitlint/format@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ chalk: 5.3.0
+
+ '@commitlint/is-ignored@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ semver: 7.6.3
+
+ '@commitlint/lint@19.5.0':
+ dependencies:
+ '@commitlint/is-ignored': 19.5.0
+ '@commitlint/parse': 19.5.0
+ '@commitlint/rules': 19.5.0
+ '@commitlint/types': 19.5.0
+
+ '@commitlint/load@19.5.0(@types/node@20.17.5)(typescript@5.6.3)':
+ dependencies:
+ '@commitlint/config-validator': 19.5.0
+ '@commitlint/execute-rule': 19.5.0
+ '@commitlint/resolve-extends': 19.5.0
+ '@commitlint/types': 19.5.0
+ chalk: 5.3.0
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ cosmiconfig-typescript-loader: 5.1.0(@types/node@20.17.5)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+
+ '@commitlint/message@19.5.0': {}
+
+ '@commitlint/parse@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
+
+ '@commitlint/read@19.5.0':
+ dependencies:
+ '@commitlint/top-level': 19.5.0
+ '@commitlint/types': 19.5.0
+ git-raw-commits: 4.0.0
+ minimist: 1.2.8
+ tinyexec: 0.3.1
+
+ '@commitlint/resolve-extends@19.5.0':
+ dependencies:
+ '@commitlint/config-validator': 19.5.0
+ '@commitlint/types': 19.5.0
+ global-directory: 4.0.1
+ import-meta-resolve: 4.1.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+
+ '@commitlint/rules@19.5.0':
+ dependencies:
+ '@commitlint/ensure': 19.5.0
+ '@commitlint/message': 19.5.0
+ '@commitlint/to-lines': 19.5.0
+ '@commitlint/types': 19.5.0
+
+ '@commitlint/to-lines@19.5.0': {}
+
+ '@commitlint/top-level@19.5.0':
+ dependencies:
+ find-up: 7.0.0
+
+ '@commitlint/types@19.5.0':
+ dependencies:
+ '@types/conventional-commits-parser': 5.0.0
+ chalk: 5.3.0
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
+ '@esbuild/aix-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm@0.21.5':
+ optional: true
+
+ '@esbuild/android-arm@0.23.1':
+ optional: true
+
+ '@esbuild/android-x64@0.21.5':
+ optional: true
+
+ '@esbuild/android-x64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-x64@0.21.5':
+ optional: true
+
+ '@esbuild/darwin-x64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm@0.21.5':
+ optional: true
+
+ '@esbuild/linux-arm@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/linux-loong64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-loong64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.21.5':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-s390x@0.21.5':
+ optional: true
+
+ '@esbuild/linux-s390x@0.23.1':
+ optional: true
+
+ '@esbuild/linux-x64@0.21.5':
+ optional: true
+
+ '@esbuild/linux-x64@0.23.1':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.21.5':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/sunos-x64@0.21.5':
+ optional: true
+
+ '@esbuild/sunos-x64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-arm64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-ia32@0.21.5':
+ optional: true
+
+ '@esbuild/win32-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/win32-x64@0.21.5':
+ optional: true
+
+ '@esbuild/win32-x64@0.23.1':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)':
+ dependencies:
+ eslint: 8.57.1
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.13.0(jiti@1.21.6))':
+ dependencies:
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.18.0':
+ dependencies:
+ '@eslint/object-schema': 2.1.4
+ debug: 4.3.7
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/core@0.7.0': {}
+
+ '@eslint/eslintrc@2.1.4':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.7
+ espree: 9.6.1
+ globals: 13.24.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/eslintrc@3.1.0':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.7
+ espree: 10.3.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@8.57.1': {}
+
+ '@eslint/js@9.13.0': {}
+
+ '@eslint/object-schema@2.1.4': {}
+
+ '@eslint/plugin-kit@0.2.2':
+ dependencies:
+ levn: 0.4.1
+
+ '@floating-ui/core@1.6.8':
+ dependencies:
+ '@floating-ui/utils': 0.2.8
+
+ '@floating-ui/dom@1.6.12':
+ dependencies:
+ '@floating-ui/core': 1.6.8
+ '@floating-ui/utils': 0.2.8
+
+ '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/dom': 1.6.12
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@floating-ui/utils@0.2.8': {}
+
+ '@hookform/resolvers@3.9.1(react-hook-form@7.53.2(react@18.3.1))':
+ dependencies:
+ react-hook-form: 7.53.2(react@18.3.1)
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/config-array@0.13.0':
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.3.7
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/object-schema@2.0.3': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@inquirer/confirm@5.0.2(@types/node@20.17.5)':
+ dependencies:
+ '@inquirer/core': 10.1.0(@types/node@20.17.5)
+ '@inquirer/type': 3.0.1(@types/node@20.17.5)
+ '@types/node': 20.17.5
+
+ '@inquirer/core@10.1.0(@types/node@20.17.5)':
+ dependencies:
+ '@inquirer/figures': 1.0.8
+ '@inquirer/type': 3.0.1(@types/node@20.17.5)
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@inquirer/figures@1.0.8': {}
+
+ '@inquirer/type@3.0.1(@types/node@20.17.5)':
+ dependencies:
+ '@types/node': 20.17.5
+
+ '@ioredis/commands@1.2.0': {}
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+
+ '@istanbuljs/schema@0.1.3': {}
+
+ '@jest/console@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ chalk: 4.1.2
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+
+ '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))':
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/reporters': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ exit: 0.1.2
+ graceful-fs: 4.2.11
+ jest-changed-files: 29.7.0
+ jest-config: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ jest-haste-map: 29.7.0
+ jest-message-util: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-resolve-dependencies: 29.7.0
+ jest-runner: 29.7.0
+ jest-runtime: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ jest-watcher: 29.7.0
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-ansi: 6.0.1
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
+ '@jest/environment@29.7.0':
+ dependencies:
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ jest-mock: 29.7.0
+
+ '@jest/expect-utils@29.7.0':
+ dependencies:
+ jest-get-type: 29.6.3
+
+ '@jest/expect@29.7.0':
+ dependencies:
+ expect: 29.7.0
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/fake-timers@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+ '@sinonjs/fake-timers': 10.3.0
+ '@types/node': 20.17.5
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
+ '@jest/globals@29.7.0':
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/types': 29.6.3
+ jest-mock: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/reporters@29.7.0':
+ dependencies:
+ '@bcoe/v8-coverage': 0.2.3
+ '@jest/console': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/node': 20.17.5
+ chalk: 4.1.2
+ collect-v8-coverage: 1.0.2
+ exit: 0.1.2
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-instrument: 6.0.3
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 4.0.1
+ istanbul-reports: 3.1.7
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ slash: 3.0.0
+ string-length: 4.0.2
+ strip-ansi: 6.0.1
+ v8-to-istanbul: 9.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/schemas@29.6.3':
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+
+ '@jest/source-map@29.6.3':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ callsites: 3.1.0
+ graceful-fs: 4.2.11
+
+ '@jest/test-result@29.7.0':
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ collect-v8-coverage: 1.0.2
+
+ '@jest/test-sequencer@29.7.0':
+ dependencies:
+ '@jest/test-result': 29.7.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ slash: 3.0.0
+
+ '@jest/transform@29.7.0':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.25
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 2.0.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ micromatch: 4.0.8
+ pirates: 4.0.6
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/types@29.6.3':
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 20.17.5
+ '@types/yargs': 17.0.33
+ chalk: 4.1.2
+
+ '@jridgewell/gen-mapping@0.3.5':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/source-map@0.3.6':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@ljharb/through@2.3.13':
+ dependencies:
+ call-bind: 1.0.7
+
+ '@lottiefiles/dotlottie-react@0.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@lottiefiles/dotlottie-web': 0.37.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@lottiefiles/dotlottie-web@0.37.0': {}
+
+ '@lukeed/csprng@1.1.0': {}
+
+ '@microsoft/api-extractor-model@7.29.8(@types/node@20.17.5)':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.0
+ '@microsoft/tsdoc-config': 0.17.0
+ '@rushstack/node-core-library': 5.9.0(@types/node@20.17.5)
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/api-extractor@7.47.11(@types/node@20.17.5)':
+ dependencies:
+ '@microsoft/api-extractor-model': 7.29.8(@types/node@20.17.5)
+ '@microsoft/tsdoc': 0.15.0
+ '@microsoft/tsdoc-config': 0.17.0
+ '@rushstack/node-core-library': 5.9.0(@types/node@20.17.5)
+ '@rushstack/rig-package': 0.5.3
+ '@rushstack/terminal': 0.14.2(@types/node@20.17.5)
+ '@rushstack/ts-command-line': 4.23.0(@types/node@20.17.5)
+ lodash: 4.17.21
+ minimatch: 3.0.8
+ resolve: 1.22.8
+ semver: 7.5.4
+ source-map: 0.6.1
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/tsdoc-config@0.17.0':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.0
+ ajv: 8.12.0
+ jju: 1.4.0
+ resolve: 1.22.8
+
+ '@microsoft/tsdoc@0.15.0': {}
+
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
+ optional: true
+
+ '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3':
+ optional: true
+
+ '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3':
+ optional: true
+
+ '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3':
+ optional: true
+
+ '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3':
+ optional: true
+
+ '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3':
+ optional: true
+
+ '@mswjs/interceptors@0.36.10':
+ dependencies:
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/logger': 0.3.0
+ '@open-draft/until': 2.1.0
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ strict-event-emitter: 0.5.1
+
+ '@nestjs/bull-shared@10.2.2(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ tslib: 2.8.0
+
+ '@nestjs/bull@10.2.2(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(bull@4.16.4)':
+ dependencies:
+ '@nestjs/bull-shared': 10.2.2(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ bull: 4.16.4
+ tslib: 2.8.0
+
+ '@nestjs/cli@10.4.5(@swc/core@1.7.42)':
+ dependencies:
+ '@angular-devkit/core': 17.3.8(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0)
+ '@angular-devkit/schematics-cli': 17.3.8(chokidar@3.6.0)
+ '@nestjs/schematics': 10.2.3(chokidar@3.6.0)(typescript@5.3.3)
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cli-table3: 0.6.5
+ commander: 4.1.1
+ fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.42))
+ glob: 10.4.2
+ inquirer: 8.2.6
+ node-emoji: 1.11.0
+ ora: 5.4.1
+ tree-kill: 1.2.2
+ tsconfig-paths: 4.2.0
+ tsconfig-paths-webpack-plugin: 4.1.0
+ typescript: 5.3.3
+ webpack: 5.94.0(@swc/core@1.7.42)
+ webpack-node-externals: 3.0.0
+ optionalDependencies:
+ '@swc/core': 1.7.42
+ transitivePeerDependencies:
+ - esbuild
+ - uglify-js
+ - webpack-cli
+
+ '@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)':
+ dependencies:
+ iterare: 1.2.1
+ reflect-metadata: 0.1.14
+ rxjs: 7.8.1
+ tslib: 2.7.0
+ uid: 2.0.2
+ optionalDependencies:
+ class-transformer: 0.5.1
+ class-validator: 0.14.1
+
+ '@nestjs/config@3.3.0(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(rxjs@7.8.1)':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ dotenv: 16.4.5
+ dotenv-expand: 10.0.0
+ lodash: 4.17.21
+ rxjs: 7.8.1
+
+ '@nestjs/core@10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nuxtjs/opencollective': 0.3.2
+ fast-safe-stringify: 2.1.1
+ iterare: 1.2.1
+ path-to-regexp: 3.3.0
+ reflect-metadata: 0.1.14
+ rxjs: 7.8.1
+ tslib: 2.7.0
+ uid: 2.0.2
+ optionalDependencies:
+ '@nestjs/platform-express': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)
+ transitivePeerDependencies:
+ - encoding
+
+ '@nestjs/jwt@10.2.0(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@types/jsonwebtoken': 9.0.5
+ jsonwebtoken: 9.0.2
+
+ '@nestjs/mapped-types@2.0.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ reflect-metadata: 0.1.14
+ optionalDependencies:
+ class-transformer: 0.5.1
+ class-validator: 0.14.1
+
+ '@nestjs/platform-express@10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ body-parser: 1.20.3
+ cors: 2.8.5
+ express: 4.21.1
+ multer: 1.4.4-lts.1
+ tslib: 2.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.3.3)':
+ dependencies:
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
+ comment-json: 4.2.5
+ jsonc-parser: 3.3.1
+ pluralize: 8.0.0
+ typescript: 5.3.3
+ transitivePeerDependencies:
+ - chokidar
+
+ '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.6.3)':
+ dependencies:
+ '@angular-devkit/core': 17.3.11(chokidar@3.6.0)
+ '@angular-devkit/schematics': 17.3.11(chokidar@3.6.0)
+ comment-json: 4.2.5
+ jsonc-parser: 3.3.1
+ pluralize: 8.0.0
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - chokidar
+
+ '@nestjs/swagger@8.0.7(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.0
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/mapped-types': 2.0.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ path-to-regexp: 3.3.0
+ reflect-metadata: 0.1.14
+ swagger-ui-dist: 5.18.2
+ optionalDependencies:
+ class-transformer: 0.5.1
+ class-validator: 0.14.1
+
+ '@nestjs/testing@10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(@nestjs/platform-express@10.4.6)':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ tslib: 2.7.0
+ optionalDependencies:
+ '@nestjs/platform-express': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)
+
+ '@nestjs/typeorm@10.0.2(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)(typeorm@0.3.20(ioredis@5.4.1)(mysql2@3.11.4)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)))':
+ dependencies:
+ '@nestjs/common': 10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ '@nestjs/core': 10.4.6(@nestjs/common@10.4.6(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.6)(reflect-metadata@0.1.14)(rxjs@7.8.1)
+ reflect-metadata: 0.1.14
+ rxjs: 7.8.1
+ typeorm: 0.3.20(ioredis@5.4.1)(mysql2@3.11.4)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ uuid: 9.0.1
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+
+ '@nuxtjs/opencollective@0.3.2':
+ dependencies:
+ chalk: 4.1.2
+ consola: 2.15.3
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@open-draft/deferred-promise@2.2.0': {}
+
+ '@open-draft/logger@0.3.0':
+ dependencies:
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+
+ '@open-draft/until@2.1.0': {}
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@playwright/test@1.49.0':
+ dependencies:
+ playwright: 1.49.0
+
+ '@radix-ui/number@1.1.0': {}
+
+ '@radix-ui/primitive@1.1.0': {}
+
+ '@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-context@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ aria-hidden: 1.2.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-slot@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.0
+ '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/rect@1.1.0': {}
+
+ '@rollup/pluginutils@5.1.3(rollup@4.24.3)':
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-walker: 2.0.2
+ picomatch: 4.0.2
+ optionalDependencies:
+ rollup: 4.24.3
+
+ '@rollup/rollup-android-arm-eabi@4.24.3':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.24.3':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.24.3':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.24.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.24.3':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.24.3':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.24.3':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.24.3':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.24.3':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.24.3':
+ optional: true
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@rushstack/node-core-library@5.9.0(@types/node@20.17.5)':
+ dependencies:
+ ajv: 8.13.0
+ ajv-draft-04: 1.0.0(ajv@8.13.0)
+ ajv-formats: 3.0.1(ajv@8.13.0)
+ fs-extra: 7.0.1
+ import-lazy: 4.0.0
+ jju: 1.4.0
+ resolve: 1.22.8
+ semver: 7.5.4
+ optionalDependencies:
+ '@types/node': 20.17.5
+
+ '@rushstack/rig-package@0.5.3':
+ dependencies:
+ resolve: 1.22.8
+ strip-json-comments: 3.1.1
+
+ '@rushstack/terminal@0.14.2(@types/node@20.17.5)':
+ dependencies:
+ '@rushstack/node-core-library': 5.9.0(@types/node@20.17.5)
+ supports-color: 8.1.1
+ optionalDependencies:
+ '@types/node': 20.17.5
+
+ '@rushstack/ts-command-line@4.23.0(@types/node@20.17.5)':
+ dependencies:
+ '@rushstack/terminal': 0.14.2(@types/node@20.17.5)
+ '@types/argparse': 1.0.38
+ argparse: 1.0.10
+ string-argv: 0.3.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@scarf/scarf@1.4.0': {}
+
+ '@shikijs/core@1.22.2':
+ dependencies:
+ '@shikijs/engine-javascript': 1.22.2
+ '@shikijs/engine-oniguruma': 1.22.2
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.3
+
+ '@shikijs/engine-javascript@1.22.2':
+ dependencies:
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+ oniguruma-to-js: 0.4.3
+
+ '@shikijs/engine-oniguruma@1.22.2':
+ dependencies:
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+
+ '@shikijs/types@1.22.2':
+ dependencies:
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@9.3.0': {}
+
+ '@sinclair/typebox@0.27.8': {}
+
+ '@sinonjs/commons@3.0.1':
+ dependencies:
+ type-detect: 4.0.8
+
+ '@sinonjs/fake-timers@10.3.0':
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+
+ '@sqltools/formatter@1.2.5': {}
+
+ '@swc/core-darwin-arm64@1.7.42':
+ optional: true
+
+ '@swc/core-darwin-x64@1.7.42':
+ optional: true
+
+ '@swc/core-linux-arm-gnueabihf@1.7.42':
+ optional: true
+
+ '@swc/core-linux-arm64-gnu@1.7.42':
+ optional: true
+
+ '@swc/core-linux-arm64-musl@1.7.42':
+ optional: true
+
+ '@swc/core-linux-x64-gnu@1.7.42':
+ optional: true
+
+ '@swc/core-linux-x64-musl@1.7.42':
+ optional: true
+
+ '@swc/core-win32-arm64-msvc@1.7.42':
+ optional: true
+
+ '@swc/core-win32-ia32-msvc@1.7.42':
+ optional: true
+
+ '@swc/core-win32-x64-msvc@1.7.42':
+ optional: true
+
+ '@swc/core@1.7.42':
+ dependencies:
+ '@swc/counter': 0.1.3
+ '@swc/types': 0.1.13
+ optionalDependencies:
+ '@swc/core-darwin-arm64': 1.7.42
+ '@swc/core-darwin-x64': 1.7.42
+ '@swc/core-linux-arm-gnueabihf': 1.7.42
+ '@swc/core-linux-arm64-gnu': 1.7.42
+ '@swc/core-linux-arm64-musl': 1.7.42
+ '@swc/core-linux-x64-gnu': 1.7.42
+ '@swc/core-linux-x64-musl': 1.7.42
+ '@swc/core-win32-arm64-msvc': 1.7.42
+ '@swc/core-win32-ia32-msvc': 1.7.42
+ '@swc/core-win32-x64-msvc': 1.7.42
+
+ '@swc/counter@0.1.3': {}
+
+ '@swc/types@0.1.13':
+ dependencies:
+ '@swc/counter': 0.1.3
+
+ '@tanstack/history@1.61.1': {}
+
+ '@tanstack/query-core@5.59.17': {}
+
+ '@tanstack/query-devtools@5.59.19': {}
+
+ '@tanstack/react-query-devtools@5.59.19(@tanstack/react-query@5.59.19(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/query-devtools': 5.59.19
+ '@tanstack/react-query': 5.59.19(react@18.3.1)
+ react: 18.3.1
+
+ '@tanstack/react-query@5.59.19(react@18.3.1)':
+ dependencies:
+ '@tanstack/query-core': 5.59.17
+ react: 18.3.1
+
+ '@tanstack/react-router@1.78.3(@tanstack/router-generator@1.78.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/history': 1.61.1
+ '@tanstack/react-store': 0.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tiny-invariant: 1.3.3
+ tiny-warning: 1.0.3
+ optionalDependencies:
+ '@tanstack/router-generator': 1.78.3
+
+ '@tanstack/react-store@0.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/store': 0.5.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ use-sync-external-store: 1.2.2(react@18.3.1)
+
+ '@tanstack/router-devtools@1.78.3(@tanstack/react-router@1.78.3(@tanstack/router-generator@1.78.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@tanstack/react-router': 1.78.3(@tanstack/router-generator@1.78.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ clsx: 2.1.1
+ goober: 2.1.16(csstype@3.1.3)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ transitivePeerDependencies:
+ - csstype
+
+ '@tanstack/router-generator@1.78.3':
+ dependencies:
+ '@tanstack/virtual-file-routes': 1.64.0
+ prettier: 3.3.3
+ tsx: 4.19.2
+ zod: 3.23.8
+
+ '@tanstack/router-plugin@1.78.3(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))(webpack-sources@3.2.3)(webpack@5.96.1(@swc/core@1.7.42))':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.2
+ '@babel/parser': 7.26.2
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ '@tanstack/router-generator': 1.78.3
+ '@tanstack/virtual-file-routes': 1.64.0
+ '@types/babel__core': 7.20.5
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+ babel-dead-code-elimination: 1.0.6
+ chokidar: 3.6.0
+ unplugin: 1.15.0(webpack-sources@3.2.3)
+ zod: 3.23.8
+ optionalDependencies:
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ webpack: 5.96.1(@swc/core@1.7.42)
+ transitivePeerDependencies:
+ - supports-color
+ - webpack-sources
+
+ '@tanstack/store@0.5.5': {}
+
+ '@tanstack/virtual-file-routes@1.64.0': {}
+
+ '@testing-library/dom@10.4.0':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/runtime': 7.26.0
+ '@types/aria-query': 5.0.4
+ aria-query: 5.3.0
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ pretty-format: 27.5.1
+
+ '@testing-library/jest-dom@6.6.3':
+ dependencies:
+ '@adobe/css-tools': 4.4.0
+ aria-query: 5.3.2
+ chalk: 3.0.0
+ css.escape: 1.5.1
+ dom-accessibility-api: 0.6.3
+ lodash: 4.17.21
+ redent: 3.0.0
+
+ '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.26.0
+ '@testing-library/dom': 10.4.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@tsconfig/node10@1.0.11': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@types/argparse@1.0.38': {}
+
+ '@types/aria-query@5.0.4': {}
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+
+ '@types/babel__traverse@7.20.6':
+ dependencies:
+ '@babel/types': 7.26.0
+
+ '@types/body-parser@1.19.5':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 20.17.5
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 20.17.5
+
+ '@types/conventional-commits-parser@5.0.0':
+ dependencies:
+ '@types/node': 20.17.5
+
+ '@types/cookie@0.6.0': {}
+
+ '@types/cookiejar@2.1.5': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 0.7.34
+
+ '@types/eslint-scope@3.7.7':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.6
+ optional: true
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ optional: true
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.6
+
+ '@types/estree@1.0.6': {}
+
+ '@types/express-serve-static-core@4.19.6':
+ dependencies:
+ '@types/node': 20.17.5
+ '@types/qs': 6.9.16
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.4
+
+ '@types/express@4.17.21':
+ dependencies:
+ '@types/body-parser': 1.19.5
+ '@types/express-serve-static-core': 4.19.6
+ '@types/qs': 6.9.16
+ '@types/serve-static': 1.15.7
+
+ '@types/graceful-fs@4.1.9':
+ dependencies:
+ '@types/node': 20.17.5
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/http-errors@2.0.4': {}
+
+ '@types/istanbul-lib-coverage@2.0.6': {}
+
+ '@types/istanbul-lib-report@3.0.3':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+
+ '@types/istanbul-reports@3.0.4':
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+
+ '@types/jest@29.5.14':
+ dependencies:
+ expect: 29.7.0
+ pretty-format: 29.7.0
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/jsonwebtoken@9.0.5':
+ dependencies:
+ '@types/node': 20.17.5
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/methods@1.1.4': {}
+
+ '@types/mime@1.3.5': {}
+
+ '@types/ms@0.7.34': {}
+
+ '@types/node@20.17.5':
+ dependencies:
+ undici-types: 6.19.8
+
+ '@types/prop-types@15.7.13': {}
+
+ '@types/qs@6.9.16': {}
+
+ '@types/range-parser@1.2.7': {}
+
+ '@types/react-dom@18.3.1':
+ dependencies:
+ '@types/react': 18.3.12
+
+ '@types/react@18.3.12':
+ dependencies:
+ '@types/prop-types': 15.7.13
+ csstype: 3.1.3
+
+ '@types/semver@7.5.8': {}
+
+ '@types/send@0.17.4':
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 20.17.5
+
+ '@types/serve-static@1.15.7':
+ dependencies:
+ '@types/http-errors': 2.0.4
+ '@types/node': 20.17.5
+ '@types/send': 0.17.4
+
+ '@types/stack-utils@2.0.3': {}
+
+ '@types/statuses@2.0.5': {}
+
+ '@types/superagent@8.1.9':
+ dependencies:
+ '@types/cookiejar': 2.1.5
+ '@types/methods': 1.1.4
+ '@types/node': 20.17.5
+ form-data: 4.0.1
+
+ '@types/supertest@2.0.16':
+ dependencies:
+ '@types/superagent': 8.1.9
+
+ '@types/tough-cookie@4.0.5': {}
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@types/validator@13.12.2': {}
+
+ '@types/yargs-parser@21.0.3': {}
+
+ '@types/yargs@17.0.33':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ debug: 4.3.7
+ eslint: 8.57.1
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare-lite: 1.4.0
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.12.2
+ '@typescript-eslint/type-utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.12.2
+ eslint: 9.13.0(jiti@1.21.6)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 1.4.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+ debug: 4.3.7
+ eslint: 8.57.1
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.12.2
+ '@typescript-eslint/types': 8.12.2
+ '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.12.2
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@5.62.0':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+
+ '@typescript-eslint/scope-manager@8.12.2':
+ dependencies:
+ '@typescript-eslint/types': 8.12.2
+ '@typescript-eslint/visitor-keys': 8.12.2
+
+ '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ debug: 4.3.7
+ eslint: 8.57.1
+ tsutils: 3.21.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/type-utils@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ debug: 4.3.7
+ ts-api-utils: 1.4.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+
+ '@typescript-eslint/types@5.62.0': {}
+
+ '@typescript-eslint/types@8.12.2': {}
+
+ '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ debug: 4.3.7
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.6.3
+ tsutils: 3.21.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/typescript-estree@8.12.2(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.12.2
+ '@typescript-eslint/visitor-keys': 8.12.2
+ debug: 4.3.7
+ fast-glob: 3.3.2
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 1.4.0(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.5.8
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3)
+ eslint: 8.57.1
+ eslint-scope: 5.1.1
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@typescript-eslint/utils@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.13.0(jiti@1.21.6))
+ '@typescript-eslint/scope-manager': 8.12.2
+ '@typescript-eslint/types': 8.12.2
+ '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.3)
+ eslint: 9.13.0(jiti@1.21.6)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@typescript-eslint/visitor-keys@5.62.0':
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
+
+ '@typescript-eslint/visitor-keys@8.12.2':
+ dependencies:
+ '@typescript-eslint/types': 8.12.2
+ eslint-visitor-keys: 3.4.3
+
+ '@ungap/structured-clone@1.2.0': {}
+
+ '@vitejs/plugin-react-swc@3.7.1(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))':
+ dependencies:
+ '@swc/core': 1.7.42
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ transitivePeerDependencies:
+ - '@swc/helpers'
+
+ '@vitest/expect@2.1.4':
+ dependencies:
+ '@vitest/spy': 2.1.4
+ '@vitest/utils': 2.1.4
+ chai: 5.1.2
+ tinyrainbow: 1.2.0
+
+ '@vitest/mocker@2.1.4(msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3))(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))':
+ dependencies:
+ '@vitest/spy': 2.1.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.12
+ optionalDependencies:
+ msw: 2.6.4(@types/node@20.17.5)(typescript@5.6.3)
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+
+ '@vitest/pretty-format@2.1.4':
+ dependencies:
+ tinyrainbow: 1.2.0
+
+ '@vitest/runner@2.1.4':
+ dependencies:
+ '@vitest/utils': 2.1.4
+ pathe: 1.1.2
+
+ '@vitest/snapshot@2.1.4':
+ dependencies:
+ '@vitest/pretty-format': 2.1.4
+ magic-string: 0.30.12
+ pathe: 1.1.2
+
+ '@vitest/spy@2.1.4':
+ dependencies:
+ tinyspy: 3.0.2
+
+ '@vitest/utils@2.1.4':
+ dependencies:
+ '@vitest/pretty-format': 2.1.4
+ loupe: 3.1.2
+ tinyrainbow: 1.2.0
+
+ '@volar/language-core@2.4.10':
+ dependencies:
+ '@volar/source-map': 2.4.10
+
+ '@volar/source-map@2.4.10': {}
+
+ '@volar/typescript@2.4.10':
+ dependencies:
+ '@volar/language-core': 2.4.10
+ path-browserify: 1.0.1
+ vscode-uri: 3.0.8
+
+ '@vue/compiler-core@3.5.12':
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@vue/shared': 3.5.12
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.12':
+ dependencies:
+ '@vue/compiler-core': 3.5.12
+ '@vue/shared': 3.5.12
+
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/language-core@2.1.6(typescript@5.6.3)':
+ dependencies:
+ '@volar/language-core': 2.4.10
+ '@vue/compiler-dom': 3.5.12
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.12
+ computeds: 0.0.1
+ minimatch: 9.0.5
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.6.3
+
+ '@vue/shared@3.5.12': {}
+
+ '@webassemblyjs/ast@1.12.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.11.6
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+
+ '@webassemblyjs/floating-point-hex-parser@1.11.6': {}
+
+ '@webassemblyjs/helper-api-error@1.11.6': {}
+
+ '@webassemblyjs/helper-buffer@1.12.1': {}
+
+ '@webassemblyjs/helper-numbers@1.11.6':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.11.6
+ '@webassemblyjs/helper-api-error': 1.11.6
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.11.6': {}
+
+ '@webassemblyjs/helper-wasm-section@1.12.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/helper-buffer': 1.12.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+ '@webassemblyjs/wasm-gen': 1.12.1
+
+ '@webassemblyjs/ieee754@1.11.6':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.11.6':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.11.6': {}
+
+ '@webassemblyjs/wasm-edit@1.12.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/helper-buffer': 1.12.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+ '@webassemblyjs/helper-wasm-section': 1.12.1
+ '@webassemblyjs/wasm-gen': 1.12.1
+ '@webassemblyjs/wasm-opt': 1.12.1
+ '@webassemblyjs/wasm-parser': 1.12.1
+ '@webassemblyjs/wast-printer': 1.12.1
+
+ '@webassemblyjs/wasm-gen@1.12.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+ '@webassemblyjs/ieee754': 1.11.6
+ '@webassemblyjs/leb128': 1.11.6
+ '@webassemblyjs/utf8': 1.11.6
+
+ '@webassemblyjs/wasm-opt@1.12.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/helper-buffer': 1.12.1
+ '@webassemblyjs/wasm-gen': 1.12.1
+ '@webassemblyjs/wasm-parser': 1.12.1
+
+ '@webassemblyjs/wasm-parser@1.12.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/helper-api-error': 1.11.6
+ '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+ '@webassemblyjs/ieee754': 1.11.6
+ '@webassemblyjs/leb128': 1.11.6
+ '@webassemblyjs/utf8': 1.11.6
+
+ '@webassemblyjs/wast-printer@1.12.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.12.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ acorn-import-attributes@1.9.5(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn-jsx@5.3.2(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@8.14.0: {}
+
+ agent-base@7.1.1:
+ dependencies:
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+
+ ajv-draft-04@1.0.0(ajv@8.13.0):
+ optionalDependencies:
+ ajv: 8.13.0
+
+ ajv-formats@2.1.1(ajv@8.12.0):
+ optionalDependencies:
+ ajv: 8.12.0
+
+ ajv-formats@3.0.1(ajv@8.13.0):
+ optionalDependencies:
+ ajv: 8.13.0
+
+ ajv-keywords@3.5.2(ajv@6.12.6):
+ dependencies:
+ ajv: 6.12.6
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.12.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
+ ajv@8.13.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
+ ansi-colors@4.1.3: {}
+
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
+ ansi-escapes@7.0.0:
+ dependencies:
+ environment: 1.1.0
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@5.2.0: {}
+
+ ansi-styles@6.2.1: {}
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ app-root-path@3.1.0: {}
+
+ append-field@1.0.0: {}
+
+ arg@4.1.3: {}
+
+ arg@5.0.2: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.4:
+ dependencies:
+ tslib: 2.8.1
+
+ aria-query@5.3.0:
+ dependencies:
+ dequal: 2.0.3
+
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
+
+ array-flatten@1.1.1: {}
+
+ array-ify@1.0.0: {}
+
+ array-includes@3.1.8:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ is-string: 1.0.7
+
+ array-timsort@1.0.3: {}
+
+ array-union@2.1.0: {}
+
+ array.prototype.findlastindex@1.2.5:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.flat@1.3.2:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+
+ array.prototype.flatmap@1.3.2:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+
+ arraybuffer.prototype.slice@1.0.3:
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
+
+ asap@2.0.6: {}
+
+ asn1@0.2.6:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ assertion-error@2.0.1: {}
+
+ async@3.2.6: {}
+
+ asynckit@0.4.0: {}
+
+ autoprefixer@10.4.20(postcss@8.4.47):
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001676
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.47
+ postcss-value-parser: 4.2.0
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.0.0
+
+ aws-ssl-profiles@1.1.2: {}
+
+ axios@1.7.7:
+ dependencies:
+ follow-redirects: 1.15.9
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ b4a@1.6.7: {}
+
+ babel-dead-code-elimination@1.0.6:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.2
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-jest@29.7.0(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/transform': 29.7.0
+ '@types/babel__core': 7.20.5
+ babel-plugin-istanbul: 6.1.1
+ babel-preset-jest: 29.6.3(@babel/core@7.26.0)
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-istanbul@6.1.1:
+ dependencies:
+ '@babel/helper-plugin-utils': 7.25.9
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-jest-hoist@29.6.3:
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ '@types/babel__core': 7.20.5
+ '@types/babel__traverse': 7.20.6
+
+ babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0)
+
+ babel-preset-jest@29.6.3(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ babel-plugin-jest-hoist: 29.6.3
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+
+ bail@2.0.2: {}
+
+ balanced-match@1.0.2: {}
+
+ bare-events@2.5.0:
+ optional: true
+
+ base64-js@1.5.1: {}
+
+ bcrypt-pbkdf@1.0.2:
+ dependencies:
+ tweetnacl: 0.14.5
+
+ binary-extensions@2.3.0: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ body-parser@1.20.3:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.24.2:
+ dependencies:
+ caniuse-lite: 1.0.30001676
+ electron-to-chromium: 1.5.50
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
+
+ bs-logger@0.2.6:
+ dependencies:
+ fast-json-stable-stringify: 2.1.0
+
+ bser@2.1.1:
+ dependencies:
+ node-int64: 0.4.0
+
+ buffer-equal-constant-time@1.0.1: {}
+
+ buffer-from@1.1.2: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ buildcheck@0.0.6:
+ optional: true
+
+ bull@4.16.4:
+ dependencies:
+ cron-parser: 4.9.0
+ get-port: 5.1.1
+ ioredis: 5.4.1
+ lodash: 4.17.21
+ msgpackr: 1.11.2
+ semver: 7.6.3
+ uuid: 8.3.2
+ transitivePeerDependencies:
+ - supports-color
+
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
+ bytes@3.1.2: {}
+
+ cac@6.7.14: {}
+
+ call-bind@1.0.7:
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
+
+ callsites@3.1.0: {}
+
+ camelcase-css@2.0.1: {}
+
+ camelcase@5.3.1: {}
+
+ camelcase@6.3.0: {}
+
+ caniuse-lite@1.0.30001676: {}
+
+ ccount@2.0.1: {}
+
+ chai@5.1.2:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.1.2
+ pathval: 2.0.0
+
+ chalk@3.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.3.0: {}
+
+ char-regex@1.0.2: {}
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@2.0.1: {}
+
+ chardet@0.7.0: {}
+
+ check-error@2.1.1: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ chownr@1.1.4: {}
+
+ chrome-trace-event@1.0.4: {}
+
+ ci-info@3.9.0: {}
+
+ cjs-module-lexer@1.4.1: {}
+
+ class-transformer@0.5.1: {}
+
+ class-validator@0.14.1:
+ dependencies:
+ '@types/validator': 13.12.2
+ libphonenumber-js: 1.11.14
+ validator: 13.12.0
+
+ class-variance-authority@0.7.0:
+ dependencies:
+ clsx: 2.0.0
+
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
+ cli-cursor@5.0.0:
+ dependencies:
+ restore-cursor: 5.1.0
+
+ cli-highlight@2.1.11:
+ dependencies:
+ chalk: 4.1.2
+ highlight.js: 10.7.3
+ mz: 2.7.0
+ parse5: 5.1.1
+ parse5-htmlparser2-tree-adapter: 6.0.1
+ yargs: 16.2.0
+
+ cli-spinners@2.9.2: {}
+
+ cli-table3@0.6.5:
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+
+ cli-truncate@4.0.0:
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 7.2.0
+
+ cli-width@3.0.0: {}
+
+ cli-width@4.1.0: {}
+
+ cliui@7.0.4:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone@1.0.4: {}
+
+ clsx@2.0.0: {}
+
+ clsx@2.1.1: {}
+
+ cluster-key-slot@1.1.2: {}
+
+ co@4.6.0: {}
+
+ collect-v8-coverage@1.0.2: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ colorette@2.0.20: {}
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@12.1.0: {}
+
+ commander@2.20.3: {}
+
+ commander@4.1.1: {}
+
+ comment-json@4.2.5:
+ dependencies:
+ array-timsort: 1.0.3
+ core-util-is: 1.0.3
+ esprima: 4.0.1
+ has-own-prop: 2.0.0
+ repeat-string: 1.6.1
+
+ compare-func@2.0.0:
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+
+ compare-versions@6.1.1: {}
+
+ component-emitter@1.3.1: {}
+
+ computeds@0.0.1: {}
+
+ concat-map@0.0.1: {}
+
+ concat-stream@1.6.2:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+ typedarray: 0.0.6
+
+ confbox@0.1.8: {}
+
+ consola@2.15.3: {}
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-type@1.0.5: {}
+
+ conventional-changelog-angular@7.0.0:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-changelog-conventionalcommits@7.0.2:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-commits-parser@5.0.0:
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 2.0.0
+ meow: 12.1.1
+ split2: 4.2.0
+
+ convert-source-map@2.0.0: {}
+
+ cookie-signature@1.0.6: {}
+
+ cookie@0.7.1: {}
+
+ cookie@0.7.2: {}
+
+ cookiejar@2.1.4: {}
+
+ core-util-is@1.0.3: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cosmiconfig-typescript-loader@5.1.0(@types/node@20.17.5)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3):
+ dependencies:
+ '@types/node': 20.17.5
+ cosmiconfig: 9.0.0(typescript@5.6.3)
+ jiti: 1.21.6
+ typescript: 5.6.3
+
+ cosmiconfig@8.3.6(typescript@5.3.3):
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.3.3
+
+ cosmiconfig@9.0.0(typescript@5.6.3):
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ optionalDependencies:
+ typescript: 5.6.3
+
+ cpu-features@0.0.10:
+ dependencies:
+ buildcheck: 0.0.6
+ nan: 2.22.0
+ optional: true
+
+ create-jest@29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ exit: 0.1.2
+ graceful-fs: 4.2.11
+ jest-config: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ jest-util: 29.7.0
+ prompts: 2.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
+ create-require@1.1.1: {}
+
+ cron-parser@4.9.0:
+ dependencies:
+ luxon: 3.5.0
+
+ cross-spawn@7.0.3:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css.escape@1.5.1: {}
+
+ cssesc@3.0.0: {}
+
+ cssstyle@4.1.0:
+ dependencies:
+ rrweb-cssom: 0.7.1
+
+ csstype@3.1.3: {}
+
+ dargs@8.1.0: {}
+
+ data-urls@5.0.0:
+ dependencies:
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.0.0
+
+ data-view-buffer@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+
+ data-view-byte-length@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+
+ data-view-byte-offset@1.0.0:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+
+ dayjs@1.11.13: {}
+
+ de-indent@1.0.2: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.3.7:
+ dependencies:
+ ms: 2.1.3
+
+ decimal.js@10.4.3: {}
+
+ decode-named-character-reference@1.0.2:
+ dependencies:
+ character-entities: 2.0.2
+
+ dedent@1.5.3: {}
+
+ deep-eql@5.0.2: {}
+
+ deep-is@0.1.4: {}
+
+ deepmerge@4.3.1: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ delayed-stream@1.0.0: {}
+
+ denque@2.1.0: {}
+
+ depd@2.0.0: {}
+
+ dequal@2.0.3: {}
+
+ destroy@1.2.0: {}
+
+ detect-libc@2.0.3:
+ optional: true
+
+ detect-newline@3.1.0: {}
+
+ detect-node-es@1.1.0: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ dezalgo@1.0.4:
+ dependencies:
+ asap: 2.0.6
+ wrappy: 1.0.2
+
+ didyoumean@1.2.2: {}
+
+ diff-sequences@29.6.3: {}
+
+ diff@4.0.2: {}
+
+ dir-glob@3.0.1:
+ dependencies:
+ path-type: 4.0.0
+
+ dlv@1.1.3: {}
+
+ docker-modem@5.0.3:
+ dependencies:
+ debug: 4.3.7
+ readable-stream: 3.6.2
+ split-ca: 1.0.1
+ ssh2: 1.16.0
+ transitivePeerDependencies:
+ - supports-color
+
+ dockerode@4.0.2:
+ dependencies:
+ '@balena/dockerignore': 1.0.2
+ docker-modem: 5.0.3
+ tar-fs: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ doctrine@3.0.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dom-accessibility-api@0.5.16: {}
+
+ dom-accessibility-api@0.6.3: {}
+
+ dot-prop@5.3.0:
+ dependencies:
+ is-obj: 2.0.0
+
+ dotenv-expand@10.0.0: {}
+
+ dotenv@16.4.5: {}
+
+ eastasianwidth@0.2.0: {}
+
+ ecdsa-sig-formatter@1.0.11:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ ee-first@1.1.1: {}
+
+ ejs@3.1.10:
+ dependencies:
+ jake: 10.9.2
+
+ electron-to-chromium@1.5.50: {}
+
+ embla-carousel-autoplay@8.5.1(embla-carousel@8.3.1):
+ dependencies:
+ embla-carousel: 8.3.1
+
+ embla-carousel-react@8.3.1(react@18.3.1):
+ dependencies:
+ embla-carousel: 8.3.1
+ embla-carousel-reactive-utils: 8.3.1(embla-carousel@8.3.1)
+ react: 18.3.1
+
+ embla-carousel-reactive-utils@8.3.1(embla-carousel@8.3.1):
+ dependencies:
+ embla-carousel: 8.3.1
+
+ embla-carousel@8.3.1: {}
+
+ emittery@0.13.1: {}
+
+ emoji-regex@10.4.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
+ end-of-stream@1.4.4:
+ dependencies:
+ once: 1.4.0
+
+ enhanced-resolve@5.17.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
+ entities@4.5.0: {}
+
+ env-paths@2.2.1: {}
+
+ environment@1.1.0: {}
+
+ error-ex@1.3.2:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-abstract@1.23.3:
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ data-view-buffer: 1.0.1
+ data-view-byte-length: 1.0.1
+ data-view-byte-offset: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-set-tostringtag: 2.0.3
+ es-to-primitive: 1.2.1
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
+ globalthis: 1.0.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
+ is-callable: 1.2.7
+ is-data-view: 1.0.1
+ is-negative-zero: 2.0.3
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.3
+ is-string: 1.0.7
+ is-typed-array: 1.1.13
+ is-weakref: 1.0.2
+ object-inspect: 1.13.2
+ object-keys: 1.1.1
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.3
+ safe-array-concat: 1.1.2
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.9
+ string.prototype.trimend: 1.0.8
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.2
+ typed-array-byte-length: 1.0.1
+ typed-array-byte-offset: 1.0.2
+ typed-array-length: 1.0.6
+ unbox-primitive: 1.0.2
+ which-typed-array: 1.1.15
+
+ es-define-property@1.0.0:
+ dependencies:
+ get-intrinsic: 1.2.4
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@1.5.4: {}
+
+ es-object-atoms@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.0.3:
+ dependencies:
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ es-shim-unscopables@1.0.2:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.2.1:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+
+ esbuild@0.21.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+
+ esbuild@0.23.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.23.1
+ '@esbuild/android-arm': 0.23.1
+ '@esbuild/android-arm64': 0.23.1
+ '@esbuild/android-x64': 0.23.1
+ '@esbuild/darwin-arm64': 0.23.1
+ '@esbuild/darwin-x64': 0.23.1
+ '@esbuild/freebsd-arm64': 0.23.1
+ '@esbuild/freebsd-x64': 0.23.1
+ '@esbuild/linux-arm': 0.23.1
+ '@esbuild/linux-arm64': 0.23.1
+ '@esbuild/linux-ia32': 0.23.1
+ '@esbuild/linux-loong64': 0.23.1
+ '@esbuild/linux-mips64el': 0.23.1
+ '@esbuild/linux-ppc64': 0.23.1
+ '@esbuild/linux-riscv64': 0.23.1
+ '@esbuild/linux-s390x': 0.23.1
+ '@esbuild/linux-x64': 0.23.1
+ '@esbuild/netbsd-x64': 0.23.1
+ '@esbuild/openbsd-arm64': 0.23.1
+ '@esbuild/openbsd-x64': 0.23.1
+ '@esbuild/sunos-x64': 0.23.1
+ '@esbuild/win32-arm64': 0.23.1
+ '@esbuild/win32-ia32': 0.23.1
+ '@esbuild/win32-x64': 0.23.1
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@2.0.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-config-prettier@8.10.0(eslint@8.57.1):
+ dependencies:
+ eslint: 8.57.1
+
+ eslint-config-prettier@8.10.0(eslint@9.13.0(jiti@1.21.6)):
+ dependencies:
+ eslint: 9.13.0(jiti@1.21.6)
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.15.1
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@1.21.6)):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-import-resolver-node: 0.3.9
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)
+ hasown: 2.0.2
+ is-core-module: 2.15.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.8
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.6.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6)):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.8
+ array.prototype.findlastindex: 1.2.5
+ array.prototype.flat: 1.3.2
+ array.prototype.flatmap: 1.3.2
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.13.0(jiti@1.21.6))
+ hasown: 2.0.2
+ is-core-module: 2.15.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.0
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.8
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-no-relative-import-paths@1.5.5: {}
+
+ eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8):
+ dependencies:
+ eslint: 8.57.1
+ prettier: 2.8.8
+ prettier-linter-helpers: 1.0.0
+ optionalDependencies:
+ eslint-config-prettier: 8.10.0(eslint@8.57.1)
+
+ eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))(prettier@2.8.8):
+ dependencies:
+ eslint: 9.13.0(jiti@1.21.6)
+ prettier: 2.8.8
+ prettier-linter-helpers: 1.0.0
+ optionalDependencies:
+ eslint-config-prettier: 8.10.0(eslint@9.13.0(jiti@1.21.6))
+
+ eslint-plugin-react-hooks@5.0.0(eslint@9.13.0(jiti@1.21.6)):
+ dependencies:
+ eslint: 9.13.0(jiti@1.21.6)
+
+ eslint-plugin-react-refresh@0.4.14(eslint@9.13.0(jiti@1.21.6)):
+ dependencies:
+ eslint: 9.13.0(jiti@1.21.6)
+
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ eslint-scope@7.2.2:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-scope@8.2.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.0: {}
+
+ eslint@8.57.1:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.57.1
+ '@humanwhocodes/config-array': 0.13.0
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.7
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint@9.13.0(jiti@1.21.6):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.13.0(jiti@1.21.6))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.18.0
+ '@eslint/core': 0.7.0
+ '@eslint/eslintrc': 3.1.0
+ '@eslint/js': 9.13.0
+ '@eslint/plugin-kit': 0.2.2
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.3.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.7
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.2.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ text-table: 0.2.0
+ optionalDependencies:
+ jiti: 1.21.6
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.3.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 4.2.0
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 3.4.3
+
+ esprima@4.0.1: {}
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.6
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ eventemitter3@5.0.1: {}
+
+ events@3.3.0: {}
+
+ execa@5.1.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+
+ execa@8.0.1:
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+
+ exit@0.1.2: {}
+
+ expect-type@1.1.0: {}
+
+ expect@29.7.0:
+ dependencies:
+ '@jest/expect-utils': 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+
+ express@4.21.1:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.10
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ extend@3.0.2: {}
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-diff@1.3.0: {}
+
+ fast-fifo@1.3.2: {}
+
+ fast-glob@3.3.2:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-safe-stringify@2.1.1: {}
+
+ fastq@1.17.1:
+ dependencies:
+ reusify: 1.0.4
+
+ fb-watchman@2.0.2:
+ dependencies:
+ bser: 2.1.1
+
+ figures@3.2.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ file-entry-cache@6.0.1:
+ dependencies:
+ flat-cache: 3.2.0
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ filelist@1.0.4:
+ dependencies:
+ minimatch: 5.1.6
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ finalhandler@1.3.1:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ find-up@7.0.0:
+ dependencies:
+ locate-path: 7.2.0
+ path-exists: 5.0.0
+ unicorn-magic: 0.1.0
+
+ flat-cache@3.2.0:
+ dependencies:
+ flatted: 3.3.1
+ keyv: 4.5.4
+ rimraf: 3.0.2
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.1
+ keyv: 4.5.4
+
+ flatted@3.3.1: {}
+
+ follow-redirects@1.15.9: {}
+
+ for-each@0.3.3:
+ dependencies:
+ is-callable: 1.2.7
+
+ foreground-child@3.3.0:
+ dependencies:
+ cross-spawn: 7.0.3
+ signal-exit: 4.1.0
+
+ fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.7.42)):
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cosmiconfig: 8.3.6(typescript@5.3.3)
+ deepmerge: 4.3.1
+ fs-extra: 10.1.0
+ memfs: 3.5.3
+ minimatch: 3.1.2
+ node-abort-controller: 3.1.1
+ schema-utils: 3.3.0
+ semver: 7.6.3
+ tapable: 2.2.1
+ typescript: 5.3.3
+ webpack: 5.94.0(@swc/core@1.7.42)
+
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ formidable@2.1.2:
+ dependencies:
+ dezalgo: 1.0.4
+ hexoid: 1.0.0
+ once: 1.4.0
+ qs: 6.13.0
+
+ forwarded@0.2.0: {}
+
+ fraction.js@4.3.7: {}
+
+ framer-motion@11.11.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ fresh@0.5.2: {}
+
+ fs-constants@1.0.0: {}
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+
+ fs-extra@7.0.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+
+ fs-monkey@1.0.6: {}
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.2:
+ optional: true
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.6:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ functions-have-names: 1.2.3
+
+ functions-have-names@1.2.3: {}
+
+ generate-function@2.3.1:
+ dependencies:
+ is-property: 1.0.2
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.3.0: {}
+
+ get-intrinsic@1.2.4:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+
+ get-nonce@1.0.1: {}
+
+ get-package-type@0.1.0: {}
+
+ get-port@5.1.1: {}
+
+ get-stream@6.0.1: {}
+
+ get-stream@8.0.1: {}
+
+ get-symbol-description@1.0.2:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+
+ get-tsconfig@4.8.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ git-raw-commits@4.0.0:
+ dependencies:
+ dargs: 8.1.0
+ meow: 12.1.1
+ split2: 4.2.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-to-regexp@0.4.1: {}
+
+ glob@10.4.2:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ global-directory@4.0.1:
+ dependencies:
+ ini: 4.1.1
+
+ globals@11.12.0: {}
+
+ globals@13.24.0:
+ dependencies:
+ type-fest: 0.20.2
+
+ globals@14.0.0: {}
+
+ globals@15.11.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.0.1
+
+ globby@11.1.0:
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
+
+ globrex@0.1.2: {}
+
+ goober@2.1.16(csstype@3.1.3):
+ dependencies:
+ csstype: 3.1.3
+
+ gopd@1.0.1:
+ dependencies:
+ get-intrinsic: 1.2.4
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ graphql@16.9.0: {}
+
+ has-bigints@1.0.2: {}
+
+ has-flag@4.0.0: {}
+
+ has-own-prop@2.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.0
+
+ has-proto@1.0.3: {}
+
+ has-symbols@1.0.3: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.0.3
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hast-util-from-html@2.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.1
+ parse5: 7.2.1
+ vfile: 6.0.3
+ vfile-message: 4.0.2
+
+ hast-util-from-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 8.0.0
+ property-information: 6.5.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-to-html@9.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-jsx-runtime@2.3.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.8
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-string@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hastscript@8.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+
+ he@1.2.0: {}
+
+ headers-polyfill@4.0.3: {}
+
+ hexoid@1.0.0: {}
+
+ highlight.js@10.7.3: {}
+
+ html-encoding-sniffer@4.0.0:
+ dependencies:
+ whatwg-encoding: 3.1.1
+
+ html-escaper@2.0.2: {}
+
+ html-void-elements@3.0.0: {}
+
+ http-errors@2.0.0:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.5:
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+
+ human-signals@2.1.0: {}
+
+ human-signals@5.0.0: {}
+
+ husky@9.1.6: {}
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-lazy@4.0.0: {}
+
+ import-local@3.2.0:
+ dependencies:
+ pkg-dir: 4.2.0
+ resolve-cwd: 3.0.0
+
+ import-meta-resolve@4.1.0: {}
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@4.0.0: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ ini@4.1.1: {}
+
+ inline-style-parser@0.2.4: {}
+
+ inquirer@8.2.6:
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 6.2.0
+
+ inquirer@9.2.15:
+ dependencies:
+ '@ljharb/through': 2.3.13
+ ansi-escapes: 4.3.2
+ chalk: 5.3.0
+ cli-cursor: 3.1.0
+ cli-width: 4.1.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 1.0.0
+ ora: 5.4.1
+ run-async: 3.0.0
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+
+ internal-slot@1.0.7:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
+
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
+
+ ioredis@5.4.1:
+ dependencies:
+ '@ioredis/commands': 1.2.0
+ cluster-key-slot: 1.1.2
+ debug: 4.3.7
+ denque: 2.1.0
+ lodash.defaults: 4.2.0
+ lodash.isarguments: 3.1.0
+ redis-errors: 1.2.0
+ redis-parser: 3.0.0
+ standard-as-callback: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ ipaddr.js@1.9.1: {}
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-array-buffer@3.0.4:
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+
+ is-arrayish@0.2.1: {}
+
+ is-bigint@1.0.4:
+ dependencies:
+ has-bigints: 1.0.2
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-boolean-object@1.1.2:
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.15.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.1:
+ dependencies:
+ is-typed-array: 1.1.13
+
+ is-date-object@1.0.5:
+ dependencies:
+ has-tostringtag: 1.0.2
+
+ is-decimal@2.0.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@4.0.0: {}
+
+ is-fullwidth-code-point@5.0.0:
+ dependencies:
+ get-east-asian-width: 1.3.0
+
+ is-generator-fn@2.1.0: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-hexadecimal@2.0.1: {}
+
+ is-interactive@1.0.0: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-node-process@1.2.0: {}
+
+ is-number-object@1.0.7:
+ dependencies:
+ has-tostringtag: 1.0.2
+
+ is-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-path-inside@3.0.3: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-potential-custom-element-name@1.0.1: {}
+
+ is-property@1.0.2: {}
+
+ is-regex@1.1.4:
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+
+ is-shared-array-buffer@1.0.3:
+ dependencies:
+ call-bind: 1.0.7
+
+ is-stream@2.0.1: {}
+
+ is-stream@3.0.0: {}
+
+ is-string@1.0.7:
+ dependencies:
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.0.4:
+ dependencies:
+ has-symbols: 1.0.3
+
+ is-text-path@2.0.0:
+ dependencies:
+ text-extensions: 2.4.0
+
+ is-typed-array@1.1.13:
+ dependencies:
+ which-typed-array: 1.1.15
+
+ is-unicode-supported@0.1.0: {}
+
+ is-weakref@1.0.2:
+ dependencies:
+ call-bind: 1.0.7
+
+ isarray@1.0.0: {}
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-instrument@5.2.1:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.2
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-lib-instrument@6.0.3:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.2
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-lib-report@3.0.1:
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+
+ istanbul-lib-source-maps@4.0.1:
+ dependencies:
+ debug: 4.3.7
+ istanbul-lib-coverage: 3.2.2
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-reports@3.1.7:
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+
+ iterare@1.2.1: {}
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jake@10.9.2:
+ dependencies:
+ async: 3.2.6
+ chalk: 4.1.2
+ filelist: 1.0.4
+ minimatch: 3.1.2
+
+ jest-changed-files@29.7.0:
+ dependencies:
+ execa: 5.1.1
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+
+ jest-circus@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ chalk: 4.1.2
+ co: 4.6.0
+ dedent: 1.5.3
+ is-generator-fn: 2.1.0
+ jest-each: 29.7.0
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-runtime: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+ pretty-format: 29.7.0
+ pure-rand: 6.1.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+
+ jest-cli@29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ create-jest: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ exit: 0.1.2
+ import-local: 3.2.0
+ jest-config: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
+ jest-config@29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/test-sequencer': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.26.0)
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ deepmerge: 4.3.1
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-circus: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-get-type: 29.6.3
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-runner: 29.7.0
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ micromatch: 4.0.8
+ parse-json: 5.2.0
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ strip-json-comments: 3.1.1
+ optionalDependencies:
+ '@types/node': 20.17.5
+ ts-node: 10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+
+ jest-diff@29.7.0:
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 29.6.3
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+
+ jest-docblock@29.7.0:
+ dependencies:
+ detect-newline: 3.1.0
+
+ jest-each@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ jest-util: 29.7.0
+ pretty-format: 29.7.0
+
+ jest-environment-node@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
+ jest-get-type@29.6.3: {}
+
+ jest-haste-map@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 20.17.5
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.11
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ jest-leak-detector@29.7.0:
+ dependencies:
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+
+ jest-matcher-utils@29.7.0:
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+
+ jest-message-util@29.7.0:
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@jest/types': 29.6.3
+ '@types/stack-utils': 2.0.3
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+
+ jest-mock@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ jest-util: 29.7.0
+
+ jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
+ optionalDependencies:
+ jest-resolve: 29.7.0
+
+ jest-regex-util@29.6.3: {}
+
+ jest-resolve-dependencies@29.7.0:
+ dependencies:
+ jest-regex-util: 29.6.3
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-resolve@29.7.0:
+ dependencies:
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ resolve: 1.22.8
+ resolve.exports: 2.0.2
+ slash: 3.0.0
+
+ jest-runner@29.7.0:
+ dependencies:
+ '@jest/console': 29.7.0
+ '@jest/environment': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ chalk: 4.1.2
+ emittery: 0.13.1
+ graceful-fs: 4.2.11
+ jest-docblock: 29.7.0
+ jest-environment-node: 29.7.0
+ jest-haste-map: 29.7.0
+ jest-leak-detector: 29.7.0
+ jest-message-util: 29.7.0
+ jest-resolve: 29.7.0
+ jest-runtime: 29.7.0
+ jest-util: 29.7.0
+ jest-watcher: 29.7.0
+ jest-worker: 29.7.0
+ p-limit: 3.1.0
+ source-map-support: 0.5.13
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-runtime@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/globals': 29.7.0
+ '@jest/source-map': 29.6.3
+ '@jest/test-result': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ chalk: 4.1.2
+ cjs-module-lexer: 1.4.1
+ collect-v8-coverage: 1.0.2
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-resolve: 29.7.0
+ jest-snapshot: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+ strip-bom: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-snapshot@29.7.0:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.2
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ '@jest/expect-utils': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+ chalk: 4.1.2
+ expect: 29.7.0
+ graceful-fs: 4.2.11
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ natural-compare: 1.4.0
+ pretty-format: 29.7.0
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-util@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.11
+ picomatch: 2.3.1
+
+ jest-validate@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ leven: 3.1.0
+ pretty-format: 29.7.0
+
+ jest-watcher@29.7.0:
+ dependencies:
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.17.5
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ emittery: 0.13.1
+ jest-util: 29.7.0
+ string-length: 4.0.2
+
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 20.17.5
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jest-worker@29.7.0:
+ dependencies:
+ '@types/node': 20.17.5
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jest@29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ '@jest/types': 29.6.3
+ import-local: 3.2.0
+ jest-cli: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+
+ jiti@1.21.6: {}
+
+ jju@1.4.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsdom@25.0.1:
+ dependencies:
+ cssstyle: 4.1.0
+ data-urls: 5.0.0
+ decimal.js: 10.4.3
+ form-data: 4.0.1
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.5
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.13
+ parse5: 7.2.1
+ rrweb-cssom: 0.7.1
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 5.0.0
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.0.0
+ ws: 8.18.0
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ jsesc@3.0.2: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsonc-parser@3.2.1: {}
+
+ jsonc-parser@3.3.1: {}
+
+ jsonfile@4.0.0:
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonparse@1.3.1: {}
+
+ jsonwebtoken@9.0.2:
+ dependencies:
+ jws: 3.2.2
+ lodash.includes: 4.3.0
+ lodash.isboolean: 3.0.3
+ lodash.isinteger: 4.0.4
+ lodash.isnumber: 3.0.3
+ lodash.isplainobject: 4.0.6
+ lodash.isstring: 4.0.1
+ lodash.once: 4.1.1
+ ms: 2.1.3
+ semver: 7.6.3
+
+ jwa@1.4.1:
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+
+ jws@3.2.2:
+ dependencies:
+ jwa: 1.4.1
+ safe-buffer: 5.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kleur@3.0.3: {}
+
+ kolorist@1.8.0: {}
+
+ leven@3.1.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ libphonenumber-js@1.11.14: {}
+
+ lilconfig@2.1.0: {}
+
+ lilconfig@3.1.2: {}
+
+ lines-and-columns@1.2.4: {}
+
+ lint-staged@15.2.10:
+ dependencies:
+ chalk: 5.3.0
+ commander: 12.1.0
+ debug: 4.3.7
+ execa: 8.0.1
+ lilconfig: 3.1.2
+ listr2: 8.2.5
+ micromatch: 4.0.8
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.5.1
+ transitivePeerDependencies:
+ - supports-color
+
+ listr2@8.2.5:
+ dependencies:
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 6.1.0
+ rfdc: 1.4.1
+ wrap-ansi: 9.0.0
+
+ loader-runner@4.3.0: {}
+
+ local-pkg@0.5.0:
+ dependencies:
+ mlly: 1.7.2
+ pkg-types: 1.2.1
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ locate-path@7.2.0:
+ dependencies:
+ p-locate: 6.0.0
+
+ lodash.camelcase@4.3.0: {}
+
+ lodash.defaults@4.2.0: {}
+
+ lodash.includes@4.3.0: {}
+
+ lodash.isarguments@3.1.0: {}
+
+ lodash.isboolean@3.0.3: {}
+
+ lodash.isinteger@4.0.4: {}
+
+ lodash.isnumber@3.0.3: {}
+
+ lodash.isplainobject@4.0.6: {}
+
+ lodash.isstring@4.0.1: {}
+
+ lodash.kebabcase@4.1.1: {}
+
+ lodash.memoize@4.1.2: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.mergewith@4.6.2: {}
+
+ lodash.once@4.1.1: {}
+
+ lodash.snakecase@4.1.1: {}
+
+ lodash.startcase@4.4.0: {}
+
+ lodash.uniq@4.5.0: {}
+
+ lodash.upperfirst@4.3.1: {}
+
+ lodash@4.17.21: {}
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ log-update@6.1.0:
+ dependencies:
+ ansi-escapes: 7.0.0
+ cli-cursor: 5.0.0
+ slice-ansi: 7.1.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 9.0.0
+
+ long@5.2.3: {}
+
+ longest-streak@3.1.0: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ loupe@3.1.2: {}
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
+ lru-cache@7.18.3: {}
+
+ lru.min@1.1.1: {}
+
+ lucide-react@0.454.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ luxon@3.5.0: {}
+
+ lz-string@1.5.0: {}
+
+ magic-string@0.30.12:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ magic-string@0.30.8:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ make-dir@4.0.0:
+ dependencies:
+ semver: 7.6.3
+
+ make-error@1.3.6: {}
+
+ makeerror@1.0.12:
+ dependencies:
+ tmpl: 1.0.5
+
+ markdown-table@3.0.4: {}
+
+ mdast-util-find-and-replace@3.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ mdast-util-from-markdown@2.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-decode-string: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.1
+ micromark-util-character: 2.1.0
+
+ mdast-util-gfm-footnote@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.1.3:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.1
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ mdast-util-to-hast@13.2.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-decode-string: 2.0.0
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ media-typer@0.3.0: {}
+
+ memfs@3.5.3:
+ dependencies:
+ fs-monkey: 1.0.6
+
+ meow@12.1.1: {}
+
+ merge-descriptors@1.0.3: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ methods@1.1.2: {}
+
+ micromark-core-commonmark@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.0
+ micromark-factory-label: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-factory-title: 2.0.0
+ micromark-factory-whitespace: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-html-tag-name: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-table@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.0
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-destination@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-label@2.0.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-space@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-title@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-whitespace@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-character@2.1.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-chunked@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-classify-character@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-combine-extensions@2.0.0:
+ dependencies:
+ micromark-util-chunked: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-decode-string@2.0.0:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 2.1.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-encode@2.0.0: {}
+
+ micromark-util-html-tag-name@2.0.0: {}
+
+ micromark-util-normalize-identifier@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-resolve-all@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-util-sanitize-uri@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-encode: 2.0.0
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-subtokenize@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-symbol@2.0.0: {}
+
+ micromark-util-types@2.0.0: {}
+
+ micromark@4.0.0:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.7
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-encode: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mime@2.6.0: {}
+
+ mimic-fn@2.1.0: {}
+
+ mimic-fn@4.0.0: {}
+
+ mimic-function@5.0.1: {}
+
+ min-indent@1.0.1: {}
+
+ minimatch@3.0.8:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@5.1.6:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ mkdirp-classic@0.5.3: {}
+
+ mkdirp@0.5.6:
+ dependencies:
+ minimist: 1.2.8
+
+ mkdirp@2.1.6: {}
+
+ mlly@1.7.2:
+ dependencies:
+ acorn: 8.14.0
+ pathe: 1.1.2
+ pkg-types: 1.2.1
+ ufo: 1.5.4
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ msgpackr-extract@3.0.3:
+ dependencies:
+ node-gyp-build-optional-packages: 5.2.2
+ optionalDependencies:
+ '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3
+ '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
+ optional: true
+
+ msgpackr@1.11.2:
+ optionalDependencies:
+ msgpackr-extract: 3.0.3
+
+ msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3):
+ dependencies:
+ '@bundled-es-modules/cookie': 2.0.1
+ '@bundled-es-modules/statuses': 1.0.1
+ '@bundled-es-modules/tough-cookie': 0.1.6
+ '@inquirer/confirm': 5.0.2(@types/node@20.17.5)
+ '@mswjs/interceptors': 0.36.10
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/until': 2.1.0
+ '@types/cookie': 0.6.0
+ '@types/statuses': 2.0.5
+ chalk: 4.1.2
+ graphql: 16.9.0
+ headers-polyfill: 4.0.3
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ path-to-regexp: 6.3.0
+ strict-event-emitter: 0.5.1
+ type-fest: 4.27.0
+ yargs: 17.7.2
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - '@types/node'
+
+ muggle-string@0.4.1: {}
+
+ multer@1.4.4-lts.1:
+ dependencies:
+ append-field: 1.0.0
+ busboy: 1.6.0
+ concat-stream: 1.6.2
+ mkdirp: 0.5.6
+ object-assign: 4.1.1
+ type-is: 1.6.18
+ xtend: 4.0.2
+
+ mute-stream@0.0.8: {}
+
+ mute-stream@1.0.0: {}
+
+ mute-stream@2.0.0: {}
+
+ mysql2@3.11.4:
+ dependencies:
+ aws-ssl-profiles: 1.1.2
+ denque: 2.1.0
+ generate-function: 2.3.1
+ iconv-lite: 0.6.3
+ long: 5.2.3
+ lru.min: 1.1.1
+ named-placeholders: 1.1.3
+ seq-queue: 0.0.5
+ sqlstring: 2.3.3
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ named-placeholders@1.1.3:
+ dependencies:
+ lru-cache: 7.18.3
+
+ nan@2.22.0:
+ optional: true
+
+ nanoid@3.3.7: {}
+
+ natural-compare-lite@1.4.0: {}
+
+ natural-compare@1.4.0: {}
+
+ negotiator@0.6.3: {}
+
+ neo-async@2.6.2: {}
+
+ node-abort-controller@3.1.1: {}
+
+ node-emoji@1.11.0:
+ dependencies:
+ lodash: 4.17.21
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-gyp-build-optional-packages@5.2.2:
+ dependencies:
+ detect-libc: 2.0.3
+ optional: true
+
+ node-int64@0.4.0: {}
+
+ node-releases@2.0.18: {}
+
+ normalize-path@3.0.0: {}
+
+ normalize-range@0.1.2: {}
+
+ npm-run-path@4.0.1:
+ dependencies:
+ path-key: 3.1.1
+
+ npm-run-path@5.3.0:
+ dependencies:
+ path-key: 4.0.0
+
+ nwsapi@2.2.13: {}
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.2: {}
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.5:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+
+ object.values@1.2.0:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ onetime@6.0.0:
+ dependencies:
+ mimic-fn: 4.0.0
+
+ onetime@7.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
+ oniguruma-to-js@0.4.3:
+ dependencies:
+ regex: 4.4.0
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
+ os-tmpdir@1.0.2: {}
+
+ outvariant@1.4.3: {}
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-limit@4.0.0:
+ dependencies:
+ yocto-queue: 1.1.1
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-locate@6.0.0:
+ dependencies:
+ p-limit: 4.0.0
+
+ p-try@2.2.0: {}
+
+ package-json-from-dist@1.0.1: {}
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-entities@4.0.1:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities: 2.0.2
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.0.2
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-numeric-range@1.3.0: {}
+
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ dependencies:
+ parse5: 6.0.1
+
+ parse5@5.1.1: {}
+
+ parse5@6.0.1: {}
+
+ parse5@7.2.1:
+ dependencies:
+ entities: 4.5.0
+
+ parseurl@1.3.3: {}
+
+ path-browserify@1.0.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-exists@5.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-key@4.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ path-to-regexp@0.1.10: {}
+
+ path-to-regexp@3.3.0: {}
+
+ path-to-regexp@6.3.0: {}
+
+ path-type@4.0.0: {}
+
+ pathe@1.1.2: {}
+
+ pathval@2.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.1: {}
+
+ picomatch@4.0.2: {}
+
+ pidtree@0.6.0: {}
+
+ pify@2.3.0: {}
+
+ pirates@4.0.6: {}
+
+ pkg-dir@4.2.0:
+ dependencies:
+ find-up: 4.1.0
+
+ pkg-types@1.2.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.2
+ pathe: 1.1.2
+
+ playwright-core@1.49.0: {}
+
+ playwright@1.49.0:
+ dependencies:
+ playwright-core: 1.49.0
+ optionalDependencies:
+ fsevents: 2.3.2
+
+ pluralize@8.0.0: {}
+
+ possible-typed-array-names@1.0.0: {}
+
+ postcss-import@15.1.0(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+
+ postcss-js@4.0.1(postcss@8.4.47):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.47
+
+ postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ lilconfig: 3.1.2
+ yaml: 2.5.1
+ optionalDependencies:
+ postcss: 8.4.47
+ ts-node: 10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)
+
+ postcss-nested@6.2.0(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.47:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prettier-linter-helpers@1.0.0:
+ dependencies:
+ fast-diff: 1.3.0
+
+ prettier@2.8.8: {}
+
+ prettier@3.3.3: {}
+
+ pretty-format@27.5.1:
+ dependencies:
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 17.0.2
+
+ pretty-format@29.7.0:
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+
+ process-nextick-args@2.0.1: {}
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ property-information@6.5.0: {}
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ proxy-from-env@1.1.0: {}
+
+ psl@1.10.0:
+ dependencies:
+ punycode: 2.3.1
+
+ pump@3.0.2:
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+
+ punycode@2.3.1: {}
+
+ pure-rand@6.1.0: {}
+
+ qs@6.13.0:
+ dependencies:
+ side-channel: 1.0.6
+
+ querystringify@2.2.0: {}
+
+ queue-microtask@1.2.3: {}
+
+ queue-tick@1.0.1: {}
+
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-hook-form@7.53.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-icons@5.3.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-is@17.0.2: {}
+
+ react-is@18.3.1: {}
+
+ react-remove-scroll-bar@2.3.6(@types/react@18.3.12)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1)
+ react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1)
+ use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.3.1):
+ dependencies:
+ get-nonce: 1.0.1
+ invariant: 2.2.4
+ react: 18.3.1
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ read-cache@1.0.0:
+ dependencies:
+ pify: 2.3.0
+
+ readable-stream@2.3.8:
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ redent@3.0.0:
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+
+ redis-errors@1.2.0: {}
+
+ redis-parser@3.0.0:
+ dependencies:
+ redis-errors: 1.2.0
+
+ reflect-metadata@0.1.14: {}
+
+ reflect-metadata@0.2.2: {}
+
+ regenerator-runtime@0.14.1: {}
+
+ regex@4.4.0: {}
+
+ regexp.prototype.flags@1.5.3:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
+
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
+ rehype-pretty-code@0.14.0(shiki@1.22.2):
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-string: 3.0.1
+ parse-numeric-range: 1.3.0
+ rehype-parse: 9.0.1
+ shiki: 1.22.2
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+
+ rehype-react@8.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-jsx-runtime: 2.3.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ rehype-stringify@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.3
+ unified: 11.0.5
+
+ rehype@13.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ rehype-parse: 9.0.1
+ rehype-stringify: 10.0.1
+ unified: 11.0.5
+
+ remark-gfm@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.0.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ micromark-util-types: 2.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+
+ repeat-string@1.6.1: {}
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ requires-port@1.0.0: {}
+
+ resolve-cwd@3.0.0:
+ dependencies:
+ resolve-from: 5.0.0
+
+ resolve-from@4.0.0: {}
+
+ resolve-from@5.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve.exports@2.0.2: {}
+
+ resolve@1.22.8:
+ dependencies:
+ is-core-module: 2.15.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ restore-cursor@5.1.0:
+ dependencies:
+ onetime: 7.0.0
+ signal-exit: 4.1.0
+
+ reusify@1.0.4: {}
+
+ rfdc@1.4.1: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rollup@4.24.3:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.24.3
+ '@rollup/rollup-android-arm64': 4.24.3
+ '@rollup/rollup-darwin-arm64': 4.24.3
+ '@rollup/rollup-darwin-x64': 4.24.3
+ '@rollup/rollup-freebsd-arm64': 4.24.3
+ '@rollup/rollup-freebsd-x64': 4.24.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.24.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.24.3
+ '@rollup/rollup-linux-arm64-gnu': 4.24.3
+ '@rollup/rollup-linux-arm64-musl': 4.24.3
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.24.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.24.3
+ '@rollup/rollup-linux-s390x-gnu': 4.24.3
+ '@rollup/rollup-linux-x64-gnu': 4.24.3
+ '@rollup/rollup-linux-x64-musl': 4.24.3
+ '@rollup/rollup-win32-arm64-msvc': 4.24.3
+ '@rollup/rollup-win32-ia32-msvc': 4.24.3
+ '@rollup/rollup-win32-x64-msvc': 4.24.3
+ fsevents: 2.3.3
+
+ rrweb-cssom@0.7.1: {}
+
+ run-async@2.4.1: {}
+
+ run-async@3.0.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.8.1
+
+ safe-array-concat@1.1.2:
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+
+ safe-buffer@5.1.2: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-regex-test@1.0.3:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-regex: 1.1.4
+
+ safer-buffer@2.1.2: {}
+
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ schema-utils@3.3.0:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ ajv-keywords: 3.5.2(ajv@6.12.6)
+
+ semver@6.3.1: {}
+
+ semver@7.5.4:
+ dependencies:
+ lru-cache: 6.0.0
+
+ semver@7.6.3: {}
+
+ send@0.19.0:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ seq-queue@0.0.5: {}
+
+ serialize-javascript@6.0.2:
+ dependencies:
+ randombytes: 2.1.0
+
+ serve-static@1.16.2:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+
+ set-function-length@1.2.2:
+ 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
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ setprototypeof@1.2.0: {}
+
+ sha.js@2.4.11:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shiki@1.22.2:
+ dependencies:
+ '@shikijs/core': 1.22.2
+ '@shikijs/engine-javascript': 1.22.2
+ '@shikijs/engine-oniguruma': 1.22.2
+ '@shikijs/types': 1.22.2
+ '@shikijs/vscode-textmate': 9.3.0
+ '@types/hast': 3.0.4
+
+ side-channel@1.0.6:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.2
+
+ siginfo@2.0.0: {}
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sisteransi@1.0.5: {}
+
+ slash@3.0.0: {}
+
+ slice-ansi@5.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+
+ slice-ansi@7.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.13:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ split-ca@1.0.1: {}
+
+ split2@4.2.0: {}
+
+ sprintf-js@1.0.3: {}
+
+ sqlstring@2.3.3: {}
+
+ ssh2@1.16.0:
+ dependencies:
+ asn1: 0.2.6
+ bcrypt-pbkdf: 1.0.2
+ optionalDependencies:
+ cpu-features: 0.0.10
+ nan: 2.22.0
+
+ stack-utils@2.0.6:
+ dependencies:
+ escape-string-regexp: 2.0.0
+
+ stackback@0.0.2: {}
+
+ standard-as-callback@2.1.0: {}
+
+ statuses@2.0.1: {}
+
+ std-env@3.7.0: {}
+
+ streamsearch@1.1.0: {}
+
+ streamx@2.20.1:
+ dependencies:
+ fast-fifo: 1.3.2
+ queue-tick: 1.0.1
+ text-decoder: 1.2.1
+ optionalDependencies:
+ bare-events: 2.5.0
+
+ strict-event-emitter@0.5.1: {}
+
+ string-argv@0.3.2: {}
+
+ string-length@4.0.2:
+ dependencies:
+ char-regex: 1.0.2
+ strip-ansi: 6.0.1
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string.prototype.trim@1.2.9:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+
+ string.prototype.trimend@1.0.8:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+
+ string_decoder@1.1.1:
+ dependencies:
+ safe-buffer: 5.1.2
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-bom@3.0.0: {}
+
+ strip-bom@4.0.0: {}
+
+ strip-final-newline@2.0.0: {}
+
+ strip-final-newline@3.0.0: {}
+
+ strip-indent@3.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
+ strip-json-comments@3.1.1: {}
+
+ style-to-object@1.0.8:
+ dependencies:
+ inline-style-parser: 0.2.4
+
+ sucrase@3.35.0:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ commander: 4.1.1
+ glob: 10.4.2
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.6
+ ts-interface-checker: 0.1.13
+
+ superagent@8.1.2:
+ dependencies:
+ component-emitter: 1.3.1
+ cookiejar: 2.1.4
+ debug: 4.3.7
+ fast-safe-stringify: 2.1.1
+ form-data: 4.0.1
+ formidable: 2.1.2
+ methods: 1.1.2
+ mime: 2.6.0
+ qs: 6.13.0
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ supertest@6.3.4:
+ dependencies:
+ methods: 1.1.2
+ superagent: 8.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ swagger-ui-dist@5.18.2:
+ dependencies:
+ '@scarf/scarf': 1.4.0
+
+ swagger-ui-express@5.0.1(express@4.21.1):
+ dependencies:
+ express: 4.21.1
+ swagger-ui-dist: 5.18.2
+
+ symbol-observable@4.0.0: {}
+
+ symbol-tree@3.2.4: {}
+
+ tailwind-merge@2.5.4: {}
+
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))):
+ dependencies:
+ tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+
+ tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ lilconfig: 2.1.0
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.4.47
+ postcss-import: 15.1.0(postcss@8.4.47)
+ postcss-js: 4.0.1(postcss@8.4.47)
+ postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ postcss-nested: 6.2.0(postcss@8.4.47)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.8
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+
+ tapable@2.2.1: {}
+
+ tar-fs@2.0.1:
+ dependencies:
+ chownr: 1.1.4
+ mkdirp-classic: 0.5.3
+ pump: 3.0.2
+ tar-stream: 2.2.0
+
+ tar-stream@2.2.0:
+ dependencies:
+ bl: 4.1.0
+ end-of-stream: 1.4.4
+ fs-constants: 1.0.0
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ tar-stream@3.1.7:
+ dependencies:
+ b4a: 1.6.7
+ fast-fifo: 1.3.2
+ streamx: 2.20.1
+
+ terser-webpack-plugin@5.3.10(@swc/core@1.7.42)(webpack@5.94.0(@swc/core@1.7.42)):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ jest-worker: 27.5.1
+ schema-utils: 3.3.0
+ serialize-javascript: 6.0.2
+ terser: 5.36.0
+ webpack: 5.94.0(@swc/core@1.7.42)
+ optionalDependencies:
+ '@swc/core': 1.7.42
+
+ terser-webpack-plugin@5.3.10(@swc/core@1.7.42)(webpack@5.96.1(@swc/core@1.7.42)):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ jest-worker: 27.5.1
+ schema-utils: 3.3.0
+ serialize-javascript: 6.0.2
+ terser: 5.36.0
+ webpack: 5.96.1(@swc/core@1.7.42)
+ optionalDependencies:
+ '@swc/core': 1.7.42
+ optional: true
+
+ terser@5.36.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.6
+ acorn: 8.14.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ test-exclude@6.0.0:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+
+ text-decoder@1.2.1: {}
+
+ text-extensions@2.4.0: {}
+
+ text-table@0.2.0: {}
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ through@2.3.8: {}
+
+ tiny-invariant@1.3.3: {}
+
+ tiny-warning@1.0.3: {}
+
+ tinybench@2.9.0: {}
+
+ tinyexec@0.3.1: {}
+
+ tinypool@1.0.1: {}
+
+ tinyrainbow@1.2.0: {}
+
+ tinyspy@3.0.2: {}
+
+ tldts-core@6.1.58: {}
+
+ tldts@6.1.58:
+ dependencies:
+ tldts-core: 6.1.58
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ tmpl@1.0.5: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toidentifier@1.0.1: {}
+
+ tough-cookie@4.1.4:
+ dependencies:
+ psl: 1.10.0
+ punycode: 2.3.1
+ universalify: 0.2.0
+ url-parse: 1.5.10
+
+ tough-cookie@5.0.0:
+ dependencies:
+ tldts: 6.1.58
+
+ tr46@0.0.3: {}
+
+ tr46@5.0.0:
+ dependencies:
+ punycode: 2.3.1
+
+ tree-kill@1.2.2: {}
+
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ ts-api-utils@1.4.0(typescript@5.6.3):
+ dependencies:
+ typescript: 5.6.3
+
+ ts-interface-checker@0.1.13: {}
+
+ ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)))(typescript@5.6.3):
+ dependencies:
+ bs-logger: 0.2.6
+ ejs: 3.1.10
+ fast-json-stable-stringify: 2.1.0
+ jest: 29.7.0(@types/node@20.17.5)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3))
+ jest-util: 29.7.0
+ json5: 2.2.3
+ lodash.memoize: 4.1.2
+ make-error: 1.3.6
+ semver: 7.6.3
+ typescript: 5.6.3
+ yargs-parser: 21.1.1
+ optionalDependencies:
+ '@babel/core': 7.26.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-jest: 29.7.0(@babel/core@7.26.0)
+
+ ts-loader@9.5.1(typescript@5.6.3)(webpack@5.94.0(@swc/core@1.7.42)):
+ dependencies:
+ chalk: 4.1.2
+ enhanced-resolve: 5.17.1
+ micromatch: 4.0.8
+ semver: 7.6.3
+ source-map: 0.7.4
+ typescript: 5.6.3
+ webpack: 5.94.0(@swc/core@1.7.42)
+
+ ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.17.5
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.6.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ optionalDependencies:
+ '@swc/core': 1.7.42
+
+ tsconfck@3.1.4(typescript@5.6.3):
+ optionalDependencies:
+ typescript: 5.6.3
+
+ tsconfig-paths-webpack-plugin@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ enhanced-resolve: 5.17.1
+ tsconfig-paths: 4.2.0
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tsconfig-paths@4.2.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@1.14.1: {}
+
+ tslib@2.7.0: {}
+
+ tslib@2.8.0: {}
+
+ tslib@2.8.1: {}
+
+ tsutils@3.21.0(typescript@5.6.3):
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.6.3
+
+ tsx@4.19.2:
+ dependencies:
+ esbuild: 0.23.1
+ get-tsconfig: 4.8.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ turbo-darwin-64@2.2.3:
+ optional: true
+
+ turbo-darwin-arm64@2.2.3:
+ optional: true
+
+ turbo-linux-64@2.2.3:
+ optional: true
+
+ turbo-linux-arm64@2.2.3:
+ optional: true
+
+ turbo-windows-64@2.2.3:
+ optional: true
+
+ turbo-windows-arm64@2.2.3:
+ optional: true
+
+ turbo@2.2.3:
+ optionalDependencies:
+ turbo-darwin-64: 2.2.3
+ turbo-darwin-arm64: 2.2.3
+ turbo-linux-64: 2.2.3
+ turbo-linux-arm64: 2.2.3
+ turbo-windows-64: 2.2.3
+ turbo-windows-arm64: 2.2.3
+
+ tweetnacl@0.14.5: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-detect@4.0.8: {}
+
+ type-fest@0.20.2: {}
+
+ type-fest@0.21.3: {}
+
+ type-fest@4.27.0: {}
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ typed-array-buffer@1.0.2:
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+
+ typed-array-byte-length@1.0.1:
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+
+ typed-array-byte-offset@1.0.2:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+
+ typed-array-length@1.0.6:
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ possible-typed-array-names: 1.0.0
+
+ typedarray@0.0.6: {}
+
+ typeorm@0.3.20(ioredis@5.4.1)(mysql2@3.11.4)(ts-node@10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)):
+ dependencies:
+ '@sqltools/formatter': 1.2.5
+ app-root-path: 3.1.0
+ buffer: 6.0.3
+ chalk: 4.1.2
+ cli-highlight: 2.1.11
+ dayjs: 1.11.13
+ debug: 4.3.7
+ dotenv: 16.4.5
+ glob: 10.4.2
+ mkdirp: 2.1.6
+ reflect-metadata: 0.2.2
+ sha.js: 2.4.11
+ tslib: 2.8.1
+ uuid: 9.0.1
+ yargs: 17.7.2
+ optionalDependencies:
+ ioredis: 5.4.1
+ mysql2: 3.11.4
+ ts-node: 10.9.2(@swc/core@1.7.42)(@types/node@20.17.5)(typescript@5.6.3)
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript-eslint@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.12.2(@typescript-eslint/parser@8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.12.2(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ optionalDependencies:
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+
+ typescript@5.3.3: {}
+
+ typescript@5.4.2: {}
+
+ typescript@5.6.3: {}
+
+ ufo@1.5.4: {}
+
+ uid@2.0.2:
+ dependencies:
+ '@lukeed/csprng': 1.1.0
+
+ unbox-primitive@1.0.2:
+ dependencies:
+ call-bind: 1.0.7
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+
+ undici-types@6.19.8: {}
+
+ unicorn-magic@0.1.0: {}
+
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unist-util-is@6.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ universalify@0.1.2: {}
+
+ universalify@0.2.0: {}
+
+ universalify@2.0.1: {}
+
+ unpipe@1.0.0: {}
+
+ unplugin@1.15.0(webpack-sources@3.2.3):
+ dependencies:
+ acorn: 8.14.0
+ webpack-virtual-modules: 0.6.2
+ optionalDependencies:
+ webpack-sources: 3.2.3
+
+ update-browserslist-db@1.1.1(browserslist@4.24.2):
+ dependencies:
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ url-parse@1.5.10:
+ dependencies:
+ querystringify: 2.2.0
+ requires-port: 1.0.0
+
+ use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ use-sidecar@1.1.2(@types/react@18.3.12)(react@18.3.1):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 18.3.1
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ use-sync-external-store@1.2.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ util-deprecate@1.0.2: {}
+
+ utils-merge@1.0.1: {}
+
+ uuid@8.3.2: {}
+
+ uuid@9.0.1: {}
+
+ v8-compile-cache-lib@3.0.1: {}
+
+ v8-to-istanbul@9.3.0:
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/istanbul-lib-coverage': 2.0.6
+ convert-source-map: 2.0.0
+
+ validator@13.12.0: {}
+
+ vary@1.1.2: {}
+
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.2
+
+ vite-node@2.1.4(@types/node@20.17.5)(terser@5.36.0):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.7
+ pathe: 1.1.2
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-plugin-dts@4.3.0(@types/node@20.17.5)(rollup@4.24.3)(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0)):
+ dependencies:
+ '@microsoft/api-extractor': 7.47.11(@types/node@20.17.5)
+ '@rollup/pluginutils': 5.1.3(rollup@4.24.3)
+ '@volar/typescript': 2.4.10
+ '@vue/language-core': 2.1.6(typescript@5.6.3)
+ compare-versions: 6.1.1
+ debug: 4.3.7
+ kolorist: 1.8.0
+ local-pkg: 0.5.0
+ magic-string: 0.30.12
+ typescript: 5.6.3
+ optionalDependencies:
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - rollup
+ - supports-color
+
+ vite-tsconfig-paths@5.0.1(typescript@5.6.3)(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0)):
+ dependencies:
+ debug: 4.3.7
+ globrex: 0.1.2
+ tsconfck: 3.1.4(typescript@5.6.3)
+ optionalDependencies:
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ vite@5.4.10(@types/node@20.17.5)(terser@5.36.0):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.47
+ rollup: 4.24.3
+ optionalDependencies:
+ '@types/node': 20.17.5
+ fsevents: 2.3.3
+ terser: 5.36.0
+
+ vitest@2.1.4(@types/node@20.17.5)(jsdom@25.0.1)(msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3))(terser@5.36.0):
+ dependencies:
+ '@vitest/expect': 2.1.4
+ '@vitest/mocker': 2.1.4(msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3))(vite@5.4.10(@types/node@20.17.5)(terser@5.36.0))
+ '@vitest/pretty-format': 2.1.4
+ '@vitest/runner': 2.1.4
+ '@vitest/snapshot': 2.1.4
+ '@vitest/spy': 2.1.4
+ '@vitest/utils': 2.1.4
+ chai: 5.1.2
+ debug: 4.3.7
+ expect-type: 1.1.0
+ magic-string: 0.30.12
+ pathe: 1.1.2
+ std-env: 3.7.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.1
+ tinypool: 1.0.1
+ tinyrainbow: 1.2.0
+ vite: 5.4.10(@types/node@20.17.5)(terser@5.36.0)
+ vite-node: 2.1.4(@types/node@20.17.5)(terser@5.36.0)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 20.17.5
+ jsdom: 25.0.1
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vscode-uri@3.0.8: {}
+
+ w3c-xmlserializer@5.0.0:
+ dependencies:
+ xml-name-validator: 5.0.0
+
+ walker@1.0.8:
+ dependencies:
+ makeerror: 1.0.12
+
+ watchpack@2.4.2:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ web-namespaces@2.0.1: {}
+
+ webidl-conversions@3.0.1: {}
+
+ webidl-conversions@7.0.0: {}
+
+ webpack-node-externals@3.0.0: {}
+
+ webpack-sources@3.2.3: {}
+
+ webpack-virtual-modules@0.6.2: {}
+
+ webpack@5.94.0(@swc/core@1.7.42):
+ dependencies:
+ '@types/estree': 1.0.6
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/wasm-edit': 1.12.1
+ '@webassemblyjs/wasm-parser': 1.12.1
+ acorn: 8.14.0
+ acorn-import-attributes: 1.9.5(acorn@8.14.0)
+ browserslist: 4.24.2
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.17.1
+ es-module-lexer: 1.5.4
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.0
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 3.3.0
+ tapable: 2.2.1
+ terser-webpack-plugin: 5.3.10(@swc/core@1.7.42)(webpack@5.94.0(@swc/core@1.7.42))
+ watchpack: 2.4.2
+ webpack-sources: 3.2.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
+ webpack@5.96.1(@swc/core@1.7.42):
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.6
+ '@webassemblyjs/ast': 1.12.1
+ '@webassemblyjs/wasm-edit': 1.12.1
+ '@webassemblyjs/wasm-parser': 1.12.1
+ acorn: 8.14.0
+ browserslist: 4.24.2
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.17.1
+ es-module-lexer: 1.5.4
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.0
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 3.3.0
+ tapable: 2.2.1
+ terser-webpack-plugin: 5.3.10(@swc/core@1.7.42)(webpack@5.96.1(@swc/core@1.7.42))
+ watchpack: 2.4.2
+ webpack-sources: 3.2.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+ optional: true
+
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@4.0.0: {}
+
+ whatwg-url@14.0.0:
+ dependencies:
+ tr46: 5.0.0
+ webidl-conversions: 7.0.0
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which-boxed-primitive@1.0.2:
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+
+ which-typed-array@1.1.15:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ why-is-node-running@2.3.0:
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+
+ word-wrap@1.2.5: {}
+
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@4.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
+ ws@8.18.0: {}
+
+ xml-name-validator@5.0.0: {}
+
+ xmlchars@2.2.0: {}
+
+ xtend@4.0.2: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml@2.5.1: {}
+
+ yargs-parser@20.2.9: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@16.2.0:
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.9
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+
+ yn@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ yocto-queue@1.1.1: {}
+
+ yoctocolors-cjs@2.1.2: {}
+
+ zod@3.23.8: {}
+
+ zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 00000000..3ff5faaa
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,3 @@
+packages:
+ - "apps/*"
+ - "packages/*"
diff --git a/turbo.json b/turbo.json
new file mode 100644
index 00000000..86ffea19
--- /dev/null
+++ b/turbo.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "https://turbo.build/schema.json",
+ "tasks": {
+ "build": {
+ "dependsOn": ["^build"],
+ "inputs": ["$TURBO_DEFAULT$", ".env*"]
+ },
+ "lint": {
+ "dependsOn": ["^lint"]
+ },
+ "dev": {
+ "cache": false,
+ "persistent": true
+ }
+ }
+}