diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 00000000..77129f5d
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,34 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:react-hooks/recommended',
+ 'plugin:react/recommended' // self closing tag룰 적용하기 위해서 "eslint-plugin-react" 추가 설치
+ ],
+ ignorePatterns: ['dist', '.eslintrc.cjs'],
+ parser: '@typescript-eslint/parser',
+ plugins: ['react-refresh'],
+ rules: {
+ 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
+ quotes: ['error', 'single'],
+ 'no-console': ['error', { allow: ['warn', 'error', 'info'] }],
+ 'no-unused-vars': 'off', // interface에서 사용하지 않는 변수는 에러로 처리하지 않도록 설정
+ '@typescript-eslint/no-unused-vars': ['error'],
+ 'no-multiple-empty-lines': 'error',
+ 'react/self-closing-comp': [
+ 'error',
+ {
+ component: true,
+ html: true
+ }
+ ]
+ },
+ // https://stackoverflow.com/questions/72780296/warning-react-version-not-specified-in-eslint-plugin-react-settings-while-run
+ settings: {
+ react: {
+ version: 'detect'
+ }
+ }
+}
diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md
new file mode 100644
index 00000000..7d52aae0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/custom.md
@@ -0,0 +1,11 @@
+---
+name: Custom issue template
+about: Describe this issue template's purpose here.
+title: ''
+labels: enhancement
+assignees: ''
+---
+
+# 어떤 목적으로 이슈를 발행했는지 작성합니다.
+
+e.g ) 문서작업, 스타일링, 배포
diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md
new file mode 100644
index 00000000..46c03ab0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request.md
@@ -0,0 +1,33 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: to do
+assignees: ''
+---
+
+
+
+Feature request rules
+
+- 기본적으로 이슈를 작성하는 사람이 Assignee입니다.
+
+- Labels로 진행 상황 표기합니다. (to do, in progress, done 셋 중 하나는 반드시 필요)
+
+- Assignees를 배정합니다.
+
+- Branch는 `Feature/<이슈번호>-<기능>`으로 작성합니다.
+
+- `YOLO Wallet` Project를 선택합니다.
+
+
+
+# 기능
+
+# 적용되는 페이지
+
+# 추가 설명
+
+# 예상 시작일
+
+# 예상 완료일
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..302e36aa
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,36 @@
+```
+PR 예시입니다.
+
+PR을 등록할 때 해당 코드 블럭은 삭제해주세요.
+
+# 요약
+
+프로파일 컴포넌트 재사용성을 올리기 위한 리팩터링
+
+# 주요 키워드
+
+dayjs 설치
+
+/src/utils/profile.ts에 이미지 경로를 동적으로 생성하는 함수 구현
+
+/src/component/ui/profile.tsx에 뭔가 멋진 기능 구현
+
+# 추가 설명 (있을 경우만)
+
+뭔가 멋진 기능은 아래 사진처럼 프로파일 이미지가 360도 움직입니다.
+
+|------|
+| 사진 |
+|------|
+
+# 참고
+
+https//reactrouter.com/web/guides/quick-start
+
+```
+
+# 요약
+
+# 주요 키워드
+
+# 참고
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000..c016225e
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,30 @@
+name: git push into another repo to deploy to vercel
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ container: pandoc/latex
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install mustache (to update the date)
+ run: apk add ruby && gem install mustache
+ - name: creates output
+ run: sh ./build.sh
+ - name: Pushes to another repository
+ id: push_directory
+ uses: cpina/github-action-push-to-another-repository@main
+ env:
+ API_TOKEN_GITHUB: ${{ secrets.VERCEL_DEPLOY_TOKEN }}
+ with:
+ source-directory: 'output'
+ destination-github-username: peacepiece7
+ destination-repository-name: scheduler-front-indi
+ user-email: peacepiece7@naver.com
+ commit-message: ${{ github.event.commits[0].message }}
+ target-branch: main
+ - name: Test get variable exported by push-to-another-repository
+ run: echo $DESTINATION_CLONED_DIRECTORY
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..85dcd9de
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+*.local
+dist
+build
+
+# Editor directories and files
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000..d24fdfc6
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx lint-staged
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..14679ef3
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,11 @@
+{
+ "printWidth": 100,
+ "tabWidth": 2,
+ "semi": false,
+ "singleQuote": true,
+ "jsxSingleQuote": true,
+ "trailingComma": "none",
+ "bracketSpacing": true,
+ "arrowParens": "always",
+ "quoteProps": "as-needed"
+}
diff --git a/.vscode/javascript.code-snippets b/.vscode/javascript.code-snippets
new file mode 100644
index 00000000..b899599a
--- /dev/null
+++ b/.vscode/javascript.code-snippets
@@ -0,0 +1,55 @@
+{
+ // scope 속성 주의!
+ "Print to console log": {
+ "prefix": "log",
+ "body": ["console.log($0)"],
+ "description": "Log output to console",
+ "scope": "javascript, typescript, javascriptreact, typescriptreact"
+ },
+ "Print to console error": {
+ "prefix": "elog",
+ "body": ["console.error($0)"],
+ "description": "Log output to console",
+ "scope": "javascript, typescript, javascriptreact, typescriptreact"
+ },
+ "Throw new Error": {
+ "prefix": "tne",
+ "body": ["throw new Error($0)"],
+ "scope": "javascript, typescript, javascriptreact, typescriptreact"
+ },
+ "ES6 import from ": {
+ "prefix": "imf",
+ "body": ["import $0 from '$1'"],
+ "scope": "javascript, typescript, javascriptreact, typescriptreact"
+ },
+ "Try Catch Scope": {
+ "prefix": "tc",
+ "body": "try {\n $0\n} catch (err) {\n throw new Error(err)\n}",
+ "scope": "javascript, typescript, javascriptreact, typescriptreact"
+ },
+ "reactFunction": {
+ "prefix": "rfc",
+ "body": "import React from 'react';\n\nexport default function ${1:${TM_FILENAME_BASE}}() {\n\treturn (\n\t\t
\n\t\t\t\n\t\t
\n\t);\n}\n\n",
+ "description": "Creates a React Function component",
+ "scope": "javascriptreact, typescriptreact"
+ },
+ "reactStatelessImplicitReturn": {
+ "prefix": "rsi",
+ "body": "import React from 'react';\n\nexport const ${1:${TM_FILENAME_BASE}} = (props) => {\n\t\t\t$0\n\t};",
+ "description": "Creates a React Function component",
+ "scope": "javascriptreact, typescriptreact"
+ },
+ // postcss 에시입니다. 고쳐쓰세요!
+ "Import Module CSS": {
+ "prefix": "si",
+ "body": ["import styles from './$TM_FILENAME_BASE.module.css'"],
+ "description": "Import PostCSS",
+ "scope": "javascriptreact, typescriptreact"
+ },
+ "ClassName": {
+ "prefix": "cn",
+ "body": ["className={styles.$0}"],
+ "description": "Adding className",
+ "scope": "javascriptreact, typescriptreact"
+ }
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..55767ccb
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,8 @@
+{
+ "eslint.validate": ["javascript", "typescript", "typescriptreact", "javascriptreact"],
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true // 저장할 때마다 eslint가 자동으로 코드를 고쳐줍니다.
+ },
+ "javascript.autoClosingTags": true, // 닫히는 태그가 자동으로 생성됩니다.
+ "typescript.autoClosingTags": true
+}
diff --git a/README.md b/README.md
index 733a8622..4672022b 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,136 @@
-# ✔️ 미니 프로젝트_연차/당직 프로그램 만들기
+# 연간아이돌(YeonganIdol)
-## 필수 요구 사항
+
-- 로그인 / 회원가입 페이지
-- 개인 정보 수정 페이지
-- 사용자간 공유 게시 페이지 캘린더 사용
+### 연차? 당직? 우리는 콘서트 보러 간다!!!
-## 선택 요구 사항
+회사에서 연차, 당직을 사용하기 위해 남아있는 횟수를 확인하고, 신청하고 사용합니다.
+ 우리는 덕질을 위해, 남아있는 티켓의 횟수를 확인하고, 신청하고 사용합니다.
+ 연간아이돌은 덕질을 위해 만들어진 공연 신청 서비스입니다.
+ 일상에 지친 당신에게 매달 한번!! 원하는 공연을 신청해서 티켓을 소진하세요!!
+ 기획사는 연간아이돌을 통해 신청된 티켓의 승인, 거절을 결정할 수 있습니다. 홍보는 덤입니다.
+ 기획사 권한 신청은 관리자에게 문의하세요.
-- `useCallback`, `useMemo `등을 통한 컴포넌트 렌더링 최적화
-- 내가 작성한 코드를 팀원 중 누가봐도 쉽게 알아볼 수 있도록 고민하면서 작성해주세요.
+
+미니 프로젝트 기간: 2023.07.24 ~ 2023.08.10
+
+
+
+
+
-## 과제 수행 및 제출 방법
+## 🤗 개발팀
-1. 현재 저장소를 로컬에 클론(Clone)합니다.
-2. 팀별로 브랜치를 생성합니다.(`git branch KDT5_TEAM_ABC`)
-3. 팀별 브랜치에서 과제를 수행합니다.
-4. 과제 수행이 완료되면, 자신의 본명 브랜치를 원격 저장소에 푸시(Push)합니다.(`main` 브랜치에 푸시하지 않도록 꼭 주의하세요, `git push origin KDT5_TEAM_ABC`)
-5. 저장소에서 `main` 브랜치를 대상으로 Pull Request 생성하면, 과제 제출이 완료됩니다!(E.g, `main` <== `KDT5_TEAM_ABC`)
+
+
+
+
+
+ 정태욱(FE-리더)
+
+
+
+
+
+ 박철민
+
+
+
+
+
+ 방미선
+
+
+
+
+
+ 백지욱
+
+
+
+
+
+ 캘린더(유저/매니저), 캘린더 부가기능 전체, 프로젝트 셋팅, 로딩 애니메이션, 깃허브 관리, 사용자 마이페이지, 매니저 행사 등록/수정
+
+
+ 매니저(기획사) 페이지, 매니저 대시보드, 디자인-1, css 전역 스타일, 와이어프레임, 로그인 배경화면, 캐릭터 디자인
+
+
+ 사용자 페이지, 회원정보 수정, 디자인-2, 와이어프레임, 유저 플로우
+
+
+ 회원가입 페이지, 로그인 페이지
+
+
+
+
-### 주의사항!
+## 🛠️ 사용 기술 및 개발 환경
-- `main` 혹은 다른 사람의 브랜치로 절대 병합하지 않도록 주의하세요!
-- Pull Request에서 보이는 설명을 다른 사람들이 이해하기 쉽도록 꼼꼼하게 작성하세요!
-- Pull Request에서 과제 제출 후 절대 병합(Merge)하지 않도록 주의하세요!
-- 과제 수행 및 제출 과정에서 문제가 발생한 경우, 바로 담당 멘토나 강사에서 얘기하세요!
+### Development
+
+
+
+
+
+
+
+
+
+### Config
+
+
+
+
+
+
+### Environment
+
+
+
+
+
+
+
+
+### Cowork Tools
+
+
+
+
+
+
+
+
+
+### Deployment
+
+
+
+
+
+
+
+## 💻 전체 화면 구성
+
+
+
+### 사용자 페이지
+
+
+
+
+
+### 매니저(기획사) 페이지
+
+
+
+
+
+### 관리자(권한 관리) 페이지
+
+
+
+
+
+### 🙏 감사합니다
diff --git a/build.sh b/build.sh
new file mode 100644
index 00000000..ebc97f07
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+cd ../
+mkdir output
+cp -R ./scheduler-front/* ./output
+cp -R ./output ./scheduler-front/
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..b355e15f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ 연간 아이돌
+
+
+
+
+
+
diff --git a/legacy/SignInTestPage.tsx b/legacy/SignInTestPage.tsx
new file mode 100644
index 00000000..25de385f
--- /dev/null
+++ b/legacy/SignInTestPage.tsx
@@ -0,0 +1,186 @@
+import React, { useEffect, useState, useContext } from 'react'
+import {
+ ADMIN_USER_1,
+ ADMIN_USER_2,
+ FAN_USER_1,
+ FAN_USER_2,
+ FAN_USER_3,
+ FAN_USER_4,
+ FAN_USER_5
+} from '@/mocks/user'
+import { AdminUser, FanUser } from '@/models/user'
+import { delay } from '@/utils'
+import { useNavigate } from 'react-router-dom'
+import dayjs from 'dayjs'
+import { DATE_ROUTE_FORMAT } from '@/constants'
+import { UserContext } from '@/context/UserProvider'
+// import useUser from '@/hooks/user'
+
+// ! 사용자가 브라우저 url을 조작할 경우 로그인이 풀립니다.
+// ! 이때 API가 있다면 다시 API를 호출해서 로그인을 유지해야 합니다.
+export default function SignInOrUpTestPage() {
+ const navigation = useNavigate()
+ const [errorMsg, setErrorMsg] = useState('')
+ const { getUserInfo, loading, loggedIn, setLoggedIn, setLoading, setUserInfo } =
+ useContext(UserContext)
+
+ useEffect(() => {
+ // * login check (백엔드) API가 완성되면 백엔드에 요청을 보내서 로그인 여부를 판단합니다.
+ if (loggedIn && getUserInfo().id) {
+ const date = new Date()
+ const currentDate = dayjs(date).format(DATE_ROUTE_FORMAT)
+ navigation(`/calendar/${currentDate}`)
+ }
+ }, [loggedIn, getUserInfo, navigation])
+
+ if (errorMsg) {
+ setTimeout(() => setErrorMsg(''), 3000)
+ }
+
+ return (
+
+
Logout Form
+ {loading &&
로그인을 시도하고 있습니다.
}
+ {errorMsg &&
{errorMsg}
}
+
+ {
+ setLoading(true)
+ delay(FAN_USER_1, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setErrorMsg('로그인에 실패했습니다.')
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ user1로 로그인
+
+
+
+ {
+ setLoading(true)
+ delay(FAN_USER_2, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setErrorMsg('로그인에 실패했습니다.')
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ user2로 로그인
+
+
+
+ {
+ setLoading(true)
+ delay(FAN_USER_3, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setErrorMsg('로그인에 실패했습니다.')
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ user3로 로그인
+
+
+
+ {
+ setLoading(true)
+ delay(FAN_USER_4, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setErrorMsg('로그인에 실패했습니다.')
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ user4로 로그인
+
+
+
+ {
+ setLoading(true)
+ delay(FAN_USER_5, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ user5로 로그인
+
+
+
+
{
+ setLoading(true)
+ delay(ADMIN_USER_1, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setErrorMsg('로그인에 실패했습니다.')
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ admin1로 로그인
+
+
+
+
{
+ setLoading(true)
+ delay(ADMIN_USER_2, 3000)
+ .then((res) => {
+ setUserInfo(res)
+ setLoggedIn(true)
+ setLoading(false)
+ })
+ .catch(() => {
+ setErrorMsg('로그인에 실패했습니다.')
+ setLoading(false)
+ setLoggedIn(false)
+ })
+ }}
+ >
+ admin2로 로그인
+
+
+
+ )
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..a6976847
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,7697 @@
+{
+ "name": "scheduler-front",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "scheduler-front",
+ "version": "0.0.0",
+ "dependencies": {
+ "@react-three/drei": "^9.80.1",
+ "@react-three/fiber": "^8.13.6",
+ "@react-three/postprocessing": "^2.14.13",
+ "@tanstack/react-query": "^4.32.0",
+ "axios": "^1.4.0",
+ "dayjs": "^1.11.9",
+ "pm2": "^5.3.0",
+ "postprocessing": "^6.32.2",
+ "react": "^18.2.0",
+ "react-cookie": "^4.1.1",
+ "react-dom": "^18.2.0",
+ "react-icons": "^4.10.1",
+ "react-js-pagination": "^3.0.3",
+ "react-router-dom": "^6.14.2",
+ "react-toastify": "^9.1.3",
+ "swiper": "^10.1.0",
+ "tailwind-scrollbar-hide": "^1.1.7",
+ "three": "^0.154.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.15",
+ "@types/react-dom": "^18.2.7",
+ "@types/react-js-pagination": "^3.0.4",
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
+ "@typescript-eslint/parser": "^6.0.0",
+ "@vitejs/plugin-react": "^4.0.3",
+ "autoprefixer": "^10.4.14",
+ "eslint": "^8.45.0",
+ "eslint-plugin-react": "^7.33.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.3",
+ "husky": "^8.0.3",
+ "lint-staged": "^13.2.3",
+ "postcss": "^8.4.27",
+ "prettier": "^3.0.0",
+ "tailwindcss": "^3.3.3",
+ "typescript": "^5.0.2",
+ "vite": "^4.4.5",
+ "vite-tsconfig-paths": "^4.2.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+ "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
+ "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
+ "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.9",
+ "@babel/helper-compilation-targets": "^7.22.9",
+ "@babel/helper-module-transforms": "^7.22.9",
+ "@babel/helpers": "^7.22.6",
+ "@babel/parser": "^7.22.7",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.8",
+ "@babel/types": "^7.22.5",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
+ "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz",
+ "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-validator-option": "^7.22.5",
+ "browserslist": "^4.21.9",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+ "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+ "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz",
+ "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+ "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
+ "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.6",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+ "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.22.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
+ "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz",
+ "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz",
+ "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.22.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz",
+ "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+ "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.22.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz",
+ "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.7",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.22.7",
+ "@babel/types": "^7.22.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+ "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@chevrotain/cst-dts-gen": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz",
+ "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==",
+ "dependencies": {
+ "@chevrotain/gast": "10.5.0",
+ "@chevrotain/types": "10.5.0",
+ "lodash": "4.17.21"
+ }
+ },
+ "node_modules/@chevrotain/gast": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz",
+ "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==",
+ "dependencies": {
+ "@chevrotain/types": "10.5.0",
+ "lodash": "4.17.21"
+ }
+ },
+ "node_modules/@chevrotain/types": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz",
+ "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A=="
+ },
+ "node_modules/@chevrotain/utils": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz",
+ "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ=="
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz",
+ "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz",
+ "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz",
+ "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz",
+ "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz",
+ "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz",
+ "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz",
+ "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz",
+ "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz",
+ "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz",
+ "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz",
+ "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz",
+ "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz",
+ "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz",
+ "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz",
+ "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz",
+ "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz",
+ "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz",
+ "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz",
+ "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz",
+ "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz",
+ "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz",
+ "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz",
+ "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+ "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.44.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+ "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+ "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@mediapipe/tasks-vision": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.2.tgz",
+ "integrity": "sha512-d8Q9uRK89ZRWmED2JLI9/blpJcfdbh0iEUuMo8TgkMzNfQBY1/GC0FEJWrairTwHkxIf6Oud1vFBP+aHicWqJA=="
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@opencensus/core": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz",
+ "integrity": "sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==",
+ "dependencies": {
+ "continuation-local-storage": "^3.2.1",
+ "log-driver": "^1.2.7",
+ "semver": "^5.5.0",
+ "shimmer": "^1.2.0",
+ "uuid": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@opencensus/core/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@opencensus/propagation-b3": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz",
+ "integrity": "sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==",
+ "dependencies": {
+ "@opencensus/core": "^0.0.8",
+ "uuid": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@opencensus/propagation-b3/node_modules/@opencensus/core": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz",
+ "integrity": "sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==",
+ "dependencies": {
+ "continuation-local-storage": "^3.2.1",
+ "log-driver": "^1.2.7",
+ "semver": "^5.5.0",
+ "shimmer": "^1.2.0",
+ "uuid": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@opencensus/propagation-b3/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@pm2/agent": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.3.tgz",
+ "integrity": "sha512-xkqqCoTf5VsciMqN0vb9jthW7olVAi4KRFNddCc7ZkeJZ3i8QwZANr4NSH2H5DvseRFHq7MiPspRY/EWAFWWTg==",
+ "dependencies": {
+ "async": "~3.2.0",
+ "chalk": "~3.0.0",
+ "dayjs": "~1.8.24",
+ "debug": "~4.3.1",
+ "eventemitter2": "~5.0.1",
+ "fast-json-patch": "^3.0.0-1",
+ "fclone": "~1.0.11",
+ "nssocket": "0.6.0",
+ "pm2-axon": "~4.0.1",
+ "pm2-axon-rpc": "~0.7.0",
+ "proxy-agent": "~6.3.0",
+ "semver": "~7.5.0",
+ "ws": "~7.4.0"
+ }
+ },
+ "node_modules/@pm2/agent/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/@pm2/agent/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@pm2/agent/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/@pm2/agent/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/@pm2/agent/node_modules/dayjs": {
+ "version": "1.8.36",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz",
+ "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw=="
+ },
+ "node_modules/@pm2/agent/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/@pm2/agent/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/@pm2/io": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz",
+ "integrity": "sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw==",
+ "dependencies": {
+ "@opencensus/core": "0.0.9",
+ "@opencensus/propagation-b3": "0.0.8",
+ "async": "~2.6.1",
+ "debug": "~4.3.1",
+ "eventemitter2": "^6.3.1",
+ "require-in-the-middle": "^5.0.0",
+ "semver": "6.3.0",
+ "shimmer": "^1.2.0",
+ "signal-exit": "^3.0.3",
+ "tslib": "1.9.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@pm2/io/node_modules/async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/@pm2/io/node_modules/eventemitter2": {
+ "version": "6.4.9",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz",
+ "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="
+ },
+ "node_modules/@pm2/io/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@pm2/io/node_modules/tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+ },
+ "node_modules/@pm2/js-api": {
+ "version": "0.6.7",
+ "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz",
+ "integrity": "sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==",
+ "dependencies": {
+ "async": "^2.6.3",
+ "axios": "^0.21.0",
+ "debug": "~4.3.1",
+ "eventemitter2": "^6.3.1",
+ "ws": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@pm2/js-api/node_modules/async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/@pm2/js-api/node_modules/axios": {
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+ "dependencies": {
+ "follow-redirects": "^1.14.0"
+ }
+ },
+ "node_modules/@pm2/js-api/node_modules/eventemitter2": {
+ "version": "6.4.9",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz",
+ "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="
+ },
+ "node_modules/@pm2/pm2-version-check": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz",
+ "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==",
+ "dependencies": {
+ "debug": "^4.3.1"
+ }
+ },
+ "node_modules/@react-spring/animated": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz",
+ "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==",
+ "dependencies": {
+ "@react-spring/shared": "~9.6.1",
+ "@react-spring/types": "~9.6.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/core": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz",
+ "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==",
+ "dependencies": {
+ "@react-spring/animated": "~9.6.1",
+ "@react-spring/rafz": "~9.6.1",
+ "@react-spring/shared": "~9.6.1",
+ "@react-spring/types": "~9.6.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-spring/donate"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/rafz": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz",
+ "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ=="
+ },
+ "node_modules/@react-spring/shared": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz",
+ "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==",
+ "dependencies": {
+ "@react-spring/rafz": "~9.6.1",
+ "@react-spring/types": "~9.6.1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/three": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz",
+ "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==",
+ "dependencies": {
+ "@react-spring/animated": "~9.6.1",
+ "@react-spring/core": "~9.6.1",
+ "@react-spring/shared": "~9.6.1",
+ "@react-spring/types": "~9.6.1"
+ },
+ "peerDependencies": {
+ "@react-three/fiber": ">=6.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "three": ">=0.126"
+ }
+ },
+ "node_modules/@react-spring/types": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz",
+ "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q=="
+ },
+ "node_modules/@react-three/drei": {
+ "version": "9.80.1",
+ "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.80.1.tgz",
+ "integrity": "sha512-BlntSFEQb+Zhtj1zVfVv4ts/Co6GUBeZLPgG4SYhecKdGy1ctFaH2Tb8Z8HIl8PToUeWEDfKO4g4+/pE89YrEw==",
+ "dependencies": {
+ "@babel/runtime": "^7.11.2",
+ "@mediapipe/tasks-vision": "0.10.2",
+ "@react-spring/three": "~9.6.1",
+ "@use-gesture/react": "^10.2.24",
+ "camera-controls": "^2.4.2",
+ "detect-gpu": "^5.0.28",
+ "glsl-noise": "^0.0.0",
+ "lodash.clamp": "^4.0.3",
+ "lodash.omit": "^4.5.0",
+ "lodash.pick": "^4.4.0",
+ "maath": "^0.6.0",
+ "meshline": "^3.1.6",
+ "react-composer": "^5.0.3",
+ "react-merge-refs": "^1.1.0",
+ "stats-gl": "^1.0.4",
+ "stats.js": "^0.17.0",
+ "suspend-react": "^0.1.3",
+ "three-mesh-bvh": "^0.6.0",
+ "three-stdlib": "^2.23.9",
+ "troika-three-text": "^0.47.2",
+ "utility-types": "^3.10.0",
+ "zustand": "^3.5.13"
+ },
+ "peerDependencies": {
+ "@react-three/fiber": ">=8.0",
+ "react": ">=18.0",
+ "react-dom": ">=18.0",
+ "three": ">=0.137"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-three/fiber": {
+ "version": "8.13.6",
+ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.13.6.tgz",
+ "integrity": "sha512-V49lldHcbsC7PMnnf4aYrMpHPQe8R7hJYL0AEFjqwioY0nkwga9A+Jx6lCLVG02DF03xwCfJZv5cjZCChffsWg==",
+ "dependencies": {
+ "@babel/runtime": "^7.17.8",
+ "@types/react-reconciler": "^0.26.7",
+ "its-fine": "^1.0.6",
+ "react-reconciler": "^0.27.0",
+ "react-use-measure": "^2.1.1",
+ "scheduler": "^0.21.0",
+ "suspend-react": "^0.1.3",
+ "zustand": "^3.7.1"
+ },
+ "peerDependencies": {
+ "expo": ">=43.0",
+ "expo-asset": ">=8.4",
+ "expo-gl": ">=11.0",
+ "react": ">=18.0",
+ "react-dom": ">=18.0",
+ "react-native": ">=0.64",
+ "three": ">=0.133"
+ },
+ "peerDependenciesMeta": {
+ "expo": {
+ "optional": true
+ },
+ "expo-asset": {
+ "optional": true
+ },
+ "expo-gl": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-three/fiber/node_modules/scheduler": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz",
+ "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/@react-three/postprocessing": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/@react-three/postprocessing/-/postprocessing-2.15.0.tgz",
+ "integrity": "sha512-kldXieRcn8tB3bIVwRAFa1ojG11tkuMLAFYOra32E7y9n1nhVU4FKx+GxmblHSiRWpvGnEje/kYxDKTPjKj4eA==",
+ "dependencies": {
+ "maath": "^0.6.0",
+ "n8ao": "^1.6.6",
+ "postprocessing": "^6.32.1",
+ "three-stdlib": "^2.23.4"
+ },
+ "peerDependencies": {
+ "@react-three/fiber": ">=8.0",
+ "react": ">=18.0",
+ "three": ">= 0.138.0"
+ }
+ },
+ "node_modules/@react-three/postprocessing/node_modules/n8ao": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/n8ao/-/n8ao-1.6.8.tgz",
+ "integrity": "sha512-3xaBaoMIplgPdBK+9mZefa8stWEoA2673h2734wYMxm/hUkMLENMhzymDe+WZueFQq93ly4xpl5s1NJrQBzFOQ==",
+ "peerDependencies": {
+ "postprocessing": ">=6.30.0",
+ "three": ">=0.137"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz",
+ "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "4.32.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.32.0.tgz",
+ "integrity": "sha512-ei4IYwL2kmlKSlCw9WgvV7PpXi0MiswVwfQRxawhJA690zWO3dU49igaQ/UMTl+Jy9jj9dK5IKAYvbX7kUvviQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "4.32.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.32.0.tgz",
+ "integrity": "sha512-B8WUMcByYAH9500ENejDCATOmEZhqjtS9wsfiQ3BNa+s+yAynY8SESI8WWHhSqUmjd0pmCSFRP6BOUGSda3QXA==",
+ "dependencies": {
+ "@tanstack/query-core": "4.32.0",
+ "use-sync-external-store": "^1.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-native": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="
+ },
+ "node_modules/@tweenjs/tween.js": {
+ "version": "18.6.4",
+ "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz",
+ "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==",
+ "peer": true
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz",
+ "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
+ },
+ "node_modules/@types/draco3d": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.2.tgz",
+ "integrity": "sha512-goh23EGr6CLV6aKPwN1p8kBD/7tT5V/bLpToSbarKrwVejqNrspVrv8DhliteYkkhZYrlq/fwKZRRUzH4XN88w=="
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
+ "dev": true
+ },
+ "node_modules/@types/offscreencanvas": {
+ "version": "2019.7.0",
+ "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz",
+ "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.16",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.16.tgz",
+ "integrity": "sha512-LLFWr12ZhBJ4YVw7neWLe6Pk7Ey5R9OCydfuMsz1L8bZxzaawJj2p06Q8/EFEHDeTBQNFLF62X+CG7B2zIyu0Q==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
+ "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-js-pagination": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/react-js-pagination/-/react-js-pagination-3.0.4.tgz",
+ "integrity": "sha512-yka+27eZ6Mg9cmwT2sADgLn3ij9hVfpPu5dk+Y/0k1xS52WZOz0LJnn4y4VKGmR4mf/tG5Ga7Dody/xmfiB0Fg==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-reconciler": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz",
+ "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
+ "dev": true
+ },
+ "node_modules/@types/stats.js": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz",
+ "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==",
+ "peer": true
+ },
+ "node_modules/@types/three": {
+ "version": "0.155.0",
+ "resolved": "https://registry.npmjs.org/@types/three/-/three-0.155.0.tgz",
+ "integrity": "sha512-IzdbqXsGsbG0flvq9D5L9pZRwySQQps2bGcizLYEsfvK3dM+B0sqKR6S+xAOXbouXemfDmHttrcQjVOM46YnAw==",
+ "peer": true,
+ "dependencies": {
+ "@tweenjs/tween.js": "~18.6.4",
+ "@types/stats.js": "*",
+ "@types/webxr": "*",
+ "fflate": "~0.6.9",
+ "lil-gui": "~0.17.0",
+ "meshoptimizer": "~0.18.1"
+ }
+ },
+ "node_modules/@types/webxr": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.2.tgz",
+ "integrity": "sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw=="
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz",
+ "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.2.0",
+ "@typescript-eslint/type-utils": "6.2.0",
+ "@typescript-eslint/utils": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.0.tgz",
+ "integrity": "sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.2.0",
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/typescript-estree": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz",
+ "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz",
+ "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.2.0",
+ "@typescript-eslint/utils": "6.2.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz",
+ "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz",
+ "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/visitor-keys": "6.2.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz",
+ "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.2.0",
+ "@typescript-eslint/types": "6.2.0",
+ "@typescript-eslint/typescript-estree": "6.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz",
+ "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.2.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@use-gesture/core": {
+ "version": "10.2.27",
+ "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz",
+ "integrity": "sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA=="
+ },
+ "node_modules/@use-gesture/react": {
+ "version": "10.2.27",
+ "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.27.tgz",
+ "integrity": "sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w==",
+ "dependencies": {
+ "@use-gesture/core": "10.2.27"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.3.tgz",
+ "integrity": "sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.22.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.22.5",
+ "@babel/plugin-transform-react-jsx-source": "^7.22.5",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+ "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/amp": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz",
+ "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw=="
+ },
+ "node_modules/amp-message": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz",
+ "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==",
+ "dependencies": {
+ "amp": "0.3.1"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "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-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
+ "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/async-listener": {
+ "version": "0.6.10",
+ "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
+ "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==",
+ "dependencies": {
+ "semver": "^5.3.0",
+ "shimmer": "^1.1.0"
+ },
+ "engines": {
+ "node": "<=0.11.8 || >0.11.10"
+ }
+ },
+ "node_modules/async-listener/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "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/autoprefixer": {
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/basic-ftp": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz",
+ "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/bidi-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
+ "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==",
+ "dependencies": {
+ "require-from-string": "^2.0.2"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/blessed": {
+ "version": "0.1.81",
+ "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz",
+ "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==",
+ "bin": {
+ "blessed": "bin/tput.js"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
+ "dependencies": {
+ "inherits": "~2.0.0"
+ },
+ "engines": {
+ "node": "0.4 || >=0.5.8"
+ }
+ },
+ "node_modules/bodec": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz",
+ "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.9",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+ "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001503",
+ "electron-to-chromium": "^1.4.431",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "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/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camera-controls": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.7.0.tgz",
+ "integrity": "sha512-HONMoMYHieOCQOoweS639bdWHP/P/fvVGR08imnECGVUp04mqGfsX/zp1ZufLeiAA5hA6i1JhP6SrnOwh01C0w==",
+ "peerDependencies": {
+ "three": ">=0.126.1"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001517",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz",
+ "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/charm": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz",
+ "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ=="
+ },
+ "node_modules/chevrotain": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz",
+ "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==",
+ "dependencies": {
+ "@chevrotain/cst-dts-gen": "10.5.0",
+ "@chevrotain/gast": "10.5.0",
+ "@chevrotain/types": "10.5.0",
+ "@chevrotain/utils": "10.5.0",
+ "lodash": "4.17.21",
+ "regexp-to-ast": "0.5.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+ "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-tableau": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz",
+ "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==",
+ "dependencies": {
+ "chalk": "3.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/cli-tableau/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/cli-tableau/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-tableau/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/cli-tableau/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/cli-tableau/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/cli-tableau/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/cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "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": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/continuation-local-storage": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
+ "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==",
+ "dependencies": {
+ "async-listener": "^0.6.0",
+ "emitter-listener": "^1.1.1"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/croner": {
+ "version": "4.1.97",
+ "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz",
+ "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ=="
+ },
+ "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/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ },
+ "node_modules/culvert": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz",
+ "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg=="
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz",
+ "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.9",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz",
+ "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA=="
+ },
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "dev": true,
+ "dependencies": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "dependencies": {
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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/detect-gpu": {
+ "version": "5.0.36",
+ "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.36.tgz",
+ "integrity": "sha512-fc+ylg9AnplrKW3POCQhyJ93bjsJK3AzxP5RI9hnRvHzGit8kWN38LLIivzNMCX80EaXFok/1P2+KZXZVbZgoA==",
+ "dependencies": {
+ "webgl-constants": "^1.1.1"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/draco3d": {
+ "version": "1.5.6",
+ "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.6.tgz",
+ "integrity": "sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ=="
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.471",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz",
+ "integrity": "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==",
+ "dev": true
+ },
+ "node_modules/emitter-listener": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz",
+ "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==",
+ "dependencies": {
+ "shimmer": "^1.2.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
+ "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.1",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.2.1",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.0",
+ "safe-array-concat": "^1.0.0",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.7",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.17",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz",
+ "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.17",
+ "@esbuild/android-arm64": "0.18.17",
+ "@esbuild/android-x64": "0.18.17",
+ "@esbuild/darwin-arm64": "0.18.17",
+ "@esbuild/darwin-x64": "0.18.17",
+ "@esbuild/freebsd-arm64": "0.18.17",
+ "@esbuild/freebsd-x64": "0.18.17",
+ "@esbuild/linux-arm": "0.18.17",
+ "@esbuild/linux-arm64": "0.18.17",
+ "@esbuild/linux-ia32": "0.18.17",
+ "@esbuild/linux-loong64": "0.18.17",
+ "@esbuild/linux-mips64el": "0.18.17",
+ "@esbuild/linux-ppc64": "0.18.17",
+ "@esbuild/linux-riscv64": "0.18.17",
+ "@esbuild/linux-s390x": "0.18.17",
+ "@esbuild/linux-x64": "0.18.17",
+ "@esbuild/netbsd-x64": "0.18.17",
+ "@esbuild/openbsd-x64": "0.18.17",
+ "@esbuild/sunos-x64": "0.18.17",
+ "@esbuild/win32-arm64": "0.18.17",
+ "@esbuild/win32-ia32": "0.18.17",
+ "@esbuild/win32-x64": "0.18.17"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.45.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+ "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "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.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz",
+ "integrity": "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz",
+ "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
+ "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/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/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "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==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter2": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
+ "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg=="
+ },
+ "node_modules/execa": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
+ "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.1",
+ "human-signals": "^4.3.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^3.0.7",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
+ },
+ "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-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-patch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
+ "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fclone": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz",
+ "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw=="
+ },
+ "node_modules/fflate": {
+ "version": "0.6.10",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz",
+ "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg=="
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/fstream": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+ "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/fstream/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-uri": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz",
+ "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==",
+ "dependencies": {
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^5.0.1",
+ "debug": "^4.3.4",
+ "fs-extra": "^8.1.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/git-node-fs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz",
+ "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ=="
+ },
+ "node_modules/git-sha1": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz",
+ "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg=="
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
+ "node_modules/glsl-noise": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz",
+ "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": 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=="
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": 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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
+ "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
+ "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true,
+ "bin": {
+ "husky": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ip": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
+ "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": 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-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+ "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "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==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": 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-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "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/its-fine": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.1.1.tgz",
+ "integrity": "sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==",
+ "dependencies": {
+ "@types/react-reconciler": "^0.28.0"
+ },
+ "peerDependencies": {
+ "react": ">=18.0"
+ }
+ },
+ "node_modules/its-fine/node_modules/@types/react-reconciler": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.2.tgz",
+ "integrity": "sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz",
+ "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-git": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz",
+ "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==",
+ "dependencies": {
+ "bodec": "^0.1.0",
+ "culvert": "^0.1.2",
+ "git-sha1": "^0.1.2",
+ "pako": "^0.2.5"
+ }
+ },
+ "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=="
+ },
+ "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/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "optional": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
+ "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/ktx-parse": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.4.5.tgz",
+ "integrity": "sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg=="
+ },
+ "node_modules/lazy": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz",
+ "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==",
+ "engines": {
+ "node": ">=0.2.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lil-gui": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz",
+ "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==",
+ "peer": true
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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": "13.2.3",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz",
+ "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "5.2.0",
+ "cli-truncate": "^3.1.0",
+ "commander": "^10.0.0",
+ "debug": "^4.3.4",
+ "execa": "^7.0.0",
+ "lilconfig": "2.1.0",
+ "listr2": "^5.0.7",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-inspect": "^1.12.3",
+ "pidtree": "^0.6.0",
+ "string-argv": "^0.3.1",
+ "yaml": "^2.2.2"
+ },
+ "bin": {
+ "lint-staged": "bin/lint-staged.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/lint-staged"
+ }
+ },
+ "node_modules/lint-staged/node_modules/chalk": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
+ "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/lint-staged/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/listr2": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz",
+ "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.19",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.8.0",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listr2/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/listr2/node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/listr2/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/listr2/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/listr2/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/listr2/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/listr2/node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/listr2/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/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.clamp": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.clamp/-/lodash.clamp-4.0.3.tgz",
+ "integrity": "sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg=="
+ },
+ "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.omit": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
+ "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg=="
+ },
+ "node_modules/lodash.pick": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q=="
+ },
+ "node_modules/log-driver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz",
+ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==",
+ "engines": {
+ "node": ">=0.8.6"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/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/log-update/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/log-update/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/log-update/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/log-update/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/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/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/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/maath": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/maath/-/maath-0.6.0.tgz",
+ "integrity": "sha512-dSb2xQuP7vDnaYqfoKzlApeRcR2xtN8/f7WV/TMAkBC8552TwTLtOO0JTcSygkYMjNDPoo6V01jTw/aPi4JrMw==",
+ "peerDependencies": {
+ "@types/three": ">=0.144.0",
+ "three": ">=0.144.0"
+ }
+ },
+ "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/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/meshline": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.1.6.tgz",
+ "integrity": "sha512-8JZJOdaL5oz3PI/upG8JvP/5FfzYUOhrkJ8np/WKvXzl0/PZ2V9pqTvCIjSKv+w9ccg2xb+yyBhXAwt6ier3ug==",
+ "peerDependencies": {
+ "three": ">=0.137"
+ }
+ },
+ "node_modules/meshoptimizer": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz",
+ "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==",
+ "peer": true
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "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/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mmd-parser": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mmd-parser/-/mmd-parser-1.0.4.tgz",
+ "integrity": "sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg=="
+ },
+ "node_modules/module-details-from-path": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
+ "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/needle": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz",
+ "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
+ "dependencies": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/netmask": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "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/nssocket": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz",
+ "integrity": "sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==",
+ "dependencies": {
+ "eventemitter2": "~0.4.14",
+ "lazy": "~1.0.11"
+ },
+ "engines": {
+ "node": ">= 0.10.x"
+ }
+ },
+ "node_modules/nssocket/node_modules/eventemitter2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ=="
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/opentype.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz",
+ "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==",
+ "dependencies": {
+ "string.prototype.codepointat": "^0.2.1",
+ "tiny-inflate": "^1.0.3"
+ },
+ "bin": {
+ "ot": "bin/ot"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pac-proxy-agent": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz",
+ "integrity": "sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==",
+ "dependencies": {
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.0.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "pac-resolver": "^7.0.0",
+ "socks-proxy-agent": "^8.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-resolver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz",
+ "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==",
+ "dependencies": {
+ "degenerator": "^5.0.0",
+ "ip": "^1.1.8",
+ "netmask": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/paginator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/paginator/-/paginator-1.0.0.tgz",
+ "integrity": "sha512-j2Y5AtF/NrXOEU9VVOQBGHnj81NveRQ/cDzySywqsWrAj+cxivMpMCkYJOds3ulQiDU4rQBWc0WoyyXMXOmuMA=="
+ },
+ "node_modules/pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
+ },
+ "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/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "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/pidusage": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz",
+ "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==",
+ "dependencies": {
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pm2": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.3.0.tgz",
+ "integrity": "sha512-xscmQiAAf6ArVmKhjKTeeN8+Td7ZKnuZFFPw1DGkdFPR/0Iyx+m+1+OpCdf9+HQopX3VPc9/wqPQHqVOfHum9w==",
+ "dependencies": {
+ "@pm2/agent": "~2.0.0",
+ "@pm2/io": "~5.0.0",
+ "@pm2/js-api": "~0.6.7",
+ "@pm2/pm2-version-check": "latest",
+ "async": "~3.2.0",
+ "blessed": "0.1.81",
+ "chalk": "3.0.0",
+ "chokidar": "^3.5.3",
+ "cli-tableau": "^2.0.0",
+ "commander": "2.15.1",
+ "croner": "~4.1.92",
+ "dayjs": "~1.11.5",
+ "debug": "^4.3.1",
+ "enquirer": "2.3.6",
+ "eventemitter2": "5.0.1",
+ "fclone": "1.0.11",
+ "mkdirp": "1.0.4",
+ "needle": "2.4.0",
+ "pidusage": "~3.0",
+ "pm2-axon": "~4.0.1",
+ "pm2-axon-rpc": "~0.7.1",
+ "pm2-deploy": "~1.0.2",
+ "pm2-multimeter": "^0.1.2",
+ "promptly": "^2",
+ "semver": "^7.2",
+ "source-map-support": "0.5.21",
+ "sprintf-js": "1.1.2",
+ "vizion": "~2.2.1",
+ "yamljs": "0.3.0"
+ },
+ "bin": {
+ "pm2": "bin/pm2",
+ "pm2-dev": "bin/pm2-dev",
+ "pm2-docker": "bin/pm2-docker",
+ "pm2-runtime": "bin/pm2-runtime"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "pm2-sysmonit": "^1.2.8"
+ }
+ },
+ "node_modules/pm2-axon": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz",
+ "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==",
+ "dependencies": {
+ "amp": "~0.3.1",
+ "amp-message": "~0.1.1",
+ "debug": "^4.3.1",
+ "escape-string-regexp": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=5"
+ }
+ },
+ "node_modules/pm2-axon-rpc": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz",
+ "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==",
+ "dependencies": {
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=5"
+ }
+ },
+ "node_modules/pm2-axon/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pm2-deploy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz",
+ "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==",
+ "dependencies": {
+ "run-series": "^1.1.8",
+ "tv4": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pm2-multimeter": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz",
+ "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==",
+ "dependencies": {
+ "charm": "~0.1.1"
+ }
+ },
+ "node_modules/pm2-sysmonit": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz",
+ "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==",
+ "optional": true,
+ "dependencies": {
+ "async": "^3.2.0",
+ "debug": "^4.3.1",
+ "pidusage": "^2.0.21",
+ "systeminformation": "^5.7",
+ "tx2": "~1.0.4"
+ }
+ },
+ "node_modules/pm2-sysmonit/node_modules/pidusage": {
+ "version": "2.0.21",
+ "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz",
+ "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==",
+ "optional": true,
+ "dependencies": {
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pm2/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/pm2/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pm2/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/pm2/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/pm2/node_modules/commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+ },
+ "node_modules/pm2/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/pm2/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/pm2/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/postcss": {
+ "version": "8.4.27",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz",
+ "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-import/node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/postprocessing": {
+ "version": "6.32.2",
+ "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.32.2.tgz",
+ "integrity": "sha512-BpjIHeElXRmkcqO6p8Pi6W1uDcivQa2FVQ/Swnoo32Cg5bq/bb0mh9hXSHeCkIBD0W4D2KU8Fg7jBICztcN9iQ==",
+ "engines": {
+ "node": ">= 0.13.2"
+ },
+ "peerDependencies": {
+ "three": ">= 0.138.0 < 0.155.0"
+ }
+ },
+ "node_modules/potpack": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
+ "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz",
+ "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/promptly": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz",
+ "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==",
+ "dependencies": {
+ "read": "^1.0.4"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/proxy-agent": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz",
+ "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.0.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-composer": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz",
+ "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==",
+ "dependencies": {
+ "prop-types": "^15.6.0"
+ },
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-cookie": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz",
+ "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.0.1",
+ "hoist-non-react-statics": "^3.0.0",
+ "universal-cookie": "^4.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.3.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-icons": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz",
+ "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-js-pagination": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/react-js-pagination/-/react-js-pagination-3.0.3.tgz",
+ "integrity": "sha512-podyA6Rd0uxc8uQakXWXxnonoOPI6NnFOROXfc6qPKNYm44s+Bgpn0JkyflcfbHf/GFKahnL8JN8rxBHZiBskg==",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "fstream": "1.0.12",
+ "paginator": "^1.0.0",
+ "prop-types": "15.x.x - 16.x.x",
+ "react": "15.x.x - 16.x.x",
+ "tar": "2.2.2"
+ }
+ },
+ "node_modules/react-js-pagination/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-merge-refs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz",
+ "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/react-reconciler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz",
+ "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.21.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/react-reconciler/node_modules/scheduler": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz",
+ "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
+ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.2.tgz",
+ "integrity": "sha512-09Zss2dE2z+T1D03IheqAFtK4UzQyX8nFPWx6jkwdYzGLXd5ie06A6ezS2fO6zJfEb/SpG6UocN2O1hfD+2urQ==",
+ "dependencies": {
+ "@remix-run/router": "1.7.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.2.tgz",
+ "integrity": "sha512-5pWX0jdKR48XFZBuJqHosX3AAHjRAzygouMTyimnBPOLdY3WjzUSKhus2FVMihUFWzeLebDgr4r8UeQFAct7Bg==",
+ "dependencies": {
+ "@remix-run/router": "1.7.2",
+ "react-router": "6.14.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-toastify": {
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz",
+ "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==",
+ "dependencies": {
+ "clsx": "^1.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
+ "node_modules/react-use-measure": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz",
+ "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==",
+ "dependencies": {
+ "debounce": "^1.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.13",
+ "react-dom": ">=16.13"
+ }
+ },
+ "node_modules/read": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
+ "dependencies": {
+ "mute-stream": "~0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
+ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
+ },
+ "node_modules/regexp-to-ast": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
+ "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+ "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-in-the-middle": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz",
+ "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "module-details-from-path": "^1.0.3",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/require-in-the-middle/node_modules/resolve": {
+ "version": "1.22.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
+ "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/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/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.26.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz",
+ "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/run-series": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz",
+ "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==",
+ "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/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz",
+ "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/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/semver/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/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/shimmer": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
+ "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/slice-ansi/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/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+ "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "dependencies": {
+ "ip": "^2.0.0",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz",
+ "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==",
+ "dependencies": {
+ "agent-base": "^7.0.1",
+ "debug": "^4.3.4",
+ "socks": "^2.7.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/socks/node_modules/ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="
+ },
+ "node_modules/stats-gl": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-1.0.4.tgz",
+ "integrity": "sha512-oxo13HHonoMWIYcrIu4xCk8IcFEFaqAOkMOMIyfvZFxNZzGy+jnW8sy0W3VfEjKQd5JX0Kp2KhePAKhtI6/TSw=="
+ },
+ "node_modules/stats.js": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz",
+ "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw=="
+ },
+ "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": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/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/string.prototype.codepointat": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
+ "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg=="
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
+ "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/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/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
+ "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/suspend-react": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz",
+ "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==",
+ "peerDependencies": {
+ "react": ">=17.0"
+ }
+ },
+ "node_modules/swiper": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.1.0.tgz",
+ "integrity": "sha512-E+wh+hcSbwlRfXuwBTclcOOikOjNdSF0a2Sdg3J4cIWtHO64A7SaLRfezfrJ67CW3GEc15AduYU2YKlElsjqsQ==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
+ "node_modules/systeminformation": {
+ "version": "5.18.13",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.18.13.tgz",
+ "integrity": "sha512-spBy2YCllkmmvfm66xkVxrCaDVfeAwyKR8uxu+zLF4gIuNQ0l9mSVljh4pIb/6en8b74qv9wronBPkfyrcfO7w==",
+ "optional": true,
+ "os": [
+ "darwin",
+ "linux",
+ "win32",
+ "freebsd",
+ "openbsd",
+ "netbsd",
+ "sunos",
+ "android"
+ ],
+ "bin": {
+ "systeminformation": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "funding": {
+ "type": "Buy me a coffee",
+ "url": "https://www.buymeacoffee.com/systeminfo"
+ }
+ },
+ "node_modules/tailwind-scrollbar-hide": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-1.1.7.tgz",
+ "integrity": "sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA=="
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
+ "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tar": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+ "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+ "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.",
+ "dependencies": {
+ "block-stream": "*",
+ "fstream": "^1.0.12",
+ "inherits": "2"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/three": {
+ "version": "0.154.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.154.0.tgz",
+ "integrity": "sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug=="
+ },
+ "node_modules/three-mesh-bvh": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.6.3.tgz",
+ "integrity": "sha512-xjuGLSI9nBATIsWcT/DnnNma5xXYyvBiXfUbhGLAFqItOlOKYF5JWsUOX+cuSAnSWovEoHzd5Emx23qKiByrlw==",
+ "peerDependencies": {
+ "three": ">= 0.151.0"
+ }
+ },
+ "node_modules/three-stdlib": {
+ "version": "2.24.2",
+ "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.24.2.tgz",
+ "integrity": "sha512-+FWg+evDvjcuwIYopqEz6xCrqadSW6j855EV4/5w/kygwEc2BktB7s4Y8iZEQKGq8g6Srfj5eWQpSK0+51C4Hg==",
+ "dependencies": {
+ "@types/draco3d": "^1.4.0",
+ "@types/offscreencanvas": "^2019.6.4",
+ "@types/webxr": "^0.5.2",
+ "chevrotain": "^10.1.2",
+ "draco3d": "^1.4.1",
+ "fflate": "^0.6.9",
+ "ktx-parse": "^0.4.5",
+ "mmd-parser": "^1.0.4",
+ "opentype.js": "^1.3.3",
+ "potpack": "^1.0.1",
+ "zstddec": "^0.0.2"
+ },
+ "peerDependencies": {
+ "three": ">=0.128.0"
+ }
+ },
+ "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/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/troika-three-text": {
+ "version": "0.47.2",
+ "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.47.2.tgz",
+ "integrity": "sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==",
+ "dependencies": {
+ "bidi-js": "^1.0.2",
+ "troika-three-utils": "^0.47.2",
+ "troika-worker-utils": "^0.47.2",
+ "webgl-sdf-generator": "1.1.1"
+ },
+ "peerDependencies": {
+ "three": ">=0.125.0"
+ }
+ },
+ "node_modules/troika-three-utils": {
+ "version": "0.47.2",
+ "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.47.2.tgz",
+ "integrity": "sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==",
+ "peerDependencies": {
+ "three": ">=0.125.0"
+ }
+ },
+ "node_modules/troika-worker-utils": {
+ "version": "0.47.2",
+ "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz",
+ "integrity": "sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA=="
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz",
+ "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/tsconfck": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz",
+ "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==",
+ "dev": true,
+ "bin": {
+ "tsconfck": "bin/tsconfck.js"
+ },
+ "engines": {
+ "node": "^14.13.1 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "typescript": "^4.3.5 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz",
+ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+ },
+ "node_modules/tv4": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz",
+ "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/tx2": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz",
+ "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==",
+ "optional": true,
+ "dependencies": {
+ "json-stringify-safe": "^5.0.1"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
+ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/universal-cookie": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz",
+ "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==",
+ "dependencies": {
+ "@types/cookie": "^0.3.3",
+ "cookie": "^0.4.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/utility-types": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
+ "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/vite": {
+ "version": "4.4.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz",
+ "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.26",
+ "rollup": "^3.25.2"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "globrex": "^0.1.2",
+ "tsconfck": "^2.1.0"
+ },
+ "peerDependencies": {
+ "vite": "*"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vizion": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz",
+ "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==",
+ "dependencies": {
+ "async": "^2.6.3",
+ "git-node-fs": "^1.0.0",
+ "ini": "^1.3.5",
+ "js-git": "^0.7.8"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/vizion/node_modules/async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/webgl-constants": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz",
+ "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg=="
+ },
+ "node_modules/webgl-sdf-generator": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz",
+ "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA=="
+ },
+ "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-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
+ "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/wrap-ansi/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/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/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/ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
+ "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yamljs": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz",
+ "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "glob": "^7.0.5"
+ },
+ "bin": {
+ "json2yaml": "bin/json2yaml",
+ "yaml2json": "bin/yaml2json"
+ }
+ },
+ "node_modules/yamljs/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/yamljs/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zstddec": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.0.2.tgz",
+ "integrity": "sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA=="
+ },
+ "node_modules/zustand": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
+ "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..4aa31aaf
--- /dev/null
+++ b/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "scheduler-front",
+ "type": "module",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "prepare": "husky install",
+ "deploy": "npx pm2 start npm -- run preview"
+ },
+ "dependencies": {
+ "@react-three/drei": "^9.80.1",
+ "@react-three/fiber": "^8.13.6",
+ "@react-three/postprocessing": "^2.14.13",
+ "@tanstack/react-query": "^4.32.0",
+ "axios": "^1.4.0",
+ "dayjs": "^1.11.9",
+ "pm2": "^5.3.0",
+ "postprocessing": "^6.32.2",
+ "react": "^18.2.0",
+ "react-cookie": "^4.1.1",
+ "react-dom": "^18.2.0",
+ "react-icons": "^4.10.1",
+ "react-js-pagination": "^3.0.3",
+ "react-router-dom": "^6.14.2",
+ "react-toastify": "^9.1.3",
+ "swiper": "^10.1.0",
+ "tailwind-scrollbar-hide": "^1.1.7",
+ "three": "^0.154.0"
+ },
+ "devDependencies": {
+ "@types/react": "^18.2.15",
+ "@types/react-dom": "^18.2.7",
+ "@types/react-js-pagination": "^3.0.4",
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
+ "@typescript-eslint/parser": "^6.0.0",
+ "@vitejs/plugin-react": "^4.0.3",
+ "autoprefixer": "^10.4.14",
+ "eslint": "^8.45.0",
+ "eslint-plugin-react": "^7.33.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.3",
+ "husky": "^8.0.3",
+ "lint-staged": "^13.2.3",
+ "postcss": "^8.4.27",
+ "prettier": "^3.0.0",
+ "tailwindcss": "^3.3.3",
+ "typescript": "^5.0.2",
+ "vite": "^4.4.5",
+ "vite-tsconfig-paths": "^4.2.0"
+ },
+ "lint-staged": {
+ "*.{ts,tsx,js,jsx}": [
+ "prettier --write",
+ "eslint --fix"
+ ]
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 00000000..2b75bd8a
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {}
+ }
+}
diff --git a/public/2pm.png b/public/2pm.png
new file mode 100644
index 00000000..7469c6e8
Binary files /dev/null and b/public/2pm.png differ
diff --git a/public/YeonganIdolLogoOrigin.svg b/public/YeonganIdolLogoOrigin.svg
new file mode 100644
index 00000000..b58a6605
--- /dev/null
+++ b/public/YeonganIdolLogoOrigin.svg
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/YeonganIdolLogoSymbol.svg b/public/YeonganIdolLogoSymbol.svg
new file mode 100644
index 00000000..23a47e07
--- /dev/null
+++ b/public/YeonganIdolLogoSymbol.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/YeonganIdolLogoWhite.svg b/public/YeonganIdolLogoWhite.svg
new file mode 100644
index 00000000..816daf23
--- /dev/null
+++ b/public/YeonganIdolLogoWhite.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/YeonganIdol_Logo_File/YeonganIdolLogoOrigin.svg b/public/YeonganIdol_Logo_File/YeonganIdolLogoOrigin.svg
new file mode 100644
index 00000000..b58a6605
--- /dev/null
+++ b/public/YeonganIdol_Logo_File/YeonganIdolLogoOrigin.svg
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/YeonganIdol_Logo_File/YeonganIdolLogoSymbol.svg b/public/YeonganIdol_Logo_File/YeonganIdolLogoSymbol.svg
new file mode 100644
index 00000000..64e31b1e
--- /dev/null
+++ b/public/YeonganIdol_Logo_File/YeonganIdolLogoSymbol.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/YeonganIdol_Logo_File/YeonganIdolLogoWhite.svg b/public/YeonganIdol_Logo_File/YeonganIdolLogoWhite.svg
new file mode 100644
index 00000000..816daf23
--- /dev/null
+++ b/public/YeonganIdol_Logo_File/YeonganIdolLogoWhite.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dots.svg b/public/dots.svg
new file mode 100644
index 00000000..08293423
--- /dev/null
+++ b/public/dots.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 00000000..143c31ea
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/image/1-login.png b/public/image/1-login.png
new file mode 100644
index 00000000..1cd6ceb2
Binary files /dev/null and b/public/image/1-login.png differ
diff --git a/public/image/Group 1.png b/public/image/Group 1.png
new file mode 100644
index 00000000..3d2db8b7
Binary files /dev/null and b/public/image/Group 1.png differ
diff --git a/public/image/Group 2.png b/public/image/Group 2.png
new file mode 100644
index 00000000..965ea843
Binary files /dev/null and b/public/image/Group 2.png differ
diff --git a/public/image/Group 3.png b/public/image/Group 3.png
new file mode 100644
index 00000000..35c7ca46
Binary files /dev/null and b/public/image/Group 3.png differ
diff --git a/public/image/Logo-bg.svg b/public/image/Logo-bg.svg
new file mode 100644
index 00000000..e6928b23
--- /dev/null
+++ b/public/image/Logo-bg.svg
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/image/Logo.svg b/public/image/Logo.svg
new file mode 100644
index 00000000..b58a6605
--- /dev/null
+++ b/public/image/Logo.svg
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/image/LogoSymbol.svg b/public/image/LogoSymbol.svg
new file mode 100644
index 00000000..64e31b1e
--- /dev/null
+++ b/public/image/LogoSymbol.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/image/LogoWhite.svg b/public/image/LogoWhite.svg
new file mode 100644
index 00000000..816daf23
--- /dev/null
+++ b/public/image/LogoWhite.svg
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/image/loading.png b/public/image/loading.png
new file mode 100644
index 00000000..6a767154
Binary files /dev/null and b/public/image/loading.png differ
diff --git a/public/lesserafim.jpg b/public/lesserafim.jpg
new file mode 100644
index 00000000..6ddbc8a6
Binary files /dev/null and b/public/lesserafim.jpg differ
diff --git a/public/mock_image/event_default.jpg b/public/mock_image/event_default.jpg
new file mode 100644
index 00000000..7b8333b5
Binary files /dev/null and b/public/mock_image/event_default.jpg differ
diff --git a/public/mock_image/hive_profile_image.png b/public/mock_image/hive_profile_image.png
new file mode 100644
index 00000000..0db07190
Binary files /dev/null and b/public/mock_image/hive_profile_image.png differ
diff --git a/public/mock_image/sm_profile_image.png b/public/mock_image/sm_profile_image.png
new file mode 100644
index 00000000..9882556f
Binary files /dev/null and b/public/mock_image/sm_profile_image.png differ
diff --git a/public/mock_image/user_default.png b/public/mock_image/user_default.png
new file mode 100644
index 00000000..47664802
Binary files /dev/null and b/public/mock_image/user_default.png differ
diff --git a/public/mock_image/user_profile_1.png b/public/mock_image/user_profile_1.png
new file mode 100644
index 00000000..cbd12462
Binary files /dev/null and b/public/mock_image/user_profile_1.png differ
diff --git a/public/mock_image/user_profile_2.png b/public/mock_image/user_profile_2.png
new file mode 100644
index 00000000..71dbc51f
Binary files /dev/null and b/public/mock_image/user_profile_2.png differ
diff --git a/public/mock_image/user_profile_3.png b/public/mock_image/user_profile_3.png
new file mode 100644
index 00000000..2fe63790
Binary files /dev/null and b/public/mock_image/user_profile_3.png differ
diff --git a/public/mock_image/user_profile_4.png b/public/mock_image/user_profile_4.png
new file mode 100644
index 00000000..26183631
Binary files /dev/null and b/public/mock_image/user_profile_4.png differ
diff --git a/public/mock_image/user_profile_5.png b/public/mock_image/user_profile_5.png
new file mode 100644
index 00000000..4f5c4c53
Binary files /dev/null and b/public/mock_image/user_profile_5.png differ
diff --git a/public/newjeans_ad.png b/public/newjeans_ad.png
new file mode 100644
index 00000000..fd9a0fa5
Binary files /dev/null and b/public/newjeans_ad.png differ
diff --git a/public/psy_humppuckshow.png b/public/psy_humppuckshow.png
new file mode 100644
index 00000000..c3d350b9
Binary files /dev/null and b/public/psy_humppuckshow.png differ
diff --git a/public/resources/bg.jpg b/public/resources/bg.jpg
new file mode 100644
index 00000000..67e03471
Binary files /dev/null and b/public/resources/bg.jpg differ
diff --git a/public/resources/fan.png b/public/resources/fan.png
new file mode 100644
index 00000000..360df0c5
Binary files /dev/null and b/public/resources/fan.png differ
diff --git a/public/resources/fans1.png b/public/resources/fans1.png
new file mode 100644
index 00000000..92e8bb40
Binary files /dev/null and b/public/resources/fans1.png differ
diff --git a/public/resources/fans2.png b/public/resources/fans2.png
new file mode 100644
index 00000000..a69cb7fc
Binary files /dev/null and b/public/resources/fans2.png differ
diff --git a/public/resources/ground.png b/public/resources/ground.png
new file mode 100644
index 00000000..2fbec907
Binary files /dev/null and b/public/resources/ground.png differ
diff --git a/public/resources/stars.png b/public/resources/stars.png
new file mode 100644
index 00000000..64cc3049
Binary files /dev/null and b/public/resources/stars.png differ
diff --git a/public/sbtn_ac.svg b/public/sbtn_ac.svg
new file mode 100644
index 00000000..69ed3e99
--- /dev/null
+++ b/public/sbtn_ac.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/sbtn_inac.svg b/public/sbtn_inac.svg
new file mode 100644
index 00000000..0e91c690
--- /dev/null
+++ b/public/sbtn_inac.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/side_add.png b/public/side_add.png
new file mode 100644
index 00000000..17413a00
Binary files /dev/null and b/public/side_add.png differ
diff --git a/public/table.jpg b/public/table.jpg
new file mode 100644
index 00000000..c529d29b
Binary files /dev/null and b/public/table.jpg differ
diff --git a/public/user.svg b/public/user.svg
new file mode 100644
index 00000000..29b394d5
--- /dev/null
+++ b/public/user.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 00000000..e7b8dfb1
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/yearly_idol.png b/public/yearly_idol.png
new file mode 100644
index 00000000..f50a2c5c
Binary files /dev/null and b/public/yearly_idol.png differ
diff --git a/src/App.css b/src/App.css
new file mode 100644
index 00000000..e69de29b
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 00000000..957d9544
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,70 @@
+import React, { Suspense, lazy } from 'react'
+import { Route, Routes } from 'react-router-dom'
+
+import CalendarLayout from '@/components/layouts/CalendarLayout'
+import CalendarPage from '@/pages/Calendar'
+const Sample = lazy(() => import('@/pages/Sample/Sample'))
+import Optimistic from '@/pages/Sample/Optimistic'
+
+const MainLayout = lazy(() => import('@/components/layouts/MainLayout'))
+const Home = lazy(() => import('./pages/Home'))
+const SignupPage = lazy(() => import('pages/SignupPage'))
+const SignInPage = lazy(() => import('pages/SignInPage'))
+const SignUpTestPage = lazy(() => import('@/pages/Sample/SignUpTestPage'))
+
+import ApprovalPage from './pages/Manager/Approval'
+import ManagerEventAddEditPage from './pages/Manager/ManagerEventAddEdit'
+import ManagerDashboardPage from './pages/Manager/ManagerDashboard'
+import ManagerLayout from './components/layouts/ManagerLayout'
+import UserLayout from './components/layouts/UserLayout'
+import MyPage from './pages/User/MyPage'
+import Edit from './pages/User/Edit'
+
+const SignInAPITestPage = lazy(() => import('./pages/Sample/SignInAPITestPage'))
+const ScheduleAddTestPage = lazy(() => import('./pages/Sample/Schedule'))
+
+import '@/App.css'
+import 'react-toastify/dist/ReactToastify.css'
+import { ToastContainer } from 'react-toastify'
+
+function App() {
+ return (
+ <>
+ }>
+
+
+ }>
+ } />
+ } />
+
+ }>
+ }
+ />
+ } />
+ } />
+ } />
+
+ }>
+ } />
+ } />
+
+
+ }>
+ } />
+ } />
+ } />
+
+ {/* ! react-query Sample 페이지입니다 ! */}
+ } />
+ } />
+ } />
+ } />
+
+
+ >
+ )
+}
+
+export default App
diff --git a/src/api/admin/adminPage.ts b/src/api/admin/adminPage.ts
new file mode 100644
index 00000000..9d2039f3
--- /dev/null
+++ b/src/api/admin/adminPage.ts
@@ -0,0 +1,56 @@
+import api from '@/api'
+
+export type ScheduleDtoType = {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ schedulerRoleAdminList: any
+ description: string
+ fullName?: string
+ title: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+ scheduleStart: string
+ adminScheduleId: number
+ userScheduleId: number
+}
+export type ApprovalListResponse = {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ registeredEventCount: any
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ countProcessDTO: any
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ schedulerRoleAdminList: []
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ getRoleAdminCountProgressDTO: any
+ scheduleDto: ScheduleDtoType[]
+ countProcessDto: {
+ waiting: number
+ refused: number
+ accepted: number
+ }
+ userDTO: {
+ id: number
+ email: string
+ fullName: string
+ sizeOfTicket: string
+ profileImage: string
+ role: 'USER' | 'ADMIN'
+ }
+}
+
+export const getAdminDashbordlList = async (
+ cookie: string
+): Promise => {
+ try {
+ const res = await api({
+ url: '/mypage?role=ADMIN',
+ method: 'GET',
+ headers: {
+ Authorization: cookie
+ }
+ })
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ return null
+ }
+}
diff --git a/src/api/admin/approvalPage.ts b/src/api/admin/approvalPage.ts
new file mode 100644
index 00000000..05855b35
--- /dev/null
+++ b/src/api/admin/approvalPage.ts
@@ -0,0 +1,113 @@
+import api from '@/api'
+import { SetStateAction } from 'react'
+
+export type ScheduleDtoType = {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ schedulerRoleAdminList: any
+ description: string
+ fullName?: string
+ title: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+ scheduleStart: string
+ adminScheduleId: number
+ userScheduleId: number
+}
+
+export type implScheduleDtoType = {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ data: any
+ length: SetStateAction
+ description: string
+ fullName?: string
+ title: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+ scheduleStart: string
+ adminScheduleId: number
+ userScheduleId: number
+}
+
+export type ApprovalListResponse = {
+ implScheduleDto: implScheduleDtoType
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ registeredEventCount: any
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ countProcessDTO: any
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ schedulerRoleAdminList: []
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ getRoleAdminCountProgressDTO: any
+ scheduleDto: ScheduleDtoType[]
+ countProcessDto: {
+ waiting: number
+ refused: number
+ accepted: number
+ }
+ userDTO: {
+ id: number
+ email: string
+ fullName: string
+ sizeOfTicket: string
+ profileImage: string
+ role: 'USER' | 'ADMIN'
+ }
+}
+
+export const getAdminApprovallList = async (
+ cookie: string
+): Promise => {
+ try {
+ const res = await api({
+ url: '/admin/schedule/confirm',
+ method: 'GET',
+ headers: {
+ Authorization: cookie
+ }
+ })
+ // eslint-disable-next-line no-console
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ return null
+ }
+}
+
+export const approveSchedule = async (userScheduleId: number, cookie: string): Promise => {
+ try {
+ const res = await api({
+ url: `/admin/schedule/confirm/${userScheduleId}?progress=ACCEPT`,
+ method: 'POST',
+ headers: {
+ Authorization: cookie
+ }
+ })
+
+ if (res.data.data) {
+ return true // 성공 시 true 반환
+ }
+ return false // 데이터 없을 시 false 반환
+ } catch (error) {
+ console.error('승인 요청 실패:', error)
+ return false // 에러 시 false 반환
+ }
+}
+
+export const cancelSchedule = async (userScheduleId: number, cookie: string): Promise => {
+ try {
+ const res = await api({
+ url: `/admin/schedule/confirm/${userScheduleId}?progress=REFUSE`,
+ method: 'POST',
+ headers: {
+ Authorization: cookie
+ }
+ })
+
+ if (res.data.data) {
+ return true // 성공 시 true 반환
+ }
+ return false // 데이터 없을 시 false 반환
+ } catch (error) {
+ console.error('취소 요청 실패:', error)
+ return false // 에러 시 false 반환
+ }
+}
diff --git a/src/api/api.ts b/src/api/api.ts
new file mode 100644
index 00000000..ca6f02eb
--- /dev/null
+++ b/src/api/api.ts
@@ -0,0 +1,57 @@
+import { AxiosResponse } from 'axios'
+import api from './index'
+
+interface ApiResponse {
+ data: T
+}
+
+export async function loginUser(email: string, password: string) {
+ try {
+ const response: AxiosResponse> = await api.post('/login', {
+ email,
+ password
+ })
+ return response.headers.authorization // 쿠키에 저장 토큰임
+ } catch (err) {
+ return null
+ }
+}
+
+export async function signUpUser(
+ email: string,
+ password: string,
+ fullName: string,
+ profileImage: File | undefined,
+ role: 'ADMIN' | 'USER'
+) {
+ try {
+ const formData = new FormData()
+
+ // 프로필 이미지가 있는 경우에만 FormData에 추가합니다.
+ if (profileImage) {
+ formData.append('file', profileImage)
+ }
+
+ formData.append(
+ 'dto',
+ new Blob([JSON.stringify({ email, password, fullName, role })], {
+ type: 'application/json'
+ })
+ )
+
+ const response: AxiosResponse> = await api.post(
+ '/join',
+ formData,
+ {
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ }
+ )
+
+ return response.data.data
+ } catch (err) {
+ console.error(err)
+ return false
+ }
+}
diff --git a/src/api/index.ts b/src/api/index.ts
new file mode 100644
index 00000000..ebd60e55
--- /dev/null
+++ b/src/api/index.ts
@@ -0,0 +1,6 @@
+import axios from 'axios'
+
+const api = axios.create({
+ baseURL: 'http://minischeduler-env.eba-m9yfe83y.ap-northeast-2.elasticbeanstalk.com'
+})
+export default api
diff --git a/src/api/login/auth.ts b/src/api/login/auth.ts
new file mode 100644
index 00000000..08ad55fe
--- /dev/null
+++ b/src/api/login/auth.ts
@@ -0,0 +1,15 @@
+import api from '..'
+
+export const auth = async (token: string) => {
+ return await api('/api', {
+ method: 'GET',
+ headers: {
+ Authorization: token
+ }
+ })
+ .then((res) => res.data.data)
+ .catch((err) => {
+ console.error(err)
+ return {}
+ })
+}
diff --git a/src/api/login/login.ts b/src/api/login/login.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/api/schedule/admin.ts b/src/api/schedule/admin.ts
new file mode 100644
index 00000000..5eac77bf
--- /dev/null
+++ b/src/api/schedule/admin.ts
@@ -0,0 +1,39 @@
+import { ScheduleAddFormData } from '@/components/calendar/AddForm'
+import { DATE_REQEUST_FORMAT } from '@/constants'
+import dayjs from 'dayjs'
+import api from '..'
+
+export const createSchedule = async (schedule: ScheduleAddFormData, token: string) => {
+ try {
+ const formData = new FormData()
+ formData.append('file', schedule.imageFile)
+ formData.append(
+ 'dto',
+ new Blob(
+ [
+ JSON.stringify({
+ title: schedule.title,
+ scheduleStart: dayjs(schedule.startDate).format(DATE_REQEUST_FORMAT),
+ scheduleEnd: dayjs(schedule.endDate).format(DATE_REQEUST_FORMAT),
+ description: schedule.description
+ })
+ ],
+ {
+ type: 'application/json'
+ }
+ )
+ )
+ await api('/admin/schedule/create', {
+ method: 'POST',
+ data: formData,
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ Authorization: token
+ }
+ })
+ return true
+ } catch (err) {
+ console.error(err)
+ return false
+ }
+}
diff --git a/src/api/schedule/index.ts b/src/api/schedule/index.ts
new file mode 100644
index 00000000..30b9057f
--- /dev/null
+++ b/src/api/schedule/index.ts
@@ -0,0 +1,94 @@
+import api from '@/api'
+import { DATE_FORMAT } from '@/constants'
+import { ProviderReservedList, ProviderSchedule, Schedule } from '@/models/schedule'
+import { delay } from '@/utils'
+import dayjs from 'dayjs'
+
+type ScheduleRequestOption = {
+ year: number
+ month: number
+ token: string
+ userId?: string
+ keyword?: string
+}
+
+export const fetchSchedule = async ({
+ year,
+ month,
+ userId,
+ keyword,
+ token
+}: ScheduleRequestOption): Promise<{
+ schedule: ProviderSchedule[]
+ reservedList: ProviderReservedList[]
+}> => {
+ try {
+ // * 최소 1초의 딜레이로 에니메이션을 보여줌
+ let path = '/user/schedule'
+ if (keyword)
+ path += `/search?year=${year}&month=${month}&keyword=${encodeURIComponent(keyword)}`
+ else path += `?year=${year}&month=${month}`
+
+ const start = new Date()
+
+ const res: { data: Schedule } = await api.get(path, {
+ headers: {
+ Authorization: token
+ }
+ })
+
+ const reservedList = res.data.schedulerUser.map((s) => {
+ const reservedDate = dayjs(s.scheduleStart).format(DATE_FORMAT)
+ return {
+ id: s.id,
+ scheduleId: s.schedulerAdmin.id,
+ progress: s.progress,
+ reservedDate,
+ user: {
+ ...s.user
+ }
+ }
+ })
+
+ const schedule = res.data.schedulerAdmin
+ .filter((s) => s)
+ .map((s) => {
+ return {
+ id: s.id, // post id PK가 안와서 임시로 만듬
+ userId: s.user.id,
+ title: s.title,
+ fullName: s.user.fullName,
+ image: s.image,
+ profileImage: s.user.profileImage,
+ description: s.description,
+ startDate: dayjs(s.scheduleStart).format(DATE_FORMAT),
+ endDate: dayjs(s.scheduleEnd).format(DATE_FORMAT)
+ }
+ })
+ .sort((a, b) => {
+ if (a.startDate === b.startDate) {
+ return a.endDate > b.endDate ? -1 : 1
+ }
+ return a.startDate > b.startDate ? 1 : -1
+ })
+
+ const end = new Date()
+ // * userId로 필터링 된 해당 년 월의 스케줄 정보
+ await delay({}, 1000 - (end.getTime() - start.getTime()))
+ if (userId && !keyword)
+ return {
+ schedule: schedule.filter((s) => s.userId == userId),
+ reservedList
+ }
+ return {
+ schedule,
+ reservedList
+ }
+ } catch (e) {
+ console.error(e)
+ return {
+ schedule: [],
+ reservedList: []
+ }
+ }
+}
diff --git a/src/api/schedule/user.ts b/src/api/schedule/user.ts
new file mode 100644
index 00000000..a109cf77
--- /dev/null
+++ b/src/api/schedule/user.ts
@@ -0,0 +1,28 @@
+import api from '@/api'
+import { AxiosError } from 'axios'
+
+export const addSchedule = async (adminId: string, selectDate: string, cookie: string) => {
+ try {
+ await api({
+ url: `/user/schedule/create?schedulerAdminId=${adminId}`,
+ method: 'POST',
+ headers: {
+ Authorization: cookie
+ },
+ data: {
+ scheduleStart: selectDate
+ }
+ })
+ return {
+ message: '일정이 추가되었습니다.',
+ status: 200
+ }
+ } catch (err) {
+ console.error(err)
+
+ return {
+ message: (err as AxiosError<{ data: string }>).response?.data?.data,
+ status: (err as AxiosError<{ data: string }>).response?.status
+ }
+ }
+}
diff --git a/src/api/user/edit.ts b/src/api/user/edit.ts
new file mode 100644
index 00000000..7fe167b2
--- /dev/null
+++ b/src/api/user/edit.ts
@@ -0,0 +1,107 @@
+import api from '@/api'
+
+export type UserProfileResponse = {
+ id: string
+ email: string
+ fullName: string
+ profileImage: string
+ role: 'USER'
+ sizeOfTicket: number
+ usedTicket: number
+}
+
+// 프로필 수정 페이지 조회 API 요청 함수
+export const getProfileUpdatePage = async (cookie: string): Promise => {
+ try {
+ const res = await api({
+ url: '/mypage/update',
+ method: 'GET',
+ headers: {
+ Authorization: cookie
+ }
+ })
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ console.error(error)
+ return null
+ }
+}
+
+// 프로필 이미지 등록/변경 API 요청 함수
+export const uploadProfileImage = async (
+ cookie: string,
+ imageFile: File
+): Promise => {
+ try {
+ const formData = new FormData()
+ formData.append('file', imageFile)
+
+ const res = await api({
+ url: '/mypage/update/image',
+ method: 'POST',
+ headers: {
+ Authorization: cookie
+ },
+ data: formData
+ })
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ console.error(error)
+ return null
+ }
+}
+
+// 프로필 이미지 삭제 API 요청 함수
+export const deleteProfileImage = async (cookie: string): Promise => {
+ try {
+ const res = await api({
+ url: '/mypage/delete/image',
+ method: 'POST',
+ headers: {
+ Authorization: cookie
+ }
+ })
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ console.error(error)
+ return null
+ }
+}
+
+// 사용자 정보 변경 API 요청 함수
+type RequestData = {
+ [key: string]: string | undefined
+}
+
+export const updateUserInformation = async (
+ cookie: string,
+ fullName: string | null,
+ password: string | null
+): Promise => {
+ try {
+ const requestData: RequestData = {}
+ if (fullName !== null) requestData['fullName'] = fullName
+ if (password !== null) requestData['password'] = password
+
+ const res = await api({
+ url: '/mypage/update',
+ method: 'POST',
+ headers: {
+ Authorization: cookie
+ },
+ data: requestData
+ })
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ console.error(error)
+ return null
+ }
+}
diff --git a/src/api/user/mypage.ts b/src/api/user/mypage.ts
new file mode 100644
index 00000000..79c52c7c
--- /dev/null
+++ b/src/api/user/mypage.ts
@@ -0,0 +1,35 @@
+import api from '@/api'
+
+export type SchedulerRoleUserList = {
+ scheduleStart: string
+ title: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+}
+export type TicketListResponse = {
+ getUserInfoDTO: {
+ id: number
+ email: string
+ fullName: string
+ profileImage: string
+ role: 'USER' | 'ADMIN'
+ sizeOfTicket: number
+ usedTicket: number
+ }
+ schedulerRoleUserList: SchedulerRoleUserList[]
+}
+export const getMyTicketList = async (cookie: string): Promise => {
+ try {
+ const res = await api({
+ url: '/mypage?role=USER',
+ method: 'GET',
+ headers: {
+ Authorization: cookie
+ }
+ })
+
+ if (res.data.data) return res.data.data
+ return null
+ } catch (error) {
+ return null
+ }
+}
diff --git a/src/assets/react.svg b/src/assets/react.svg
new file mode 100644
index 00000000..6c87de9b
--- /dev/null
+++ b/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/AdminActionBar.tsx b/src/components/AdminActionBar.tsx
new file mode 100644
index 00000000..6f68eb02
--- /dev/null
+++ b/src/components/AdminActionBar.tsx
@@ -0,0 +1,85 @@
+import React, { useEffect, useState } from 'react'
+import SidebarMenu from './sidebar/SidebarMenu'
+import { useLocation, useParams } from 'react-router-dom'
+import { BiCalendarAlt } from 'react-icons/bi'
+import { BiCalendarPlus } from 'react-icons/bi'
+import { BiSolidCommentCheck } from 'react-icons/bi'
+import { BiSolidUserRectangle } from 'react-icons/bi'
+import { DATE_ROUTE_FORMAT } from '@/constants'
+import dayjs from 'dayjs'
+
+export default function AdminActionBar() {
+ const location = useLocation()
+ const searchParams = new URLSearchParams(location.search)
+ const [activeId, setActiveId] = useState('')
+
+ const { year, month, day } = useParams()
+
+ let calendarPath =
+ year && month && day
+ ? `/calendar/${year}/${month}/${day}`
+ : `/calendar/${dayjs(new Date()).format(DATE_ROUTE_FORMAT)}`
+
+ searchParams.get('keyword') && (calendarPath += `?keyword=${searchParams.get('keyword')}`)
+
+ const sidebarMenu = [
+ {
+ title: '행사 일정 캘린더',
+ id: 'admin-sidebar-0',
+ Icon: BiCalendarAlt,
+ url: calendarPath
+ },
+ {
+ title: '행사 등록/수정',
+ id: 'admin-sidebar-1',
+ Icon: BiCalendarPlus,
+ url: '/manager/event' + calendarPath
+ },
+ {
+ title: '신청 승인/취소',
+ id: 'admin-sidebar-2',
+ Icon: BiSolidCommentCheck,
+ url: '/manager/approval'
+ },
+ {
+ title: '매니저 페이지',
+ id: 'admin-sidebar-3',
+ Icon: BiSolidUserRectangle,
+ url: '/manager/dashboard'
+ }
+ ]
+
+ useEffect(() => {
+ let idx = -1
+ if (location.pathname.includes('/calendar')) idx = 0
+ if (location.pathname.includes('/manager/event/calendar/')) idx = 1
+ if (location.pathname.includes('/manager/approval')) idx = 2
+ if (location.pathname.includes('/manager/dashboard')) idx = 3
+ setActiveId(() => (sidebarMenu[idx]?.id ? sidebarMenu[idx].id : ''))
+
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [location.pathname])
+
+ return (
+
+ {sidebarMenu.map((menu, idx) => {
+ if (!menu) return
+ return (
+
setActiveId(name)}
+ idx={idx}
+ url={menu.url}
+ >
+
+
+ {menu.title}
+
+
+ )
+ })}
+
+ )
+}
diff --git a/src/components/Banner.tsx b/src/components/Banner.tsx
new file mode 100644
index 00000000..840354f7
--- /dev/null
+++ b/src/components/Banner.tsx
@@ -0,0 +1,28 @@
+import React from 'react'
+
+type Props = {
+ src: string
+ alt: string
+ type: 'top' | 'side' | 'post'
+ className?: string
+}
+export default function Banner({ src, type = 'top', className, alt }: Props) {
+ let bannerStyle = ''
+ let imgStyle = ''
+ if (type === 'top') {
+ bannerStyle = 'w-full'
+ imgStyle = 'w-full aspect-auto object-cover'
+ } else if (type === 'side') {
+ bannerStyle = 'h-full'
+ imgStyle = 'flex h-full object-cover'
+ } else if (type === 'post') {
+ bannerStyle = 'w-full'
+ imgStyle = 'flex w-full object-cover'
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/src/components/BannerSwiper.tsx b/src/components/BannerSwiper.tsx
new file mode 100644
index 00000000..86ee0701
--- /dev/null
+++ b/src/components/BannerSwiper.tsx
@@ -0,0 +1,41 @@
+import React from 'react'
+import { Navigation, Pagination, Scrollbar, A11y, Autoplay, Parallax } from 'swiper/modules'
+import { Swiper, SwiperSlide } from 'swiper/react'
+import 'swiper/css'
+import 'swiper/css/navigation'
+import 'swiper/css/scrollbar'
+import 'swiper/css/a11y'
+
+export default function BannerSwiper() {
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
new file mode 100644
index 00000000..cf29a21a
--- /dev/null
+++ b/src/components/Footer.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+
+export default function Footer() {
+ return (
+
+
Footer
+ min-height가 100vh입니다.
+
+ Footer 개발시 한 화면에 Header Footer가 모두 보이도록 개발해주세요.
+
+
+ )
+}
diff --git a/src/components/FullProfile.tsx b/src/components/FullProfile.tsx
new file mode 100644
index 00000000..917a6af6
--- /dev/null
+++ b/src/components/FullProfile.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+
+type Props = {
+ src: string
+ name: string
+ email: string
+}
+export default function FullProfile({ src, name, email }: Props) {
+ return (
+
+
+
+
+
+
+
{name}
+
{email}
+
+
+ )
+}
diff --git a/src/components/Header.tsx b/src/components/Header.tsx
new file mode 100644
index 00000000..e12caba0
--- /dev/null
+++ b/src/components/Header.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+
+export default function Header() {
+ return (
+
+ Header
+
+ navigation
+
+
+ )
+}
diff --git a/src/components/SearchForm.tsx b/src/components/SearchForm.tsx
new file mode 100644
index 00000000..2e7f5f28
--- /dev/null
+++ b/src/components/SearchForm.tsx
@@ -0,0 +1,48 @@
+import React from 'react'
+import { BiSearchAlt2 } from 'react-icons/bi'
+import { useLocation } from 'react-router-dom'
+import { toast } from 'react-toastify'
+
+type Props = {
+ onSubmit: (value: string) => void
+}
+export default function SearchForm({ onSubmit }: Props) {
+ const location = useLocation()
+ const searchParams = new URLSearchParams(location.search)
+ const [value, setValue] = React.useState(searchParams.get('keyword') || '')
+ const searchToast = () =>
+ toast.info(`${value}(을)를 검색합니다`, {
+ position: 'top-center',
+ autoClose: 1500
+ })
+ return (
+
+ )
+}
diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx
new file mode 100644
index 00000000..ff2f8550
--- /dev/null
+++ b/src/components/SideBar.tsx
@@ -0,0 +1,45 @@
+import React from 'react'
+import useUser from '@/hooks/user'
+import AdminActionBar from '@/components/AdminActionBar'
+import UserActionBar from '@/components/UserActionBar'
+import Profile from '@/components/sidebar/Profile'
+import SearchForm from '@/components/SearchForm'
+import SideBarAd from './SideBarAd'
+import { Link, useLocation, useNavigate } from 'react-router-dom'
+import dayjs from 'dayjs'
+import { DATE_ROUTE_FORMAT } from '@/constants'
+
+export default function SideBar() {
+ const navigate = useNavigate()
+ const location = useLocation()
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+
+ const handleSubmit = (value: string) => {
+ navigate(`${location.pathname}?keyword=${value}`)
+ }
+
+ return (
+
+ )
+}
diff --git a/src/components/SideBarAd.tsx b/src/components/SideBarAd.tsx
new file mode 100644
index 00000000..ba077516
--- /dev/null
+++ b/src/components/SideBarAd.tsx
@@ -0,0 +1,17 @@
+import React from 'react'
+
+export default function SideBarAd() {
+ return (
+
+
+
+
+ 굳덕 티켓 신청
+
+
+
+ )
+}
diff --git a/src/components/UserActionBar.tsx b/src/components/UserActionBar.tsx
new file mode 100644
index 00000000..c262c7e5
--- /dev/null
+++ b/src/components/UserActionBar.tsx
@@ -0,0 +1,69 @@
+import React, { useEffect, useState } from 'react'
+import SidebarMenu from './sidebar/SidebarMenu'
+import { useLocation, useParams } from 'react-router-dom'
+import { BiCalendarCheck } from 'react-icons/bi'
+import { BiSolidUserRectangle } from 'react-icons/bi'
+import dayjs from 'dayjs'
+import { DATE_ROUTE_FORMAT } from '@/constants'
+
+export default function UserActionBar() {
+ const location = useLocation()
+ const searchParams = new URLSearchParams(location.search)
+ const [activeId, setActiveId] = useState('')
+ const { year, month, day } = useParams()
+ let calendarPath =
+ year && month && day
+ ? `/calendar/${year}/${month}/${day}`
+ : `/calendar/${dayjs(new Date()).format(DATE_ROUTE_FORMAT)}`
+
+ searchParams.get('keyword') && (calendarPath += `?keyword=${searchParams.get('keyword')}`)
+
+ const sidebarMenu = [
+ {
+ title: '행사 신청 캘린더',
+ id: 'user-sidebar-0',
+ Icon: BiCalendarCheck,
+ url: calendarPath
+ },
+ {
+ title: '마이 페이지',
+ id: 'user-sidebar-1',
+ Icon: BiSolidUserRectangle,
+ url: '/user/mypage'
+ }
+ ]
+
+ // params로 체크해서 sidebarMenu[0] 몇번째 인지 정하기
+
+ useEffect(() => {
+ let idx = -1
+ if (location.pathname.includes('calendar')) idx = 0
+ if (location.pathname.includes('user/mypage')) idx = 1
+ setActiveId(() => (sidebarMenu[idx]?.id ? sidebarMenu[idx].id : ''))
+
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [location.pathname])
+
+ return (
+
+ {sidebarMenu.map((menu, idx) => {
+ if (!menu) return
+ return (
+
setActiveId(name)}
+ idx={idx}
+ url={menu.url}
+ >
+
+
+ {menu.title}
+
+
+ )
+ })}
+
+ )
+}
diff --git a/src/components/approval/ApprovalList.tsx b/src/components/approval/ApprovalList.tsx
new file mode 100644
index 00000000..e8995e64
--- /dev/null
+++ b/src/components/approval/ApprovalList.tsx
@@ -0,0 +1,83 @@
+import React, { useEffect, useState } from 'react'
+import ApprovalListItem from './ApprovalListItem'
+import ApprovalPaging from './ApprovalPagination'
+import CheerUpLoading from '../ui/CheerUpLoading'
+import { implScheduleDtoType } from '@/api/admin/approvalPage'
+
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+export default function ApprovalList(props: any) {
+ // eslint-disable-next-line react/prop-types
+ const { data } = props
+
+ const [postPerPage] = useState(10) //한 페이지에 보여질 아이템 수
+ const [count, setCount] = useState(10) //아이템 총 개수
+ const [currentPage, setCurrentPage] = useState(1) //현재 페이지. 기본값 '1'
+ const [indexOfLastPost, setIndexOfLastPost] = useState(0) //현재 페이지의 마지막 아이템 인덱스
+ const [indexOfFirstPost, setIndexOfFirstPost] = useState(0) //현재 페이지의 첫번째 아이템 인덱스
+ const [currentPosts, setCurrentPosts] = useState([]) //현재 페이지에서 보여지는 아이템
+ const [approvalList, setApprovallist] = useState([]) //리스트에 나타낼 아이템
+ const [londing, setLoding] = useState(true)
+
+ useEffect(() => {
+ setLoding(true)
+ const fetchData = () => {
+ try {
+ setApprovallist(data)
+ setCount(data.length)
+ setLoding(false)
+ } catch (error) {
+ console.error('신청 승인/거절 영역 오류', error)
+ }
+ }
+ fetchData()
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
+
+ useEffect(() => {
+ setIndexOfLastPost(currentPage * postPerPage) // 현재 페이지와 한 페이지에 보여질 아이템 수를 곱하여 결과 값을 setIndexOfLastPost에 넘깁니다.
+ setIndexOfFirstPost(indexOfLastPost - postPerPage) // indexOfLastPost의 값과 한 페이지에 보여질 아이템 수를 뺀 결과를 setIndexOfFirstPost에 전달합니다.
+ setCurrentPosts(approvalList.slice(indexOfFirstPost, indexOfLastPost)) // approvalList 배열에서 현재 페이지의 첫번째와 마지막 인덱스까지의 값을 복사하여 setCurrentPosts에 전달합니다.
+ }, [currentPage, postPerPage, approvalList, indexOfLastPost, indexOfFirstPost]) // useEffect를 실행할 조건들을 배열에 명시합니다.
+
+ const setPage = (pageNumber: number) => {
+ setCurrentPage(pageNumber) // 페이지를 설정하는 함수입니다. ApprovalPaging 컴포넌트에서 호출됩니다.
+ }
+
+ return (
+
+ {londing && (
+
+
+ 데이터를 가져오고 있습니다!
+
+
+
+ )}
+
+
+
+ 행사명
+
+
행사 설명
+
신청자
+
신청일
+
+ 승인 여부
+
+
+
+
+
+ {currentPosts && currentPosts.length > 0 ? (
+ currentPosts.map((data) =>
)
+ ) : (
+
데이터가 없습니다.
+ )}
+
+
+
+ )
+}
diff --git a/src/components/approval/ApprovalListItem.tsx b/src/components/approval/ApprovalListItem.tsx
new file mode 100644
index 00000000..656c2414
--- /dev/null
+++ b/src/components/approval/ApprovalListItem.tsx
@@ -0,0 +1,125 @@
+import React from 'react'
+import { approveSchedule, cancelSchedule } from '../../api/admin/approvalPage'
+import { useCookies } from 'react-cookie' // react-cookie 라이브러리 임포트
+import { ACCESS_TOKEN } from '@/constants'
+import { toast } from 'react-toastify'
+
+interface ScheduleDtoType {
+ description: string
+ fullName?: string
+ title: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+ scheduleStart: string
+ userScheduleId: number
+}
+
+interface ApprovalListItemProps {
+ data: ScheduleDtoType
+}
+
+const ApprovalListItem: React.FC = ({ data }) => {
+ const [cookies] = useCookies([ACCESS_TOKEN]) // 쿠키 가져오기
+ const failToast = () => toast.error('요청을 실패하였습니다. 다시 시도해주세요.')
+ const cancelFailToast = () => toast.error('이미 승인된 일정은 취소할 수 없습니다.')
+
+ const handleApprove = async () => {
+ const result = await approveSchedule(data.userScheduleId, cookies[ACCESS_TOKEN])
+ if (result) {
+ window.location.replace('/manager/approval')
+ return // 페이지 재로딩
+ }
+ failToast() // 실패 알림 표시
+ }
+
+ const handleCancel = async () => {
+ const result = await cancelSchedule(data.userScheduleId, cookies[ACCESS_TOKEN])
+ if (result) {
+ window.location.replace('/manager/approval')
+ return // 페이지 재로딩
+ }
+ cancelFailToast()
+ }
+
+ const approval = {
+ accepted:
+ 'flex w-[calc(3vw+5px)] text-[calc(1vw-40%)] border text-point border-confirm rounded-lg justify-center text-sm font-bold text-white border-confirm bg-confirm',
+ refused:
+ 'flex w-[calc(3vw+5px)] text-[calc(1vw-40%)] border font-bold text-white border-point bg-point rounded-lg justify-center text-sm',
+ textState: 'flex text-[calc(1vw-5px)] text-base justify-center'
+ }
+
+ let buttonState
+ let titleState
+ let fullNameState
+ let scheduleStartState
+ let descriptionState
+
+ switch (data.progress) {
+ case 'ACCEPT':
+ buttonState = 승인완료
+ titleState = {data.title}
+ fullNameState = {data.fullName}
+ descriptionState = {data.description}
+ scheduleStartState = {data.scheduleStart.split('T')[0]}
+ break
+ case 'REFUSE':
+ buttonState = 거절완료
+ titleState = (
+ {data.title}
+ )
+ fullNameState = (
+
+ {data.fullName}
+
+ )
+ descriptionState = (
+
+ {data.description}
+
+ )
+ scheduleStartState = (
+
+ {data.scheduleStart.split('T')[0]}
+
+ )
+ break
+ case 'WAITING':
+ buttonState = (
+
+ handleApprove()}
+ >
+ 승인하기
+
+ handleCancel()}
+ >
+ 취소하기
+
+
+ )
+ titleState = {data.title}
+ fullNameState = {data.fullName}
+ descriptionState = {data.description}
+ scheduleStartState = {data.scheduleStart}
+ break
+ } //r
+
+ return (
+
+
{titleState}
+
{descriptionState}
+
{fullNameState}
+
+ {scheduleStartState}
+
+
{buttonState}
+
+ )
+}
+
+export default ApprovalListItem
diff --git a/src/components/approval/ApprovalPagination.tsx b/src/components/approval/ApprovalPagination.tsx
new file mode 100644
index 00000000..e862f74e
--- /dev/null
+++ b/src/components/approval/ApprovalPagination.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import Pagination from 'react-js-pagination';
+// import '@/components/approval/ApprovalPagination.scss'
+
+type SearchPagingProps = {
+ page: number,
+ count: number,
+ setPage: (page: number) => void,
+}
+
+const ApprovalPaging: React.FC = ({page, count, setPage}) => {
+
+ const arrowBtn = {
+ color: 'pb-[2px] cursor-pointer bg-main ml-2 mr-2 text-white justify-center items-center rounded-xl h-8 w-8 flex transition duration-200 hover:bg-hover'
+ }
+
+ return (
+
+
'} //다음 텍스트
+ lastPageText={''} //맨 마지막 이동 텍스트
+ firstPageText={''} //맨 앞으로 이동 텍스트
+ itemClassFirst={'FirstArrow'} //맨 앞으로 이동 텍스트 스타일 적용 클래스명
+ itemClassPrev={arrowBtn.color} //맨 이전 이동 텍스트 스타일 적용 클래스명
+ itemClassNext={arrowBtn.color} //맨 다음 이동 텍스트 스타일 적용 클래스명
+ itemClassLast={'ListArrow'} //맨 마지막 이동 텍스트 스타일 적용 클래스명
+ activeClass='text-main justify-center items-center rounded h-8 w-8 flex' //페이지 번호 텍스트 선택 상태 스타일 적용 클래스명
+ itemClass='justify-center items-center rounded h-8 w-8 flex' //번호 페이지 텍스트 스타일 적용 클래스명
+ onChange={setPage} //페이지가 바뀌면 핸들링 시켜줄 함수
+ />
+
+ );
+}
+
+export default ApprovalPaging;
diff --git a/src/components/approval/QuickState.tsx b/src/components/approval/QuickState.tsx
new file mode 100644
index 00000000..76ff2388
--- /dev/null
+++ b/src/components/approval/QuickState.tsx
@@ -0,0 +1,33 @@
+import React from 'react'
+
+type Props = {
+ state: {
+ accepted: number
+ refused: number
+ waiting: number
+ }
+}
+export default function QuickState({state}: Props) {
+ return (
+
+
+ 승인대기
+
+
총 {state.waiting ? state.waiting : 0 }명
+
+
+
+ 취소
+
+
총 {state.refused ? state.refused : 0 }명
+
+
+
+ 승인
+
+
총 {state.accepted ? state.accepted : 0 }명
+
+
+
+ )
+}
diff --git a/src/components/calendar/AddForm.tsx b/src/components/calendar/AddForm.tsx
new file mode 100644
index 00000000..1180217f
--- /dev/null
+++ b/src/components/calendar/AddForm.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import AddFormInformation from './AddFormInformation'
+
+export type ScheduleAddFormData = {
+ startDate: string
+ endDate: string
+ title: string
+ description: string
+ imageFile: File
+}
+
+type Props = {
+ date: string
+ onCancle: () => void
+ onSubmit: (schedule: ScheduleAddFormData) => void
+}
+export default function AddForm({ date, onCancle, onSubmit }: Props) {
+ return (
+
+ )
+}
diff --git a/src/components/calendar/AddFormInformation.tsx b/src/components/calendar/AddFormInformation.tsx
new file mode 100644
index 00000000..a66c9836
--- /dev/null
+++ b/src/components/calendar/AddFormInformation.tsx
@@ -0,0 +1,179 @@
+import React, { useState } from 'react'
+import Button from '@/components/ui/Button'
+import Banner from '@/components/Banner'
+import { ScheduleAddFormData } from '@/components/calendar/AddForm'
+import { toast } from 'react-toastify'
+
+type Props = {
+ date: string
+ onCancle: () => void
+ onSubmit: (schedule: ScheduleAddFormData) => void
+}
+
+export default function EditFormInformation({ date, onSubmit, onCancle }: Props) {
+ const [file, setFile] = useState()
+ const [imgSrc, setImgSrc] = useState('')
+ const [startDate, setStartDate] = useState(date)
+ const [endDate, setEndDate] = useState(date)
+ const [title, setTitle] = useState('')
+ const [description, setDescription] = useState('')
+ //이미지 미리보기
+ const handleChangeFile = (event: React.ChangeEvent) => {
+ const files = event.target.files
+ if (files && files.length > 0) {
+ const file = files[0]
+ const reader = new FileReader()
+ reader.onloadend = () => {
+ const base64 = reader.result
+ if (base64) {
+ const str = base64?.toString()
+ if (str && str.length > 1048576 * 10) {
+ toast.warn('이미지 크기는 10MB 이하여야 합니다.', {
+ position: 'top-center'
+ })
+ return
+ }
+ setFile(file)
+ setImgSrc(base64.toString())
+ }
+ }
+ reader.readAsDataURL(file)
+ }
+ }
+
+ const handleSubmit = () => {
+ if (!file) {
+ toast.warn('이미지를 업로드해주세요', {
+ position: 'top-center'
+ })
+ return
+ }
+ if (!startDate || !endDate || !title || !description) {
+ toast.warn('모든 정보를 입력해주세요', {
+ position: 'top-center'
+ })
+ return
+ }
+ const newSchedule = {
+ startDate,
+ endDate,
+ title,
+ description,
+ imageFile: file
+ }
+ onSubmit(newSchedule)
+ }
+
+ return (
+ <>
+
+ 행사 등록
+
+
+
+ 이미지
+
+
+
+ {imgSrc ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ 행사 시작일
+
+
+ {
+ setStartDate(e.target.value)
+ if (e.target.value > endDate) setEndDate(e.target.value)
+ }}
+ />
+
+
+
+
+ 행사 종료일
+
+
+ setEndDate(e.target.value)}
+ />
+
+
+
+
+ 행사명
+
+ setTitle(e.target.value)}
+ />
+
+
+
+ 행사 설명
+
+
+
+
+ onCancle()}
+ />
+
+ >
+ )
+}
diff --git a/src/components/calendar/CalendarAction.tsx b/src/components/calendar/CalendarAction.tsx
new file mode 100644
index 00000000..871b581d
--- /dev/null
+++ b/src/components/calendar/CalendarAction.tsx
@@ -0,0 +1,180 @@
+import React from 'react'
+import { ProviderScheduleWithPos } from '@/utils/calendar'
+import ReserveForm from '@/components/calendar/ReserveForm'
+import EditForm from '@/components/calendar/EditForm'
+import AddForm, { ScheduleAddFormData } from '@/components/calendar/AddForm'
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+import { useCookies } from 'react-cookie'
+import { addSchedule } from '@/api/schedule/user'
+import dayjs from 'dayjs'
+// import useUser from '@/hooks/user'
+import { ACCESS_TOKEN, DATE_REQEUST_FORMAT } from '@/constants'
+import api from '@/api'
+import { createSchedule } from '@/api/schedule/admin'
+import { toast } from 'react-toastify'
+
+type Props = {
+ type: 'add' | 'edit' | 'reserve'
+ user: 'admin' | 'fan'
+ schedule: ProviderScheduleWithPos
+ date: string
+ onCancle: () => void
+ onReserve: (message: string) => void
+ onEdit: (message: string) => void
+ onSubmit: (message: string) => void
+}
+
+export default function CalendarAction({
+ type,
+ user,
+ schedule,
+ date,
+ onEdit,
+ onCancle,
+ onReserve,
+ onSubmit
+}: Props) {
+ const [cookie] = useCookies([ACCESS_TOKEN])
+ const queryClient = useQueryClient()
+
+ // * Reserve Mutation
+ const reserveMutation = useMutation({
+ mutationFn: ({ adminId, selectDate }: { adminId: string; selectDate: string }) => {
+ return addSchedule(adminId, selectDate, cookie.AccessToken)
+ },
+ onSuccess: async () => {
+ queryClient.invalidateQueries(['schedule'])
+ },
+ onError: (error) => {
+ console.error(error)
+ }
+ })
+ const handleReserve = (schedule: ProviderScheduleWithPos, selectDate: string) => {
+ reserveMutation
+ .mutateAsync({
+ adminId: schedule.id,
+ selectDate: dayjs(selectDate).format(DATE_REQEUST_FORMAT)
+ })
+ .then((res) => {
+ // * 시간 관계상 에러 처리를 깔끔하게 하지 못했습니다 ㅠㅠ
+ if (!res.status || !res.message) {
+ toast.error('예약 실패')
+ return
+ }
+ if (res.status > 300) {
+ toast.error(res.message)
+ return
+ } else if (res.status > 200) {
+ toast.success(res.message)
+ return
+ }
+ onReserve(res.message)
+ })
+ .catch(() => {
+ // toast.error('예약 실패')
+ })
+ }
+
+ // * Edit Mutation
+ const editMutation = useMutation({
+ mutationFn: ({ id, formData, token }: { id: string; formData: FormData; token: string }) => {
+ return api(`/admin/schedule/update/${id}`, {
+ method: 'POST',
+ data: formData,
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ Authorization: token
+ }
+ })
+ },
+ onSuccess: async () => {
+ queryClient.invalidateQueries(['schedule'])
+ },
+ onError: (error) => {
+ console.error(error)
+ }
+ })
+ const handleEdit = (
+ schedule: ProviderScheduleWithPos & {
+ imgFile?: File
+ }
+ ) => {
+ const formData = new FormData()
+ if (schedule.imgFile) formData.append('file', schedule.imgFile as Blob)
+ formData.append(
+ 'dto',
+ new Blob(
+ [
+ JSON.stringify({
+ title: schedule.title,
+ scheduleStart: dayjs(schedule.startDate).format(DATE_REQEUST_FORMAT),
+ scheduleEnd: dayjs(schedule.endDate).format(DATE_REQEUST_FORMAT),
+ description: schedule.description
+ })
+ ],
+ {
+ type: 'application/json'
+ }
+ )
+ )
+ editMutation
+ .mutateAsync({
+ id: schedule.id,
+ formData,
+ token: cookie.AccessToken
+ })
+ .then(() => {
+ onEdit('수정되었습니다.')
+ })
+ .catch(() => {
+ onEdit('수정에 실패했습니다.')
+ })
+ }
+
+ // * Add(Submit) Mutation
+ const addMutation = useMutation({
+ mutationFn: ({ schedule, token }: { schedule: ScheduleAddFormData; token: string }) => {
+ return createSchedule(schedule, token)
+ },
+ onSuccess: async () => {
+ queryClient.invalidateQueries(['schedule'])
+ },
+ onError: (error) => {
+ console.error(error)
+ }
+ })
+ const handleSubmit = (schedule: ScheduleAddFormData) => {
+ addMutation
+ .mutateAsync({
+ schedule,
+ token: cookie.AccessToken
+ })
+ .then((isReflected) => {
+ if (isReflected) {
+ onSubmit('행사가 추가되었습니다.')
+ } else onSubmit('행사 추가에 실패했습니다.')
+ })
+ .catch(() => {
+ onSubmit('행사 추가에 실패했습니다.')
+ })
+ }
+
+ return (
+ <>
+ {type === 'add' && user == 'admin' && (
+
+ )}
+ {type === 'edit' && user == 'admin' && (
+
+ )}
+ {type === 'reserve' && (
+
+ )}
+ >
+ )
+}
diff --git a/src/components/calendar/CalendarFrame.tsx b/src/components/calendar/CalendarFrame.tsx
new file mode 100644
index 00000000..a037af7b
--- /dev/null
+++ b/src/components/calendar/CalendarFrame.tsx
@@ -0,0 +1,25 @@
+import React from 'react'
+import useSchedule from '@/hooks/schedule'
+import MonthlyCalendar from '@/components/calendar/MonthlyCalendar'
+import CalendarSwiper from '@/components/calendar/CalendarSwiper'
+import CheerUpLoading from '@/components/ui/CheerUpLoading'
+
+export default function CalendarFrame() {
+ const { isFetching, isLoading } = useSchedule()
+
+ return (
+ <>
+
+ {(isFetching || isLoading) && (
+
+
+ 낭만있는 덕후 생활
+
+
+ {/*
*/}
+
+ )}
+
+ >
+ )
+}
diff --git a/src/components/calendar/CalendarModal.tsx b/src/components/calendar/CalendarModal.tsx
new file mode 100644
index 00000000..942affaa
--- /dev/null
+++ b/src/components/calendar/CalendarModal.tsx
@@ -0,0 +1,41 @@
+import React, { useEffect, useState } from 'react'
+import { CgClose } from 'react-icons/cg'
+
+type Props = {
+ children?: React.ReactNode
+
+ onClose: () => void
+}
+export default function CalendarModal({ onClose, children }: Props) {
+ const [isOpen, setIsOpen] = useState(false)
+ useEffect(() => {
+ setTimeout(() => setIsOpen(true), 200)
+ }, [])
+ return (
+ {
+ if (event.target === event.currentTarget) onClose()
+ }}
+ >
+
+
+ {children}
+
onClose()}>
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/calendar/CalendarSwiper.tsx b/src/components/calendar/CalendarSwiper.tsx
new file mode 100644
index 00000000..4bd66313
--- /dev/null
+++ b/src/components/calendar/CalendarSwiper.tsx
@@ -0,0 +1,111 @@
+import React, { useCallback } from 'react'
+import { useLocation, useNavigate } from 'react-router-dom'
+import dayjs from 'dayjs'
+
+import useSchedule from '@/hooks/schedule'
+import { appendSwipeAnimation, swipeCalendar } from '@/utils/calendar'
+import { ACCESS_TOKEN, CALENDAR_TAG_ID, DATE_ROUTE_FORMAT } from '@/constants'
+
+import Button from '@/components/ui/Button'
+import HighlightInformation from '@/components/calendar/HighlightInformation'
+import ArrowButton, { DirectionType } from '@/components/ui/ArrowButton'
+import useUser from '@/hooks/user'
+import { toast } from 'react-toastify'
+import { useCookies } from 'react-cookie'
+
+export default function CalendarSwiper() {
+ const [cookie] = useCookies([ACCESS_TOKEN])
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+ const location = useLocation()
+ const { isFetching } = useSchedule()
+ const { year, month } = useSchedule()
+ const navigate = useNavigate()
+
+ // * 이전/다음 달로 이동합니다.
+ const handleArrowBtn = useCallback(
+ (direction: DirectionType) => {
+ if (!year || !month) return toast.error('비정상적인 접근입니다.')
+ const route = location.pathname.split(`/${year}`)[0]
+ const path = swipeCalendar(direction, {
+ year,
+ month,
+ path: route
+ })
+ const searchParams = new URLSearchParams(location.search)
+ navigate(
+ `${path}${searchParams.get('keyword') ? `?keyword=${searchParams.get('keyword')}` : ''}`
+ )
+ appendSwipeAnimation(CALENDAR_TAG_ID, direction)
+ },
+ [navigate, year, month, location.pathname, location.search]
+ )
+
+ // * 오늘로 이동합니다.
+ const navagateToCurrentDate = useCallback(() => {
+ const date = new Date()
+ const path = `/calendar/${dayjs(date).format(DATE_ROUTE_FORMAT)}`
+ navigate(path)
+ }, [navigate])
+
+ const handleDownloadExcel = async () => {
+ const xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = function () {
+ if (this.readyState == 4 && this.status === 200) {
+ const blob = new Blob([this.response], {
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+ })
+ const link = document.createElement('a')
+ link.href = window.URL.createObjectURL(blob)
+ link.download = 'schedule.xlsx'
+ link.click()
+ }
+ }
+ xhr.open(
+ 'GET',
+ 'http://minischeduler-env.eba-m9yfe83y.ap-northeast-2.elasticbeanstalk.com/admin/schedule/excelDownload'
+ )
+ xhr.responseType = 'blob'
+ xhr.setRequestHeader('Authorization', cookie[ACCESS_TOKEN])
+ xhr.send()
+ xhr.onerror = function () {
+ toast.error('다운로드에 실패했습니다. \n 잠시 후 다시 시도해주세요.')
+ }
+ xhr.onloadend = function () {
+ toast.success('다운로드가 완료되었습니다.')
+ }
+ }
+
+ // todo max width를 캘린더와 동일하게 맞추기
+ return (
+
+
+ {user.role === 'USER' && }
+
+
+
+
+
+ {year} 년
+
+
+ {month} 월
+
+
+
+
+
+
+ {/* */}
+ {user.role === 'ADMIN' && (
+
+ )}
+
+
+ )
+}
diff --git a/src/components/calendar/Daily.tsx b/src/components/calendar/Daily.tsx
new file mode 100644
index 00000000..87079885
--- /dev/null
+++ b/src/components/calendar/Daily.tsx
@@ -0,0 +1,230 @@
+import React, { useState, useEffect, useCallback } from 'react'
+import { useLocation } from 'react-router-dom'
+import dayjs from 'dayjs'
+import useSchedule from '@/hooks/schedule'
+import useResize from '@/hooks/resize'
+import useUser from '@/hooks/user'
+import useHover from '@/hooks/hover'
+import { ProviderScheduleWithPos, getProviderSchdule } from '@/utils/calendar'
+import DailySchedule from '@/components/calendar/DailySchedule'
+import MoreButton from '@/components/calendar/MoreButton'
+import CalendarModal from '@/components/calendar/CalendarModal'
+import DailyDetail from '@/components/calendar/DailyDetail'
+import ModalPortal from '@/components/ui/ModalPortal'
+import CalendarAction from '@/components/calendar/CalendarAction'
+import { DATE_FORMAT } from '@/constants'
+import { toast } from 'react-toastify'
+
+type Props = {
+ daily: string[]
+}
+export default function Daily({ daily }: Props) {
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+ const [isAdmin] = useState(user.role === 'ADMIN' ? true : false)
+ const { pathname } = useLocation()
+ // * 모달 관련 속성
+ const [openPortal, setOpenPortal] = useState(false)
+ const [portalType, setPortalType] = useState<'edit' | 'reserve' | 'add'>('reserve')
+ const [openMoreModal, setOpenMoreModal] = useState(false)
+ const [targetSchedule, setTargetSchedule] = useState({} as ProviderScheduleWithPos)
+ const [targetDate, setTargetDate] = useState('')
+ // * 스타일링 관련 속성
+ const { width, resize, setWidth } = useResize('.cell')
+
+ // * 행사 등록/수정 페이지 + 어드민일 경우 자신이 등록한 스케줄만 가져옵니다.
+ const adminId = isAdmin && pathname.includes('manager/event/calendar') ? user.id : ''
+ const { month, adminSchedule, reservedList, isFetching } = useSchedule()
+ // * 어드민이고 매니저 페이지일 경우 마우스 호버 이벤트를 추가합니다.
+ useHover(adminId && adminSchedule?.length !== 0 ? true : false)
+
+ const today = dayjs(new Date()).format(DATE_FORMAT)
+
+ // * 더보기 버튼 클릭시 모달창을 띄웁니다.
+ const handleViewMore = useCallback((date: string) => {
+ if (!document.getElementById(`monthly-${date}`)) return
+ setTargetDate(date)
+ setOpenMoreModal(true)
+ }, [])
+
+ // * /manager 페이지라면 수정 모달을 띄우고, /calendar 페이지라면 예약 모달을 띄웁니다.
+ const handleSchedule = useCallback(
+ (schedule: ProviderScheduleWithPos) => {
+ setOpenMoreModal(false)
+ setTargetSchedule(schedule)
+ setPortalType(() => {
+ if (pathname.includes('manager/event/calendar') && user.id === schedule.userId) {
+ return 'edit'
+ }
+ return 'reserve'
+ })
+ setOpenPortal(true)
+ },
+ [pathname, user.id]
+ )
+
+ // * 더보기 모달창을 닫습니다.
+ const setCloseMoreModal = useCallback(() => {
+ setOpenMoreModal(false)
+ setTargetDate('')
+ }, [])
+
+ // * 모달창을 닫습니다.
+ const setClosePortal = useCallback(() => {
+ setOpenPortal(false)
+ }, [])
+
+ // * 수정 모달에서 수정 버튼을 누르면 실행됩니다.
+ const handleEdit = (message: string) => {
+ toast(message, {
+ position: 'top-center'
+ })
+ setOpenPortal(false)
+ }
+
+ const handleReserve = (message: string) => {
+ toast(message, {
+ position: 'top-center'
+ })
+ setOpenPortal(false)
+ }
+
+ // * 공연 추가 모달에서 새로운 공연을 추가하면 실행됩니다.
+ const handleSubmitSchedule = (message: string) => {
+ toast(message, {
+ position: 'top-center'
+ })
+ setOpenPortal(false)
+ }
+
+ const handleOnClickCell = (e: React.MouseEvent, date: string) => {
+ if (!pathname.includes('manager/event/calendar') || !isAdmin) return
+ if ((e.target as HTMLElement).classList.contains('moreBtn')) return
+ // * 클릭한 부분이 cell의 스케줄 부분이라면 공연 수정, cell이라면 return합니다. (handleSchedule에서 처리)
+ if ((e.target as HTMLElement).classList.contains('schedule-cell')) return
+ setPortalType('add')
+ setTargetDate(date)
+ setOpenPortal(true)
+ }
+
+ // * 스케줄이 변경되면 width를 다시 계산합니다.
+ // todo : isFetching이 최선인가?
+ useEffect(() => {
+ setWidth(() => 20)
+ // prettier-ignore
+ if (!isFetching) {setTimeout(() => { resize()}, 100) }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [isFetching])
+
+ const reserveStyle = {
+ WAITING: {
+ from: 'from-wait',
+ bg: 'bg-wait'
+ },
+ ACCEPT: {
+ from: 'from-confirm',
+ bg: 'bg-confirm'
+ },
+ REFUSE: {
+ from: 'from-point',
+ bg: 'bg-point'
+ }
+ }
+
+ const hoverEvent = adminId ? 'hover:bg-[#6344ff2a] hover:cursor-pointer' : ''
+ return (
+ <>
+ {daily?.map((date, i) => {
+ const disable = dayjs(date).month() + 1 !== Number(month) ? true : false
+ const providerSchedule = getProviderSchdule(adminSchedule, date)
+ const reservedSchedule = reservedList?.filter((r) => r.reservedDate === date)
+ const isToday = today === dayjs(date).format(DATE_FORMAT)
+ let textColor = isToday ? 'text-point' : 'text-main'
+ if (disable) textColor += ' opacity-20'
+ return (
+ handleOnClickCell(e, date)}
+ >
+ {/*
*/}
+
+
+ {dayjs(date).date() / 10 < 1 ? '0' + dayjs(date).date() : dayjs(date).date()}{' '}
+
+ {providerSchedule?.map((s, j) => {
+ if (disable || j > 1) return null
+ return (
+
+ )
+ })}
+ {reservedSchedule?.map((r, i) => {
+ r.progress === 'REFUSE'
+ return (
+ <>
+
+
+ >
+ )
+ })}
+ {providerSchedule.length > 2 && (
+
+
+
+ )}
+
+
+ )
+ })}
+ {openMoreModal && (
+
+
+
+ )}
+ {openPortal && (
+
+
+
+
+
+ )}
+ >
+ )
+}
+
+function getBgStyle(date: string) {
+ let bgStyle = 'bg-blue-50'
+ if (dayjs(date).format('ddd') === '일' || dayjs(date).format('ddd') === '토') {
+ bgStyle = 'bg-blue-100'
+ }
+ bgStyle
+ return bgStyle
+}
diff --git a/src/components/calendar/DailyDetail.tsx b/src/components/calendar/DailyDetail.tsx
new file mode 100644
index 00000000..7cbb5952
--- /dev/null
+++ b/src/components/calendar/DailyDetail.tsx
@@ -0,0 +1,82 @@
+import React, { useState, useEffect } from 'react'
+import useSchedule from '@/hooks/schedule'
+import { ProviderScheduleWithPos, getProviderSchdule } from '@/utils/calendar'
+import DailySchedule from '@/components/calendar/DailySchedule'
+import Banner from '@/components/Banner'
+import CheerUpLoading from '@/components/ui/CheerUpLoading'
+
+type Props = {
+ date: string
+ onClick: (schedule: ProviderScheduleWithPos) => void
+}
+export default function DailyDetail({ date, onClick }: Props) {
+ const { adminSchedule, reservedList, isFetching } = useSchedule()
+ const [scheduleWithPos, setScheduleWithPos] = useState([])
+
+ useEffect(() => {
+ const filteredSchedule = getProviderSchdule(adminSchedule, date).map((s) => {
+ s.pos = 'start'
+ return s
+ })
+ setScheduleWithPos(filteredSchedule)
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [adminSchedule, isFetching])
+
+ return (
+
+
+
+
+ {date}
+
+ 행사 리스트
+
+
+ {/* 임시 로당 바 */}
+ {isFetching && scheduleWithPos.length === 0 && (
+
+
+ 데이터를 가져오고 있습니다!
+
+
+
+
+
+ )}
+ {isFetching && scheduleWithPos.length > 0 && (
+
추가된 데이터 확인 중...
+ )}
+
+ {scheduleWithPos?.map((s) => {
+ return (
+
+
+ {s.title}
+
+ ({s.startDate} ~ {s.endDate})
+
+
+
+
+
+
+ )
+ })}
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/calendar/DailySchedule.tsx b/src/components/calendar/DailySchedule.tsx
new file mode 100644
index 00000000..73f47b41
--- /dev/null
+++ b/src/components/calendar/DailySchedule.tsx
@@ -0,0 +1,76 @@
+import React from 'react'
+import dayjs from 'dayjs'
+import type { ProviderScheduleWithPos } from '@/utils/calendar'
+import { ProviderReservedList } from '@/models/schedule'
+
+type Props = {
+ schedule: ProviderScheduleWithPos
+ reservedList: ProviderReservedList[] | undefined
+ cellWidth: number
+ date: string
+ skip?: boolean
+ onClickSchedule: (schedule: ProviderScheduleWithPos) => void
+}
+
+export default function DailySchedule({
+ schedule,
+ cellWidth: cellWidth,
+ onClickSchedule,
+ reservedList,
+ date
+}: Props) {
+ const startDate = dayjs(date).day() === 0 ? date : schedule.startDate
+ let cells = Math.min(dayjs(schedule.endDate).diff(dayjs(startDate), 'day') + 1, 8)
+ if (schedule.pos === 'start-end') cells = 1
+
+ const bgByProgress = {
+ WAITING: 'bg-wait hover:bg-[#d9960f]',
+ ACCEPT: 'bg-confirm hover:bg-[#5cbbd7]',
+ REFUSE: 'bg-point hover:bg-[#f43f5e]'
+ }
+ let bgStyle = 'bg-main hover:bg-[#4619a5]'
+ if (typeof reservedList !== 'undefined') {
+ reservedList.forEach((r) => {
+ if (r.scheduleId === schedule.id) {
+ bgStyle = bgByProgress[r.progress]
+ }
+ })
+ }
+
+ return (
+
+ {schedule.pos.includes('start') ? (
+ <>
+
{schedule.title}
+
{
+ onClickSchedule(schedule)
+ }}
+ >
+
+
+ {schedule.title}
+
+
+ >
+ ) : (
+
{schedule.title}
+ )}
+
+ )
+}
diff --git a/src/components/calendar/EditForm.tsx b/src/components/calendar/EditForm.tsx
new file mode 100644
index 00000000..fe36ad04
--- /dev/null
+++ b/src/components/calendar/EditForm.tsx
@@ -0,0 +1,23 @@
+import React from 'react'
+import { ProviderScheduleWithPos } from '@/utils/calendar'
+import EditFormInformation from './EditFormInformation'
+
+type Props = {
+ schedule: ProviderScheduleWithPos
+ onCancle: () => void
+ onEdit: (
+ schedule: ProviderScheduleWithPos & {
+ imgFile?: File
+ }
+ ) => void
+}
+
+export default function EditForm({ schedule, onCancle, onEdit }: Props) {
+ return (
+
+ )
+}
diff --git a/src/components/calendar/EditFormInformation.tsx b/src/components/calendar/EditFormInformation.tsx
new file mode 100644
index 00000000..97f2cacf
--- /dev/null
+++ b/src/components/calendar/EditFormInformation.tsx
@@ -0,0 +1,172 @@
+import { ProviderScheduleWithPos } from '@/utils/calendar'
+import React, { useState } from 'react'
+import Banner from '@/components/Banner'
+import dayjs from 'dayjs'
+import { DATE_FORMAT } from '@/constants'
+import Button from '@/components/ui/Button'
+import useUser from '@/hooks/user'
+import { toast } from 'react-toastify'
+
+type Props = {
+ schedule: ProviderScheduleWithPos
+ onCancle: () => void
+ onEdit: (
+ schedule: ProviderScheduleWithPos & {
+ imgFile?: File
+ }
+ ) => unknown
+}
+
+export default function EditFormInformation({ schedule, onEdit, onCancle }: Props) {
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+ const [imgSrc, setImgSrc] = useState('')
+ const [imgFile, setImgFile] = useState()
+ const date = dayjs(new Date()).format(DATE_FORMAT)
+ const [startDate, setStartDate] = useState(schedule.startDate)
+ const [endDate, setEndDate] = useState(schedule.endDate)
+ const [title, setTitle] = useState(schedule.title)
+ const [description, setDescription] = useState(schedule.description)
+ //이미지 미리보기
+ const handleChangeFile = (event: React.ChangeEvent) => {
+ const files = event.target.files
+ if (files && files.length > 0) {
+ const reader = new FileReader()
+ reader.onloadend = () => {
+ const base64 = reader.result
+ if (base64) {
+ const str = base64?.toString()
+ if (str && str.length > 1048576 * 10) {
+ toast.warn('이미지는 10MB이하여야합니다.')
+ return
+ }
+ setImgFile(files[0])
+ setImgSrc(base64.toString())
+ }
+ }
+ reader.readAsDataURL(files[0])
+ }
+ }
+
+ const handleSubmit = () => {
+ const newSchedule = {
+ ...schedule,
+ startDate: startDate ? startDate : schedule.startDate,
+ endDate: endDate ? endDate : schedule.endDate,
+ title,
+ description,
+ imgFile
+ }
+ onEdit(newSchedule)
+ }
+
+ return (
+ <>
+
+ 행사 수정
+
+
+
+ 이미지
+
+
+
+ {imgFile ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ 행사 날짜
+
+
+ {schedule.startDate} ~ {schedule.endDate}
+
+
+
+
+ 행사 시작일
+
+
+ {
+ setStartDate(e.target.value)
+ if (e.target.value > endDate) setEndDate(e.target.value)
+ }}
+ />
+
+
+
+
+ 행사 종료일
+
+
+ setEndDate(e.target.value)}
+ />
+
+
+
+
+ 행사명
+
+ setTitle(e.target.value)}
+ />
+
+
+
+ 행사 설명
+
+
+
+
+ onCancle()}
+ />
+
+ >
+ )
+}
diff --git a/src/components/calendar/HighlightInformation.tsx b/src/components/calendar/HighlightInformation.tsx
new file mode 100644
index 00000000..900cae91
--- /dev/null
+++ b/src/components/calendar/HighlightInformation.tsx
@@ -0,0 +1,24 @@
+import React from 'react'
+
+export default function HighlightInformation() {
+ return (
+
+ )
+}
diff --git a/src/components/calendar/MonthlyCalendar.tsx b/src/components/calendar/MonthlyCalendar.tsx
new file mode 100644
index 00000000..e1591b36
--- /dev/null
+++ b/src/components/calendar/MonthlyCalendar.tsx
@@ -0,0 +1,44 @@
+import React from 'react'
+import { CALENDAR_TAG_ID } from '@/constants'
+import useSchedule from '@/hooks/schedule'
+import Weeks from '@/components/calendar/Weeks'
+import Daily from '@/components/calendar/Daily'
+import { caculateDailyIdx } from '@/utils/calendar'
+import { useLocation, useNavigate } from 'react-router-dom'
+
+export default function MonthlyCalendar() {
+ const location = useLocation()
+ const navigate = useNavigate()
+ const { year, month, isSuccess } = useSchedule()
+ const dailyIdx = caculateDailyIdx(year, month)
+ const searchParams = new URLSearchParams(location.search)
+ const keyword = searchParams.get('keyword')
+
+ return (
+ <>
+ {keyword && (
+
+
navigate(location.pathname)}
+ className='bg-point font-gmarket cursor-pointer text-[14px] font-bold rounded-[20px] pl-3 pr-3 pt-[2px] pb-[1px] transition text-white hover:bg-wait'
+ >현재 검색 결과 삭제
+
: {keyword}
+
+ )}
+
+
+ {isSuccess ? (
+
+ ) : (
+ dailyIdx.map((d, i) => (
+
+ ))
+ )}
+
+ >
+ )
+}
diff --git a/src/components/calendar/MoreButton.tsx b/src/components/calendar/MoreButton.tsx
new file mode 100644
index 00000000..a5fada92
--- /dev/null
+++ b/src/components/calendar/MoreButton.tsx
@@ -0,0 +1,20 @@
+import React from 'react'
+
+type Props = {
+ date: string
+ restItem: number
+ onClick?: (id: string) => void
+}
+export default function MoreButton({ date, restItem, onClick }: Props) {
+ return (
+ onClick && onClick(date)}
+ >
+ {`+ MORE ${restItem}`}
+ {/*
*/}
+
+ )
+}
diff --git a/src/components/calendar/ReserveForm.tsx b/src/components/calendar/ReserveForm.tsx
new file mode 100644
index 00000000..1d9aa209
--- /dev/null
+++ b/src/components/calendar/ReserveForm.tsx
@@ -0,0 +1,67 @@
+import React, { useState } from 'react'
+import { ProviderScheduleWithPos } from '@/utils/calendar'
+// import Banner from '@/components/Banner'
+import ReserveFormInfomation from '@/components/calendar/ReserveFormInfomation'
+import Button from '@/components/ui/Button'
+import { toast } from 'react-toastify'
+// import { MdDiversity1 } from 'react-icons/md'
+
+type Props = {
+ schedule: ProviderScheduleWithPos
+ user: 'admin' | 'fan'
+ onCancle: () => void
+ onReserve: (schedule: ProviderScheduleWithPos, selectedDate: string) => void
+}
+
+export default function ReserveForm({ schedule, onCancle, onReserve, user }: Props) {
+ const [selectedDate, setSelectedDate] = useState('')
+ return (
+
+
+
+ 행사 신청
+
+
+
+ {schedule.image ? (
+
+ ) : (
+
+ )}
+
+
+
+ setSelectedDate(date)}
+ />
+
+
+ {user === 'fan' ? (
+ <>
+
{
+ if (!selectedDate) return toast.error('날짜를 선택해주세요.')
+ onReserve(schedule, selectedDate)
+ }}
+ />
+ onCancle()}
+ />
+ >
+ ) : (
+ 매니저는 예약할 수 없습니다!
+ )}
+
+
+
+ )
+}
diff --git a/src/components/calendar/ReserveFormInfomation.tsx b/src/components/calendar/ReserveFormInfomation.tsx
new file mode 100644
index 00000000..ccbfafd8
--- /dev/null
+++ b/src/components/calendar/ReserveFormInfomation.tsx
@@ -0,0 +1,57 @@
+import { DATE_FORMAT } from '@/constants'
+import { ProviderScheduleWithPos } from '@/utils/calendar'
+import { BiCalendarX } from 'react-icons/bi'
+import dayjs from 'dayjs'
+import React from 'react'
+
+type Props = {
+ schedule: ProviderScheduleWithPos
+ onChageDate: (date: string) => void
+}
+
+export default function ReserveFormInfomation({ schedule, onChageDate }: Props) {
+ const date = new Date()
+
+ const itemStyle = 'flex justify-between items-center pb-8'
+ return (
+
+
+ {'행사명'}
+ {schedule.title}
+
+
+ {'행사 날짜'}
+
+ {schedule.startDate} ~ {schedule.endDate}
+
+
+
+ {'공연 선택'}
+
+ {schedule.startDate < dayjs(date).format(DATE_FORMAT) ? (
+
+
+ {schedule.endDate > dayjs(date).format(DATE_FORMAT)
+ ? '진행 중인 행사입니다!'
+ : 이미 끝난 행사입니다!
}
+
+
+
+ ) : (
+ onChageDate(e.target.value)}
+ />
+ )}
+
+
+
+ {'행사 설명'}
+ {schedule.description}
+
+
+ )
+}
diff --git a/src/components/calendar/Weeks.tsx b/src/components/calendar/Weeks.tsx
new file mode 100644
index 00000000..6fe55a84
--- /dev/null
+++ b/src/components/calendar/Weeks.tsx
@@ -0,0 +1,13 @@
+import React, { useMemo } from 'react'
+
+export default function Weeks() {
+ const weeks = useMemo(() => ['일', '월', '화', '수', '목', '금', '토'], [])
+
+ return weeks.map((week) => {
+ return (
+
+ {week + '요일'}
+
+ )
+ })
+}
diff --git a/src/components/dashboard/AddEventList.tsx b/src/components/dashboard/AddEventList.tsx
new file mode 100644
index 00000000..f0461bd8
--- /dev/null
+++ b/src/components/dashboard/AddEventList.tsx
@@ -0,0 +1,46 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+import React from 'react'
+import AddEventListItem from './AddEventListItem'
+import { ApprovalListResponse } from '@/api/admin/adminPage'
+import { Link } from 'react-router-dom'
+import dayjs from 'dayjs'
+import { DATE_ROUTE_FORMAT } from '@/constants'
+
+type Props = {
+ data: ApprovalListResponse
+}
+
+export default function AddEventList(props: Props) {
+ const { data } = props
+ const datetime = new Date()
+
+ return (
+
+
등록한 행사 리스트
+
+
+
+ 행사명
+
+
행사 설명
+
행사일
+
+
+
+
+ {data.schedulerRoleAdminList?.map((schedule: any, index: any) => (
+
+ ))}
+
+
+
+
행사 등록하기
+
+
+
신청자 승인/취소 관리
+
+
+
+
+ )
+}
diff --git a/src/components/dashboard/AddEventListItem.tsx b/src/components/dashboard/AddEventListItem.tsx
new file mode 100644
index 00000000..b991a86e
--- /dev/null
+++ b/src/components/dashboard/AddEventListItem.tsx
@@ -0,0 +1,25 @@
+import { ScheduleDtoType } from '@/api/admin/adminPage'
+import React from 'react'
+
+type Props = {
+ data: ScheduleDtoType
+}
+
+export default function AddEventListItem({ data }: Props) {
+
+ return (
+
+
+
+ {data.title}
+
+
+ {data.description.substring(0, 20) + '...'}
+
+
+ {data.scheduleStart.split('T')[0]}
+
+
+
+ )
+}
diff --git a/src/components/dashboard/EventStatusCard.tsx b/src/components/dashboard/EventStatusCard.tsx
new file mode 100644
index 00000000..2a23941f
--- /dev/null
+++ b/src/components/dashboard/EventStatusCard.tsx
@@ -0,0 +1,58 @@
+import React from 'react'
+import { TbCalendarUp, TbFaceId, TbCircleCheckFilled, TbCircleXFilled } from 'react-icons/tb'
+
+type Props = {
+ waiting: string
+ accepted: string
+ refused: string
+ events: string
+}
+
+export default function EventStatusCard({ waiting, accepted, refused, events }: Props) {
+ return (
+
+
행사현황
+
+
+
+
+
+
등록 행사
+
+ {events ? events : 0}
개
+
+
+
+
+
+
+
승인 대기
+
+ {waiting ? waiting : 0}
+
개
+
+
+
+
+
+
+
승인
+
+ {accepted ? accepted : 0}
+
개
+
+
+
+
+
+
+
취소
+
+ {refused ? refused : 0}
+
개
+
+
+
+
+ )
+}
diff --git a/src/components/layouts/CalendarLayout.tsx b/src/components/layouts/CalendarLayout.tsx
new file mode 100644
index 00000000..6e967887
--- /dev/null
+++ b/src/components/layouts/CalendarLayout.tsx
@@ -0,0 +1,18 @@
+import React, { useEffect } from 'react'
+import useUser from '@/hooks/user'
+import { Outlet, useNavigate } from 'react-router-dom'
+
+export default function CalendarLayout() {
+ const navigate = useNavigate()
+ const { loggedIn, loading } = useUser()
+ useEffect(() => {
+ if (!loggedIn && !loading) navigate('/login')
+ }, [loggedIn, navigate, loading])
+
+ return (
+
+ {loggedIn && !loading && }
+
+
+ )
+}
diff --git a/src/components/layouts/MainLayout.tsx b/src/components/layouts/MainLayout.tsx
new file mode 100644
index 00000000..97f399eb
--- /dev/null
+++ b/src/components/layouts/MainLayout.tsx
@@ -0,0 +1,43 @@
+import { DATE_ROUTE_FORMAT } from '@/constants'
+import useUser from '@/hooks/user'
+import dayjs from 'dayjs'
+import React, { useEffect } from 'react'
+import { Outlet, useLocation, useNavigate } from 'react-router-dom'
+import Scene from '../ui/animation/Scene'
+
+export default function MainLayout() {
+ const location = useLocation()
+ const navigate = useNavigate()
+ const { getUserInfo, loggedIn, loading } = useUser()
+
+ useEffect(() => {
+ if (loggedIn && !loading) {
+ window.location.replace(`/calendar/${dayjs(new Date()).format(DATE_ROUTE_FORMAT)}`)
+ // navigate(`/calendar/${dayjs(new Date()).format(DATE_ROUTE_FORMAT)}`)
+ return
+ } else {
+ if (location.pathname === '/login' || location.pathname === '/signup') return
+ else navigate('/login')
+ }
+ }, [getUserInfo, navigate, loggedIn, location.pathname, loading])
+
+ return (
+
+
+
+
+
+ © 2023. 12 GROUP All rights reserved.
+
+
+ Illustrated by Chulmin Park & Source Zustand
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/layouts/ManagerLayout.tsx b/src/components/layouts/ManagerLayout.tsx
new file mode 100644
index 00000000..8ba15178
--- /dev/null
+++ b/src/components/layouts/ManagerLayout.tsx
@@ -0,0 +1,34 @@
+import React, { useEffect } from 'react'
+import useUser from '@/hooks/user'
+import { Outlet, useNavigate } from 'react-router-dom'
+import SideBar from '@/components/SideBar'
+import { toast } from 'react-toastify'
+
+export default function ManagerLayout() {
+ const navigate = useNavigate()
+ const { getUserInfo, loggedIn, loading } = useUser()
+
+ useEffect(() => {
+ if (loading) return
+ if (!loggedIn && !loading) {
+ toast.warn('로그인 후 이용해주세요')
+ navigate('/login')
+ return
+ }
+ if (loggedIn && getUserInfo().role !== 'ADMIN') {
+ toast.warn('관리자만 접근할 수 있는 페이지 입니다!')
+ navigate('/login')
+ return
+ }
+ }, [getUserInfo, loggedIn, navigate, loading])
+
+ return (
+
+
+
+ {loggedIn && !loading && }
+ {loggedIn && !loading && }
+
+
+ )
+}
diff --git a/src/components/layouts/UserLayout.tsx b/src/components/layouts/UserLayout.tsx
new file mode 100644
index 00000000..90711897
--- /dev/null
+++ b/src/components/layouts/UserLayout.tsx
@@ -0,0 +1,34 @@
+import useUser from '@/hooks/user'
+import React, { useEffect } from 'react'
+import { Outlet, useNavigate } from 'react-router-dom'
+import SideBar from '@/components/SideBar'
+import { toast } from 'react-toastify'
+
+export default function ManagerLayout() {
+ const navigate = useNavigate()
+ const { getUserInfo, loggedIn, loading } = useUser()
+
+ useEffect(() => {
+ if (loading) return
+ if (!loggedIn && !loading) {
+ toast.warn('로그인 후 이용해주세요')
+ navigate('/login')
+ return
+ }
+ if (loggedIn && getUserInfo().role !== 'USER') {
+ toast.warn('사용자만 접근할 수 있는 페이지 입니다!')
+ navigate('/login')
+ return
+ }
+ }, [getUserInfo, loggedIn, navigate, loading])
+
+ return (
+
+
+
+ {loggedIn && !loading && }
+ {loggedIn && !loading && }
+
+
+ )
+}
diff --git a/src/components/sidebar/Profile.tsx b/src/components/sidebar/Profile.tsx
new file mode 100644
index 00000000..17f54acd
--- /dev/null
+++ b/src/components/sidebar/Profile.tsx
@@ -0,0 +1,33 @@
+import { AdminUser, FanUser } from '@/models/user'
+import React from 'react'
+import { Link } from 'react-router-dom'
+import useUser from '@/hooks/user'
+
+type Props = {
+ user: Partial
+}
+export default function Profile({ user }: Props) {
+ const { logout } = useUser()
+ return (
+
+
+
+
+
{user.fullName}
+
+ 수정
+
+
+
+
+
+ )
+}
diff --git a/src/components/sidebar/SidebarMenu.tsx b/src/components/sidebar/SidebarMenu.tsx
new file mode 100644
index 00000000..9044e002
--- /dev/null
+++ b/src/components/sidebar/SidebarMenu.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+
+type Props = {
+ children: React.ReactNode
+ isActive?: boolean
+ name: string
+ idx: number
+ url: string
+ onClick?: (name: string) => void
+}
+export default function SidebarMenu({ name, children, isActive = false, url, onClick }: Props) {
+ const style = isActive ? 'bg-white text-main rounded-l-[20px]' : 'bg-main text-white'
+ return (
+ onClick && onClick(name)}>
+
+
+ {isActive &&
}
+
+ {children}
+
+
+
+
+ )
+}
diff --git a/src/components/ui/ArrowButton.tsx b/src/components/ui/ArrowButton.tsx
new file mode 100644
index 00000000..bd140e7a
--- /dev/null
+++ b/src/components/ui/ArrowButton.tsx
@@ -0,0 +1,29 @@
+import React from 'react'
+import { FaChevronLeft, FaChevronRight, FaMinus } from 'react-icons/fa'
+
+export type DirectionType = 'left' | 'right'
+type Props = {
+ direction: DirectionType
+ onClick?: (direction: 'left' | 'right') => void
+ disabled?: boolean
+}
+
+export default function ArrowBotton({ direction, onClick, disabled = true }: Props) {
+ const iconStyle = 'text-[16px] text-white'
+ let ICON =
+ direction === 'left' ? (
+
+ ) : (
+
+ )
+ disabled && (ICON = )
+ return (
+ onClick && onClick(direction)}
+ >
+ {ICON}
+
+ )
+}
diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx
new file mode 100644
index 00000000..da5436eb
--- /dev/null
+++ b/src/components/ui/Button.tsx
@@ -0,0 +1,40 @@
+import React from 'react'
+
+type Props = {
+ text: string
+ onClick?: () => void
+ disabled?: boolean
+ size?: 'sm' | 'md' | 'lg'
+ className?: string
+ type?: 'red' | 'purple'
+}
+export default function Button({
+ text,
+ disabled = false,
+ size = 'md',
+ className,
+ onClick,
+ type = 'purple'
+}: Props) {
+ let sizeStyle = ''
+ if (size === 'sm') sizeStyle = 'h-6 px-2'
+ else if (size === 'md') sizeStyle = 'h-8 px-4'
+ else if (size === 'lg') sizeStyle = 'h-10 px-6'
+
+ const color = type === 'purple' ? 'main' : 'point'
+ const deepColor = type === 'purple' ? 'hover' : 'rose-500'
+
+ return (
+
+ {text}
+
+ )
+}
diff --git a/src/components/ui/CheerUpLoading.tsx b/src/components/ui/CheerUpLoading.tsx
new file mode 100644
index 00000000..87f472f9
--- /dev/null
+++ b/src/components/ui/CheerUpLoading.tsx
@@ -0,0 +1,294 @@
+import React from 'react'
+import './CheerUpLoadingStyle.css'
+export default function CheerUpLoading() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/ui/CheerUpLoadingStyle.css b/src/components/ui/CheerUpLoadingStyle.css
new file mode 100644
index 00000000..cecddce3
--- /dev/null
+++ b/src/components/ui/CheerUpLoadingStyle.css
@@ -0,0 +1,75 @@
+.right-light-stick {
+ animation-name: shake-right-light-stick;
+ animation-duration: 1s;
+ animation-iteration-count: infinite;
+ transform-origin: bottom;
+}
+
+.right-hand {
+ animation-name: shake-right-hand;
+ animation-duration: 1s;
+ animation-iteration-count: infinite;
+ transform-origin: bottom;
+}
+
+.left-light-stick {
+ animation-name: shake-left-light-stick;
+ animation-duration: 1s;
+ animation-iteration-count: infinite;
+ transform-origin: bottom;
+}
+
+.left-hand {
+ animation-name: shake-left-hand;
+ animation-duration: 1s;
+ animation-iteration-count: infinite;
+ transform-origin: bottom;
+}
+
+@keyframes shake-right-light-stick {
+ 0% {
+ transform: rotate(0);
+ }
+ 70% {
+ transform: rotate(7deg);
+ }
+ 100% {
+ transform: rotate(0);
+ }
+}
+
+@keyframes shake-right-hand {
+ 0% {
+ transform: rotate(0);
+ }
+ 70% {
+ transform: rotate(5deg);
+ }
+
+ 100% {
+ transform: rotate(0);
+ }
+}
+
+@keyframes shake-left-light-stick {
+ 0% {
+ transform: translateY(0) rotate(0);
+ }
+ 70% {
+ transform: translateY(-2px) rotate(-10deg);
+ }
+ 100% {
+ transform: translateY(0) rotate(0);
+ }
+}
+@keyframes shake-left-hand {
+ 0% {
+ transform: rotate(0);
+ }
+ 70% {
+ transform: rotate(-5deg);
+ }
+ 100% {
+ transform: rotate(0);
+ }
+}
diff --git a/src/components/ui/ModalPortal.tsx b/src/components/ui/ModalPortal.tsx
new file mode 100644
index 00000000..99574cc8
--- /dev/null
+++ b/src/components/ui/ModalPortal.tsx
@@ -0,0 +1,12 @@
+import reactDom from 'react-dom'
+type Props = {
+ children: React.ReactNode
+}
+export default function ModalPortal({ children }: Props) {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ const node = document.getElementById('portal') as Element
+ return reactDom.createPortal(children, node)
+}
diff --git a/src/components/ui/animation/Fireflies.jsx b/src/components/ui/animation/Fireflies.jsx
new file mode 100644
index 00000000..426e05c8
--- /dev/null
+++ b/src/components/ui/animation/Fireflies.jsx
@@ -0,0 +1,50 @@
+/* eslint-disable react/no-unknown-property */
+import { Vector3, CatmullRomCurve3 } from 'three'
+import React, { useRef, useMemo } from 'react'
+import { extend, useFrame } from '@react-three/fiber'
+import * as meshline from 'meshline'
+
+extend(meshline)
+
+const r = () => Math.max(0.2, Math.random())
+
+// eslint-disable-next-line react/prop-types
+function Fatline({ curve, color }) {
+ const material = useRef()
+ useFrame((state, delta) => (material.current.uniforms.dashOffset.value -= delta / 100))
+ return (
+
+
+
+
+ )
+}
+
+// eslint-disable-next-line react/prop-types
+export default function Fireflies({ count, colors, radius = 10 }) {
+ const lines = useMemo(
+ () =>
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ new Array(count).fill().map((_, index) => {
+ const pos = new Vector3(Math.sin(0) * radius * r(), Math.cos(0) * radius * r(), 0)
+ const points = new Array(30).fill().map((_, index) => {
+ const angle = (index / 20) * Math.PI * 2
+ return pos.add(new Vector3(Math.sin(angle) * radius * r(), Math.cos(angle) * radius * r(), 0)).clone()
+ })
+ const curve = new CatmullRomCurve3(points).getPoints(100)
+ return {
+ // eslint-disable-next-line react/prop-types
+ color: colors[parseInt(colors.length * Math.random())],
+ curve,
+ }
+ }),
+ [count, radius, colors],
+ )
+ return (
+
+ {lines.map((props, index) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/ui/animation/Scene.jsx b/src/components/ui/animation/Scene.jsx
new file mode 100644
index 00000000..9bcdb516
--- /dev/null
+++ b/src/components/ui/animation/Scene.jsx
@@ -0,0 +1,162 @@
+import { Mesh, PlaneGeometry, Group, Vector3, MathUtils } from 'three'
+import React, { useRef, useState, useLayoutEffect } from 'react'
+import { createRoot, events, extend, useFrame } from '@react-three/fiber'
+import { Plane, useAspect, useTexture } from '@react-three/drei'
+import { EffectComposer, DepthOfField, Vignette } from '@react-three/postprocessing'
+import { MaskFunction } from 'postprocessing'
+import Fireflies from './Fireflies'
+import './layerMaterial'
+
+let bgUrl = '/resources/bg.jpg'
+let starsUrl = '/resources/stars.png'
+let groundUrl = '/resources/ground.png'
+let fanUrl = '/resources/fan.png'
+let fans1Url = '/resources/fans1.png'
+let fans2Url = '/resources/fans2.png'
+
+function Experience() {
+ const scaleN = useAspect(1600, 1000, 1.05)
+ const scaleW = useAspect(1900, 1000, 1.05)
+ const textures = useTexture([bgUrl, starsUrl, groundUrl, fanUrl, fans1Url, fans2Url])
+ const group = useRef()
+ const layersRef = useRef([])
+ const [movement] = useState(() => new Vector3())
+ const [temp] = useState(() => new Vector3())
+ const layers = [
+ { texture: textures[0], x: 0, y: 0, z: 0, factor: 0.005, scale: scaleW },
+ { texture: textures[1], x: 0, y: 0, z: 10, factor: 0.005, wiggle: 0.2, scale: scaleW },
+ { texture: textures[2], x: 0, y: 0, z: 20, scale: scaleW, wiggle: 0.4 },
+ { texture: textures[3], x: 10, y: 5, z: 30, scaleFactor: 0.9, wiggle: 0.4, scale: scaleN },
+ {
+ texture: textures[4],
+ x: 0,
+ y: 0,
+ z: 40,
+ factor: 0.03,
+ scaleFactor: 1,
+ wiggle: 0.6,
+ scale: scaleW
+ },
+ {
+ texture: textures[5],
+ x: 0,
+ y: 0,
+ z: 49,
+ factor: 0.03,
+ scaleFactor: 1,
+ wiggle: 0.4,
+ scale: scaleW
+ }
+ ]
+
+ useFrame((state, delta) => {
+ movement.lerp(temp.set(state.pointer.x, state.pointer.y * 0.2, 0), 0.2)
+ group.current.position.x = MathUtils.lerp(group.current.position.x, state.pointer.x * 20, 0.05)
+ group.current.rotation.x = MathUtils.lerp(group.current.rotation.x, state.pointer.y / 20, 0.05)
+ group.current.rotation.y = MathUtils.lerp(group.current.rotation.y, -state.pointer.x / 10, 0.05)
+ layersRef.current[4].uniforms.time.value = layersRef.current[5].uniforms.time.value += delta
+ layersRef.current[1].uniforms.time.value = layersRef.current[2].uniforms.time.value += delta
+ }, 1)
+
+ return (
+
+
+ {layers.map(
+ ({ scale, texture, ref, factor = 0, scaleFactor = 1, wiggle = 0, x, y, z }, i) => (
+
+ (layersRef.current[i] = el)}
+ // eslint-disable-next-line react/no-unknown-property
+ wiggle={wiggle}
+ scale={scaleFactor}
+ />
+
+ )
+ )}
+
+ )
+}
+
+function Effects() {
+ const ref = useRef()
+ useLayoutEffect(() => {
+ const maskMaterial = ref.current.maskPass.getFullscreenMaterial()
+ maskMaterial.maskFunction = MaskFunction.MULTIPLY_RGB_SET_ALPHA
+ })
+ return (
+
+
+
+
+ )
+}
+
+export default function Scene() {
+ return (
+
+
+
+
+ )
+}
+
+// eslint-disable-next-line react/prop-types
+function Canvas({ children }) {
+ extend({ Mesh, PlaneGeometry, Group })
+ const canvas = useRef(null)
+ const root = useRef(null)
+ useLayoutEffect(() => {
+ if (!root.current) {
+ root.current = createRoot(canvas.current).configure({
+ events,
+ orthographic: true,
+ gl: { antialias: false },
+ camera: { zoom: 5, position: [0, 0, 200], far: 300, near: 50 },
+ onCreated: (state) => {
+ state.events.connect(document.getElementById('root'))
+ state.setEvents({
+ compute: (event, state) => {
+ state.pointer.set(
+ (event.clientX / state.size.width) * 2 - 1,
+ -(event.clientY / state.size.height) * +1
+ )
+ state.raycaster.setFromCamera(state.pointer, state.camera)
+ }
+ })
+ }
+ })
+ }
+ const resize = () =>
+ root.current.configure({ width: window.innerWidth, height: window.innerHeight })
+ window.addEventListener('resize', resize)
+ root.current.render(children)
+ return () => window.removeEventListener('resize', resize)
+ }, [children])
+
+ return (
+
+
+
+ )
+}
diff --git a/src/components/ui/animation/layerMaterial.js b/src/components/ui/animation/layerMaterial.js
new file mode 100644
index 00000000..21ec233b
--- /dev/null
+++ b/src/components/ui/animation/layerMaterial.js
@@ -0,0 +1,45 @@
+import { shaderMaterial } from '@react-three/drei'
+import { extend } from '@react-three/fiber'
+
+// This material takes care of wiggling and punches a hole into
+// alpha regions so that the depth-of-field effect can process the layers.
+// Credit: Gianmarco Simone https://twitter.com/ggsimm
+
+const LayerMaterial = shaderMaterial(
+ { textr: null, movement: [0, 0, 0], scale: 1, factor: 0, wiggle: 0, time: 0 },
+ ` uniform float time;
+ uniform vec2 resolution;
+ uniform float wiggle;
+ varying vec2 vUv;
+ varying vec3 vNormal;
+ void main() {
+ vUv = uv;
+ vec3 transformed = vec3(position);
+ if (wiggle > 0.) {
+ float theta = sin(time + position.y) / 2.0 * wiggle;
+ float c = cos(theta);
+ float s = sin(theta);
+ mat3 m = mat3(c, 0, s, 0, 1, 0, -s, 0, c);
+ transformed = transformed * m;
+ vNormal = vNormal * m;
+ }
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed, 1.);
+ }`,
+ ` uniform float time;
+ uniform vec2 resolution;
+ uniform float factor;
+ uniform float scale;
+ uniform vec3 movement;
+ uniform sampler2D textr;
+ varying vec2 vUv;
+ void main() {
+ vec2 uv = vUv / scale + movement.xy * factor;
+ vec4 color = texture2D(textr, uv);
+ if (color.a < 0.1) discard;
+ gl_FragColor = vec4(color.rgb, .1);
+ #include
+ #include
+ }`
+)
+
+extend({ LayerMaterial })
diff --git a/src/components/user/ReserveDetail.tsx b/src/components/user/ReserveDetail.tsx
new file mode 100644
index 00000000..fcab4fef
--- /dev/null
+++ b/src/components/user/ReserveDetail.tsx
@@ -0,0 +1,52 @@
+import React from 'react'
+import { useQuery } from '@tanstack/react-query'
+import { useCookies } from 'react-cookie'
+import { getMyTicketList } from '@/api/user/mypage'
+import Ticket from './Ticket'
+import TicketList from './TicketList'
+import { FanUser } from '@/models/user'
+import { ACCESS_TOKEN } from '@/constants'
+
+type Props = {
+ user: FanUser
+}
+export default function ReserveDetail({ user }: Props) {
+ const [cookie] = useCookies([ACCESS_TOKEN])
+
+ const { data, isSuccess } = useQuery(
+ ['myTicketList', user.id ? user.id : ''],
+ () => getMyTicketList(cookie.AccessToken),
+ {
+ staleTime: 1000 * 60 * 5
+ }
+ )
+
+ return (
+ <>
+
+ {isSuccess && data && (
+
+
+
+
+ )}
+
+
+
나의 티켓 리스트
+
+ {isSuccess && data &&
}
+ {isSuccess && !data && (
+
+
예약된 정보가 없습니다!
+
+
+ )}
+
+
+ >
+ )
+}
diff --git a/src/components/user/Ticket.tsx b/src/components/user/Ticket.tsx
new file mode 100644
index 00000000..e1e86973
--- /dev/null
+++ b/src/components/user/Ticket.tsx
@@ -0,0 +1,34 @@
+import React from 'react'
+
+type Props = {
+ type: 'rest' | 'used'
+ ticket: number
+}
+export default function Ticket({ type, ticket }: Props) {
+ const options = {
+ rest: {
+ src: '/dots.svg',
+ alt: 'dots image',
+ title: '남은 티켓',
+ ticketStyle: 'text-3xl font-bold text-main',
+ imageStyle: 'w-16 h-16 my-auto'
+ },
+ used: {
+ src: '/user.svg',
+ alt: 'user image',
+ title: '사용한 티켓',
+ ticketStyle: 'text-3xl font-bold text-point',
+ imageStyle: 'w-16 h-16 my-auto'
+ }
+ }
+
+ return (
+
+
+
+
{options[type].title}
+
{ticket}
+
+
+ )
+}
diff --git a/src/components/user/TicketList.tsx b/src/components/user/TicketList.tsx
new file mode 100644
index 00000000..0450480d
--- /dev/null
+++ b/src/components/user/TicketList.tsx
@@ -0,0 +1,16 @@
+import React from 'react'
+import TicketListItem from './TicketListItem'
+import { TicketListResponse } from '@/api/user/mypage'
+
+type Props = {
+ data: TicketListResponse
+}
+export default function TicketList({ data }: Props) {
+ return (
+
+ {data.schedulerRoleUserList?.map((schedule) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/user/TicketListItem.tsx b/src/components/user/TicketListItem.tsx
new file mode 100644
index 00000000..d99d818c
--- /dev/null
+++ b/src/components/user/TicketListItem.tsx
@@ -0,0 +1,31 @@
+import { SchedulerRoleUserList } from '@/api/user/mypage'
+import { DATE_FORMAT } from '@/constants'
+import dayjs from 'dayjs'
+import React from 'react'
+
+type Props = {
+ data: SchedulerRoleUserList
+}
+export default function TicketListItem({ data }: Props) {
+ const option = {
+ ACCEPT: 'bg-confirm',
+ REFUSE: 'bg-point',
+ WAITING: 'bg-wait'
+ }
+
+ const text = data.progress === 'ACCEPT' ? '승인완료' : '승인거절'
+ data.progress === 'WAITING' && '승인대기'
+ return (
+
+
{data.title}
+
{dayjs(data.scheduleStart).format(DATE_FORMAT)}
+ {/* ! 타입 임시 지정! */}
+
+ {text}
+
+
+ )
+}
diff --git a/src/constants/index.ts b/src/constants/index.ts
new file mode 100644
index 00000000..e6d23083
--- /dev/null
+++ b/src/constants/index.ts
@@ -0,0 +1,5 @@
+export const DATE_FORMAT = 'YYYY-MM-DD'
+export const DATE_ROUTE_FORMAT = 'YYYY/MM/DD'
+export const CALENDAR_TAG_ID = 'monthCalendar'
+export const DATE_REQEUST_FORMAT = 'YYYY-MM-DDTHH:mm:ss'
+export const ACCESS_TOKEN = 'AccessToken'
diff --git a/src/context/UserProvider.tsx b/src/context/UserProvider.tsx
new file mode 100644
index 00000000..6eb841b1
--- /dev/null
+++ b/src/context/UserProvider.tsx
@@ -0,0 +1,119 @@
+import api from '@/api'
+import { auth } from '@/api/login/auth'
+// import { auth } from '@/api/login/auth'
+import { ACCESS_TOKEN } from '@/constants'
+import { AdminUser, FanUser } from '@/models/user'
+import React, { createContext, useState, useMemo, useCallback, useEffect } from 'react'
+import { useCookies } from 'react-cookie'
+
+interface IUserContext {
+ loading: boolean
+ loggedIn: boolean
+ getUserInfo: () => AdminUser | FanUser
+ login: (email: string, password: string) => Promise
+ logout: () => void
+}
+
+export const UserContext = createContext({
+ loggedIn: false,
+ loading: true,
+ getUserInfo: () => ({}) as AdminUser | FanUser,
+ login: async () => {
+ return false
+ },
+ logout: () => {}
+})
+
+type Props = {
+ children: React.ReactNode
+}
+
+function UserProvider({ children }: Props) {
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const [cookies, setCookie, removeCookie] = useCookies([ACCESS_TOKEN])
+ const [userInfo, setUserInfo] = useState({} as AdminUser | FanUser)
+ const [loggedIn, setLoggedIn] = useState(false)
+ const [loading, setLoading] = useState(true)
+
+ // todo : 원래는 getUserInfo안에서 비동기적으로 데이터의 정합성을 검사해야하지만, 이미 작성된 로직이 많고 시간 관계상 따로 뺏습니다.
+ // * 사용자 정보가 없다면, 서버에 요청을 보내 사용자 정보를 가져옵니다.
+ const getUserInfo = useCallback(() => {
+ if (!userInfo.id) return {} as AdminUser | FanUser
+ return userInfo
+ }, [userInfo])
+
+ // * 로그인 후 cookie를 저장하고, 로그인 상태를 true로 변경합니다.
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ const login = async (email: string, password: string) => {
+ try {
+ setLoading(true)
+ setLoggedIn(false)
+ const res = await api('/login', {
+ method: 'POST',
+ data: {
+ email: email,
+ password: password
+ },
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ })
+ setCookie(ACCESS_TOKEN, res.headers.authorization, { path: '/' })
+ setUserInfo(res.data.data as AdminUser | FanUser)
+ setLoggedIn(true)
+ setLoading(false)
+ return true
+ } catch (error) {
+ console.error(error)
+ removeCookie('AccessToken', { path: '/' })
+ setLoggedIn(false)
+ setLoading(false)
+ return false
+ }
+ }
+ const logout = useCallback(() => {
+ removeCookie(ACCESS_TOKEN, { path: '/' })
+ setLoggedIn(false)
+ setUserInfo({} as AdminUser | FanUser)
+ window.location.replace('/login')
+ }, [removeCookie])
+
+ useEffect(() => {
+ setLoading(true)
+ if (loggedIn || userInfo.id) {
+ setLoading(false)
+ return
+ }
+ if (!cookies[ACCESS_TOKEN]) {
+ removeCookie(ACCESS_TOKEN, { path: '/' })
+ setLoading(false)
+ return
+ }
+ auth(cookies[ACCESS_TOKEN])
+ .then((user) => {
+ if (user) {
+ setUserInfo(user as AdminUser | FanUser)
+ setLoggedIn(true)
+ } else {
+ removeCookie(ACCESS_TOKEN, { path: '/' })
+ window.location.replace('/login')
+ }
+ setLoading(false)
+ })
+ .catch((error) => {
+ console.error(error)
+ removeCookie(ACCESS_TOKEN, { path: '/' })
+ setLoading(false)
+ window.location.replace('/login')
+ })
+ }, [cookies, loggedIn, removeCookie, userInfo.id])
+
+ const value = useMemo(
+ () => ({ getUserInfo, loggedIn, setUserInfo, setLoggedIn, login, loading, logout }),
+ [getUserInfo, setLoggedIn, setUserInfo, loggedIn, login, loading, logout]
+ )
+
+ return {children}
+}
+
+export default UserProvider
diff --git a/src/hooks/hover.ts b/src/hooks/hover.ts
new file mode 100644
index 00000000..15c024d0
--- /dev/null
+++ b/src/hooks/hover.ts
@@ -0,0 +1,31 @@
+import { useEffect } from 'react'
+// mouseenter, mouseleave
+
+export default function useHover(start: boolean) {
+ function addNoHover(e: Event) {
+ const element = e.target as HTMLElement
+ element.closest('.cell')?.classList.add('no-cell-hover')
+ }
+ function removeNoHover(e: Event) {
+ const element = e.target as HTMLElement
+ element.closest('.cell')?.classList.remove('no-cell-hover')
+ }
+
+ useEffect(() => {
+ if (typeof window === 'undefined') return
+ if (!start) return
+ document.querySelectorAll('.schedule-cell').forEach((el) => {
+ el.addEventListener('mouseenter', addNoHover)
+ el.addEventListener('mouseleave', removeNoHover)
+ })
+
+ return () => {
+ document.querySelectorAll('.schedule-cell').forEach((el) => {
+ el.removeEventListener('mouseenter', addNoHover)
+ el.removeEventListener('mouseleave', removeNoHover)
+ })
+ }
+ }, [start])
+
+ return null
+}
diff --git a/src/hooks/resize.ts b/src/hooks/resize.ts
new file mode 100644
index 00000000..0e7ff5c0
--- /dev/null
+++ b/src/hooks/resize.ts
@@ -0,0 +1,26 @@
+import { useEffect, useState } from 'react'
+
+export default function useResize(selector?: string) {
+ const [width, setWidth] = useState(0)
+ const [height, setHeight] = useState(0)
+
+ function resize() {
+ if (selector) {
+ const target = document.querySelector(selector) as HTMLElement
+ setWidth(target ? target.clientWidth : 0)
+ setHeight(target ? target.clientHeight : 0)
+ return
+ }
+ setWidth(window.innerWidth)
+ setHeight(window.innerHeight)
+ }
+
+ useEffect(() => {
+ if (typeof window === 'undefined') return
+ resize()
+ window.addEventListener('resize', resize)
+ return () => window.removeEventListener('resize', resize)
+ }, [])
+
+ return { width, height, resize, setWidth, setHeight }
+}
diff --git a/src/hooks/schedule.ts b/src/hooks/schedule.ts
new file mode 100644
index 00000000..68d1a961
--- /dev/null
+++ b/src/hooks/schedule.ts
@@ -0,0 +1,79 @@
+import { fetchSchedule } from '@/api/schedule'
+import { ACCESS_TOKEN } from '@/constants'
+import { useQuery } from '@tanstack/react-query'
+import { useEffect, useState } from 'react'
+import { useCookies } from 'react-cookie'
+import { useLocation, useParams } from 'react-router-dom'
+import useUser from './user'
+import { toast } from 'react-toastify'
+
+export default function useSchedule() {
+ const params = useParams()
+ const location = useLocation()
+ const searchParams = new URLSearchParams(location.search)
+ const [cookie] = useCookies([ACCESS_TOKEN])
+ // ? year, month가 없는 경우 체크 필요 redirect 해야함
+ const [year, setYear] = useState(params.year ? parseInt(params.year) : 0)
+ const [month, setMonth] = useState(params.month ? parseInt(params.month) : 0)
+ const [day, setDay] = useState(params.day ? parseInt(params.day) : 0)
+ const [keyword, setKeyword] = useState(searchParams.get('keyword') || '')
+
+ const { pathname } = useLocation()
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+ const userId = user.role === 'ADMIN' && pathname.includes('manager/event/calendar') ? user.id : ''
+
+ const {
+ data: schedule,
+ isFetching,
+ isLoading,
+ isError,
+ isFetched,
+ isSuccess
+ } = useQuery(
+ ['schedule', year, month, `${userId ? userId : ''}`, `${keyword ? keyword : ''}`],
+ () =>
+ fetchSchedule({
+ year,
+ month,
+ userId: `${userId ? userId : ''}`,
+ keyword: `${keyword ? keyword : ''}`,
+ token: cookie.AccessToken
+ }),
+ {
+ enabled: !!year && !!month && !!cookie.AccessToken,
+ staleTime: 1000 * 60 * 5
+ }
+ )
+
+ useEffect(() => {
+ if (
+ typeof params.year === 'undefined' ||
+ typeof params.month === 'undefined' ||
+ typeof params.day === 'undefined'
+ ) {
+ toast.error('잘못된 접근입니다.')
+ return
+ }
+
+ setYear(parseInt(params.year))
+ setMonth(parseInt(params.month))
+ setDay(parseInt(params.day))
+ const searchParams = new URLSearchParams(location.search)
+ setKeyword(searchParams.get('keyword') || '')
+ }, [params, location.search])
+
+ return {
+ adminSchedule: schedule?.schedule,
+ reservedList: schedule?.reservedList,
+
+ isFetching,
+ year,
+ month,
+ day,
+ isLoading,
+ isError,
+ isFetched,
+ isSuccess
+ }
+}
diff --git a/src/hooks/user.ts b/src/hooks/user.ts
new file mode 100644
index 00000000..c94c2c2b
--- /dev/null
+++ b/src/hooks/user.ts
@@ -0,0 +1,8 @@
+import { useContext } from 'react'
+import { UserContext } from '@/context/UserProvider'
+
+export default function useUser() {
+ const { getUserInfo, loggedIn, login, loading, logout } = useContext(UserContext)
+
+ return { getUserInfo, login, loggedIn, loading, logout }
+}
diff --git a/src/index.css b/src/index.css
new file mode 100644
index 00000000..36a203ad
--- /dev/null
+++ b/src/index.css
@@ -0,0 +1,166 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@font-face {
+ font-family: 'GmarketSans';
+ font-weight: 300;
+ font-style: normal;
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.eot');
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.eot?#iefix') format('embedded-opentype'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.woff2') format('woff2'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.woff') format('woff'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.ttf') format("truetype");
+ font-display: swap;
+}
+@font-face {
+ font-family: 'GmarketSans';
+ font-weight: 500;
+ font-style: normal;
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.eot');
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.eot?#iefix') format('embedded-opentype'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.woff2') format('woff2'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.woff') format('woff'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.ttf') format("truetype");
+ font-display: swap;
+}
+@font-face {
+ font-family: 'GmarketSans';
+ font-weight: 700;
+ font-style: normal;
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.eot');
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.eot?#iefix') format('embedded-opentype'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.woff2') format('woff2'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.woff') format('woff'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.ttf') format("truetype");
+ font-display: swap;
+}
+
+:root {
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+* {
+ /* box-sizing: border-box; */
+}
+
+input[type='date']::-webkit-calendar-picker-indicator {
+ cursor: pointer;
+}
+input[type='date']::-webkit-calendar-picker-indicator:hover {
+ transform: scale(1.2);
+}
+
+.filebox input[type='file'] {
+ position: absolute;
+ width: 0;
+ height: 0;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.cell-hover {
+ border: 1px solid #ff00a5;
+ cursor: pointer;
+}
+.no-cell-hover {
+ border: none !important;
+}
+
+.move-from-left {
+ animation: moveFromLeft 0.2s ease-in-out;
+ animation-fill-mode: backwards;
+}
+
+.move-from-right {
+ animation: moveFromRight 0.2s ease-in-out;
+ animation-fill-mode: backwards;
+}
+
+.custom-ping {
+ animation: customPing 2s ease-in-out infinite;
+}
+
+@keyframes customPing {
+ 0% {
+ transform: scale(1);
+ opacity: 0.8;
+ }
+ /* 70% {
+ transform: scale(1.5);
+ opacity: 0.4;
+ } */
+ 80% {
+ transform: scale(1.2);
+ opacity: 0.4;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 0.8;
+ }
+}
+
+@keyframes moveFromLeft {
+ 0% {
+ transform: translateX(-20%);
+ opacity: 0.2;
+ }
+ 40% {
+ transform: translateX(-5%);
+ opacity: 0.6;
+ }
+ 80% {
+ transform: translateX(0%);
+ opacity: 0.8;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+@keyframes moveFromRight {
+ 0% {
+ transform: translateX(20%);
+ opacity: 0.2;
+ }
+ 40% {
+ transform: translateX(10%);
+ opacity: 0.6;
+ }
+ 80% {
+ transform: translateX(0%);
+ opacity: 0.8;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+.bounce-menu:hover svg {
+ animation: bounceSideBar 1s infinite;
+}
+
+@keyframes bounceSideBar {
+ 0%,
+ 100% {
+ transform: translateY(-4px);
+ animation-timing-function: cubic-bezier(0.8, 0, 1, 1);
+ }
+ 50% {
+ transform: none;
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+ }
+}
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 00000000..e68c05b6
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,23 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import { BrowserRouter } from 'react-router-dom'
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { CookiesProvider } from 'react-cookie'
+import UserProvider from '@/context/UserProvider'
+
+import App from '@/App.tsx'
+import '@/index.css'
+
+const queryClient = new QueryClient()
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+
+
+
+
+
+
+)
diff --git a/src/mocks/schedule.ts b/src/mocks/schedule.ts
new file mode 100644
index 00000000..b10462bb
--- /dev/null
+++ b/src/mocks/schedule.ts
@@ -0,0 +1,122 @@
+// * 월간 공연 목록 API RESPONSE
+export const SCHEDULE_7_MONTH = [
+ {
+ id: 'schedule7month1',
+ userId: 'admin1',
+ title: 'BTS 부산 콘서트',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-07-01',
+ endDate: '2023-07-05'
+ },
+ {
+ id: 'schedule7month2',
+ userId: 'admin1',
+ title: 'BTS 서울 팬미팅',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-07-14',
+ endDate: '2023-07-16'
+ },
+ {
+ id: 'schedule7month3',
+ userId: 'admin1',
+ title: '아이돌 콘서트 블라블라 어쩌고 저쩌고..!!!',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-07-19',
+ endDate: '2023-07-19'
+ },
+ {
+ id: 'schedule7month123',
+ userId: 'admin1',
+ title: 'BTS 일본 콘서트',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-07-05',
+ endDate: '2023-07-07'
+ },
+ {
+ id: 'schedule7month4',
+ userId: 'admin2',
+ title: '뉴진스 서울 콘서트',
+ fullName: 'SM Entertainment',
+ profileImage: '/mock_image/sm_profile_image.png',
+ startDate: '2023-07-30',
+ endDate: '2023-08-04'
+ },
+ {
+ id: 'schedule7month5',
+ userId: 'admin2',
+ title: '뉴진스 부산 콘서트',
+ fullName: 'SM Entertainment',
+ profileImage: '/mock_image/sm_profile_image.png',
+ startDate: '2023-07-11',
+ endDate: '2023-07-15'
+ },
+ {
+ id: 'schedule7month6',
+ userId: 'admin2',
+ title: '슈퍼쥬니어 서울 콘서트',
+ fullName: 'SM Entertainment',
+ profileImage: '/mock_image/sm_profile_image.png',
+ startDate: '2023-07-11',
+ endDate: '2023-07-14'
+ },
+ {
+ id: 'schedule7month7',
+ userId: 'admin2',
+ title: '슈퍼쥬니어 독도 콘서트',
+ fullName: 'SM Entertainment',
+ profileImage: '/mock_image/sm_profile_image.png',
+ startDate: '2023-07-11',
+ endDate: '2023-07-15'
+ }
+]
+export const SCHEDULE_8_MONTH = [
+ {
+ id: 'schedule8month1',
+ userId: 'admin1',
+ title: 'BTS 대전 콘서트',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-08-01',
+ endDate: '2023-08-04'
+ },
+ {
+ id: 'schedule8month2',
+ userId: 'admin1',
+ title: 'BTS 대구 팬미팅',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-08-14',
+ endDate: '2023-08-16'
+ },
+ {
+ id: 'schedule8month3',
+ userId: 'admin1',
+ title: 'BTS 인천 콘서트',
+ fullName: 'HIVE',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-08-05',
+ endDate: '2023-08-08'
+ },
+ {
+ id: 'schedule8month4',
+ userId: 'admin2',
+ title: '뉴진스 마라도 콘서트',
+ fullName: 'SM Entertainment',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-08-30',
+ endDate: '2023-09-04'
+ },
+ {
+ id: 'schedule8month5',
+ userId: 'admin2',
+ title: '뉴진스 제주도 콘서트',
+ fullName: 'SM Entertainment',
+ profileImage: '/mock_image/hive_profile_image.png',
+ startDate: '2023-08-11',
+ endDate: '2023-08-15'
+ }
+]
diff --git a/src/mocks/user.ts b/src/mocks/user.ts
new file mode 100644
index 00000000..e353c2a0
--- /dev/null
+++ b/src/mocks/user.ts
@@ -0,0 +1,56 @@
+import { AdminUser, FanUser } from '@/models/user'
+
+export const ADMIN_USER_1: AdminUser = {
+ id: 'admin1',
+ fullName: 'HIVE',
+ email: 'hi@hive.com',
+ profileImage: '/mock_image/hive_profile_image.png',
+ role: 'ADMIN'
+}
+export const ADMIN_USER_2: AdminUser = {
+ id: 'admin2',
+ fullName: 'SM Entertainment',
+ email: 'sm@sm_entertainment.com',
+ profileImage: '/mock_image/sm_profile_image.png',
+ role: 'ADMIN'
+}
+export const FAN_USER_1: FanUser = {
+ id: 'fan1',
+ fullName: 'john daho',
+ email: 'fan1@aabbccdd.kr',
+ profileImage: '/mock_image/user_profile_1.png',
+ role: 'USER',
+ sizeOfTicket: 12
+}
+export const FAN_USER_2: FanUser = {
+ id: 'fan2',
+ fullName: 'ellie brown',
+ email: 'ellie2@acdefg.io',
+ profileImage: '/mock_image/user_profile_2.png',
+ role: 'USER',
+ sizeOfTicket: 12
+}
+export const FAN_USER_3: FanUser = {
+ id: 'fan3',
+ fullName: 'any amond',
+ email: 'amond@any.com',
+ profileImage: '/mock_image/user_profile_3.png',
+ role: 'USER',
+ sizeOfTicket: 12
+}
+export const FAN_USER_4: FanUser = {
+ id: 'fan4',
+ fullName: 'alien icecream',
+ email: 'icecream@amanda.com',
+ profileImage: '/mock_image/user_profile_4.png',
+ role: 'USER',
+ sizeOfTicket: 12
+}
+export const FAN_USER_5: FanUser = {
+ id: 'fan5',
+ fullName: 'carl knife',
+ email: 'icecream@amanda.com',
+ profileImage: '/mock_image/user_profile_5.png',
+ role: 'USER',
+ sizeOfTicket: 12
+}
diff --git a/src/models/schedule.ts b/src/models/schedule.ts
new file mode 100644
index 00000000..a992ee0a
--- /dev/null
+++ b/src/models/schedule.ts
@@ -0,0 +1,49 @@
+import { AdminUser, FanUser } from './user'
+
+export type ProviderSchedule = {
+ id: string
+ userId: string
+ title: string
+ description: string
+ fullName: string
+ profileImage: string
+ image: string
+ startDate: string
+ endDate: string
+}
+
+export type ProviderReservedList = {
+ id: string
+ scheduleId: string
+ reservedDate: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+ user: FanUser
+}
+
+export type AdminSchedule = {
+ id: string
+ createdAt: string
+ description: string
+ scheduleEnd: string
+ scheduleStart: string
+ image: string
+ title: string
+ user: AdminUser
+}
+
+export type UserSchedule = {
+ id: string
+ scheduleStart: string // reservedDate
+ createdAt: string
+ progress: 'WAITING' | 'ACCEPT' | 'REFUSE'
+ user: FanUser
+ schedulerAdmin: AdminSchedule
+}
+
+/**
+ * @description GET user/schedule?year=number&month=number, AccessToken 필요
+ */
+export type Schedule = {
+ schedulerAdmin: AdminSchedule[]
+ schedulerUser: UserSchedule[]
+}
diff --git a/src/models/user.ts b/src/models/user.ts
new file mode 100644
index 00000000..7d32f167
--- /dev/null
+++ b/src/models/user.ts
@@ -0,0 +1,20 @@
+type User = {
+ id: string
+ email: string
+ profileImage: string
+ role: 'ADMIN' | 'USER'
+ fullName: string
+}
+
+// * Fan User Type
+type Fan = {
+ role: 'USER'
+ sizeOfTicket: number
+}
+export type FanUser = Fan & User
+
+// * Admin User Type
+type Admin = {
+ role: 'ADMIN'
+}
+export type AdminUser = Admin & User
diff --git a/src/pages/Calendar.tsx b/src/pages/Calendar.tsx
new file mode 100644
index 00000000..1a9f3435
--- /dev/null
+++ b/src/pages/Calendar.tsx
@@ -0,0 +1,18 @@
+import BannerSwiper from '@/components/BannerSwiper'
+import SideBar from '@/components/SideBar'
+import CalendarFrame from '@/components/calendar/CalendarFrame'
+import React from 'react'
+
+export default function CalendarPage() {
+ return (
+
+ )
+}
diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx
new file mode 100644
index 00000000..85b0ed9e
--- /dev/null
+++ b/src/pages/Home.tsx
@@ -0,0 +1,4 @@
+import React from 'react'
+export default function Home() {
+ return
+}
diff --git a/src/pages/Manager/Approval/index.tsx b/src/pages/Manager/Approval/index.tsx
new file mode 100644
index 00000000..be2bf967
--- /dev/null
+++ b/src/pages/Manager/Approval/index.tsx
@@ -0,0 +1,36 @@
+import React from 'react'
+import ApprovalList from '@/components/approval/ApprovalList'
+import { useQuery } from '@tanstack/react-query'
+import { useCookies } from 'react-cookie'
+// import QuickState from '@/components/approval/QuickState'
+import { getAdminApprovallList } from '@/api/admin/approvalPage'
+import useUser from '@/hooks/user'
+import QuickState from '@/components/approval/QuickState'
+
+
+export default function ApprovalPage() {
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+ const [cookie] = useCookies(['AccessToken'])
+
+ const { data, isSuccess } = useQuery(
+ ['ApprovalList', user.id ? user.id : ''],
+ () => getAdminApprovallList(cookie.AccessToken),
+ {
+ staleTime: 1000 * 60 * 5
+ }
+ )
+
+ return (
+
+
+ 신청 승인/거절
+
+ {isSuccess && data &&(
+
+ )}
+
+ {isSuccess&& data &&
}
+
+ )
+}
diff --git a/src/pages/Manager/ManagerDashboard/index.tsx b/src/pages/Manager/ManagerDashboard/index.tsx
new file mode 100644
index 00000000..b2156323
--- /dev/null
+++ b/src/pages/Manager/ManagerDashboard/index.tsx
@@ -0,0 +1,73 @@
+import useUser from '@/hooks/user'
+import React from 'react'
+import AddEventList from '@/components/dashboard/AddEventList'
+import EventStatusCard from '@/components/dashboard/EventStatusCard'
+import userDefaultImg from '/mock_image/user_default.png'
+import { useCookies } from 'react-cookie'
+import { getAdminDashbordlList } from '@/api/admin/adminPage'
+import { useQuery } from '@tanstack/react-query'
+
+export default function ManagerDashboardPage() {
+ const { getUserInfo } = useUser()
+ const user = getUserInfo()
+ const defaultprofileImage = userDefaultImg
+
+ const [cookie] = useCookies(['AccessToken'])
+
+ const { data, isSuccess } = useQuery(
+ ['DashboardList', user.id ? user.id : ''],
+ () => getAdminDashbordlList(cookie.AccessToken),
+ {
+ staleTime: 1000 * 60 * 5
+ }
+ )
+
+ return (
+
+
+
+
+ {/* 프로필 이미지 */}
+
+ {user.profileImage ? (
+
+ ) : (
+
+ )}
+
{user.fullName}
+
{user.email}
+
+
+ {/* 프로필 배경 이미지 */}
+ {user.profileImage ? (
+
+ ) : (
+
+ )}
+
+
+ {isSuccess && data &&
}
+ {isSuccess && data &&
}
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/pages/Manager/ManagerEventAddEdit/index.tsx b/src/pages/Manager/ManagerEventAddEdit/index.tsx
new file mode 100644
index 00000000..1a9886cb
--- /dev/null
+++ b/src/pages/Manager/ManagerEventAddEdit/index.tsx
@@ -0,0 +1,14 @@
+import BannerSwiper from '@/components/BannerSwiper'
+import CalendarFrame from '@/components/calendar/CalendarFrame'
+import React from 'react'
+
+export default function ManagerEventAddEditPage() {
+ return (
+
+ )
+}
diff --git a/src/pages/Sample/Optimistic.module.css b/src/pages/Sample/Optimistic.module.css
new file mode 100644
index 00000000..efb9d463
--- /dev/null
+++ b/src/pages/Sample/Optimistic.module.css
@@ -0,0 +1,3 @@
+.title {
+ color: royalblue;
+}
diff --git a/src/pages/Sample/Optimistic.tsx b/src/pages/Sample/Optimistic.tsx
new file mode 100644
index 00000000..d304b010
--- /dev/null
+++ b/src/pages/Sample/Optimistic.tsx
@@ -0,0 +1,118 @@
+import React, { useState } from 'react'
+import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
+import styles from './Optimistic.module.css'
+
+function fetchComments(postNumber: number) {
+ return fetch(`https://jsonplaceholder.typicode.com/comments?postId=${postNumber}`).then((res) =>
+ res.json()
+ )
+}
+
+async function addComment(postNumber: number, newComment: Comment) {
+ // * 임의로 데이터를 업데이트 한다고 가정, 실제로는 서버에서 업데이트가 일어난다.
+ // * 실제로는 fetch("https//json...", method : "PUT", body : newComment)와 같은 형식으로 업데이트가 일어나고 서버에서는 데이터를 업데이트 한다.
+ // * 그리고 response로 무언가 받아온다. 여기서는 추가된 댓글을 가져오는 척 하자.
+ await new Promise((res) => setTimeout(res, 3000))
+ return newComment
+}
+
+type Comment = {
+ postId: number
+ id: number
+ name: string
+ email: string
+ body: string
+}
+
+export default function Optimistic() {
+ const queryClient = useQueryClient()
+
+ const [postNumber, setPostNumber] = useState(1)
+ // * key는 반드시 배열
+ const { data: comments, isLoading } = useQuery(
+ ['post', postNumber],
+ () => fetchComments(postNumber),
+ {
+ staleTime: 1000 * 60, // * staleTime을 0 ~ 1000으로 설정해서 네트워크 요청이 얼마나 가는지 보여주기 (default : 0)
+ cacheTime: 1000 * 60 * 5 // * cache가 0일 경우 refetch시 비교할 수 있는 데이터가 없기 떄문에 반드시 rerendering이 일어난다. (default : 5min)
+ // enabled : !!postNumber // mount될 때 fetch를 하지 않으려면 아래와 같이 enabled를 사용한다.
+ }
+ )
+
+ const mutation = useMutation({
+ mutationFn: (newComment: Comment) => {
+ return addComment(postNumber, newComment)
+ },
+ onSuccess: async (comment) => {
+ // * addComment함수의 실행이 성공적이였을 경우 성공적으로 입력된 comment가 도작했다면?
+ queryClient.setQueryData(['comments', postNumber], (prev: Comment[] | undefined) => {
+ if (!prev) return [comment]
+ return [...prev, comment]
+ })
+
+ // * API를 새로 호출하고 싶다면?
+ await new Promise((res) => {
+ setTimeout(res, 2000)
+ })
+ const isYes = prompt('"yes"를 입력하면 정말로 새로운 포스트를 받아옵니다!!!')
+ if (isYes === 'yes') queryClient.invalidateQueries(['comments', postNumber])
+ // ! 낙관적 업데이트시 두번 연속 클릭이 일어나면 어떻게 되는지 보여주기
+ },
+ onError(error, newComment, ctx) {
+ console.error(error)
+ console.info('context : ', ctx)
+ // 1. 서버에 다시 comments를 요청
+ // queryClient.setQueryData(['post', postNumber], (prev: Comment[] | undefined) => ....
+
+ // 2. 아니면 원래 comments로 복구하기
+ return comments
+ // ! 위와 아래는 같은 코드임 왜 이렇게하는지 서버 API를 어떻게 달라할 때 무엇을 생각해야하는지 알려주기
+ if (typeof comments === 'undefined') return []
+ return comments
+ }
+ })
+
+ const updateComments = () => {
+ const dummyComment: Comment = {
+ postId: postNumber,
+ id: Math.floor(Math.random() * 99999),
+ name: '익명의 사용자',
+ email: 'unknown@unknown.com',
+ body: '익명의 댓글입니다.'
+ }
+ mutation.mutate(dummyComment)
+ }
+
+ return (
+
+
React queryOptimistic Data Fetching
+
+ {mutation.isLoading &&
데이터를 패칭하고 있습니다... 잠시만 기다려주세요
}
+ {comments &&
+ !isLoading &&
+ comments.map((comment, i) => {
+ return (
+
+
{i + 1}
+
name : {comment.name}
+
body :{comment.body.slice(0, 10)}
+
+ )
+ })}
+ ------------------------------------------------------------------------------
+
+
+
+ {'get post를 누르면 '}
+
{postNumber}
+ {'번째 포스트의 댓글이 나옵니다.'}
+
+
setPostNumber((prev) => prev + 1)}>Increse Post Number
+
setPostNumber((prev) => prev - 1)}>Decrese Post Number
+
+
+ 낙관적으로 댓글을 추가해봅시다!
+
+
+ )
+}
diff --git a/src/pages/Sample/Sample.tsx b/src/pages/Sample/Sample.tsx
new file mode 100644
index 00000000..b4d66485
--- /dev/null
+++ b/src/pages/Sample/Sample.tsx
@@ -0,0 +1,66 @@
+import React, { useEffect, useState } from 'react'
+import { useQuery } from '@tanstack/react-query'
+
+function getPosts(postNumber: number) {
+ return fetch(`https://jsonplaceholder.typicode.com/posts/${postNumber}`).then((res) => res.json())
+}
+
+type Post = {
+ userId?: number
+ title?: string
+}
+
+export default function Sample() {
+ const [postNumber, setPostNumber] = useState(1)
+
+ // * key는 반드시 배열
+ const { data, isLoading, error } = useQuery(
+ ['post', postNumber],
+ () => getPosts(postNumber),
+ {
+ // * staleTiem : fresh 상태일 때는 Refetch 트리거(위의 3가지 경우)가 발생해도 Refetch가 일어나지 않는다!
+ staleTime: 1000 * 60 * 5,
+ // * inactive상태일 때 (unmount시 inactive) fetch하는 동안 임시로!! 보여줄 데이터
+ // * cacheTime이 지나면 gb에 의해 삭제된다.
+ cacheTime: 1000 * 60 * 5
+ }
+ )
+
+ const [post, setPost] = useState(data ? data : {})
+ // https://jsonplaceholder.typicode.com/posts/1
+
+ // ! 이 로직은 필요 없음 지워서 보여주기
+ // ! 이 로직을 작성해둔 이유는 서버 상태를
+ // ! 클라이언트에서 어떻개 관리할 수 있는지 알려주기 위함! (여기서 context API, Redux, Recoil, Mobx)등을 추가하면 됨
+ useEffect(() => {
+ // * 빈 배열은 true이기 때문에 return되지 않습니다! 'undefined'만 early return 됩니다!
+ if (typeof data === 'undefined') return
+ setPost(data ? data : {})
+ }, [data])
+
+ if (error) {
+ console.error(error)
+ }
+
+ return (
+
+
React query sample
+
+ {post && !isLoading && (
+
+ 포스트 제목 :
{post.title}
+
+ )}
+
+
+
+ {'get post를 누르면 '}
+
{postNumber}
+ {'번째 포스트가 나옵니다.'}
+
+
setPostNumber((prev) => prev + 1)}>Increse Post Number
+
setPostNumber((prev) => prev - 1)}>Decrese Post Number
+
+
+ )
+}
diff --git a/src/pages/Sample/Schedule.tsx b/src/pages/Sample/Schedule.tsx
new file mode 100644
index 00000000..a906d7ca
--- /dev/null
+++ b/src/pages/Sample/Schedule.tsx
@@ -0,0 +1,92 @@
+import api from '@/api'
+import Banner from '@/components/Banner'
+import SideBar from '@/components/SideBar'
+import { ACCESS_TOKEN, DATE_REQEUST_FORMAT } from '@/constants'
+import dayjs from 'dayjs'
+import React, { useState } from 'react'
+import { useCookies } from 'react-cookie'
+
+export default function ScheduleAddTestPage() {
+ const [cookie] = useCookies([ACCESS_TOKEN])
+ const [file, setFile] = useState()
+ const [title, setTitle] = useState('')
+ const [scheduleStart, setScheduleStart] = useState('')
+ const [scheduleEnd, setScheduleEnd] = useState('')
+ const [description, setDescription] = useState('')
+
+ const handleSubmit = () => {
+ // * 2021-10-01T00:00:00 시간정보는 없기 때문에 이런식으로 보냅니다.
+ // eslint-disable-next-line quotes
+ const formData = new FormData()
+ formData.append('file', file as Blob)
+ formData.append(
+ 'dto',
+ new Blob(
+ [
+ JSON.stringify({
+ title: title,
+ scheduleStart: dayjs(scheduleStart).format(DATE_REQEUST_FORMAT),
+ scheduleEnd: dayjs(scheduleEnd).format(DATE_REQEUST_FORMAT),
+ description: description
+ })
+ ],
+ {
+ type: 'application/json'
+ }
+ )
+ )
+ api('/admin/schedule/create', {
+ method: 'POST',
+ data: formData,
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ Authorization: `Bearer ${cookie.AccessToken}`
+ }
+ })
+ .then((res) => {
+ console.info(res)
+ })
+ .catch((err) => {
+ console.info(err)
+ })
+ }
+
+ return (
+
+
+ {/* max-w-[1432px] px-[0.25rem]는 켈린더 최대 너비입니다. */}
+
+
+
+ )
+}
diff --git a/src/pages/Sample/SignInAPITestPage.tsx b/src/pages/Sample/SignInAPITestPage.tsx
new file mode 100644
index 00000000..d8c31602
--- /dev/null
+++ b/src/pages/Sample/SignInAPITestPage.tsx
@@ -0,0 +1,44 @@
+import { DATE_ROUTE_FORMAT } from '@/constants'
+import useUser from '@/hooks/user'
+import dayjs from 'dayjs'
+import React, { useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { toast } from 'react-toastify'
+
+export default function SignInAPITestPage() {
+ const navigate = useNavigate()
+ const [email, setEmail] = useState('')
+ const [password, setPassword] = useState('')
+ const { login } = useUser()
+
+ const onClick = async () => {
+ const loggedIn = await login(email, password)
+ if (loggedIn) {
+ const currentDate = dayjs(new Date()).format(DATE_ROUTE_FORMAT)
+ navigate('/calendar/' + currentDate)
+ return
+ }
+ toast.error('로그인에 실패하였습니다.')
+ }
+
+ return (
+
+
로그인 페이지 입니다. 매니저는 manager1@test.io
+
유저는 fan1@test.io
+
비밀번호는 p@ssw0rd
+
setEmail(e.target.value)}
+ />
+
setPassword(e.target.value)}
+ />
+
+ 로그인
+
+
+ )
+}
diff --git a/src/pages/Sample/SignUpTestPage.tsx b/src/pages/Sample/SignUpTestPage.tsx
new file mode 100644
index 00000000..14ca6ad0
--- /dev/null
+++ b/src/pages/Sample/SignUpTestPage.tsx
@@ -0,0 +1,108 @@
+import api from '@/api'
+import React, { useState, FormEvent } from 'react'
+import { toast } from 'react-toastify'
+
+export default function SignUpTestPage() {
+ const [imgSrc, setImgSrc] = useState({} as File)
+ const [role, setRole] = useState('USER' as 'ADMIN' | 'USER')
+ const [username, setUsername] = useState('')
+ const [password, setPassword] = useState('')
+ const [email, setEmail] = useState('')
+
+ const onSubmit = (e: FormEvent) => {
+ e.preventDefault()
+ if (!username || !password || !email || (role !== 'ADMIN' && role !== 'USER')) {
+ toast.warn('인풋을 채워주세요!')
+ return
+ }
+ const formData = new FormData()
+ formData.append('file', imgSrc)
+ formData.append(
+ 'dto',
+ new Blob(
+ [
+ JSON.stringify({
+ fullName: username,
+ password: password,
+ email: email,
+ role: role
+ })
+ ],
+ {
+ type: 'application/json'
+ }
+ )
+ )
+ api('/join', {
+ method: 'POST',
+ data: formData,
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ })
+ .then((res) => console.info(res.data))
+ .catch((err) => console.error(err))
+ }
+
+ // ! 예시입니다. 지금은 URL string으로 이미지를 보내고 있습니다.
+ const handleChangeFile = (event: React.ChangeEvent) => {
+ const files = event.target.files
+ if (files && files.length > 0) {
+ const file = files[0]
+ setImgSrc(file)
+
+ // const reader = new FileReader()
+ // reader.onloadend = () => {
+ // const base64 = reader.result
+ // if (base64) {
+ // const str = base64?.toString()
+ // if (str && str.length > 1048576) {
+ // alert('이미지는 1MB이하여야합니다!')
+ // return
+ // }
+ // setImgSrc(base64.toString())
+ // }
+ // }
+ // reader.readAsDataURL(file)
+ }
+ }
+
+ return (
+
+ sign up test page
+
+
+ )
+}
diff --git a/src/pages/Schedule.tsx b/src/pages/Schedule.tsx
new file mode 100644
index 00000000..afd4f05d
--- /dev/null
+++ b/src/pages/Schedule.tsx
@@ -0,0 +1,5 @@
+import React from 'react'
+
+export default function Schedule() {
+ return 스케줄 페이지
+}
diff --git a/src/pages/SignInPage.tsx b/src/pages/SignInPage.tsx
new file mode 100644
index 00000000..fda74494
--- /dev/null
+++ b/src/pages/SignInPage.tsx
@@ -0,0 +1,116 @@
+import React, { useState, ChangeEvent, FormEvent } from 'react'
+import { Link } from 'react-router-dom'
+import useUser from '@/hooks/user'
+import dayjs from 'dayjs'
+import { DATE_ROUTE_FORMAT } from '@/constants'
+import { toast } from 'react-toastify'
+
+export default function SignUpPage() {
+ const { login } = useUser()
+ const failToast = () => toast.error('아이디 또는 비밀번호를 다시 확인해주세요!')
+
+ const handleSignIn = async (e: FormEvent) => {
+ e.preventDefault()
+
+ if (emailValid && passwordValid) {
+ const loggedIn = await login(email, password)
+ if (loggedIn) {
+ window.location.replace(`/calendar/${dayjs(new Date()).format(DATE_ROUTE_FORMAT)}`)
+ } else {
+ failToast()
+ }
+ }
+ }
+
+ const validatePassword = (value: string) => {
+ const regex = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#^?&\\()\-=+])[A-Za-z\d$@$!%*#^?&\\()\-=+]{8,20}$/
+ return regex.test(value)
+ }
+
+ const validateEmail = (value: string) => {
+ const regex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{2,})$/i
+ return regex.test(value)
+ }
+
+ const [email, setEmail] = useState('')
+ const [password, setPassword] = useState('')
+ const [emailValid, setEmailValid] = useState(false)
+ const [passwordValid, setPasswordValid] = useState(false)
+
+ const handleEmailChange = (e: ChangeEvent) => {
+ const newEmail = e.target.value
+ setEmail(newEmail)
+ setEmailValid(validateEmail(newEmail))
+ }
+
+ const handlePasswordChange = (e: ChangeEvent) => {
+ const newPassword = e.target.value
+ setPassword(newPassword)
+ setPasswordValid(validatePassword(newPassword))
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+ 아직 계정이 없으신가요?
+
+ 회원가입
+
+
+
+
+ )
+}
diff --git a/src/pages/SignupPage.tsx b/src/pages/SignupPage.tsx
new file mode 100644
index 00000000..d17f2076
--- /dev/null
+++ b/src/pages/SignupPage.tsx
@@ -0,0 +1,252 @@
+import { Link, useNavigate } from 'react-router-dom'
+import React, { useState, ChangeEvent } from 'react'
+import { AiFillPlusCircle } from 'react-icons/ai'
+import { MdInfo } from 'react-icons/md'
+import api from '@/api'
+import { toast } from 'react-toastify'
+
+const SignupPage = (): JSX.Element => {
+ const navigate = useNavigate()
+ // 회원가입 폼 요소들의 상태 관리
+ const [email, setEmail] = useState('')
+ const [password, setPassword] = useState('')
+ const [passwordConfirm, setPasswordConfirm] = useState('')
+ const [fullName, setFullName] = useState('')
+ const [profileImg, setProfileImg] = useState('')
+ const [file, setFile] = useState()
+
+ // 이메일, 비밀번호 형식 체크를 위한 상태 관리
+ const [passwordLength, setPasswordLength] = useState('')
+ const [emailError, setEmailError] = useState('')
+ const [passwordMatch, setPasswordMatch] = useState('')
+
+ const imageOverSize = () => toast.error('프로필 이미지 크기는 1MB 이하여야 합니다.')
+ const successToast = () => toast.success('회원가입이 성공적으로 완료되었습니다.')
+ const failToast = () => toast.error('회원가입에 실패하였습니다.')
+ const requireToast = () => toast.error('필수 정보를 입력해주세요.')
+
+ // 이메일 체크
+ const handleEmailCheck = (e: ChangeEvent): void => {
+ const newEmail = e.target.value
+ setEmail(newEmail)
+
+ if (!newEmail.includes('@') || !newEmail.includes('.')) {
+ setEmailError('올바른 이메일 형식을 입력해 주세요.')
+ } else {
+ setEmailError('')
+ }
+ }
+
+ // 비밀번호 체크
+ const handlePasswordLength = (e: ChangeEvent): void => {
+ const newPassword = e.target.value
+ setPassword(newPassword)
+
+ const regex =
+ /^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#^?&\\()\-=+])[A-Za-z\d$@$!%*#^?&\\()\-=+]{8,20}$/
+ if (regex.test(newPassword)) {
+ setPasswordLength('')
+ } else {
+ setPasswordLength('비밀번호는 영문, 숫자, 특수문자 조합 8~20자 이내로 입력해주세요.')
+ }
+ }
+
+ // 비밀번호 확인 체크
+ const handlePasswordConfirm = (e: ChangeEvent): void => {
+ const confirmPassword = e.target.value
+ setPasswordConfirm(confirmPassword)
+
+ if (confirmPassword !== password) {
+ setPasswordMatch('비밀번호가 일치하지 않습니다.')
+ } else {
+ setPasswordMatch('')
+ }
+ }
+
+ // 이미지 클 경우
+ const uploadImage = (e: ChangeEvent): void => {
+ const files = e.target.files as FileList
+ const file = files[0]
+ const maxSize = 1024 * 1024 // 1MB
+
+ if (file.size > maxSize) {
+ imageOverSize()
+ return
+ }
+ setFile(file)
+ const reader = new FileReader()
+ reader.readAsDataURL(file)
+ reader.addEventListener('load', (e) => {
+ setProfileImg(e.target?.result as string)
+ })
+ }
+
+ // 회원가입 요청을 보내는 함수
+ const signUp = async (e: React.FormEvent) => {
+ e.preventDefault()
+ try {
+ if (!email || !password || !passwordConfirm || !fullName || !profileImg || !file) {
+ requireToast()
+ return
+ }
+ const formData = new FormData()
+ formData.append('file', file)
+ formData.append(
+ 'dto',
+ new Blob(
+ [
+ JSON.stringify({
+ fullName,
+ password: password,
+ email: email,
+ role: 'USER'
+ })
+ ],
+ {
+ type: 'application/json'
+ }
+ )
+ )
+ await api({
+ url: '/join',
+ method: 'POST',
+ data: formData,
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ })
+ successToast()
+ navigate('/login')
+ } catch (error) {
+ failToast()
+ }
+ }
+
+ return (
+
+
+
회원가입
+
+
+
+ 이미 계정이 있으신가요?
+
+ 로그인 전환
+
+
+
+
+ )
+}
+
+export default SignupPage
diff --git a/src/pages/User/Edit.tsx b/src/pages/User/Edit.tsx
new file mode 100644
index 00000000..a4fdef42
--- /dev/null
+++ b/src/pages/User/Edit.tsx
@@ -0,0 +1,238 @@
+import React, { useEffect, useState } from 'react'
+import Button from '@/components/ui/Button'
+import { getProfileUpdatePage, updateUserInformation, uploadProfileImage } from '@/api/user/edit'
+import { useCookies } from 'react-cookie'
+import { ACCESS_TOKEN, DATE_ROUTE_FORMAT } from '@/constants'
+import { toast } from 'react-toastify'
+import { useNavigate } from 'react-router-dom'
+import dayjs from 'dayjs'
+
+export default function Edit() {
+ const navigate = useNavigate()
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const [cookies, setCookie, removeCookie] = useCookies([ACCESS_TOKEN])
+ const [name, setName] = useState('')
+ const [email, setEmail] = useState('')
+ const [newPassword, setNewPassword] = useState('')
+ const [confirmPassword, setConfirmPassword] = useState('')
+ const [profileImage, setProfileImage] = useState(null)
+ const [uploadedImage, setUploadedImage] = useState(null) // 업로드할 이미지 파일을 상태로 관리
+ const [role, setRole] = useState('')
+
+ // getProfileUpdatePage
+ // 프로필 수정 페이지에 처음 접속할 때, 현재 사용자의 프로필 정보를 불러오는 역할
+ // useEffect 훅으로 렌더링 될 때 가져와서 상태에 저장
+ useEffect(() => {
+ async function fetchProfileInfo() {
+ try {
+ const profileInfo = await getProfileUpdatePage(cookies[ACCESS_TOKEN])
+ if (profileInfo) {
+ setName(profileInfo.fullName)
+ setEmail(profileInfo.email)
+ setProfileImage(profileInfo.profileImage)
+ setRole(profileInfo.role)
+ }
+ } catch (error) {
+ console.error('프로필 정보 가져오기 오류:', error)
+ }
+ }
+
+ fetchProfileInfo()
+ }, [cookies])
+
+ const handleNameChange = (e: React.ChangeEvent) => {
+ setName(e.target.value)
+ }
+
+ const handleNewPasswordChange = (e: React.ChangeEvent) => {
+ setNewPassword(e.target.value)
+ }
+
+ const handleConfirmPasswordChange = (e: React.ChangeEvent) => {
+ setConfirmPassword(e.target.value)
+ }
+
+ // handleImageUpload 함수는 프로필 이미지를 선택하고 업로드하는 역할
+ // 프로필 이미지를 선택하고 업로드하는 역할
+
+ // uploadProfileImage 함수를 호출해서 실제로 이미지를 업로드하고 서버에 저장
+ // 업로드한 이미지 URL을 받아서 상태 변수 profileImage에 저장
+
+ const handleImageUpload = (e: React.ChangeEvent) => {
+ if (e.target.files && e.target.files[0]) {
+ const selectedFile = e.target.files[0] as File
+ setUploadedImage(selectedFile) // 업로드할 이미지 파일 상태 업데이트
+ const fileReader = new FileReader()
+ fileReader.onload = (event) => {
+ const uploadedImageUrl = event.target?.result as string
+ setProfileImage(uploadedImageUrl) // 임시 프로필 이미지 상태 업데이트
+ }
+ fileReader.readAsDataURL(selectedFile)
+ }
+ }
+
+ // '취소' 버튼을 클릭했을 때 실행
+ const handleCancel = async () => {
+ toast('회원 정보 수정이 취소되었습니다.', {
+ position: 'top-center'
+ })
+ if (role === 'USER') {
+ return navigate('/user/mypage')
+ }
+ return navigate(`/calendar/${dayjs(new Date()).format(DATE_ROUTE_FORMAT)}`)
+ }
+
+ // 수정 완료 버튼을 클릭했을때 비밀번호 변경 누락...빠르게 다시 수정!!!
+
+ // '수정 완료' 버튼을 클릭했을 때 실행되는 로직
+ // 사용자가 입력한 변경 사항을 서버로 전송하여 프로필 정보를 업데이트
+ const handleEditComplete = async () => {
+ try {
+ if (!newPassword || !confirmPassword) {
+ toast.warn('비밀번호와 비밀번호 확인을 모두 입력해주세요.')
+ return
+ }
+
+ if (newPassword !== confirmPassword) {
+ toast.error('비밀번호가 일치하지 않습니다.')
+ return
+ }
+
+ if (newPassword.length < 8 || !/[!@#$%^&*()_+{}[\]:;<>,.?~\-=/\\]/.test(newPassword)) {
+ toast.error('비밀번호는 특수문자를 포함하고, 최소 8자 이상 입력해주세요.')
+ return
+ }
+
+ await updateUserInformation(cookies[ACCESS_TOKEN], name, newPassword)
+
+ if (uploadedImage) {
+ // 업로드된 이미지가 있다면 실행
+ await uploadProfileImage(cookies[ACCESS_TOKEN], uploadedImage) // 서버에 이미지 업로드
+ }
+
+ // 수정 완료 후 추가 동작
+ setProfileImage(null) // 프로필 이미지 초기화
+ setUploadedImage(null) // 업로드된 이미지 파일 상태 초기화
+ removeCookie(ACCESS_TOKEN, { path: '/' })
+ alert('회원 정보 수정이 완료되었습니다. 다시 로그인해주세요.')
+ window.location.replace('/login')
+ } catch (error) {
+ console.error('에러 발생:', error)
+ }
+ }
+
+ return (
+
+
+
+
+ {profileImage !== null ? (
+
+ ) : (
+
+ )}
+
+
+
+ 이미지 수정
+
+
+
+
+
+
+
+ 계정
+
+
+
+
+ 이메일
+
+
{email}
{/* 이메일 값 출력 */}
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/pages/User/MyPage.tsx b/src/pages/User/MyPage.tsx
new file mode 100644
index 00000000..4fb9a9fb
--- /dev/null
+++ b/src/pages/User/MyPage.tsx
@@ -0,0 +1,69 @@
+import React from 'react'
+// import FullProfile from '@/components/FullProfile'
+import useUser from '@/hooks/user'
+import { useNavigate } from 'react-router-dom'
+import ReserveDetail from '@/components/user/ReserveDetail'
+import userDefaultImg from '/mock_image/user_default.png'
+import { toast } from 'react-toastify'
+
+export default function MyPage() {
+ const navigate = useNavigate()
+ const { getUserInfo } = useUser()
+ const fan = getUserInfo()
+
+ if (fan.role !== 'USER') {
+ toast.warn('관리자는 접근할 수 없는 페이지입니다.')
+ navigate('/login')
+ return
+ }
+
+ const defaultprofileImage = userDefaultImg
+
+ return (
+
+
+
+
+ {/* 프로필 이미지 */}
+
+ {fan.profileImage ? (
+
+ ) : (
+
+ )}
+
{fan.fullName}
+
{fan.email}
+
+
+ {/* 프로필 배경 이미지 */}
+ {fan.profileImage ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+ )
+}
diff --git a/src/utils/calendar.ts b/src/utils/calendar.ts
new file mode 100644
index 00000000..8b4ae2eb
--- /dev/null
+++ b/src/utils/calendar.ts
@@ -0,0 +1,154 @@
+import { toast } from 'react-toastify'
+import type { DirectionType } from '@/components/ui/ArrowButton'
+import { DATE_FORMAT, DATE_ROUTE_FORMAT } from '@/constants'
+import type { ProviderSchedule } from '@/models/schedule'
+import dayjs from 'dayjs'
+import 'dayjs/locale/ko'
+
+/**
+ * @description 캘린더의 이동 방향과(차월, 익월) 현재 날짜를 받아서 다음 켈린더 URL을 반환
+ * */
+export function swipeCalendar(
+ direction: DirectionType,
+ p: { year: number; month: number; today?: string; path: string }
+) {
+ const { month, year, today, path } = p
+ // * 현재 day를 계산
+ const date = new Date()
+ const currentMonth = month + (direction === 'left' ? -1 : 1)
+ const day = date.getMonth() + 1 === currentMonth ? date.getDate() : 1
+ if (direction === 'left') {
+ const prevDate = dayjs(`${year}/${month}/${today ? today : day}`).subtract(1, 'month')
+ return `${path}/${dayjs(prevDate).format(DATE_ROUTE_FORMAT)}`
+ }
+ if (direction === 'right') {
+ return `${path}/${dayjs(dayjs(`${year}/${currentMonth}/${today ? today : day}`)).format(
+ DATE_ROUTE_FORMAT
+ )}`
+ }
+ toast.warn('잘못된 접근입니다.')
+ // todo 비정상적 주소 이동 어떻게 처리할지 정하기
+ return `${path}/${year}/${month}/1`
+}
+
+/**
+ * @description 켈린더의 이동방향에 맞게 애니메이션을 추가
+ */
+export function appendSwipeAnimation(id: string, direction: DirectionType) {
+ if (typeof window === 'undefined') return
+ const calendar = document.getElementById(id)
+ calendar?.classList.remove('move-from-left')
+ calendar?.classList.remove('move-from-right')
+ if (direction === 'left') setTimeout(() => calendar?.classList.add('move-from-left'))
+ if (direction === 'right') setTimeout(() => calendar?.classList.add('move-from-right'))
+}
+
+// * 임의의 3가지 색, 색깔이 정해지면 수정해야합니다.
+export function getDailyColor(idx: number) {
+ let color = idx % 7 === 0 ? 'text-main font-bold' : 'text-main font-bold'
+ if (idx % 7 === 6) color = 'text-main font-bold'
+ return color
+}
+
+export type SchedulePosition = 'start' | 'between' | 'end' | 'start-end'
+export type ProviderScheduleWithPos = ProviderSchedule & { pos: SchedulePosition; restItem: number }
+
+/**
+ * @description schedule들을 받아서 가공합니다. ProviderScheduleWithPos[] 형태로 반환합니다.
+ */
+export function getProviderSchdule(
+ schedule: ProviderSchedule[] | undefined,
+ date: string
+): ProviderScheduleWithPos[] {
+ if (typeof schedule === 'undefined') return []
+ const filtetedSchedule = schedule.filter((s) => s.startDate <= date && s.endDate >= date)
+ const prevSchedule = schedule.filter(
+ (s) =>
+ s.startDate <= dayjs(date).subtract(1, 'day').format(DATE_FORMAT) &&
+ s.endDate >= dayjs(date).subtract(1, 'day').format(DATE_FORMAT)
+ )
+
+ const restItem = filtetedSchedule.length > 2 ? filtetedSchedule.length - 2 : 0
+ const providerSchedule: ProviderScheduleWithPos[] = Array(100).fill(null)
+ filtetedSchedule
+ .map((s) => {
+ // * position 속성 추가 설정
+ let pos: SchedulePosition = 'between'
+ if (s.startDate === date) pos = 'start'
+ if (s.endDate === date) pos = 'end'
+
+ if (dayjs(date).format('ddd') === '일') {
+ if (s.startDate <= date && s.endDate >= date) pos = 'start'
+ if (s.endDate === date && s.startDate !== date) pos = 'start-end'
+ }
+ if (s.startDate === date && s.endDate === date) pos = 'start-end'
+ return { ...s, pos, restItem }
+ })
+ .forEach((s) => {
+ // * 하루 전 스케줄과 오늘 스케줄을 비교해서 적절한 인덱스에 스케줄을 넣는다.
+ const pi = prevSchedule.findIndex((ps) => ps.id === s.id)
+ if (pi !== -1) {
+ // if (pi == 2 && providerSchedule[pi] === null) {
+ // if (providerSchedule[0] === null)
+ // providerSchedule[0] = { ...s, pos: 'start', startDate: date }
+ // else {
+ // providerSchedule[pi] = { ...s, pos: 'start', startDate: date }
+ // }
+ // } else {
+ providerSchedule[pi] = { ...s }
+ // }
+ return
+ } else {
+ for (let j = 0; j < providerSchedule.length; j++) {
+ if (providerSchedule[j] === null) {
+ providerSchedule[j] = { ...s }
+ break
+ }
+ }
+ }
+ })
+ return providerSchedule.filter((s) => s !== null)
+}
+
+// * 현재 달, 이전 달, 다음 달의 날짜를 구해서 배열로 반환
+export function caculateDailyIdx(year: number, month: number) {
+ const date = dayjs(`${year}-${month}-01`)
+
+ // * 오늘의 년 월 일, 시작 요일(월~일) 구하기
+ dayjs.locale('ko')
+ const lastDay = date.endOf('month').date()
+ const startDay = date.format('ddd')
+ const weeks = ['일', '월', '화', '수', '목', '금', '토']
+
+ // * 첫 주 중 며칠이 1일인지 구하기
+ let startDateIdx = 0
+ for (let i = 0; i < weeks.length; i++) {
+ if (weeks[i] === startDay) {
+ startDateIdx = i
+ break
+ }
+ }
+
+ // * 다음 달의 마지막 일 구하기 (30일 | 31일 | 28일)
+ const prevDate = date.subtract(1, 'day').format(DATE_FORMAT)
+
+ // * 칸에 맞춰서 일자를 채워 넣기 (7 * 6 달력으로 고정)
+ const nextDate = date.add(1, 'month').format(DATE_FORMAT)
+
+ let nextIdx = 0
+
+ const dailyIndex = Array(weeks[startDateIdx] === '토' ? 42 : 35)
+ .fill(0)
+ .map((_, i) => {
+ if (i < startDateIdx)
+ // prettier-ignore
+ return `${dayjs(prevDate).subtract(startDateIdx - i - 1, 'days').format(DATE_FORMAT)}`
+ if (i - startDateIdx + 1 > lastDay)
+ // prettier-ignore
+ return `${dayjs(nextDate).add(nextIdx++, 'day').format(DATE_FORMAT)}`
+
+ // * 현제 날짜
+ return dayjs(`${year}-${month}-${i - startDateIdx + 1}`).format(DATE_FORMAT)
+ })
+ return dailyIndex
+}
diff --git a/src/utils/index.ts b/src/utils/index.ts
new file mode 100644
index 00000000..8f993b36
--- /dev/null
+++ b/src/utils/index.ts
@@ -0,0 +1,11 @@
+// * mock API 테스트용 delay 함수
+
+/**
+ * @description mock API 테스트용 delay 함수
+ */
+export const delay = async (mock: T, ms: number): Promise =>
+ new Promise((response) =>
+ setTimeout(() => {
+ response(mock)
+ }, ms)
+ )
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 00000000..11f02fe2
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 00000000..3b5e958f
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,46 @@
+export default {
+ content: ['./src/**/*.{js,jsx,ts,tsx}'],
+
+ theme: {
+ colors: (theme) => {
+ return {
+ ...theme.colors,
+ main: '#6C27FF',
+ point: '#FF00A5',
+ wait: '#FFA800',
+ confirm: '#00C2FF',
+ white: '#FFFFFF',
+ black: '#000000',
+ hover: '#411b92',
+ weekend: '#E5F2F6',
+ weekday: '#F0FBFF',
+ boxline: '#E9E9E9',
+ boxbg: '#F4F3F3',
+ inputbox: '#F6F6F6'
+ }
+ },
+ screens: {
+ sm: '480px',
+ md: '1080px',
+ lg: '1280px'
+ },
+ extend: {
+ gridTemplateColumns: {
+ 'cal-frame-w': 'minmax(150px, 300px) 1fr',
+ 'cal-w': 'repeat(7, minmax(50px, 200px))'
+ },
+ gridTemplateRows: {
+ 'cal-h-13': '30px repeat(6, auto) '
+ },
+ height: {
+ '98vh': '98vh'
+ },
+ fontFamily: {
+ 'gmarket': ['GmarketSans', 'sans-serif']
+ }
+ }
+ },
+
+ // eslint-disable-next-line no-undef
+ plugins: [require('tailwind-scrollbar-hide')]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..00e621b3
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "target": "ES2015",
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "baseUrl": "./src",
+ "paths": {
+ "@/*": ["*"]
+ },
+
+ /* Bundler mode */
+ "moduleResolution": "Bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react",
+ "allowJs": true,
+
+ /* Linting */
+ "strict": true
+ },
+ "include": ["src"],
+ "exclude": ["node_modules"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 00000000..3adda81a
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vercel.json b/vercel.json
new file mode 100644
index 00000000..3a48e56b
--- /dev/null
+++ b/vercel.json
@@ -0,0 +1,3 @@
+{
+ "rewrites": [{ "source": "/(.*)", "destination": "/" }]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 00000000..34bad9ae
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+import tsconfigPaths from 'vite-tsconfig-paths'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ preview : {
+ port : 5173
+ },
+ plugins: [react(), tsconfigPaths()]
+}
+)