commit 6c931c1fe8756c983229389ae68822af5188825b Author: louiscklaw Date: Mon Apr 14 09:26:24 2025 +0800 build ok, diff --git a/002_source/cms/.editorconfig b/002_source/cms/.editorconfig new file mode 100644 index 0000000..37d38bb --- /dev/null +++ b/002_source/cms/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/002_source/cms/.env.example b/002_source/cms/.env.example new file mode 100644 index 0000000..f72d9d8 --- /dev/null +++ b/002_source/cms/.env.example @@ -0,0 +1,40 @@ +# App +NEXT_PUBLIC_SITE_URL= +NEXT_PUBLIC_SITE_VERSION= + +# Logger +NEXT_PUBLIC_LOG_LEVEL= + +# Auth +NEXT_PUBLIC_AUTH_STRATEGY= + +# Auth0 +AUTH0_SECRET= +AUTH0_BASE_URL= +AUTH0_ISSUER_BASE_URL= +AUTH0_CLIENT_ID= +AUTH0_CLIENT_SECRET= + +# AWS Cognito +NEXT_PUBLIC_COGNITO_IDENTITY_POOL_ID= +NEXT_PUBLIC_COGNITO_USER_POOL_CLIENT_ID= +NEXT_PUBLIC_COGNITO_USER_POOL_ID= + +# Firebase +NEXT_PUBLIC_FIREBASE_API_KEY= +NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN= +NEXT_PUBLIC_FIREBASE_PROJECT_ID= +NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET= +NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID= +NEXT_PUBLIC_FIREBASE_APP_ID= + +# Supabase +NEXT_PUBLIC_SUPABASE_REF_ID= +NEXT_PUBLIC_SUPABASE_URL= +NEXT_PUBLIC_SUPABASE_ANON_KEY= + +# Mapbox +NEXT_PUBLIC_MAPBOX_API_KEY= + +# Google Tag Manager +NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ID= \ No newline at end of file diff --git a/002_source/cms/.eslintrc.js b/002_source/cms/.eslintrc.js new file mode 100644 index 0000000..4bfd700 --- /dev/null +++ b/002_source/cms/.eslintrc.js @@ -0,0 +1,76 @@ +const { resolve } = require('node:path'); + +const project = resolve(__dirname, 'tsconfig.json'); + +module.exports = { + root: true, + extends: [ + require.resolve('@vercel/style-guide/eslint/node'), + require.resolve('@vercel/style-guide/eslint/typescript'), + require.resolve('@vercel/style-guide/eslint/browser'), + require.resolve('@vercel/style-guide/eslint/react'), + require.resolve('@vercel/style-guide/eslint/next'), + ], + parserOptions: { + project, + }, + settings: { + 'import/resolver': { + typescript: { + project, + }, + }, + }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + ignoreRestSiblings: true, + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/no-empty-interface': [ + 'error', + { + allowSingleExtends: true, + }, + ], + '@typescript-eslint/no-shadow': [ + 'error', + { + ignoreOnInitialization: true, + }, + ], + + 'import/newline-after-import': 'error', + 'react/jsx-uses-react': 'error', + 'react/react-in-jsx-scope': 'error', + 'unicorn/filename-case': [ + 'error', + { + cases: { + kebabCase: true, // personal style + pascalCase: true, + }, + }, + ], + + // Deactivated + '@typescript-eslint/dot-notation': 'off', // paths are used with a dot notation + '@typescript-eslint/no-misused-promises': 'off', // onClick with async fails + '@typescript-eslint/no-non-null-assertion': 'off', // sometimes compiler is unable to detect + '@typescript-eslint/no-unnecessary-condition': 'off', // remove when no static data is used + '@typescript-eslint/require-await': 'off', // Server Actions require async flag always + 'import/no-default-export': 'off', // Next.js components must be exported as default + 'import/no-extraneous-dependencies': 'off', // conflict with sort-imports plugin + 'import/order': 'off', // using custom sort plugin + 'no-nested-ternary': 'off', // personal style + 'no-redeclare': 'off', // conflict with TypeScript function overloads + 'react/jsx-fragments': 'off', // personal style + 'react/prop-types': 'off', // TypeScript is used for type checking + '@next/next/no-img-element': 'off', // Temporary disabled + }, + ignorePatterns: ['**/*del', '**/*bak'], +}; diff --git a/002_source/cms/.gitattributes b/002_source/cms/.gitattributes new file mode 100644 index 0000000..fbd75d3 --- /dev/null +++ b/002_source/cms/.gitattributes @@ -0,0 +1 @@ +* text=lf \ No newline at end of file diff --git a/002_source/cms/.gitignore b/002_source/cms/.gitignore new file mode 100644 index 0000000..4b435ba --- /dev/null +++ b/002_source/cms/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem +.swc + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/002_source/cms/.prettierignore b/002_source/cms/.prettierignore new file mode 100644 index 0000000..fb229ca --- /dev/null +++ b/002_source/cms/.prettierignore @@ -0,0 +1,21 @@ +*bak +*log +*tmp +*del +*copy.* +*copy*.* + +# --- +# Dependencies +node_modules + +# Next.js +.next +build + +# Lock files +package-lock.json + +# Misc +dist +public \ No newline at end of file diff --git a/002_source/cms/README.md b/002_source/cms/README.md new file mode 100644 index 0000000..3391235 --- /dev/null +++ b/002_source/cms/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. + +[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. + +The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/002_source/cms/jest.config.mjs b/002_source/cms/jest.config.mjs new file mode 100644 index 0000000..df3cd3c --- /dev/null +++ b/002_source/cms/jest.config.mjs @@ -0,0 +1,15 @@ +import nextJest from 'next/jest.js'; + +const createJestConfig = nextJest({ + dir: './', +}); + +/** @type {import('jest').Config} */ +const config = { + testEnvironment: 'jest-environment-jsdom', + moduleNameMapper: { + '^@/(.*)$': '/src/$1', + }, +}; + +export default createJestConfig(config); diff --git a/002_source/cms/next.config.mjs b/002_source/cms/next.config.mjs new file mode 100644 index 0000000..836e4e7 --- /dev/null +++ b/002_source/cms/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const config = {}; + +export default config; diff --git a/002_source/cms/package.json b/002_source/cms/package.json new file mode 100644 index 0000000..b99eb2f --- /dev/null +++ b/002_source/cms/package.json @@ -0,0 +1,114 @@ +{ + "name": "@devias-kit-pro/nextjs-template", + "author": "Devias IO", + "version": "7.0.0", + "private": true, + "engines": { + "node": ">=18" + }, + "scripts": { + "dev": "rm -rf .next && next dev", + "build": "next build", + "build:w": "pnpx nodemon --ext ts,tsx,json --delay 1 --exec \"pnpm run build\"", + "start": "next start", + "lint": "next lint --quiet", + "lint:fix": "next lint --fix", + "lint:w": "pnpx nodemon --ext ts,tsx,json --delay 2 --exec \"pnpm run lint\"", + "typecheck": "tsc --noEmit", + "format:write": "prettier --write \"**/*.{js,jsx,mjs,ts,tsx,mdx}\" --cache", + "format:check": "prettier --check \"**/*.{js,jsx,mjs,ts,tsx,mdx}\" --cache", + "format:fix": "prettier --write \"**/*.{js,jsx,mjs,ts,tsx,mdx}\" --cache", + "test": "jest --watch", + "update_doc:w": "pnpx nodemon --ext md --exec \"pnpm run update_doc\"", + "update_doc": "cd 001_documentation/Requirements && node update_req_index.js", + "update_repomix": "npx repomix", + "update_repomix:w": "pnpx nodemon --delay 3 --exec \"pnpx repomix\"", + "clean": "rm -rf node_modules && rm -rf .next" + }, + "dependencies": { + "@auth0/nextjs-auth0": "3.5.0", + "@aws-amplify/auth": "6.0.17", + "@dnd-kit/core": "6.1.0", + "@dnd-kit/sortable": "8.0.0", + "@dnd-kit/utilities": "3.2.2", + "@elgorditosalsero/react-gtm-hook": "2.7.2", + "@emotion/cache": "11.11.0", + "@emotion/react": "11.11.3", + "@emotion/server": "11.11.0", + "@emotion/styled": "11.11.0", + "@fontsource/inter": "5.0.16", + "@fontsource/plus-jakarta-sans": "5.0.18", + "@fontsource/roboto-mono": "5.0.16", + "@fullcalendar/core": "6.1.11", + "@fullcalendar/daygrid": "6.1.11", + "@fullcalendar/interaction": "6.1.11", + "@fullcalendar/list": "6.1.11", + "@fullcalendar/react": "6.1.11", + "@fullcalendar/timegrid": "6.1.11", + "@fullcalendar/timeline": "6.1.11", + "@hookform/resolvers": "3.3.4", + "@mui/lab": "5.0.0-alpha.166", + "@mui/material": "5.15.11", + "@mui/system": "5.15.11", + "@mui/utils": "5.15.11", + "@mui/x-date-pickers": "6.19.5", + "@phosphor-icons/react": "2.0.15", + "@react-pdf/renderer": "3.3.8", + "@supabase/ssr": "0.1.0", + "@supabase/supabase-js": "2.39.7", + "@tiptap/extension-link": "2.2.4", + "@tiptap/extension-placeholder": "2.2.4", + "@tiptap/react": "2.2.4", + "@tiptap/starter-kit": "2.2.4", + "aws-amplify": "6.0.17", + "dayjs": "1.11.10", + "embla-carousel": "8.0.0", + "embla-carousel-react": "8.0.0", + "firebase": "10.8.0", + "i18next": "23.10.0", + "i18next-http-backend": "2.5.0", + "mapbox-gl": "3.1.2", + "next": "14.1.0", + "next-i18next": "15.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-dropzone": "14.2.3", + "react-hook-form": "7.50.1", + "react-i18next": "14.0.5", + "react-map-gl": "7.1.7", + "react-markdown": "9.0.1", + "react-simple-maps": "3.0.0", + "react-syntax-highlighter": "15.5.0", + "recharts": "2.12.1", + "sonner": "1.4.1", + "stylis": "4.3.1", + "stylis-plugin-rtl": "2.1.1", + "zod": "3.22.4" + }, + "devDependencies": { + "@ianvs/prettier-plugin-sort-imports": "4.1.1", + "@testing-library/jest-dom": "6.4.2", + "@testing-library/react": "14.2.1", + "@types/jest": "29.5.12", + "@types/mapbox-gl": "3.1.0", + "@types/node": "20.11.20", + "@types/react": "18.2.58", + "@types/react-dom": "18.2.19", + "@types/react-simple-maps": "3.0.4", + "@types/react-syntax-highlighter": "15.5.11", + "@vercel/style-guide": "5.2.0", + "eslint": "8.57.0", + "eslint-config-next": "14.1.0", + "eslint-config-prettier": "9.1.0", + "jest": "29.7.0", + "jest-environment-jsdom": "29.7.0", + "prettier": "3.2.5", + "typescript": "5.3.3" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "core-js", + "protobufjs" + ] + } +} \ No newline at end of file diff --git a/002_source/cms/pnpm-lock.yaml b/002_source/cms/pnpm-lock.yaml new file mode 100644 index 0000000..f208ef1 --- /dev/null +++ b/002_source/cms/pnpm-lock.yaml @@ -0,0 +1,12246 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@auth0/nextjs-auth0': + specifier: 3.5.0 + version: 3.5.0(next@14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@aws-amplify/auth': + specifier: 6.0.17 + version: 6.0.17(@aws-amplify/core@6.0.17) + '@dnd-kit/core': + specifier: 6.1.0 + version: 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/sortable': + specifier: 8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@dnd-kit/utilities': + specifier: 3.2.2 + version: 3.2.2(react@18.2.0) + '@elgorditosalsero/react-gtm-hook': + specifier: 2.7.2 + version: 2.7.2(react@18.2.0) + '@emotion/cache': + specifier: 11.11.0 + version: 11.11.0 + '@emotion/react': + specifier: 11.11.3 + version: 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/server': + specifier: 11.11.0 + version: 11.11.0 + '@emotion/styled': + specifier: 11.11.0 + version: 11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@fontsource/inter': + specifier: 5.0.16 + version: 5.0.16 + '@fontsource/plus-jakarta-sans': + specifier: 5.0.18 + version: 5.0.18 + '@fontsource/roboto-mono': + specifier: 5.0.16 + version: 5.0.16 + '@fullcalendar/core': + specifier: 6.1.11 + version: 6.1.11 + '@fullcalendar/daygrid': + specifier: 6.1.11 + version: 6.1.11(@fullcalendar/core@6.1.11) + '@fullcalendar/interaction': + specifier: 6.1.11 + version: 6.1.11(@fullcalendar/core@6.1.11) + '@fullcalendar/list': + specifier: 6.1.11 + version: 6.1.11(@fullcalendar/core@6.1.11) + '@fullcalendar/react': + specifier: 6.1.11 + version: 6.1.11(@fullcalendar/core@6.1.11)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@fullcalendar/timegrid': + specifier: 6.1.11 + version: 6.1.11(@fullcalendar/core@6.1.11) + '@fullcalendar/timeline': + specifier: 6.1.11 + version: 6.1.11(@fullcalendar/core@6.1.11) + '@hookform/resolvers': + specifier: 3.3.4 + version: 3.3.4(react-hook-form@7.50.1(react@18.2.0)) + '@mui/lab': + specifier: 5.0.0-alpha.166 + version: 5.0.0-alpha.166(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@mui/material@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': + specifier: 5.15.11 + version: 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': + specifier: 5.15.11 + version: 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@mui/utils': + specifier: 5.15.11 + version: 5.15.11(@types/react@18.2.58)(react@18.2.0) + '@mui/x-date-pickers': + specifier: 6.19.5 + version: 6.19.5(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@mui/material@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@phosphor-icons/react': + specifier: 2.0.15 + version: 2.0.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-pdf/renderer': + specifier: 3.3.8 + version: 3.3.8(react@18.2.0) + '@supabase/ssr': + specifier: 0.1.0 + version: 0.1.0(@supabase/supabase-js@2.39.7) + '@supabase/supabase-js': + specifier: 2.39.7 + version: 2.39.7 + '@tiptap/extension-link': + specifier: 2.2.4 + version: 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-placeholder': + specifier: 2.2.4 + version: 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/react': + specifier: 2.2.4 + version: 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tiptap/starter-kit': + specifier: 2.2.4 + version: 2.2.4(@tiptap/pm@2.2.4) + aws-amplify: + specifier: 6.0.17 + version: 6.0.17 + dayjs: + specifier: 1.11.10 + version: 1.11.10 + embla-carousel: + specifier: 8.0.0 + version: 8.0.0 + embla-carousel-react: + specifier: 8.0.0 + version: 8.0.0(react@18.2.0) + firebase: + specifier: 10.8.0 + version: 10.8.0 + i18next: + specifier: 23.10.0 + version: 23.10.0 + i18next-http-backend: + specifier: 2.5.0 + version: 2.5.0 + mapbox-gl: + specifier: 3.1.2 + version: 3.1.2 + next: + specifier: 14.1.0 + version: 14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next-i18next: + specifier: 15.2.0 + version: 15.2.0(i18next@23.10.0)(next@14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@14.0.5(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-dropzone: + specifier: 14.2.3 + version: 14.2.3(react@18.2.0) + react-hook-form: + specifier: 7.50.1 + version: 7.50.1(react@18.2.0) + react-i18next: + specifier: 14.0.5 + version: 14.0.5(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-map-gl: + specifier: 7.1.7 + version: 7.1.7(mapbox-gl@3.1.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-markdown: + specifier: 9.0.1 + version: 9.0.1(@types/react@18.2.58)(react@18.2.0) + react-simple-maps: + specifier: 3.0.0 + version: 3.0.0(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-syntax-highlighter: + specifier: 15.5.0 + version: 15.5.0(react@18.2.0) + recharts: + specifier: 2.12.1 + version: 2.12.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + sonner: + specifier: 1.4.1 + version: 1.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + stylis: + specifier: 4.3.1 + version: 4.3.1 + stylis-plugin-rtl: + specifier: 2.1.1 + version: 2.1.1(stylis@4.3.1) + zod: + specifier: 3.22.4 + version: 3.22.4 + devDependencies: + '@ianvs/prettier-plugin-sort-imports': + specifier: 4.1.1 + version: 4.1.1(prettier@3.2.5) + '@testing-library/jest-dom': + specifier: 6.4.2 + version: 6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0)) + '@testing-library/react': + specifier: 14.2.1 + version: 14.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@types/jest': + specifier: 29.5.12 + version: 29.5.12 + '@types/mapbox-gl': + specifier: 3.1.0 + version: 3.1.0 + '@types/node': + specifier: 20.11.20 + version: 20.11.20 + '@types/react': + specifier: 18.2.58 + version: 18.2.58 + '@types/react-dom': + specifier: 18.2.19 + version: 18.2.19 + '@types/react-simple-maps': + specifier: 3.0.4 + version: 3.0.4 + '@types/react-syntax-highlighter': + specifier: 15.5.11 + version: 15.5.11 + '@vercel/style-guide': + specifier: 5.2.0 + version: 5.2.0(@next/eslint-plugin-next@14.1.0)(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(prettier@3.2.5)(typescript@5.3.3) + eslint: + specifier: 8.57.0 + version: 8.57.0 + eslint-config-next: + specifier: 14.1.0 + version: 14.1.0(eslint@8.57.0)(typescript@5.3.3) + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.0) + jest: + specifier: 29.7.0 + version: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + jest-environment-jsdom: + specifier: 29.7.0 + version: 29.7.0 + prettier: + specifier: 3.2.5 + version: 3.2.5 + typescript: + specifier: 5.3.3 + version: 5.3.3 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adobe/css-tools@4.3.3': + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@auth0/nextjs-auth0@3.5.0': + resolution: {integrity: sha512-uFZEE2QQf1zU+jRK2fwqxRQt+WSqDPYF2tnr7d6BEa7b6L6tpPJ3evzoImbWSY1a7gFdvD7RD/Rvrsx7B5CKVg==} + engines: {node: '>=16'} + peerDependencies: + next: '>=10' + + '@aws-amplify/analytics@7.0.17': + resolution: {integrity: sha512-GNT/jyztx61FQ1Xr7V18llDRpBSFqTHk8WcshCDFm9ZQAXC1TvnpxavoKIolBeXTpPJ0L3HJ7X3TxvWnUYkYIQ==} + peerDependencies: + '@aws-amplify/core': ^6.0.0 + + '@aws-amplify/api-graphql@4.0.17': + resolution: {integrity: sha512-/3g5GJ1vvDoux1SPHzrDWghoJR101EKhUnjgt5+uS7+zcLJlT6s5mOz0unhMD5Phvtjhcc33sukoC7A7y3xAYA==} + + '@aws-amplify/api-rest@4.0.17': + resolution: {integrity: sha512-cpl9sIn7pJscnHmQa5LYd2gdItuWu4pJ/zjsRXXhp1/Or2iX0fxUs1r3oPEq+eDjSmDmO5c89bQbNO4spqgs0g==} + peerDependencies: + '@aws-amplify/core': ^6.0.0 + + '@aws-amplify/api@6.0.17': + resolution: {integrity: sha512-76PvRRhbkzenr2X5a9DNupFKu6kBmbZ0KI0yFqaqXdAMQjvtm8GrqY/1yFnMcSqHH8mlUmexYP8lKrOX5sZqmQ==} + + '@aws-amplify/auth@6.0.17': + resolution: {integrity: sha512-VnksOAjBRm/TskkSjkLq7rzGJItpT2oDlUIddzGlGeILAumpTpv2PX5Jx3tfqghsQpn9kXE1AP8YgpOhuVDIDw==} + peerDependencies: + '@aws-amplify/core': ^6.0.0 + + '@aws-amplify/core@6.0.17': + resolution: {integrity: sha512-ruQuDN6owk6z3R6baQf/JV391DkgJr6IP0n/BdiiQR+jeLLoHtQbWrMUfVR4wwyIYSPph6fH2PMvggutAkD1fw==} + + '@aws-amplify/data-schema-types@0.7.5': + resolution: {integrity: sha512-C6kd+w1/D/+SEyFa7a/SaOwfNK4lewsSM54Lm8KozDDLNWtVTYcMieDy4Gw+S4O/J/7u3cF40regAnh2x/jGtg==} + + '@aws-amplify/datastore@5.0.17': + resolution: {integrity: sha512-bzV24IueXIBAy4+UAi90bZeSPHcVKmUWr05Y5MCB/GzX0TibppkE0FdE3zgMXk0pRcxzmxG+Bg6dUh5Nkco4Ow==} + peerDependencies: + '@aws-amplify/core': ^6.0.0 + + '@aws-amplify/notifications@2.0.17': + resolution: {integrity: sha512-xi+cm/b3KQInD/U4f3xmxcbzqOm1kbbkF6GPG1Bt62MEnEjVQqcXOMS0zfUpa5OKp8ocaDSlZR+RQzVy6moFSQ==} + peerDependencies: + '@aws-amplify/core': ^6.0.0 + + '@aws-amplify/storage@6.0.17': + resolution: {integrity: sha512-WUXKQ1q5BrxJtR9of7ffqQmZT/v2YaIvl7kJcQKMiTJ6Sk/lKb2lNncpaIHu4nl89j7tgCaqJiGVuB76HqybSg==} + peerDependencies: + '@aws-amplify/core': ^6.0.0 + + '@aws-crypto/crc32@3.0.0': + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + + '@aws-crypto/ie11-detection@3.0.0': + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + + '@aws-crypto/sha256-browser@3.0.0': + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + + '@aws-crypto/sha256-js@3.0.0': + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@3.0.0': + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + + '@aws-crypto/util@3.0.0': + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-firehose@3.398.0': + resolution: {integrity: sha512-qOWNLAD7K+7LofQCeBe56xP/+XJ7C0Wmkkczra2QuA4dveYBrBftxMJcWQjiA2SY4C0GjlMcBoSdXNCtinJnIQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/client-kinesis@3.398.0': + resolution: {integrity: sha512-zaOw+MwwdMpUdeUF8UVG19xcBDpQ1+8/Q2CEwu4OilTBMpcz9El+FaMVyOW4IWpVJMlDJfroZPxKkuITCHxgXA==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/client-personalize-events@3.398.0': + resolution: {integrity: sha512-dynXr8ZVMC2FxQS5QRr7cu90xAGfwgfZM5XDW2jm81UPK5Qqo2FbbEF4wvdXXbnkbvU5rsmxL1IjQiMGm+lWVg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/client-sso@3.398.0': + resolution: {integrity: sha512-CygL0jhfibw4kmWXG/3sfZMFNjcXo66XUuPC4BqZBk8Rj5vFoxp1vZeMkDLzTIk97Nvo5J5Bh+QnXKhub6AckQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/client-sts@3.398.0': + resolution: {integrity: sha512-/3Pa9wLMvBZipKraq3AtbmTfXW6q9kyvhwOno64f1Fz7kFb8ijQFMGoATS70B2pGEZTlxkUqJFWDiisT6Q6dFg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/credential-provider-env@3.398.0': + resolution: {integrity: sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/credential-provider-ini@3.398.0': + resolution: {integrity: sha512-AsK1lStK3nB9Cn6S6ODb1ktGh7SRejsNVQVKX3t5d3tgOaX+aX1Iwy8FzM/ZEN8uCloeRifUGIY9uQFygg5mSw==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/credential-provider-node@3.398.0': + resolution: {integrity: sha512-odmI/DSKfuWUYeDnGTCEHBbC8/MwnF6yEq874zl6+owoVv0ZsYP8qBHfiJkYqrwg7wQ7Pi40sSAPC1rhesGwzg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/credential-provider-process@3.398.0': + resolution: {integrity: sha512-WrkBL1W7TXN508PA9wRXPFtzmGpVSW98gDaHEaa8GolAPHMPa5t2QcC/z/cFpglzrcVv8SA277zu9Z8tELdZhg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/credential-provider-sso@3.398.0': + resolution: {integrity: sha512-2Dl35587xbnzR/GGZqA2MnFs8+kS4wbHQO9BioU0okA+8NRueohNMdrdQmQDdSNK4BfIpFspiZmFkXFNyEAfgw==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.398.0': + resolution: {integrity: sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/middleware-host-header@3.398.0': + resolution: {integrity: sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/middleware-logger@3.398.0': + resolution: {integrity: sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.398.0': + resolution: {integrity: sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/middleware-sdk-sts@3.398.0': + resolution: {integrity: sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/middleware-signing@3.398.0': + resolution: {integrity: sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/middleware-user-agent@3.398.0': + resolution: {integrity: sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/token-providers@3.398.0': + resolution: {integrity: sha512-nrYgjzavGCKJL/48Vt0EL+OlIc5UZLfNGpgyUW9cv3XZwl+kXV0QB+HH0rHZZLfpbBgZ2RBIJR9uD5ieu/6hpQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/types@3.387.0': + resolution: {integrity: sha512-YTjFabNwjTF+6yl88f0/tWff018qmmgMmjlw45s6sdVKueWxdxV68U7gepNLF2nhaQPZa6FDOBoA51NaviVs0Q==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/types@3.398.0': + resolution: {integrity: sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/util-endpoints@3.398.0': + resolution: {integrity: sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/util-locate-window@3.495.0': + resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==} + engines: {node: '>=14.0.0'} + + '@aws-sdk/util-user-agent-browser@3.398.0': + resolution: {integrity: sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==} + + '@aws-sdk/util-user-agent-node@3.398.0': + resolution: {integrity: sha512-RTVQofdj961ej4//fEkppFf4KXqKGMTCqJYghx3G0C/MYXbg7MGl7LjfNGtJcboRE8pfHHQ/TUWBDA7RIAPPlQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.9': + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.23.10': + resolution: {integrity: sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.9': + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.9': + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.23.3': + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.23.3': + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.23.9': + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.23.9': + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.9': + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.9': + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/sortable@8.0.0': + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@elgorditosalsero/react-gtm-hook@2.7.2': + resolution: {integrity: sha512-5lGZOk7BcWTdz2pqu2sa/IyAtuTItCCZuEGUthnlJgpWKvVGrzVyhIOVj1/ed575jusaMIr+yIfeZ11WzH2QqQ==} + engines: {node: '>=12'} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || 18 + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@1.2.1': + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.3': + resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.3': + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + + '@emotion/server@11.11.0': + resolution: {integrity: sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==} + peerDependencies: + '@emotion/css': ^11.0.0-rc.0 + peerDependenciesMeta: + '@emotion/css': + optional: true + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.0': + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/busboy@2.1.0': + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + + '@firebase/analytics-compat@0.2.7': + resolution: {integrity: sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/analytics-types@0.8.0': + resolution: {integrity: sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==} + + '@firebase/analytics@0.10.1': + resolution: {integrity: sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-check-compat@0.3.9': + resolution: {integrity: sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/app-check-interop-types@0.3.0': + resolution: {integrity: sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==} + + '@firebase/app-check-types@0.5.0': + resolution: {integrity: sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==} + + '@firebase/app-check@0.8.2': + resolution: {integrity: sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-compat@0.2.27': + resolution: {integrity: sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==} + + '@firebase/app-types@0.9.0': + resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} + + '@firebase/app@0.9.27': + resolution: {integrity: sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==} + + '@firebase/auth-compat@0.5.2': + resolution: {integrity: sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/auth-interop-types@0.2.1': + resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} + + '@firebase/auth-types@0.12.0': + resolution: {integrity: sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/auth@1.6.0': + resolution: {integrity: sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@firebase/component@0.6.5': + resolution: {integrity: sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==} + + '@firebase/database-compat@1.0.3': + resolution: {integrity: sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==} + + '@firebase/database-types@1.0.1': + resolution: {integrity: sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==} + + '@firebase/database@1.0.3': + resolution: {integrity: sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==} + + '@firebase/firestore-compat@0.3.25': + resolution: {integrity: sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/firestore-types@3.0.0': + resolution: {integrity: sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/firestore@4.4.2': + resolution: {integrity: sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==} + engines: {node: '>=10.10.0'} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/functions-compat@0.3.7': + resolution: {integrity: sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/functions-types@0.6.0': + resolution: {integrity: sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==} + + '@firebase/functions@0.11.1': + resolution: {integrity: sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/installations-compat@0.2.5': + resolution: {integrity: sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/installations-types@0.5.0': + resolution: {integrity: sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==} + peerDependencies: + '@firebase/app-types': 0.x + + '@firebase/installations@0.6.5': + resolution: {integrity: sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/logger@0.4.0': + resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} + + '@firebase/messaging-compat@0.2.6': + resolution: {integrity: sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/messaging-interop-types@0.2.0': + resolution: {integrity: sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==} + + '@firebase/messaging@0.12.6': + resolution: {integrity: sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/performance-compat@0.2.5': + resolution: {integrity: sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/performance-types@0.2.0': + resolution: {integrity: sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==} + + '@firebase/performance@0.6.5': + resolution: {integrity: sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/remote-config-compat@0.2.5': + resolution: {integrity: sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/remote-config-types@0.3.0': + resolution: {integrity: sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==} + + '@firebase/remote-config@0.4.5': + resolution: {integrity: sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/storage-compat@0.3.4': + resolution: {integrity: sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==} + peerDependencies: + '@firebase/app-compat': 0.x + + '@firebase/storage-types@0.8.0': + resolution: {integrity: sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/storage@0.12.1': + resolution: {integrity: sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/util@1.9.4': + resolution: {integrity: sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==} + + '@firebase/webchannel-wrapper@0.10.5': + resolution: {integrity: sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==} + + '@floating-ui/core@1.6.0': + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + + '@floating-ui/dom@1.6.3': + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + + '@floating-ui/react-dom@2.0.8': + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.1': + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + + '@fontsource/inter@5.0.16': + resolution: {integrity: sha512-qF0aH5UiZvCmneX5orJbVRoc2VTyLTV3X/7laMp03Qt28L+B9tFlZODOGUL64wDWc69YVdi1LeJB0cIgd51lvw==} + + '@fontsource/plus-jakarta-sans@5.0.18': + resolution: {integrity: sha512-poMuIcQ8F7WGXF4mNUviDk49Ewdf0pU7wmCzWQNbWEtus+L46BSp+4OqbWy0LWJEmMLI9F5hUHaSo2maLJwrQw==} + + '@fontsource/roboto-mono@5.0.16': + resolution: {integrity: sha512-unZYfjXts55DQyODz0I9DzbSrS5DRKPNq9crJpNJe/Vy818bLnijprcJv3fvqwdDqTT0dRm2Fhk09QEIdtAc+Q==} + + '@fullcalendar/core@6.1.11': + resolution: {integrity: sha512-TjG7c8sUz+Vkui2FyCNJ+xqyu0nq653Ibe99A66LoW95oBo6tVhhKIaG1Wh0GVKymYiqAQN/OEdYTuj4ay27kA==} + + '@fullcalendar/daygrid@6.1.11': + resolution: {integrity: sha512-hF5jJB7cgUIxWD5MVjj8IU407HISyLu7BWXcEIuTytkfr8oolOXeCazqnnjmRbnFOncoJQVstTtq6SIhaT32Xg==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@fullcalendar/interaction@6.1.11': + resolution: {integrity: sha512-ynOKjzuPwEAMgTQ6R/Z2zvzIIqG4p8/Qmnhi1q0vzPZZxSIYx3rlZuvpEK2WGBZZ1XEafDOP/LGfbWoNZe+qdg==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@fullcalendar/list@6.1.11': + resolution: {integrity: sha512-9Qx8uvik9pXD12u50FiHwNzlHv4wkhfsr+r03ycahW7vEeIAKCsIZGTkUfFP+96I5wHihrfLazu1cFQG4MPiuw==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@fullcalendar/premium-common@6.1.11': + resolution: {integrity: sha512-3WsSizkGDJEu+AlgQlFXKI+/DYCYTRp0PQRz0vS63qKBEUsVzfSD0oi/7jCylZJlCUteIjbi4Hu1I2I5o6UHrQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@fullcalendar/react@6.1.11': + resolution: {integrity: sha512-Og0Tv0OiglTFp+b++yRyEhAeWnAmKkMLQ3iS0eJE1KDEov6QqGkoO+dUG4x8zp2w55IJqzik/a9iHi0s3oQDbA==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + react: ^16.7.0 || ^17 || ^18 + react-dom: ^16.7.0 || ^17 || ^18 + + '@fullcalendar/scrollgrid@6.1.11': + resolution: {integrity: sha512-GRhhU8ACHqgfxdMnP59VPThfNG3Stkp9zq1sLnI992g1fZQ+V2UhYvl5qhu3eEVSp2KTDPx4NaoR35cQGrC1Mw==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@fullcalendar/timegrid@6.1.11': + resolution: {integrity: sha512-0seUHK/ferH89IeuCvV4Bib0zWjgK0nsptNdmAc9wDBxD/d9hm5Mdti0URJX6bDoRtsSfRDu5XsRcrzwoc+AUQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@fullcalendar/timeline@6.1.11': + resolution: {integrity: sha512-MGUEAHlFBWxpuhSWhZbHOtD9i+b8GZjqNV82MH+vwPHq1Jjqe8qj9Wby00vKikdWH+RuAB+IuiKjQaROEU0Ecw==} + peerDependencies: + '@fullcalendar/core': ~6.1.11 + + '@grpc/grpc-js@1.9.14': + resolution: {integrity: sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==} + engines: {node: ^8.13.0 || >=10.10.0} + + '@grpc/proto-loader@0.7.10': + resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} + engines: {node: '>=6'} + hasBin: true + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@hookform/resolvers@3.3.4': + resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@ianvs/prettier-plugin-sort-imports@4.1.1': + resolution: {integrity: sha512-kJhXq63ngpTQ2dxgf5GasbPJWsJA3LgoOdd7WGhpUSzLgLgI4IsIzYkbJf9kmpOHe7Vdm/o3PcRA3jmizXUuAQ==} + peerDependencies: + '@vue/compiler-sfc': '>=3.0.0' + prettier: 2 || 3 + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.4': + resolution: {integrity: sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.23': + resolution: {integrity: sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==} + + '@mapbox/geojson-rewind@0.5.2': + resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} + hasBin: true + + '@mapbox/jsonlint-lines-primitives@2.0.2': + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + + '@mapbox/mapbox-gl-supported@2.0.1': + resolution: {integrity: sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==} + + '@mapbox/point-geometry@0.1.0': + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + + '@mapbox/tiny-sdf@2.0.6': + resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==} + + '@mapbox/unitbezier@0.0.1': + resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + + '@mapbox/vector-tile@1.3.1': + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + + '@mapbox/whoots-js@3.1.0': + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + + '@maplibre/maplibre-gl-style-spec@19.3.3': + resolution: {integrity: sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@mui/base@5.0.0-beta.37': + resolution: {integrity: sha512-/o3anbb+DeCng8jNsd3704XtmmLDZju1Fo8R2o7ugrVtPQ/QpcqddwKNzKPZwa0J5T8YNW3ZVuHyQgbTnQLisQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@5.15.11': + resolution: {integrity: sha512-JVrJ9Jo4gyU707ujnRzmE8ABBWpXd6FwL9GYULmwZRtfPg89ggXs/S3MStQkpJ1JRWfdLL6S5syXmgQGq5EDAw==} + + '@mui/lab@5.0.0-alpha.166': + resolution: {integrity: sha512-a+0yorrgxLIgfKhShVKQk0/5CnB4KBhMQ64SvEB+CsvKAKKJzjIU43m2nMqdBbWzfnEuj6wR9vQ9kambdn3ZKA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': '>=5.15.0' + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/material@5.15.11': + resolution: {integrity: sha512-FA3eEuEZaDaxgN3CgfXezMWbCZ4VCeU/sv0F0/PK5n42qIgsPVD6q+j71qS7/62sp6wRFMHtDMpXRlN+tT/7NA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@5.15.11': + resolution: {integrity: sha512-jY/696SnSxSzO1u86Thym7ky5T9CgfidU3NFJjguldqK4f3Z5S97amZ6nffg8gTD0HBjY9scB+4ekqDEUmxZOA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@5.15.11': + resolution: {integrity: sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@5.15.11': + resolution: {integrity: sha512-9j35suLFq+MgJo5ktVSHPbkjDLRMBCV17NMBdEQurh6oWyGnLM4uhU4QGZZQ75o0vuhjJghOCA1jkO3+79wKsA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.13': + resolution: {integrity: sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.15.11': + resolution: {integrity: sha512-D6bwqprUa9Stf8ft0dcMqWyWDKEo7D+6pB1k8WajbqlYIRA8J8Kw9Ra7PSZKKePGBGWO+/xxrX1U8HpG/aXQCw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/x-date-pickers@6.19.5': + resolution: {integrity: sha512-WPi59ImgvGTEuAlJiCLnqNkEkbqPjgwUTrg8iqACFIb4qzg5tz4y8vNgmOKMnTXCwWDHjd+SoDdxiMlZJWT1hg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.9.0 + '@emotion/styled': ^11.8.1 + '@mui/material': ^5.8.6 + '@mui/system': ^5.8.0 + date-fns: ^2.25.0 || ^3.2.0 + date-fns-jalali: ^2.13.0-0 + dayjs: ^1.10.7 + luxon: ^3.0.2 + moment: ^2.29.4 + moment-hijri: ^2.1.2 + moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + date-fns: + optional: true + date-fns-jalali: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + moment-hijri: + optional: true + moment-jalaali: + optional: true + + '@next/env@14.1.0': + resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} + + '@next/eslint-plugin-next@14.1.0': + resolution: {integrity: sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==} + + '@next/swc-darwin-arm64@14.1.0': + resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.1.0': + resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.1.0': + resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.1.0': + resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.1.0': + resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.1.0': + resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.1.0': + resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.1.0': + resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.1.0': + resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@panva/hkdf@1.1.1': + resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} + + '@phosphor-icons/react@2.0.15': + resolution: {integrity: sha512-PQKNcRrfERlC8gJGNz0su0i9xVmeubXSNxucPcbCLDd9u0cwJVTEyYK87muul/svf0UXFdL2Vl6bbeOhT1Mwow==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8' + react-dom: '>= 16.8' + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@react-pdf/fns@2.2.1': + resolution: {integrity: sha512-s78aDg0vDYaijU5lLOCsUD+qinQbfOvcNeaoX9AiE7+kZzzCo6B/nX+l48cmt9OosJmvZvE9DWR9cLhrhOi2pA==} + + '@react-pdf/font@2.4.4': + resolution: {integrity: sha512-yjK5eSY+LcbxS0m+sOYln8GdgIbUgti4xjwf14kx8OSsOMJQJyHFALHMh2cLcKJR9yZeqVDo1FwCsY6gw1yCkg==} + + '@react-pdf/image@2.3.4': + resolution: {integrity: sha512-IE34l7gfTdaxXe3XR9240xMZsFdxF1myIwmEWK28XoeTaucUPAUyOiNcFSGRT59vNuZVBuakYz3BlGGrkvAPVQ==} + + '@react-pdf/layout@3.11.2': + resolution: {integrity: sha512-5EiHJ+Eb0odqnkWll9pWbTp+dwH1QRm7mOXDMiklqIWK98eI7e3cEae5Dgr0TtdnB7KgPW9Tvul2CwRJTwq54A==} + + '@react-pdf/pdfkit@3.1.6': + resolution: {integrity: sha512-U96VVhphniDBsLbmeJHgEml15nng8cr90mmEfPATh98gsqg6wev0avBr4k9XPjLdaN1f2xTXD4VdlaMYJZ+n7Q==} + + '@react-pdf/png-js@2.3.1': + resolution: {integrity: sha512-pEZ18I4t1vAUS4lmhvXPmXYP4PHeblpWP/pAlMMRkEyP7tdAeHUN7taQl9sf9OPq7YITMY3lWpYpJU6t4CZgZg==} + + '@react-pdf/primitives@3.1.1': + resolution: {integrity: sha512-miwjxLwTnO3IjoqkTVeTI+9CdyDggwekmSLhVCw+a/7FoQc+gF3J2dSKwsHvAcVFM0gvU8mzCeTofgw0zPDq0w==} + + '@react-pdf/render@3.4.3': + resolution: {integrity: sha512-9LL059vfwrK1gA0uIA4utpQ/pUH9EW/yia4bb7pCoARs8IlupY5UP265jgax15ua0p+MdUwShZzQ9rilu7kGsw==} + + '@react-pdf/renderer@3.3.8': + resolution: {integrity: sha512-wJESEZCNNbog4MxDjRgKtgdmyGm+lDce9cMX2THRs1Jltckq3M8N0yt/fkvGyB8nwiDPtEBOsz9JKlw5vLidbw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-pdf/stylesheet@4.2.4': + resolution: {integrity: sha512-CgRfDzeMtnV0GL7zSn381NubmgwqKhFKcK1YrWX3azl/KWVh52jjFd3HWi6dvcETNT862mjWz5MnExe4WOBJXA==} + + '@react-pdf/textkit@4.4.1': + resolution: {integrity: sha512-Jl9wdTqIvJ5pX+vAGz0EOhP7ut5Two9H6CzTKo/YYPeD79cM2yTXF3JzTERBC28y7LR0Waq9D2LHQjI+b/EYUQ==} + + '@react-pdf/types@2.4.1': + resolution: {integrity: sha512-w8pk7svhjVj5f7d7kjEGXSk26ffCqRSQcgWR4DwcFltNpSM18ZJmzmM6WrNeeP437y48LlykLnmGDA3oATakgw==} + + '@remirror/core-constants@2.0.2': + resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} + + '@remirror/core-helpers@3.0.0': + resolution: {integrity: sha512-tusEgQJIqg4qKj6HSBUFcyRnWnziw3neh4T9wOmsPGHFC3w9kl5KSrDb9UAgE8uX6y32FnS7vJ955mWOl3n50A==} + + '@remirror/types@1.0.1': + resolution: {integrity: sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==} + + '@rushstack/eslint-patch@1.7.2': + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@smithy/abort-controller@2.1.2': + resolution: {integrity: sha512-iwUxrFm/ZFCXhzhtZ6JnoJzAsqUrVfBAZUTQj8ypXGtIjwXZpKqmgYiuqrDERiydDI5gesqvsC4Rqe57GGhbVg==} + engines: {node: '>=14.0.0'} + + '@smithy/config-resolver@2.1.2': + resolution: {integrity: sha512-ZDMY63xJVsJl7ei/yIMv9nx8OiEOulwNnQOUDGpIvzoBrcbvYwiMjIMe5mP5J4fUmttKkpiTKwta/7IUriAn9w==} + engines: {node: '>=14.0.0'} + + '@smithy/credential-provider-imds@2.2.2': + resolution: {integrity: sha512-a2xpqWzhzcYwImGbFox5qJLf6i5HKdVeOVj7d6kVFElmbS2QW2T4HmefRc5z1huVArk9bh5Rk1NiFp9YBCXU3g==} + engines: {node: '>=14.0.0'} + + '@smithy/eventstream-codec@2.1.2': + resolution: {integrity: sha512-2PHrVRixITHSOj3bxfZmY93apGf8/DFiyhRh9W0ukfi07cvlhlRonZ0fjgcqryJjUZ5vYHqqmfIE/Qe1HM9mlw==} + + '@smithy/eventstream-serde-browser@2.1.2': + resolution: {integrity: sha512-2N11IFHvOmKuwK6hLVkqM8ge8oiQsFkflr4h07LToxo3rX+njkx/5eRn6RVcyNmpbdbxYYt0s0Pf8u+yhHmOKg==} + engines: {node: '>=14.0.0'} + + '@smithy/eventstream-serde-config-resolver@2.1.2': + resolution: {integrity: sha512-nD/+k3mK+lMMwf2AItl7uWma+edHLqiE6LyIYXYnIBlCJcIQnA/vTHjHFoSJFCfG30sBJnU/7u4X5j/mbs9uKg==} + engines: {node: '>=14.0.0'} + + '@smithy/eventstream-serde-node@2.1.2': + resolution: {integrity: sha512-zNE6DhbwDEWTKl4mELkrdgXBGC7UsFg1LDkTwizSOFB/gd7G7la083wb0JgU+xPt+TYKK0AuUlOM0rUZSJzqeA==} + engines: {node: '>=14.0.0'} + + '@smithy/eventstream-serde-universal@2.1.2': + resolution: {integrity: sha512-Upd/zy+dNvvIDPU1HGhW9ivNjvJQ0W4UkkQOzr5Mo0hz2lqnZAyOuit4TK2JAEg/oo+V1gUY4XywDc7zNbCF0g==} + engines: {node: '>=14.0.0'} + + '@smithy/fetch-http-handler@2.4.2': + resolution: {integrity: sha512-sIGMVwa/8h6eqNjarI3F07gvML3mMXcqBe+BINNLuKsVKXMNBN6wRzeZbbx7lfiJDEHAP28qRns8flHEoBB7zw==} + + '@smithy/hash-node@2.1.2': + resolution: {integrity: sha512-3Sgn4s0g4xud1M/j6hQwYCkz04lVJ24wvCAx4xI26frr3Ao6v0o2VZkBpUySTeQbMUBp2DhuzJ0fV1zybzkckw==} + engines: {node: '>=14.0.0'} + + '@smithy/invalid-dependency@2.1.2': + resolution: {integrity: sha512-qdgKhkFYxDJnKecx2ANwz3JRkXjm0qDgEnAs5BIfb2z/XqA2l7s9BTH7GTC/RR4E8h6EDCeb5rM2rnARxviqIg==} + + '@smithy/is-array-buffer@2.1.1': + resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} + engines: {node: '>=14.0.0'} + + '@smithy/md5-js@2.0.7': + resolution: {integrity: sha512-2i2BpXF9pI5D1xekqUsgQ/ohv5+H//G9FlawJrkOJskV18PgJ8LiNbLiskMeYt07yAsSTZR7qtlcAaa/GQLWww==} + + '@smithy/middleware-content-length@2.1.2': + resolution: {integrity: sha512-XEWtul1tHP31EtUIobEyN499paUIbnCTRtjY+ciDCEXW81lZmpjrDG3aL0FxJDPnvatVQuMV1V5eg6MCqTFaLQ==} + engines: {node: '>=14.0.0'} + + '@smithy/middleware-endpoint@2.4.2': + resolution: {integrity: sha512-72qbmVwaWcLOd/OT52fszrrlXywPwciwpsRiIk/dIvpcwkpGE9qrYZ2bt/SYcA/ma8Rz9Ni2AbBuSXLDYISS+A==} + engines: {node: '>=14.0.0'} + + '@smithy/middleware-retry@2.1.2': + resolution: {integrity: sha512-tlvSK+v9bPHHb0dLWvEaFW2Iz0IeA57ISvSaso36I33u8F8wYqo5FCvenH7TgMVBx57jyJBXOmYCZa9n5gdJIg==} + engines: {node: '>=14.0.0'} + + '@smithy/middleware-serde@2.1.2': + resolution: {integrity: sha512-XNU6aVIhlSbjuo2XsfZ7rd4HhjTXDlNWxAmhlBfViTW1TNK02CeWdeEntp5XtQKYD//pyTIbYi35EQvIidAkOw==} + engines: {node: '>=14.0.0'} + + '@smithy/middleware-stack@2.1.2': + resolution: {integrity: sha512-EPGaHGd4XmZcaRYjbhyqiqN/Q/ESxXu5e5TK24CTZUe99y8/XCxmiX8VLMM4H0DI7K3yfElR0wPAAvceoSkTgw==} + engines: {node: '>=14.0.0'} + + '@smithy/node-config-provider@2.2.2': + resolution: {integrity: sha512-QXvpqHSijAm13ZsVkUo92b085UzDvYP1LblWTb3uWi9WilhDvYnVyPLXaryLhOWZ2YvdhK2170T3ZBqtg+quIQ==} + engines: {node: '>=14.0.0'} + + '@smithy/node-http-handler@2.4.0': + resolution: {integrity: sha512-Mf2f7MMy31W8LisJ9O+7J5cKiNwBwBBLU6biQ7/sFSFdhuOxPN7hOPoZ8vlaFjvrpfOUJw9YOpjGyNTKuvomOQ==} + engines: {node: '>=14.0.0'} + + '@smithy/property-provider@2.1.2': + resolution: {integrity: sha512-yaXCVFKzxbSXqOoyA7AdAgXhwdjiLeui7n2P6XLjBCz/GZFdLUJgSY6KL1PevaxT4REMwUSs/bSHAe/0jdzEHw==} + engines: {node: '>=14.0.0'} + + '@smithy/protocol-http@2.0.5': + resolution: {integrity: sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==} + engines: {node: '>=14.0.0'} + + '@smithy/protocol-http@3.2.0': + resolution: {integrity: sha512-VRp0YITYIQum+rX4zeZ3cW1wl9r90IQzQN+VLS1NxdSMt6NLsJiJqR9czTxlaeWNrLHsFAETmjmdrS48Ug1liA==} + engines: {node: '>=14.0.0'} + + '@smithy/querystring-builder@2.1.2': + resolution: {integrity: sha512-wk6QpuvBBLJF5w8aADsZOtxaHY9cF5MZe1Ry3hSqqBxARdUrMoXi/jukUz5W0ftXGlbA398IN8dIIUj3WXqJXg==} + engines: {node: '>=14.0.0'} + + '@smithy/querystring-parser@2.1.2': + resolution: {integrity: sha512-z1yL5Iiagm/UxVy1tcuTFZdfOBK/QtYeK6wfClAJ7cOY7kIaYR6jn1cVXXJmhAQSh1b2ljP4xiZN4Ybj7Tbs5w==} + engines: {node: '>=14.0.0'} + + '@smithy/service-error-classification@2.1.2': + resolution: {integrity: sha512-R+gL1pAPuWkH6unFridk57wDH5PFY2IlVg2NUjSAjoaIaU+sxqKf/7AOWIcx9Bdn+xY0/4IRQ69urlC+F3I9gg==} + engines: {node: '>=14.0.0'} + + '@smithy/shared-ini-file-loader@2.3.2': + resolution: {integrity: sha512-idHGDJB+gBh+aaIjmWj6agmtNWftoyAenErky74hAtKyUaCvfocSBgEJ2pQ6o68svBluvGIj4NGFgJu0198mow==} + engines: {node: '>=14.0.0'} + + '@smithy/signature-v4@2.1.2': + resolution: {integrity: sha512-DdPWaNGIbxzyocR3ncH8xlxQgsqteRADEdCPoivgBzwv17UzKy2obtdi2vwNc5lAJ955bGEkkWef9O7kc1Eocg==} + engines: {node: '>=14.0.0'} + + '@smithy/smithy-client@2.4.0': + resolution: {integrity: sha512-6/jxk0om9l2s9BcgHtrBn+Hd3xcFGDzxfEJ2FvGpZxIz0S7bgvZg1gyR66O1xf1w9WZBH+W7JClhfSn2gETINw==} + engines: {node: '>=14.0.0'} + + '@smithy/types@2.10.0': + resolution: {integrity: sha512-QYXQmpIebS8/jYXgyJjCanKZbI4Rr8tBVGBAIdDhA35f025TVjJNW69FJ0TGiDqt+lIGo037YIswq2t2Y1AYZQ==} + engines: {node: '>=14.0.0'} + + '@smithy/url-parser@2.1.2': + resolution: {integrity: sha512-KBPi740ciTujUaY+RfQuPABD0QFmgSBN5qNVDCGTryfsbG4jkwC0YnElSzi72m24HegMyxzZDLG4Oh4/97mw2g==} + + '@smithy/util-base64@2.1.1': + resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==} + engines: {node: '>=14.0.0'} + + '@smithy/util-body-length-browser@2.1.1': + resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} + + '@smithy/util-body-length-node@2.2.1': + resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@2.1.1': + resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} + engines: {node: '>=14.0.0'} + + '@smithy/util-config-provider@2.2.1': + resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} + engines: {node: '>=14.0.0'} + + '@smithy/util-defaults-mode-browser@2.1.2': + resolution: {integrity: sha512-YmojdmsE7VbvFGJ/8btn/5etLm1HOQkgVX6nMWlB0yBL/Vb//s3aTebUJ66zj2+LNrBS3B9S+18+LQU72Yj0AQ==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@2.2.1': + resolution: {integrity: sha512-kof7M9Q2qP5yaQn8hHJL3KwozyvIfLe+ys7feifSul6gBAAeoraibo/MWqotb/I0fVLMlCMDwn7WXFsGUwnsew==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-hex-encoding@2.0.0': + resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-hex-encoding@2.1.1': + resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} + engines: {node: '>=14.0.0'} + + '@smithy/util-middleware@2.1.2': + resolution: {integrity: sha512-lvSOnwQ7iAajtWb1nAyy0CkOIn8d+jGykQOtt2NXDsPzOTfejZM/Uph+O/TmVgWoXdcGuw5peUMG2f5xEIl6UQ==} + engines: {node: '>=14.0.0'} + + '@smithy/util-retry@2.1.2': + resolution: {integrity: sha512-pqifOgRqwLfRu+ks3awEKKqPeYxrHLwo4Yu2EarGzeoarTd1LVEyyf5qLE6M7IiCsxnXRhn9FoWIdZOC+oC/VQ==} + engines: {node: '>= 14.0.0'} + + '@smithy/util-stream@2.1.2': + resolution: {integrity: sha512-AbGjvoSok7YeUKv9WRVRSChQfsufLR54YCAabTbaABRdIucywRQs29em0uAP6r4RLj+4aFZStWGYpFgT0P8UlQ==} + engines: {node: '>=14.0.0'} + + '@smithy/util-uri-escape@2.1.1': + resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@2.0.0': + resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@2.1.1': + resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-waiter@2.1.2': + resolution: {integrity: sha512-yxLC57GBDmbDmrnH+vJxsrbV4/aYUucBONkSRLZyJIVFAl/QJH+O/h+phITHDaxVZCYZAcudYJw4ERE32BJM7g==} + engines: {node: '>=14.0.0'} + + '@supabase/functions-js@2.1.5': + resolution: {integrity: sha512-BNzC5XhCzzCaggJ8s53DP+WeHHGT/NfTsx2wUSSGKR2/ikLFQTBCDzMvGz/PxYMqRko/LwncQtKXGOYp1PkPaw==} + + '@supabase/gotrue-js@2.62.2': + resolution: {integrity: sha512-AP6e6W9rQXFTEJ7sTTNYQrNf0LCcnt1hUW+RIgUK+Uh3jbWvcIST7wAlYyNZiMlS9+PYyymWQ+Ykz/rOYSO0+A==} + + '@supabase/node-fetch@2.6.15': + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} + + '@supabase/postgrest-js@1.9.2': + resolution: {integrity: sha512-I6yHo8CC9cxhOo6DouDMy9uOfW7hjdsnCxZiaJuIVZm1dBGTFiQPgfMa9zXCamEWzNyWRjZvupAUuX+tqcl5Sw==} + + '@supabase/realtime-js@2.9.3': + resolution: {integrity: sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ==} + + '@supabase/ssr@0.1.0': + resolution: {integrity: sha512-bIVrkqjAK5G3KjkIMKYKtAOlCgRRplEWjrlyRyXSOYtgDieiOhk2ZyNAPsEOa1By9OZVxuX5eAW1fitdnuxayw==} + peerDependencies: + '@supabase/supabase-js': ^2.33.1 + + '@supabase/storage-js@2.5.5': + resolution: {integrity: sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w==} + + '@supabase/supabase-js@2.39.7': + resolution: {integrity: sha512-1vxsX10Uhc2b+Dv9pRjBjHfqmw2N2h1PyTg9LEfICR3x2xwE24By1MGCjDZuzDKH5OeHCsf4it6K8KRluAAEXA==} + + '@swc/helpers@0.4.14': + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} + + '@swc/helpers@0.4.36': + resolution: {integrity: sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==} + + '@swc/helpers@0.5.2': + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + + '@testing-library/jest-dom@6.4.2': + resolution: {integrity: sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + + '@testing-library/react@14.2.1': + resolution: {integrity: sha512-sGdjws32ai5TLerhvzThYFbpnF9XtL65Cjf+gB0Dhr29BGqK+mAeN7SURSdu+eqgET4ANcWoC7FQpkaiGvBr+A==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@tiptap/core@2.2.4': + resolution: {integrity: sha512-cRrI8IlLIhCE1hacBQzXIC8dsRvGq6a4lYWQK/BaHuZg21CG7szp3Vd8Ix+ra1f5v0xPOT+Hy+QFNQooRMKMCw==} + peerDependencies: + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-blockquote@2.2.4': + resolution: {integrity: sha512-FrfPnn0VgVrUwWLwja1afX99JGLp6PE9ThVcmri+tLwUZQvTTVcCvHoCdOakav3/nge1+aV4iE3tQdyq1tWI9Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-bold@2.2.4': + resolution: {integrity: sha512-v3tTLc8YESFZPOGj5ByFr8VbmQ/PTo49T1vsK50VubxIN/5r9cXlKH8kb3dZlZxCxJa3FrXNO/M8rdGBSWQvSg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-bubble-menu@2.2.4': + resolution: {integrity: sha512-Nx1fS9jcFlhxaTDYlnayz2UulhK6CMaePc36+7PQIVI+u20RhgTCRNr25zKNemvsiM0RPZZVUjlHkxC0l5as1Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-bullet-list@2.2.4': + resolution: {integrity: sha512-z/MPmW8bhRougMuorl6MAQBXeK4rhlP+jBWlNwT+CT8h5IkXqPnDbM1sZeagp2nYfVV6Yc4RWpzimqHHtGnYTA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-code-block@2.2.4': + resolution: {integrity: sha512-h6WV9TmaBEZmvqe1ezMR83DhCPUap6P2mSR5pwVk0WVq6rvZjfgU0iF3EetBJOeDgPlz7cNe2NMDfVb1nGTM/g==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-code@2.2.4': + resolution: {integrity: sha512-JB4SJ2mUU/9qXFUf+K5K9szvovnN9AIcCb0f0UlcVBuddKHSqCl3wO3QJgYt44BfQTLMNuyzr+zVqfFd6BNt/g==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-document@2.2.4': + resolution: {integrity: sha512-z+05xGK0OFoXV1GL+/8bzcZuWMdMA3+EKwk5c+iziG60VZcvGTF7jBRsZidlu9Oaj0cDwWHCeeo6L9SgSh6i2A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-dropcursor@2.2.4': + resolution: {integrity: sha512-IHwkEKmqpqXyJi16h7871NrcIqeyN7I6XRE2qdqi+MhGigVWI8nWHoYbjRKa7K/1uhs5zeRYyDlq5EuZyL6mgA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-floating-menu@2.2.4': + resolution: {integrity: sha512-U25l7PEzOmlAPugNRl8t8lqyhQZS6W/+3f92+FdwW9qXju3i62iX/3OGCC3Gv+vybmQ4fbZmMjvl+VDfenNi3A==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-gapcursor@2.2.4': + resolution: {integrity: sha512-Y6htT/RDSqkQ1UwG2Ia+rNVRvxrKPOs3RbqKHPaWr3vbFWwhHyKhMCvi/FqfI3d5pViVHOZQ7jhb5hT/a0BmNw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-hard-break@2.2.4': + resolution: {integrity: sha512-FPvS57GcqHIeLbPKGJa3gnH30Xw+YB1PXXnAWG2MpnMtc2Vtj1l5xaYYBZB+ADdXLAlU0YMbKhFLQO4+pg1Isg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-heading@2.2.4': + resolution: {integrity: sha512-gkq7Ns2FcrOCRq7Q+VRYt5saMt2R9g4REAtWy/jEevJ5UV5vA2AiGnYDmxwAkHutoYU0sAUkjqx37wE0wpamNw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-history@2.2.4': + resolution: {integrity: sha512-FDM32XYF5NU4mzh+fJ8w2CyUqv0l2Nl15sd6fOhQkVxSj8t57z+DUXc9ZR3zkH+1RAagYJo/2Gu3e99KpMr0tg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-horizontal-rule@2.2.4': + resolution: {integrity: sha512-iCRHjFQQHApWg3R4fkKkJQhWEOdu1Fdc4YEAukdOXPSg3fg36IwjvsMXjt9SYBtVZ+iio3rORCZGXyMvgCH9uw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-italic@2.2.4': + resolution: {integrity: sha512-qIhGNvWnsQswSgEMRA8jQQjxfkOGNAuNWKEVQX9DPoqAUgknT41hQcAMP8L2+OdACpb2jbVMOO5Cy5Dof2L8/w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-link@2.2.4': + resolution: {integrity: sha512-Qsx0cFZm4dxbkToXs5TcXbSoUdicv8db1gV1DYIZdETqjBm4wFjlzCUP7hPHFlvNfeSy1BzAMRt+RpeuiwvxWQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-list-item@2.2.4': + resolution: {integrity: sha512-lPLKGKsHpM9ClUa8n7GEUn8pG6HCYU0vFruIy3l2t6jZdHkrgBnYtVGMZ13K8UDnj/hlAlccxku0D0P4mA1Vrg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-ordered-list@2.2.4': + resolution: {integrity: sha512-TpFy140O9Af1JciXt+xwqYUXxcJ6YG8zi/B5UDJujp+FH5sCmlYYBBnWxiFMhVaj6yEmA2eafu1qUkic/1X5Aw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-paragraph@2.2.4': + resolution: {integrity: sha512-m1KwyvTNJxsq7StbspbcOhxO4Wk4YpElDbqOouWi+H4c8azdpI5Pn96ZqhFeE9bSyjByg6OcB/wqoJsLbeFWdQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-placeholder@2.2.4': + resolution: {integrity: sha512-UL4Fn9T33SoS7vdI3NnSxBJVeGUIgCIutgXZZ5J8CkcRoDIeS78z492z+6J+qGctHwTd0xUL5NzNJI82HfiTdg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-strike@2.2.4': + resolution: {integrity: sha512-/a2EwQgA+PpG17V2tVRspcrIY0SN3blwcgM7lxdW4aucGkqSKnf7+91dkhQEwCZ//o8kv9mBCyRoCUcGy6S5Xg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-text@2.2.4': + resolution: {integrity: sha512-NlKHMPnRJXB+0AGtDlU0P2Pg+SdesA2lMMd7JzDUgJgL7pX2jOb8eUqSeOjFKuSzFSqYfH6C3o6mQiNhuQMv+g==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/pm@2.2.4': + resolution: {integrity: sha512-Po0klR165zgtinhVp1nwMubjyKx6gAY9kH3IzcniYLCkqhPgiqnAcCr61TBpp4hfK8YURBS4ihvCB1dyfCyY8A==} + + '@tiptap/react@2.2.4': + resolution: {integrity: sha512-HkYmMZWcETPZn3KpzdDg/ns2TKeFh54TvtCEInA4ljYtWGLoZc/A+KaiEtMIgVs+Mo1XwrhuoNGjL9c0OK2HJw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + + '@tiptap/starter-kit@2.2.4': + resolution: {integrity: sha512-Kbk7qUfIZg3+bNa3e/wBeDQt4jJB46uQgM+xy5NSY6H8NZP6gdmmap3aIrn9S/W/hGpxJl4RcXAeaT0CQji9XA==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@2.0.6': + resolution: {integrity: sha512-tbaFGDmJWHqnenvk3QGSvD3RVwr631BjKRD7Sc7VLRgrdX5mk5hTyoeBL6rXZaeoXzmZwIl1D2HPogEdt1rHBg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-geo@2.0.7': + resolution: {integrity: sha512-RIXlxPdxvX+LAZFv+t78CuYpxYag4zuw9mZc+AwfB8tZpKU90rMEn2il2ADncmeZlb7nER9dDsJpRisA3lRvjA==} + + '@types/d3-interpolate@2.0.5': + resolution: {integrity: sha512-UINE41RDaUMbulp+bxQMDnhOi51rh5lA2dG+dWZU0UY/IwQiG/u2x8TfnWYU9+xwGdXsJoAvrBYUEQl0r91atg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-selection@2.0.4': + resolution: {integrity: sha512-5a21DF7avVPmiUau8KTsv5r76yGqbMgq4QtByoCBPXUrVFWFkd3Ob4OOhmePNRbQqfUCNFjgB4sO7sUURnKcBg==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-zoom@2.0.7': + resolution: {integrity: sha512-JWke4E8ZyrKUQ68ESTWSK16fVb0OYnaiJ+WXJRYxKLn4aXU0o4CLYxMWBEiouUfO3TTCoyroOrGPcBG6u1aAxA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/geojson@7946.0.14': + resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/jsdom@20.0.1': + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mapbox-gl@3.1.0': + resolution: {integrity: sha512-hI6cQDjw1bkJw7MC/eHMqq5TWUamLwsujnUUeiIX2KDRjxRNSYMjnHz07+LATz9I9XIsKumOtUz4gRYnZOJ/FA==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.11.20': + resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/object.omit@3.0.3': + resolution: {integrity: sha512-xrq4bQTBGYY2cw+gV4PzoG2Lv3L0pjZ1uXStRRDQoATOYW1lCsFQHhQ+OkPhIcQoqLjAq7gYif7D14Qaa6Zbew==} + + '@types/object.pick@1.3.4': + resolution: {integrity: sha512-5PjwB0uP2XDp3nt5u5NJAG2DORHIRClPzWT/TTZhJ2Ekwe8M5bA9tvPdi9NO/n2uvu2/ictat8kgqvLfcIE1SA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/phoenix@1.6.4': + resolution: {integrity: sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA==} + + '@types/prop-types@15.7.11': + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + '@types/react-dom@18.2.19': + resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} + + '@types/react-simple-maps@3.0.4': + resolution: {integrity: sha512-U9qnX0wVhxldrTpsase44fIoLpyO1OT/hgNMRoJTixj1qjpMRdSRIfih93mR3D/Tss/8CmM7dPwKMjtaGkDpmw==} + + '@types/react-syntax-highlighter@15.5.11': + resolution: {integrity: sha512-ZqIJl+Pg8kD+47kxUjvrlElrraSUrYa4h0dauY/U/FTUuprSCqvUj+9PNQNQzVc6AJgIWUUxn87/gqsMHNbRjw==} + + '@types/react-transition-group@4.4.10': + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + + '@types/react@18.2.58': + resolution: {integrity: sha512-TaGvMNhxvG2Q0K0aYxiKfNDS5m5ZsoIBBbtfUorxdH4NGSXIlYvZxLJI+9Dd3KjeB3780bciLyAb7ylO8pLhPw==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/throttle-debounce@2.1.0': + resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vercel/style-guide@5.2.0': + resolution: {integrity: sha512-fNSKEaZvSkiBoF6XEefs8CcgAV9K9e+MbcsDZjUsktHycKdA0jvjAzQi1W/FzLS+Nr5zZ6oejCwq/97dHUKe0g==} + engines: {node: '>=16'} + peerDependencies: + '@next/eslint-plugin-next': '>=12.3.0 <15' + eslint: '>=8.48.0 <9' + prettier: '>=3.0.0 <4' + typescript: '>=4.8.0 <6' + peerDependenciesMeta: + '@next/eslint-plugin-next': + optional: true + eslint: + optional: true + prettier: + optional: true + typescript: + optional: true + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abs-svg-path@0.1.1: + resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} + + acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.filter@1.0.3: + resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.4: + resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-amplify@6.0.17: + resolution: {integrity: sha512-57tFeE89XsVIe+2zusu4SDXHMGkUbc5vs4hHahDimkMYaiQJFSJWZ7yhMVVmfL9sCEG8BQXUxp4q46qZkANOJw==} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@0.1.2: + resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytewise-core@1.2.3: + resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} + + bytewise@1.1.0: + resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001589: + resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==} + + case-anything@2.1.13: + resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} + engines: {node: '>=12.13'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheap-ruler@3.0.2: + resolution: {integrity: sha512-02T332h1/HTN6cDSufLP8x4JzDs2+VC+8qZ/N0kWIVPyc2xUkWwWh3B2fJxR7raXkL4Mq7k554mfuM9ofv/vGg==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-js@3.36.0: + resolution: {integrity: sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + csscolorparser@1.0.3: + resolution: {integrity: sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==} + + cssjanus@2.1.0: + resolution: {integrity: sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==} + engines: {node: '>=10.0.0'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@2.0.0: + resolution: {integrity: sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@2.0.0: + resolution: {integrity: sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==} + + d3-drag@2.0.0: + resolution: {integrity: sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==} + + d3-ease@2.0.0: + resolution: {integrity: sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@2.0.2: + resolution: {integrity: sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==} + + d3-interpolate@2.0.1: + resolution: {integrity: sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@2.0.0: + resolution: {integrity: sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@2.0.0: + resolution: {integrity: sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@2.0.0: + resolution: {integrity: sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==} + peerDependencies: + d3-selection: '2' + + d3-zoom@2.0.0: + resolution: {integrity: sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + dash-get@1.0.2: + resolution: {integrity: sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==} + + data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.681: + resolution: {integrity: sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==} + + embla-carousel-react@8.0.0: + resolution: {integrity: sha512-qT0dii8ZwoCtEIBE6ogjqU2+5IwnGfdt2teKjCzW88JRErflhlCpz8KjWnW8xoRZOP8g0clRtsMEFoAgS/elfA==} + peerDependencies: + react: ^16.8.0 || ^17.0.1 || ^18.0.0 + + embla-carousel-reactive-utils@8.0.0: + resolution: {integrity: sha512-JCw0CqCXI7tbHDRogBb9PoeMLyjEC1vpN0lDOzUjmlfVgtfF+ffLaOK8bVtXVUEbNs/3guGe3NSzA5J5aYzLzw==} + peerDependencies: + embla-carousel: 8.0.0 + + embla-carousel@8.0.0: + resolution: {integrity: sha512-ecixcyqS6oKD2nh5Nj5MObcgoSILWNI/GtBxkidn5ytFaCCmwVHo2SecksaQZHcARMMpIR2dWOlSIdA1LkZFUA==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.4: + resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} + engines: {node: '>= 0.4'} + + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.0.17: + resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-next@14.1.0: + resolution: {integrity: sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-alias@1.1.2: + resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} + engines: {node: '>= 4'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest@27.9.0: + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-playwright@0.16.0: + resolution: {integrity: sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==} + peerDependencies: + eslint: '>=7' + eslint-plugin-jest: '>=25' + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.33.2: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-testing-library@6.2.0: + resolution: {integrity: sha512-+LCYJU81WF2yQ+Xu4A135CgK8IszcFcyMF4sWkbiu6Oj+Nel0TrkZq/HvDw0/1WuO3dhDQsZA/OpEMGd0NfcUw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + + eslint-plugin-tsdoc@0.2.17: + resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} + + eslint-plugin-unicorn@48.0.1: + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + + fast-xml-parser@4.3.5: + resolution: {integrity: sha512-sWvP1Pl8H03B8oFJpFR3HE31HUfwtX7Rlf9BNsvdpujD4n7WMhfmu8h9wOV2u+c1k0ZilTADhPqypzx2J690ZQ==} + hasBin: true + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + firebase@10.8.0: + resolution: {integrity: sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + fontkit@2.0.2: + resolution: {integrity: sha512-jc4k5Yr8iov8QfS6u8w2CnHWVmbOGtdBtOXMze5Y+QD966Rx6PEVWXSEGwXlsDlKtu1G12cJjcsybnqhSk/+LA==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + geojson-vt@3.2.1: + resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + git-hooks-list@3.1.0: + resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + + gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql@15.8.0: + resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} + engines: {node: '>= 10.x'} + + grid-index@1.1.0: + resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hsl-to-hex@1.0.0: + resolution: {integrity: sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==} + + hsl-to-rgb-for-reals@1.1.1: + resolution: {integrity: sha512-LgOWAkrN0rFaQpfdWBQlv/VhkOxb5AsBjk6NQVx4yEzWS923T07X0M1Y0VNko2H52HeSpZrZNNMJ0aFqsdVzQg==} + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + html-tokenize@2.0.1: + resolution: {integrity: sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==} + hasBin: true + + html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + hyphen@1.10.4: + resolution: {integrity: sha512-SejXzIpv9gOVdDWXd4suM1fdF1k2dxZGvuTdkOVLoazYfK7O4DykIQbdrvuyG+EaTNlXAGhMndtKrhykgbt0gg==} + + i18next-fs-backend@2.3.1: + resolution: {integrity: sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg==} + + i18next-http-backend@2.5.0: + resolution: {integrity: sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==} + + i18next@23.10.0: + resolution: {integrity: sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + idb@5.0.6: + resolution: {integrity: sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw==} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immer@9.0.6: + resolution: {integrity: sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jay-peg@1.0.1: + resolution: {integrity: sha512-zBfjkGbuuNXk8JW+rEePpPEbRRjupS8q+5yPak7kjy3e2GvvNwsLle9okEFvfGyZA6HvtSSiYrVd1/jgnYebaQ==} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + joi@17.12.2: + resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} + + jose@4.15.4: + resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-pretty-compact@3.0.0: + resolution: {integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + kdbush@4.0.2: + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.1.3: + resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + mapbox-gl@3.1.2: + resolution: {integrity: sha512-+KoLEqZM8GxO/ViPz9tKgGURteKne+Y0pXiVCNsowymiZFH3FiL6dt9oZE95owMg5XqD3Kygz5mfchR1ZgmWlA==} + + markdown-it@14.0.0: + resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==} + hasBin: true + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.1.0: + resolution: {integrity: sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-engine@1.0.3: + resolution: {integrity: sha512-aa5tG6sDoK+k70B9iEX1NeyfT8ObCKhNDs6lJVpwF6r8vhUfuKMslIcirq6HIUYuuUYLefcEQOn9bSBOvawtwg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multipipe@1.0.2: + resolution: {integrity: sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==} + + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-i18next@15.2.0: + resolution: {integrity: sha512-Rl5yZ4oGffsB0AjRykZ5PzNQ2M6am54MaMayldGmH/UKZisrIxk2SKEPJvaHhKlWe1qgdNi2FkodwK8sEjfEmg==} + engines: {node: '>=14'} + peerDependencies: + i18next: '>= 23.7.13' + next: '>= 12.0.0' + react: '>= 17.0.2' + react-i18next: '>= 13.5.0' + + next@14.1.0: + resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-svg-path@1.1.0: + resolution: {integrity: sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + + oauth4webapi@2.10.3: + resolution: {integrity: sha512-9FkXEXfzVKzH63GUOZz1zMr3wBaICSzk6DLXx+CGdrQ10ItNk2ePWzYYc1fdmKq1ayGFb2aX97sRCoZ2s0mkDw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.2: + resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} + + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + + object.omit@3.0.0: + resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==} + engines: {node: '>=0.10.0'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + openid-client@5.6.4: + resolution: {integrity: sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-svg-path@0.1.2: + resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pbf@3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + potpack@2.0.0: + resolution: {integrity: sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==} + + preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-packagejson@2.4.12: + resolution: {integrity: sha512-hifuuOgw5rHHTdouw9VrhT8+Nd7UwxtL1qco8dUfd4XUFQL6ia3xyjSxhPQTsGnSYFraTWy5Omb+MZm/OWDTpQ==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + + prosemirror-changeset@2.2.1: + resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.5.2: + resolution: {integrity: sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==} + + prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + + prosemirror-history@1.3.2: + resolution: {integrity: sha512-/zm0XoU/N/+u7i5zepjmZAEnpvjDtzoPWW6VmKptcAnPadN/SStsBjMImdCEbb3seiNTpveziPTIrXQbHLtU1g==} + + prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + + prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + + prosemirror-markdown@1.12.0: + resolution: {integrity: sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ==} + + prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + + prosemirror-model@1.19.4: + resolution: {integrity: sha512-RPmVXxUfOhyFdayHawjuZCxiROsm9L4FCUA6pWI+l7n2yCBsWy9VpdE1hpDHUS8Vad661YLY9AzqfjLhAKQ4iQ==} + + prosemirror-schema-basic@1.2.2: + resolution: {integrity: sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw==} + + prosemirror-schema-list@1.3.0: + resolution: {integrity: sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A==} + + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + + prosemirror-tables@1.3.5: + resolution: {integrity: sha512-JSZ2cCNlApu/ObAhdPyotrjBe2cimniniTpz60YXzbL0kZ+47nEYk2LWbfKU2lKpBkUNquta2PjteoNi4YCluQ==} + + prosemirror-trailing-node@2.0.7: + resolution: {integrity: sha512-8zcZORYj/8WEwsGo6yVCRXFMOfBo0Ub3hCUvmoWIZYfMP26WqENU0mpEP27w7mt8buZWuGrydBewr0tOArPb1Q==} + peerDependencies: + prosemirror-model: ^1.19.0 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.31.2 + + prosemirror-transform@1.8.0: + resolution: {integrity: sha512-BaSBsIMv52F1BVVMvOmp1yzD3u65uC3HTzCBQV1WDPqJRQ2LuHKcyfn0jwqodo8sR9vVzMzZyI+Dal5W9E6a9A==} + + prosemirror-view@1.33.1: + resolution: {integrity: sha512-62qkYgSJIkwIMMCpuGuPzc52DiK1Iod6TWoIMxP4ja6BTD4yO8kCUL64PZ/WhH/dJ9fW0CDO39FhH1EMyhUFEg==} + + protobufjs@7.2.6: + resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + engines: {node: '>=12.0.0'} + + protocol-buffers-schema@3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quickselect@2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + + ramda@0.29.1: + resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-dropzone@14.2.3: + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + + react-hook-form@7.50.1: + resolution: {integrity: sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + react-i18next@14.0.5: + resolution: {integrity: sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-map-gl@7.1.7: + resolution: {integrity: sha512-mwjc0obkBJOXCcoXQr3VoLqmqwo9vS4bXfbGsdxXzEgVCv/PM0v+1QggL7W0d/ccIy+VCjbXNlGij+PENz6VNg==} + peerDependencies: + mapbox-gl: '>=1.13.0' + maplibre-gl: '>=1.13.0' + react: '>=16.3.0' + react-dom: '>=16.3.0' + peerDependenciesMeta: + mapbox-gl: + optional: true + maplibre-gl: + optional: true + + react-markdown@9.0.1: + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-simple-maps@3.0.0: + resolution: {integrity: sha512-vKNFrvpPG8Vyfdjnz5Ne1N56rZlDfHXv5THNXOVZMqbX1rWZA48zQuYT03mx6PAKanqarJu/PDLgshIZAfHHqw==} + peerDependencies: + prop-types: ^15.7.2 + react: ^16.8.0 || 17.x || 18.x + react-dom: ^16.8.0 || 17.x || 18.x + + react-smooth@4.0.0: + resolution: {integrity: sha512-2NMXOBY1uVUQx1jBeENGA497HK20y6CPGYL1ZnJLeoQ8rrc3UfmOM82sRxtzpcoCkUMy4CS0RGylfuVhuFjBgg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-syntax-highlighter@15.5.0: + resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} + peerDependencies: + react: '>= 0.14.0' + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.12.1: + resolution: {integrity: sha512-35vUCEBPf+pM+iVgSgVTn86faKya5pc4JO6cYJL63qOK2zDEyzDn20Tdj+CDI/3z+VcpKyQ8ZBQ9OiQ+vuAbjg==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.5: + resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} + engines: {node: '>= 0.4'} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restructure@3.0.0: + resolution: {integrity: sha512-Xj8/MEIhhfj9X2rmD9iJ4Gga9EFqVlpMj3vfLnV2r/Mh5jRMryNV+6lWh9GdJtDBcBSPIqzRdfBQ3wDtNFv/uw==} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.17.0: + resolution: {integrity: sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + sonner@1.4.1: + resolution: {integrity: sha512-KJcFbMF+z2OMSJ9H+N6mrk/ffnEzuyLFlHoza/HQvNyiACoY958VtFdC7xD9D74ttzA+kcS1YIJOsNwbKWDsHw==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + sort-asc@0.2.0: + resolution: {integrity: sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==} + engines: {node: '>=0.10.0'} + + sort-desc@0.2.0: + resolution: {integrity: sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==} + engines: {node: '>=0.10.0'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-object@3.0.3: + resolution: {integrity: sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==} + engines: {node: '>=0.10.0'} + + sort-package-json@2.8.0: + resolution: {integrity: sha512-PxeNg93bTJWmDGnu0HADDucoxfFiKkIr73Kv85EBThlI1YQPdc0XovBgg2llD0iABZbu2SlKo8ntGmOP9wOj/g==} + hasBin: true + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis-plugin-rtl@2.1.1: + resolution: {integrity: sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==} + peerDependencies: + stylis: 4.x + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + + supercluster@8.0.1: + resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-arc-to-cubic-bezier@3.2.0: + resolution: {integrity: sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + + through2@0.4.2: + resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyqueue@2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + topojson-client@3.1.0: + resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} + hasBin: true + + tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@1.2.1: + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typewise-core@1.2.0: + resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} + + typewise@1.0.3: + resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} + + uc.micro@2.0.0: + resolution: {integrity: sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==} + + ulid@2.3.0: + resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} + engines: {node: '>=14.0'} + + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + victory-vendor@36.9.1: + resolution: {integrity: sha512-+pZIP+U3pEJdDCeFmsXwHzV7vNHQC/eIbHklfe2ZCZqayYRH7lQbHcVgsJ0XOOv27hWs4jH4MONgXxHMObTMSA==} + + vite-compatible-readable-stream@3.6.1: + resolution: {integrity: sha512-t20zYkrSf868+j/p31cRIGN28Phrjm3nRSLR2fyc2tiWi4cZGVdv68yNlwnIINTkMTmPoMiSlc0OadaO7DXZaQ==} + engines: {node: '>= 6'} + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vt-pbf@3.1.3: + resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} + engines: {node: '>=0.4'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoga-layout@2.0.1: + resolution: {integrity: sha512-tT/oChyDXelLo2A+UVnlW9GU7CsvFMaEnd9kVFsaiCQonFAXd3xrHhkLYu+suwwosrAEQ746xBU+HvYtm1Zs2Q==} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adobe/css-tools@4.3.3': {} + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 + + '@auth0/nextjs-auth0@3.5.0(next@14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + dependencies: + '@panva/hkdf': 1.1.1 + cookie: 0.6.0 + debug: 4.3.4 + joi: 17.12.2 + jose: 4.15.4 + next: 14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + oauth4webapi: 2.10.3 + openid-client: 5.6.4 + tslib: 2.6.2 + url-join: 4.0.1 + transitivePeerDependencies: + - supports-color + + '@aws-amplify/analytics@7.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/core': 6.0.17 + '@aws-sdk/client-firehose': 3.398.0 + '@aws-sdk/client-kinesis': 3.398.0 + '@aws-sdk/client-personalize-events': 3.398.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-amplify/api-graphql@4.0.17': + dependencies: + '@aws-amplify/api-rest': 4.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/core': 6.0.17 + '@aws-amplify/data-schema-types': 0.7.5 + '@aws-sdk/types': 3.387.0 + graphql: 15.8.0 + rxjs: 7.8.1 + tslib: 2.6.2 + uuid: 9.0.1 + + '@aws-amplify/api-rest@4.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/core': 6.0.17 + tslib: 2.6.2 + + '@aws-amplify/api@6.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/api-graphql': 4.0.17 + '@aws-amplify/api-rest': 4.0.17(@aws-amplify/core@6.0.17) + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-amplify/core' + + '@aws-amplify/auth@6.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/core': 6.0.17 + tslib: 2.6.2 + + '@aws-amplify/core@6.0.17': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/types': 3.398.0 + '@smithy/util-hex-encoding': 2.0.0 + '@types/uuid': 9.0.8 + js-cookie: 3.0.5 + rxjs: 7.8.1 + tslib: 2.6.2 + uuid: 9.0.1 + + '@aws-amplify/data-schema-types@0.7.5': + dependencies: + rxjs: 7.8.1 + + '@aws-amplify/datastore@5.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/api': 6.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/core': 6.0.17 + buffer: 4.9.2 + idb: 5.0.6 + immer: 9.0.6 + rxjs: 7.8.1 + ulid: 2.3.0 + + '@aws-amplify/notifications@2.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/core': 6.0.17 + lodash: 4.17.21 + tslib: 2.6.2 + + '@aws-amplify/storage@6.0.17(@aws-amplify/core@6.0.17)': + dependencies: + '@aws-amplify/core': 6.0.17 + '@aws-sdk/types': 3.398.0 + '@smithy/md5-js': 2.0.7 + buffer: 4.9.2 + fast-xml-parser: 4.3.5 + tslib: 2.6.2 + + '@aws-crypto/crc32@3.0.0': + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.398.0 + tslib: 1.14.1 + + '@aws-crypto/ie11-detection@3.0.0': + dependencies: + tslib: 1.14.1 + + '@aws-crypto/sha256-browser@3.0.0': + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@3.0.0': + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.398.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.398.0 + tslib: 2.6.2 + + '@aws-crypto/supports-web-crypto@3.0.0': + dependencies: + tslib: 1.14.1 + + '@aws-crypto/util@3.0.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + + '@aws-sdk/client-firehose@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.398.0 + '@aws-sdk/credential-provider-node': 3.398.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-signing': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.1.2 + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/hash-node': 2.1.2 + '@smithy/invalid-dependency': 2.1.2 + '@smithy/middleware-content-length': 2.1.2 + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-retry': 2.1.2 + '@smithy/middleware-serde': 2.1.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.2 + '@smithy/util-defaults-mode-node': 2.2.1 + '@smithy/util-retry': 2.1.2 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-kinesis@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.398.0 + '@aws-sdk/credential-provider-node': 3.398.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-signing': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.1.2 + '@smithy/eventstream-serde-browser': 2.1.2 + '@smithy/eventstream-serde-config-resolver': 2.1.2 + '@smithy/eventstream-serde-node': 2.1.2 + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/hash-node': 2.1.2 + '@smithy/invalid-dependency': 2.1.2 + '@smithy/middleware-content-length': 2.1.2 + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-retry': 2.1.2 + '@smithy/middleware-serde': 2.1.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.2 + '@smithy/util-defaults-mode-node': 2.2.1 + '@smithy/util-retry': 2.1.2 + '@smithy/util-utf8': 2.0.0 + '@smithy/util-waiter': 2.1.2 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-personalize-events@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.398.0 + '@aws-sdk/credential-provider-node': 3.398.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-signing': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.1.2 + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/hash-node': 2.1.2 + '@smithy/invalid-dependency': 2.1.2 + '@smithy/middleware-content-length': 2.1.2 + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-retry': 2.1.2 + '@smithy/middleware-serde': 2.1.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.2 + '@smithy/util-defaults-mode-node': 2.2.1 + '@smithy/util-retry': 2.1.2 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.1.2 + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/hash-node': 2.1.2 + '@smithy/invalid-dependency': 2.1.2 + '@smithy/middleware-content-length': 2.1.2 + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-retry': 2.1.2 + '@smithy/middleware-serde': 2.1.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.2 + '@smithy/util-defaults-mode-node': 2.2.1 + '@smithy/util-retry': 2.1.2 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/credential-provider-node': 3.398.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-sdk-sts': 3.398.0 + '@aws-sdk/middleware-signing': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.1.2 + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/hash-node': 2.1.2 + '@smithy/invalid-dependency': 2.1.2 + '@smithy/middleware-content-length': 2.1.2 + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-retry': 2.1.2 + '@smithy/middleware-serde': 2.1.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.2 + '@smithy/util-defaults-mode-node': 2.2.1 + '@smithy/util-retry': 2.1.2 + '@smithy/util-utf8': 2.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-env@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/property-provider': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-ini@3.398.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.398.0 + '@aws-sdk/credential-provider-process': 3.398.0 + '@aws-sdk/credential-provider-sso': 3.398.0 + '@aws-sdk/credential-provider-web-identity': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@smithy/credential-provider-imds': 2.2.2 + '@smithy/property-provider': 2.1.2 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.398.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.398.0 + '@aws-sdk/credential-provider-ini': 3.398.0 + '@aws-sdk/credential-provider-process': 3.398.0 + '@aws-sdk/credential-provider-sso': 3.398.0 + '@aws-sdk/credential-provider-web-identity': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@smithy/credential-provider-imds': 2.2.2 + '@smithy/property-provider': 2.1.2 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/property-provider': 2.1.2 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-sso@3.398.0': + dependencies: + '@aws-sdk/client-sso': 3.398.0 + '@aws-sdk/token-providers': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@smithy/property-provider': 2.1.2 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/property-provider': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-host-header@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-logger@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-recursion-detection@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-sdk-sts@3.398.0': + dependencies: + '@aws-sdk/middleware-signing': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-signing@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/property-provider': 2.1.2 + '@smithy/protocol-http': 2.0.5 + '@smithy/signature-v4': 2.1.2 + '@smithy/types': 2.10.0 + '@smithy/util-middleware': 2.1.2 + tslib: 2.6.2 + + '@aws-sdk/middleware-user-agent@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@smithy/protocol-http': 2.0.5 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/token-providers@3.398.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/middleware-host-header': 3.398.0 + '@aws-sdk/middleware-logger': 3.398.0 + '@aws-sdk/middleware-recursion-detection': 3.398.0 + '@aws-sdk/middleware-user-agent': 3.398.0 + '@aws-sdk/types': 3.398.0 + '@aws-sdk/util-endpoints': 3.398.0 + '@aws-sdk/util-user-agent-browser': 3.398.0 + '@aws-sdk/util-user-agent-node': 3.398.0 + '@smithy/config-resolver': 2.1.2 + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/hash-node': 2.1.2 + '@smithy/invalid-dependency': 2.1.2 + '@smithy/middleware-content-length': 2.1.2 + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-retry': 2.1.2 + '@smithy/middleware-serde': 2.1.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/property-provider': 2.1.2 + '@smithy/protocol-http': 2.0.5 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.2 + '@smithy/util-defaults-mode-node': 2.2.1 + '@smithy/util-retry': 2.1.2 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.387.0': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/types@3.398.0': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/util-endpoints@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + tslib: 2.6.2 + + '@aws-sdk/util-locate-window@3.495.0': + dependencies: + tslib: 2.6.2 + + '@aws-sdk/util-user-agent-browser@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/types': 2.10.0 + bowser: 2.11.0 + tslib: 2.6.2 + + '@aws-sdk/util-user-agent-node@3.398.0': + dependencies: + '@aws-sdk/types': 3.398.0 + '@smithy/node-config-provider': 2.2.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.6.2 + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + '@babel/compat-data@7.23.5': {} + + '@babel/core@7.23.9': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.23.10(@babel/core@7.23.9)(eslint@8.57.0)': + dependencies: + '@babel/core': 7.23.9 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.23.6': + dependencies: + '@babel/types': 7.23.9 + '@jridgewell/gen-mapping': 0.3.4 + '@jridgewell/trace-mapping': 0.3.23 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.23.9 + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.23.9 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-plugin-utils@7.22.5': {} + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.23.9 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.23.9 + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.23.9': + dependencies: + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/parser@7.23.9': + dependencies: + '@babel/types': 7.23.9 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/runtime@7.23.9': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.23.9': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + + '@babel/traverse@7.23.9': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.23.9': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@dnd-kit/accessibility@3.1.0(react@18.2.0)': + dependencies: + react: 18.2.0 + tslib: 2.6.2 + + '@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + + '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.6.2 + + '@dnd-kit/utilities@3.2.2(react@18.2.0)': + dependencies: + react: 18.2.0 + tslib: 2.6.2 + + '@elgorditosalsero/react-gtm-hook@2.7.2(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@emotion/babel-plugin@11.11.0': + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.9 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@1.2.1': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.58 + + '@emotion/serialize@1.1.3': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/server@11.11.0': + dependencies: + '@emotion/utils': 1.2.1 + html-tokenize: 2.0.1 + multipipe: 1.0.2 + through: 2.3.8 + + '@emotion/sheet@1.2.2': {} + + '@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.58 + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fastify/busboy@2.1.0': {} + + '@firebase/analytics-compat@0.2.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)': + dependencies: + '@firebase/analytics': 0.10.1(@firebase/app@0.9.27) + '@firebase/analytics-types': 0.8.0 + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/analytics-types@0.8.0': {} + + '@firebase/analytics@0.10.1(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/app-check-compat@0.3.9(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-check': 0.8.2(@firebase/app@0.9.27) + '@firebase/app-check-types': 0.5.0 + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/app-check-interop-types@0.3.0': {} + + '@firebase/app-check-types@0.5.0': {} + + '@firebase/app-check@0.8.2(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/app-compat@0.2.27': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/app-types@0.9.0': {} + + '@firebase/app@0.9.27': + dependencies: + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + idb: 7.1.1 + tslib: 2.6.2 + + '@firebase/auth-compat@0.5.2(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/auth': 1.6.0(@firebase/app@0.9.27) + '@firebase/auth-types': 0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + - '@react-native-async-storage/async-storage' + + '@firebase/auth-interop-types@0.2.1': {} + + '@firebase/auth-types@0.12.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4)': + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + + '@firebase/auth@1.6.0(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + + '@firebase/component@0.6.5': + dependencies: + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/database-compat@1.0.3': + dependencies: + '@firebase/component': 0.6.5 + '@firebase/database': 1.0.3 + '@firebase/database-types': 1.0.1 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/database-types@1.0.1': + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + + '@firebase/database@1.0.3': + dependencies: + '@firebase/app-check-interop-types': 0.3.0 + '@firebase/auth-interop-types': 0.2.1 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + faye-websocket: 0.11.4 + tslib: 2.6.2 + + '@firebase/firestore-compat@0.3.25(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/firestore': 4.4.2(@firebase/app@0.9.27) + '@firebase/firestore-types': 3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + + '@firebase/firestore-types@3.0.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4)': + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + + '@firebase/firestore@4.4.2(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + '@firebase/webchannel-wrapper': 0.10.5 + '@grpc/grpc-js': 1.9.14 + '@grpc/proto-loader': 0.7.10 + tslib: 2.6.2 + undici: 5.26.5 + + '@firebase/functions-compat@0.3.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/functions': 0.11.1(@firebase/app@0.9.27) + '@firebase/functions-types': 0.6.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/functions-types@0.6.0': {} + + '@firebase/functions@0.11.1(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/app-check-interop-types': 0.3.0 + '@firebase/auth-interop-types': 0.2.1 + '@firebase/component': 0.6.5 + '@firebase/messaging-interop-types': 0.2.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + + '@firebase/installations-compat@0.2.5(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/installations-types': 0.5.0(@firebase/app-types@0.9.0) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + + '@firebase/installations-types@0.5.0(@firebase/app-types@0.9.0)': + dependencies: + '@firebase/app-types': 0.9.0 + + '@firebase/installations@0.6.5(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + idb: 7.1.1 + tslib: 2.6.2 + + '@firebase/logger@0.4.0': + dependencies: + tslib: 2.6.2 + + '@firebase/messaging-compat@0.2.6(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/messaging': 0.12.6(@firebase/app@0.9.27) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/messaging-interop-types@0.2.0': {} + + '@firebase/messaging@0.12.6(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/messaging-interop-types': 0.2.0 + '@firebase/util': 1.9.4 + idb: 7.1.1 + tslib: 2.6.2 + + '@firebase/performance-compat@0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/performance': 0.6.5(@firebase/app@0.9.27) + '@firebase/performance-types': 0.2.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/performance-types@0.2.0': {} + + '@firebase/performance@0.6.5(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/remote-config-compat@0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/logger': 0.4.0 + '@firebase/remote-config': 0.4.5(@firebase/app@0.9.27) + '@firebase/remote-config-types': 0.3.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + + '@firebase/remote-config-types@0.3.0': {} + + '@firebase/remote-config@0.4.5(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/logger': 0.4.0 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + + '@firebase/storage-compat@0.3.4(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27)': + dependencies: + '@firebase/app-compat': 0.2.27 + '@firebase/component': 0.6.5 + '@firebase/storage': 0.12.1(@firebase/app@0.9.27) + '@firebase/storage-types': 0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4) + '@firebase/util': 1.9.4 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + + '@firebase/storage-types@0.8.0(@firebase/app-types@0.9.0)(@firebase/util@1.9.4)': + dependencies: + '@firebase/app-types': 0.9.0 + '@firebase/util': 1.9.4 + + '@firebase/storage@0.12.1(@firebase/app@0.9.27)': + dependencies: + '@firebase/app': 0.9.27 + '@firebase/component': 0.6.5 + '@firebase/util': 1.9.4 + tslib: 2.6.2 + undici: 5.26.5 + + '@firebase/util@1.9.4': + dependencies: + tslib: 2.6.2 + + '@firebase/webchannel-wrapper@0.10.5': {} + + '@floating-ui/core@1.6.0': + dependencies: + '@floating-ui/utils': 0.2.1 + + '@floating-ui/dom@1.6.3': + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@floating-ui/dom': 1.6.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@floating-ui/utils@0.2.1': {} + + '@fontsource/inter@5.0.16': {} + + '@fontsource/plus-jakarta-sans@5.0.18': {} + + '@fontsource/roboto-mono@5.0.16': {} + + '@fullcalendar/core@6.1.11': + dependencies: + preact: 10.12.1 + + '@fullcalendar/daygrid@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + + '@fullcalendar/interaction@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + + '@fullcalendar/list@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + + '@fullcalendar/premium-common@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + + '@fullcalendar/react@6.1.11(@fullcalendar/core@6.1.11)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@fullcalendar/core': 6.1.11 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@fullcalendar/scrollgrid@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + '@fullcalendar/premium-common': 6.1.11(@fullcalendar/core@6.1.11) + + '@fullcalendar/timegrid@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + '@fullcalendar/daygrid': 6.1.11(@fullcalendar/core@6.1.11) + + '@fullcalendar/timeline@6.1.11(@fullcalendar/core@6.1.11)': + dependencies: + '@fullcalendar/core': 6.1.11 + '@fullcalendar/premium-common': 6.1.11(@fullcalendar/core@6.1.11) + '@fullcalendar/scrollgrid': 6.1.11(@fullcalendar/core@6.1.11) + + '@grpc/grpc-js@1.9.14': + dependencies: + '@grpc/proto-loader': 0.7.10 + '@types/node': 20.11.20 + + '@grpc/proto-loader@0.7.10': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.2.6 + yargs: 17.7.2 + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@hookform/resolvers@3.3.4(react-hook-form@7.50.1(react@18.2.0))': + dependencies: + react-hook-form: 7.50.1(react@18.2.0) + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.2': {} + + '@ianvs/prettier-plugin-sort-imports@4.1.1(prettier@3.2.5)': + dependencies: + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 + prettier: 3.2.5 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.11.20 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.23 + '@types/node': 20.11.20 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.23 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.23.9 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.23 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.11.20 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.4': + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.23 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.23': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@mapbox/geojson-rewind@0.5.2': + dependencies: + get-stream: 6.0.1 + minimist: 1.2.8 + + '@mapbox/jsonlint-lines-primitives@2.0.2': {} + + '@mapbox/mapbox-gl-supported@2.0.1': {} + + '@mapbox/point-geometry@0.1.0': {} + + '@mapbox/tiny-sdf@2.0.6': {} + + '@mapbox/unitbezier@0.0.1': {} + + '@mapbox/vector-tile@1.3.1': + dependencies: + '@mapbox/point-geometry': 0.1.0 + + '@mapbox/whoots-js@3.1.0': {} + + '@maplibre/maplibre-gl-style-spec@19.3.3': + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 + json-stringify-pretty-compact: 3.0.0 + minimist: 1.2.8 + rw: 1.3.3 + sort-object: 3.0.3 + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@mui/base@5.0.0-beta.37(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.58) + '@mui/utils': 5.15.11(@types/react@18.2.58)(react@18.2.0) + '@popperjs/core': 2.11.8 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.58 + + '@mui/core-downloads-tracker@5.15.11': {} + + '@mui/lab@5.0.0-alpha.166(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@mui/material@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@mui/base': 5.0.0-beta.37(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.58) + '@mui/utils': 5.15.11(@types/react@18.2.58)(react@18.2.0) + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@types/react': 18.2.58 + + '@mui/material@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@mui/base': 5.0.0-beta.37(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.11 + '@mui/system': 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.58) + '@mui/utils': 5.15.11(@types/react@18.2.58)(react@18.2.0) + '@types/react-transition-group': 4.4.10 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@types/react': 18.2.58 + + '@mui/private-theming@5.15.11(@types/react@18.2.58)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@mui/utils': 5.15.11(@types/react@18.2.58)(react@18.2.0) + prop-types: 15.8.1 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.58 + + '@mui/styled-engine@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@emotion/cache': 11.11.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + optionalDependencies: + '@emotion/react': 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + + '@mui/system@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@mui/private-theming': 5.15.11(@types/react@18.2.58)(react@18.2.0) + '@mui/styled-engine': 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.58) + '@mui/utils': 5.15.11(@types/react@18.2.58)(react@18.2.0) + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + optionalDependencies: + '@emotion/react': 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@types/react': 18.2.58 + + '@mui/types@7.2.13(@types/react@18.2.58)': + optionalDependencies: + '@types/react': 18.2.58 + + '@mui/utils@5.15.11(@types/react@18.2.58)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@types/prop-types': 15.7.11 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + optionalDependencies: + '@types/react': 18.2.58 + + '@mui/x-date-pickers@6.19.5(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@mui/material@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@mui/base': 5.0.0-beta.37(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': 5.15.11(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@emotion/styled@11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + '@mui/utils': 5.15.11(@types/react@18.2.58)(react@18.2.0) + '@types/react-transition-group': 4.4.10 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.3(@types/react@18.2.58)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3(@types/react@18.2.58)(react@18.2.0))(@types/react@18.2.58)(react@18.2.0) + dayjs: 1.11.10 + transitivePeerDependencies: + - '@types/react' + + '@next/env@14.1.0': {} + + '@next/eslint-plugin-next@14.1.0': + dependencies: + glob: 10.3.10 + + '@next/swc-darwin-arm64@14.1.0': + optional: true + + '@next/swc-darwin-x64@14.1.0': + optional: true + + '@next/swc-linux-arm64-gnu@14.1.0': + optional: true + + '@next/swc-linux-arm64-musl@14.1.0': + optional: true + + '@next/swc-linux-x64-gnu@14.1.0': + optional: true + + '@next/swc-linux-x64-musl@14.1.0': + optional: true + + '@next/swc-win32-arm64-msvc@14.1.0': + optional: true + + '@next/swc-win32-ia32-msvc@14.1.0': + optional: true + + '@next/swc-win32-x64-msvc@14.1.0': + optional: true + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@panva/hkdf@1.1.1': {} + + '@phosphor-icons/react@2.0.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@popperjs/core@2.11.8': {} + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@react-pdf/fns@2.2.1': + dependencies: + '@babel/runtime': 7.23.9 + + '@react-pdf/font@2.4.4': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/types': 2.4.1 + cross-fetch: 3.1.8 + fontkit: 2.0.2 + is-url: 1.2.4 + transitivePeerDependencies: + - encoding + + '@react-pdf/image@2.3.4': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/png-js': 2.3.1 + cross-fetch: 3.1.8 + jay-peg: 1.0.1 + transitivePeerDependencies: + - encoding + + '@react-pdf/layout@3.11.2': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/fns': 2.2.1 + '@react-pdf/image': 2.3.4 + '@react-pdf/pdfkit': 3.1.6 + '@react-pdf/primitives': 3.1.1 + '@react-pdf/stylesheet': 4.2.4 + '@react-pdf/textkit': 4.4.1 + '@react-pdf/types': 2.4.1 + cross-fetch: 3.1.8 + emoji-regex: 10.3.0 + queue: 6.0.2 + yoga-layout: 2.0.1 + transitivePeerDependencies: + - encoding + + '@react-pdf/pdfkit@3.1.6': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/png-js': 2.3.1 + browserify-zlib: 0.2.0 + crypto-js: 4.2.0 + fontkit: 2.0.2 + jay-peg: 1.0.1 + vite-compatible-readable-stream: 3.6.1 + + '@react-pdf/png-js@2.3.1': + dependencies: + browserify-zlib: 0.2.0 + + '@react-pdf/primitives@3.1.1': {} + + '@react-pdf/render@3.4.3': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/fns': 2.2.1 + '@react-pdf/primitives': 3.1.1 + '@react-pdf/textkit': 4.4.1 + '@react-pdf/types': 2.4.1 + abs-svg-path: 0.1.1 + color-string: 1.9.1 + normalize-svg-path: 1.1.0 + parse-svg-path: 0.1.2 + svg-arc-to-cubic-bezier: 3.2.0 + + '@react-pdf/renderer@3.3.8(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/font': 2.4.4 + '@react-pdf/layout': 3.11.2 + '@react-pdf/pdfkit': 3.1.6 + '@react-pdf/primitives': 3.1.1 + '@react-pdf/render': 3.4.3 + '@react-pdf/types': 2.4.1 + events: 3.3.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + queue: 6.0.2 + react: 18.2.0 + scheduler: 0.17.0 + transitivePeerDependencies: + - encoding + + '@react-pdf/stylesheet@4.2.4': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/fns': 2.2.1 + '@react-pdf/types': 2.4.1 + color-string: 1.9.1 + hsl-to-hex: 1.0.0 + media-engine: 1.0.3 + postcss-value-parser: 4.2.0 + + '@react-pdf/textkit@4.4.1': + dependencies: + '@babel/runtime': 7.23.9 + '@react-pdf/fns': 2.2.1 + bidi-js: 1.0.3 + hyphen: 1.10.4 + unicode-properties: 1.4.1 + + '@react-pdf/types@2.4.1': {} + + '@remirror/core-constants@2.0.2': {} + + '@remirror/core-helpers@3.0.0': + dependencies: + '@remirror/core-constants': 2.0.2 + '@remirror/types': 1.0.1 + '@types/object.omit': 3.0.3 + '@types/object.pick': 1.3.4 + '@types/throttle-debounce': 2.1.0 + case-anything: 2.1.13 + dash-get: 1.0.2 + deepmerge: 4.3.1 + fast-deep-equal: 3.1.3 + make-error: 1.3.6 + object.omit: 3.0.0 + object.pick: 1.3.0 + throttle-debounce: 3.0.1 + + '@remirror/types@1.0.1': + dependencies: + type-fest: 2.19.0 + + '@rushstack/eslint-patch@1.7.2': {} + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@smithy/abort-controller@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/config-resolver@2.1.2': + dependencies: + '@smithy/node-config-provider': 2.2.2 + '@smithy/types': 2.10.0 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.2 + tslib: 2.6.2 + + '@smithy/credential-provider-imds@2.2.2': + dependencies: + '@smithy/node-config-provider': 2.2.2 + '@smithy/property-provider': 2.1.2 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + tslib: 2.6.2 + + '@smithy/eventstream-codec@2.1.2': + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.10.0 + '@smithy/util-hex-encoding': 2.1.1 + tslib: 2.6.2 + + '@smithy/eventstream-serde-browser@2.1.2': + dependencies: + '@smithy/eventstream-serde-universal': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/eventstream-serde-config-resolver@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/eventstream-serde-node@2.1.2': + dependencies: + '@smithy/eventstream-serde-universal': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/eventstream-serde-universal@2.1.2': + dependencies: + '@smithy/eventstream-codec': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/fetch-http-handler@2.4.2': + dependencies: + '@smithy/protocol-http': 3.2.0 + '@smithy/querystring-builder': 2.1.2 + '@smithy/types': 2.10.0 + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 + + '@smithy/hash-node@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + + '@smithy/invalid-dependency@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/is-array-buffer@2.1.1': + dependencies: + tslib: 2.6.2 + + '@smithy/md5-js@2.0.7': + dependencies: + '@smithy/types': 2.10.0 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + + '@smithy/middleware-content-length@2.1.2': + dependencies: + '@smithy/protocol-http': 3.2.0 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/middleware-endpoint@2.4.2': + dependencies: + '@smithy/middleware-serde': 2.1.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/types': 2.10.0 + '@smithy/url-parser': 2.1.2 + '@smithy/util-middleware': 2.1.2 + tslib: 2.6.2 + + '@smithy/middleware-retry@2.1.2': + dependencies: + '@smithy/node-config-provider': 2.2.2 + '@smithy/protocol-http': 3.2.0 + '@smithy/service-error-classification': 2.1.2 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/util-middleware': 2.1.2 + '@smithy/util-retry': 2.1.2 + tslib: 2.6.2 + uuid: 8.3.2 + + '@smithy/middleware-serde@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/middleware-stack@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/node-config-provider@2.2.2': + dependencies: + '@smithy/property-provider': 2.1.2 + '@smithy/shared-ini-file-loader': 2.3.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/node-http-handler@2.4.0': + dependencies: + '@smithy/abort-controller': 2.1.2 + '@smithy/protocol-http': 3.2.0 + '@smithy/querystring-builder': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/property-provider@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/protocol-http@2.0.5': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/protocol-http@3.2.0': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/querystring-builder@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + '@smithy/util-uri-escape': 2.1.1 + tslib: 2.6.2 + + '@smithy/querystring-parser@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/service-error-classification@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + + '@smithy/shared-ini-file-loader@2.3.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/signature-v4@2.1.2': + dependencies: + '@smithy/eventstream-codec': 2.1.2 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/types': 2.10.0 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-middleware': 2.1.2 + '@smithy/util-uri-escape': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + + '@smithy/smithy-client@2.4.0': + dependencies: + '@smithy/middleware-endpoint': 2.4.2 + '@smithy/middleware-stack': 2.1.2 + '@smithy/protocol-http': 3.2.0 + '@smithy/types': 2.10.0 + '@smithy/util-stream': 2.1.2 + tslib: 2.6.2 + + '@smithy/types@2.10.0': + dependencies: + tslib: 2.6.2 + + '@smithy/url-parser@2.1.2': + dependencies: + '@smithy/querystring-parser': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/util-base64@2.1.1': + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + + '@smithy/util-body-length-browser@2.1.1': + dependencies: + tslib: 2.6.2 + + '@smithy/util-body-length-node@2.2.1': + dependencies: + tslib: 2.6.2 + + '@smithy/util-buffer-from@2.1.1': + dependencies: + '@smithy/is-array-buffer': 2.1.1 + tslib: 2.6.2 + + '@smithy/util-config-provider@2.2.1': + dependencies: + tslib: 2.6.2 + + '@smithy/util-defaults-mode-browser@2.1.2': + dependencies: + '@smithy/property-provider': 2.1.2 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + bowser: 2.11.0 + tslib: 2.6.2 + + '@smithy/util-defaults-mode-node@2.2.1': + dependencies: + '@smithy/config-resolver': 2.1.2 + '@smithy/credential-provider-imds': 2.2.2 + '@smithy/node-config-provider': 2.2.2 + '@smithy/property-provider': 2.1.2 + '@smithy/smithy-client': 2.4.0 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/util-hex-encoding@2.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/util-hex-encoding@2.1.1': + dependencies: + tslib: 2.6.2 + + '@smithy/util-middleware@2.1.2': + dependencies: + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/util-retry@2.1.2': + dependencies: + '@smithy/service-error-classification': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@smithy/util-stream@2.1.2': + dependencies: + '@smithy/fetch-http-handler': 2.4.2 + '@smithy/node-http-handler': 2.4.0 + '@smithy/types': 2.10.0 + '@smithy/util-base64': 2.1.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + + '@smithy/util-uri-escape@2.1.1': + dependencies: + tslib: 2.6.2 + + '@smithy/util-utf8@2.0.0': + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + + '@smithy/util-utf8@2.1.1': + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + + '@smithy/util-waiter@2.1.2': + dependencies: + '@smithy/abort-controller': 2.1.2 + '@smithy/types': 2.10.0 + tslib: 2.6.2 + + '@supabase/functions-js@2.1.5': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/gotrue-js@2.62.2': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/node-fetch@2.6.15': + dependencies: + whatwg-url: 5.0.0 + + '@supabase/postgrest-js@1.9.2': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/realtime-js@2.9.3': + dependencies: + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.4 + '@types/ws': 8.5.10 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@supabase/ssr@0.1.0(@supabase/supabase-js@2.39.7)': + dependencies: + '@supabase/supabase-js': 2.39.7 + cookie: 0.5.0 + ramda: 0.29.1 + + '@supabase/storage-js@2.5.5': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/supabase-js@2.39.7': + dependencies: + '@supabase/functions-js': 2.1.5 + '@supabase/gotrue-js': 2.62.2 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.9.2 + '@supabase/realtime-js': 2.9.3 + '@supabase/storage-js': 2.5.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@swc/helpers@0.4.14': + dependencies: + tslib: 2.6.2 + + '@swc/helpers@0.4.36': + dependencies: + legacy-swc-helpers: '@swc/helpers@0.4.14' + tslib: 2.6.2 + + '@swc/helpers@0.5.2': + dependencies: + tslib: 2.6.2 + + '@testing-library/dom@9.3.4': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.9 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.4.2(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))': + dependencies: + '@adobe/css-tools': 4.3.3 + '@babel/runtime': 7.23.9 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + optionalDependencies: + '@jest/globals': 29.7.0 + '@types/jest': 29.5.12 + jest: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + + '@testing-library/react@14.2.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.9 + '@testing-library/dom': 9.3.4 + '@types/react-dom': 18.2.19 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@tiptap/core@2.2.4(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-blockquote@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-bold@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-bubble-menu@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + tippy.js: 6.3.7 + + '@tiptap/extension-bullet-list@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-code-block@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-code@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-document@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-dropcursor@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-floating-menu@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + tippy.js: 6.3.7 + + '@tiptap/extension-gapcursor@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-hard-break@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-heading@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-history@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-horizontal-rule@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-italic@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-link@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + linkifyjs: 4.1.3 + + '@tiptap/extension-list-item@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-ordered-list@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-paragraph@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-placeholder@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + + '@tiptap/extension-strike@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/extension-text@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + + '@tiptap/pm@2.2.4': + dependencies: + prosemirror-changeset: 2.2.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.5.2 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.3.2 + prosemirror-inputrules: 1.4.0 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.12.0 + prosemirror-menu: 1.2.4 + prosemirror-model: 1.19.4 + prosemirror-schema-basic: 1.2.2 + prosemirror-schema-list: 1.3.0 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.3.5 + prosemirror-trailing-node: 2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.1) + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + + '@tiptap/react@2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/extension-bubble-menu': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-floating-menu': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/pm': 2.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@tiptap/starter-kit@2.2.4(@tiptap/pm@2.2.4)': + dependencies: + '@tiptap/core': 2.2.4(@tiptap/pm@2.2.4) + '@tiptap/extension-blockquote': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-bold': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-bullet-list': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-code': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-code-block': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-document': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-dropcursor': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-gapcursor': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-hard-break': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-heading': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-history': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-horizontal-rule': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-italic': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-list-item': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-ordered-list': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-paragraph': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-strike': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + '@tiptap/extension-text': 2.2.4(@tiptap/core@2.2.4(@tiptap/pm@2.2.4)) + transitivePeerDependencies: + - '@tiptap/pm' + + '@tootallnate/once@2.0.0': {} + + '@types/aria-query@5.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.23.9 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.23.9 + + '@types/d3-array@3.2.1': {} + + '@types/d3-color@2.0.6': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-geo@2.0.7': + dependencies: + '@types/geojson': 7946.0.14 + + '@types/d3-interpolate@2.0.5': + dependencies: + '@types/d3-color': 2.0.6 + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.0': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.3 + + '@types/d3-selection@2.0.4': {} + + '@types/d3-shape@3.1.6': + dependencies: + '@types/d3-path': 3.1.0 + + '@types/d3-time@3.0.3': {} + + '@types/d3-timer@3.0.2': {} + + '@types/d3-zoom@2.0.7': + dependencies: + '@types/d3-interpolate': 2.0.5 + '@types/d3-selection': 2.0.4 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.5 + + '@types/estree@1.0.5': {} + + '@types/geojson@7946.0.14': {} + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.11.20 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.10 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.2.58 + hoist-non-react-statics: 3.3.2 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.12': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/jsdom@20.0.1': + dependencies: + '@types/node': 20.11.20 + '@types/tough-cookie': 4.0.5 + parse5: 7.1.2 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/mapbox-gl@3.1.0': + dependencies: + '@types/geojson': 7946.0.14 + + '@types/mdast@4.0.3': + dependencies: + '@types/unist': 3.0.2 + + '@types/ms@0.7.34': {} + + '@types/node@20.11.20': + dependencies: + undici-types: 5.26.5 + + '@types/normalize-package-data@2.4.4': {} + + '@types/object.omit@3.0.3': {} + + '@types/object.pick@1.3.4': {} + + '@types/parse-json@4.0.2': {} + + '@types/phoenix@1.6.4': {} + + '@types/prop-types@15.7.11': {} + + '@types/react-dom@18.2.19': + dependencies: + '@types/react': 18.2.58 + + '@types/react-simple-maps@3.0.4': + dependencies: + '@types/d3-geo': 2.0.7 + '@types/d3-zoom': 2.0.7 + '@types/geojson': 7946.0.14 + '@types/react': 18.2.58 + + '@types/react-syntax-highlighter@15.5.11': + dependencies: + '@types/react': 18.2.58 + + '@types/react-transition-group@4.4.10': + dependencies: + '@types/react': 18.2.58 + + '@types/react@18.2.58': + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + '@types/scheduler@0.16.8': {} + + '@types/semver@7.5.8': {} + + '@types/stack-utils@2.0.3': {} + + '@types/throttle-debounce@2.1.0': {} + + '@types/tough-cookie@4.0.5': {} + + '@types/unist@2.0.10': {} + + '@types/unist@3.0.2': {} + + '@types/uuid@9.0.8': {} + + '@types/ws@8.5.10': + dependencies: + '@types/node': 20.11.20 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.32': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.3.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + eslint: 8.57.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vercel/style-guide@5.2.0(@next/eslint-plugin-next@14.1.0)(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(prettier@3.2.5)(typescript@5.3.3)': + dependencies: + '@babel/core': 7.23.9 + '@babel/eslint-parser': 7.23.10(@babel/core@7.23.9)(eslint@8.57.0) + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(typescript@5.3.3) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(typescript@5.3.3))(eslint@8.57.0) + eslint-plugin-react: 7.33.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + eslint-plugin-testing-library: 6.2.0(eslint@8.57.0)(typescript@5.3.3) + eslint-plugin-tsdoc: 0.2.17 + eslint-plugin-unicorn: 48.0.1(eslint@8.57.0) + prettier-plugin-packagejson: 2.4.12(prettier@3.2.5) + optionalDependencies: + '@next/eslint-plugin-next': 14.1.0 + eslint: 8.57.0 + prettier: 3.2.5 + typescript: 5.3.3 + transitivePeerDependencies: + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - jest + - supports-color + + abab@2.0.6: {} + + abs-svg-path@0.1.1: {} + + acorn-globals@7.0.1: + dependencies: + acorn: 8.11.3 + acorn-walk: 8.3.2 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.1.3: + dependencies: + deep-equal: 2.2.3 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + arr-union@3.1.0: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.filter@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + + array.prototype.findlastindex@1.2.4: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + assign-symbols@1.0.0: {} + + ast-types-flow@0.0.8: {} + + asynciterator.prototype@1.0.0: + dependencies: + has-symbols: 1.0.3 + + asynckit@0.4.0: {} + + attr-accept@2.2.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + aws-amplify@6.0.17: + dependencies: + '@aws-amplify/analytics': 7.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/api': 6.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/auth': 6.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/core': 6.0.17 + '@aws-amplify/datastore': 5.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/notifications': 2.0.17(@aws-amplify/core@6.0.17) + '@aws-amplify/storage': 6.0.17(@aws-amplify/core@6.0.17) + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + axe-core@4.7.0: {} + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 + + babel-jest@29.7.0(@babel/core@7.23.9): + dependencies: + '@babel/core': 7.23.9 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.23.9) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.23.9 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + + babel-preset-jest@29.6.3(@babel/core@7.23.9): + dependencies: + '@babel/core': 7.23.9 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + bowser@2.11.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browserify-zlib@0.2.0: + dependencies: + pako: 1.0.11 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001589 + electron-to-chromium: 1.4.681 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@0.1.2: {} + + buffer-from@1.1.2: {} + + buffer@4.9.2: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + + builtin-modules@3.3.0: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytewise-core@1.2.3: + dependencies: + typewise-core: 1.2.0 + + bytewise@1.1.0: + dependencies: + bytewise-core: 1.2.3 + typewise: 1.0.3 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001589: {} + + case-anything@2.1.13: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + cheap-ruler@3.0.2: {} + + ci-info@3.9.0: {} + + cjs-module-lexer@1.2.3: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + client-only@0.0.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + clsx@2.1.0: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + concat-map@0.0.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.5.0: {} + + cookie@0.6.0: {} + + core-js@3.36.0: {} + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + create-jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + crelt@1.0.6: {} + + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-fetch@4.0.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css.escape@1.5.1: {} + + csscolorparser@1.0.3: {} + + cssjanus@2.1.0: {} + + cssom@0.3.8: {} + + cssom@0.5.0: {} + + cssstyle@2.3.0: + dependencies: + cssom: 0.3.8 + + csstype@3.1.3: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@2.0.0: {} + + d3-color@3.1.0: {} + + d3-dispatch@2.0.0: {} + + d3-drag@2.0.0: + dependencies: + d3-dispatch: 2.0.0 + d3-selection: 2.0.0 + + d3-ease@2.0.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.0: {} + + d3-geo@2.0.2: + dependencies: + d3-array: 2.12.1 + + d3-interpolate@2.0.1: + dependencies: + d3-color: 2.0.0 + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@2.0.0: {} + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@2.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@2.0.0(d3-selection@2.0.0): + dependencies: + d3-color: 2.0.0 + d3-dispatch: 2.0.0 + d3-ease: 2.0.0 + d3-interpolate: 2.0.1 + d3-selection: 2.0.0 + d3-timer: 2.0.0 + + d3-zoom@2.0.0: + dependencies: + d3-dispatch: 2.0.0 + d3-drag: 2.0.0 + d3-interpolate: 2.0.1 + d3-selection: 2.0.0 + d3-transition: 2.0.0(d3-selection@2.0.0) + + damerau-levenshtein@1.0.8: {} + + dash-get@1.0.2: {} + + data-urls@3.0.2: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + + dayjs@1.11.10: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decimal.js-light@2.5.1: {} + + decimal.js@10.4.3: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dedent@1.5.1(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 + + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.14 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-indent@7.0.1: {} + + detect-newline@3.1.0: {} + + detect-newline@4.0.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.23.9 + csstype: 3.1.3 + + domexception@4.0.0: + dependencies: + webidl-conversions: 7.0.0 + + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + + earcut@2.2.4: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.4.681: {} + + embla-carousel-react@8.0.0(react@18.2.0): + dependencies: + embla-carousel: 8.0.0 + embla-carousel-reactive-utils: 8.0.0(embla-carousel@8.0.0) + react: 18.2.0 + + embla-carousel-reactive-utils@8.0.0(embla-carousel@8.0.0): + dependencies: + embla-carousel: 8.0.0 + + embla-carousel@8.0.0: {} + + emittery@0.13.1: {} + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.15.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.22.4: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.14 + + es-array-method-boxes-properly@1.0.0: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + + es-iterator-helpers@1.0.17: + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.1 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-config-next@14.1.0(eslint@8.57.0)(typescript@5.3.3): + dependencies: + '@next/eslint-plugin-next': 14.1.0 + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.33.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)): + dependencies: + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.57.0 + ignore: 5.3.1 + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.1 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.4 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.1 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.2 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(typescript@5.3.3): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3) + jest: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + dependencies: + '@babel/runtime': 7.23.9 + aria-query: 5.3.0 + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.17 + eslint: 8.57.0 + hasown: 2.0.1 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + + eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(typescript@5.3.3))(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + optionalDependencies: + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)(jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0))(typescript@5.3.3) + + eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react@7.33.2(eslint@8.57.0): + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.17 + eslint: 8.57.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + + eslint-plugin-testing-library@6.2.0(eslint@8.57.0)(typescript@5.3.3): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-tsdoc@0.2.17: + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + + eslint-plugin-unicorn@48.0.1(eslint@8.57.0): + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + ci-info: 3.9.0 + clean-regexp: 1.0.0 + eslint: 8.57.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + lodash: 4.17.21 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.0 + strip-indent: 3.0.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + esutils@2.0.3: {} + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-equals@5.0.1: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-xml-parser@4.2.5: + dependencies: + strnum: 1.0.5 + + fast-xml-parser@4.3.5: + dependencies: + strnum: 1.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fault@1.0.4: + dependencies: + format: 0.2.2 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-selector@0.6.0: + dependencies: + tslib: 2.6.2 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + firebase@10.8.0: + dependencies: + '@firebase/analytics': 0.10.1(@firebase/app@0.9.27) + '@firebase/analytics-compat': 0.2.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/app': 0.9.27 + '@firebase/app-check': 0.8.2(@firebase/app@0.9.27) + '@firebase/app-check-compat': 0.3.9(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/app-compat': 0.2.27 + '@firebase/app-types': 0.9.0 + '@firebase/auth': 1.6.0(@firebase/app@0.9.27) + '@firebase/auth-compat': 0.5.2(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/database': 1.0.3 + '@firebase/database-compat': 1.0.3 + '@firebase/firestore': 4.4.2(@firebase/app@0.9.27) + '@firebase/firestore-compat': 0.3.25(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/functions': 0.11.1(@firebase/app@0.9.27) + '@firebase/functions-compat': 0.3.7(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/installations': 0.6.5(@firebase/app@0.9.27) + '@firebase/installations-compat': 0.2.5(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/messaging': 0.12.6(@firebase/app@0.9.27) + '@firebase/messaging-compat': 0.2.6(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/performance': 0.6.5(@firebase/app@0.9.27) + '@firebase/performance-compat': 0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/remote-config': 0.4.5(@firebase/app@0.9.27) + '@firebase/remote-config-compat': 0.2.5(@firebase/app-compat@0.2.27)(@firebase/app@0.9.27) + '@firebase/storage': 0.12.1(@firebase/app@0.9.27) + '@firebase/storage-compat': 0.3.4(@firebase/app-compat@0.2.27)(@firebase/app-types@0.9.0)(@firebase/app@0.9.27) + '@firebase/util': 1.9.4 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + fontkit@2.0.2: + dependencies: + '@swc/helpers': 0.4.36 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.0 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + format@0.2.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + geojson-vt@3.2.1: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + + get-package-type@0.1.0: {} + + get-stdin@9.0.0: {} + + get-stream@6.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.2: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-value@2.0.6: {} + + git-hooks-list@3.1.0: {} + + gl-matrix@3.4.3: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.3.10: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql@15.8.0: {} + + grid-index@1.1.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.1: + dependencies: + function-bind: 1.1.2 + + hast-util-parse-selector@2.2.5: {} + + hast-util-to-jsx-runtime@2.3.0: + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + highlight.js@10.7.3: {} + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hosted-git-info@2.8.9: {} + + hsl-to-hex@1.0.0: + dependencies: + hsl-to-rgb-for-reals: 1.1.1 + + hsl-to-rgb-for-reals@1.1.1: {} + + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + + html-escaper@2.0.2: {} + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + html-tokenize@2.0.1: + dependencies: + buffer-from: 0.1.2 + inherits: 2.0.4 + minimist: 1.2.8 + readable-stream: 1.0.34 + through2: 0.4.2 + + html-url-attributes@3.0.0: {} + + http-parser-js@0.5.8: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + hyphen@1.10.4: {} + + i18next-fs-backend@2.3.1: {} + + i18next-http-backend@2.5.0: + dependencies: + cross-fetch: 4.0.0 + transitivePeerDependencies: + - encoding + + i18next@23.10.0: + dependencies: + '@babel/runtime': 7.23.9 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + idb@5.0.6: {} + + idb@7.1.1: {} + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + immer@9.0.6: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.1.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inline-style-parser@0.2.2: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.5 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.1 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-map@2.0.2: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.2: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.14 + + is-url@1.2.4: {} + + is-weakmap@2.0.1: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.2: + dependencies: + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.5 + set-function-name: 2.0.2 + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jay-peg@1.0.1: + dependencies: + restructure: 3.0.0 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0(babel-plugin-macros@3.1.0): + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1(babel-plugin-macros@3.1.0) + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.0.4 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0): + dependencies: + '@babel/core': 7.23.9 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.23.9) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.11.20 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-jsdom@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/jsdom': 20.0.1 + '@types/node': 20.11.20 + jest-mock: 29.7.0 + jest-util: 29.7.0 + jsdom: 20.0.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.11.20 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.23.5 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/types': 7.23.9 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.11.20 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.11.20 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.11.20)(babel-plugin-macros@3.1.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jju@1.4.0: {} + + joi@17.12.2: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + jose@4.15.4: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@20.0.3: + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 7.0.1 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.1.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + ws: 8.16.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-pretty-compact@3.0.0: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.1.7 + + kdbush@4.0.2: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + language-subtag-registry@0.3.22: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.22 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.0.0 + + linkifyjs@4.1.3: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + long@5.2.3: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowlight@1.20.0: + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + + lru-cache@10.2.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lz-string@1.5.0: {} + + make-dir@4.0.0: + dependencies: + semver: 7.6.0 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + mapbox-gl@3.1.2: + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 2.0.1 + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 2.0.6 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + cheap-ruler: 3.0.2 + csscolorparser: 1.0.3 + earcut: 2.2.4 + geojson-vt: 3.2.1 + gl-matrix: 3.4.3 + grid-index: 1.1.0 + kdbush: 4.0.2 + murmurhash-js: 1.0.0 + pbf: 3.2.1 + potpack: 2.0.0 + quickselect: 2.0.0 + rw: 1.3.3 + supercluster: 8.0.1 + tinyqueue: 2.0.3 + vt-pbf: 3.1.3 + + markdown-it@14.0.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.0.0 + + mdast-util-from-markdown@2.0.0: + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.3 + + mdurl@2.0.0: {} + + media-engine@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.0.4: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multipipe@1.0.2: + dependencies: + duplexer2: 0.1.4 + object-assign: 4.1.1 + + murmurhash-js@1.0.0: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + next-i18next@15.2.0(i18next@23.10.0)(next@14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-i18next@14.0.5(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.23.9 + '@types/hoist-non-react-statics': 3.3.5 + core-js: 3.36.0 + hoist-non-react-statics: 3.3.2 + i18next: 23.10.0 + i18next-fs-backend: 2.3.1 + next: 14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-i18next: 14.0.5(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + + next@14.1.0(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@next/env': 14.1.0 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001589 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.1.0 + '@next/swc-darwin-x64': 14.1.0 + '@next/swc-linux-arm64-gnu': 14.1.0 + '@next/swc-linux-arm64-musl': 14.1.0 + '@next/swc-linux-x64-gnu': 14.1.0 + '@next/swc-linux-x64-musl': 14.1.0 + '@next/swc-win32-arm64-msvc': 14.1.0 + '@next/swc-win32-ia32-msvc': 14.1.0 + '@next/swc-win32-x64-msvc': 14.1.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-int64@0.4.0: {} + + node-releases@2.0.14: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-svg-path@1.1.0: + dependencies: + svg-arc-to-cubic-bezier: 3.2.0 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nwsapi@2.2.7: {} + + oauth4webapi@2.10.3: {} + + object-assign@4.1.1: {} + + object-hash@2.2.0: {} + + object-inspect@1.13.1: {} + + object-is@1.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@0.4.0: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.entries@1.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + object.fromentries@2.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + object.groupby@1.0.2: + dependencies: + array.prototype.filter: 1.0.3 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + + object.hasown@1.1.3: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.4 + + object.omit@3.0.0: + dependencies: + is-extendable: 1.0.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + object.values@1.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + oidc-token-hash@5.0.3: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + openid-client@5.6.4: + dependencies: + jose: 4.15.4 + lru-cache: 6.0.0 + object-hash: 2.2.0 + oidc-token-hash: 5.0.3 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + orderedmap@2.1.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + pako@0.2.9: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-svg-path@0.1.2: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.10.1: + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + + path-type@4.0.0: {} + + pbf@3.2.1: + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pluralize@8.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + potpack@2.0.0: {} + + preact@10.12.1: {} + + prelude-ls@1.2.1: {} + + prettier-plugin-packagejson@2.4.12(prettier@3.2.5): + dependencies: + sort-package-json: 2.8.0 + synckit: 0.9.0 + optionalDependencies: + prettier: 3.2.5 + + prettier@3.2.5: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + prismjs@1.27.0: {} + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + property-information@6.4.1: {} + + prosemirror-changeset@2.2.1: + dependencies: + prosemirror-transform: 1.8.0 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.3 + + prosemirror-commands@1.5.2: + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + + prosemirror-dropcursor@1.8.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + + prosemirror-gapcursor@1.3.2: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.33.1 + + prosemirror-history@1.3.2: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.4.0: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + + prosemirror-keymap@1.2.2: + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.12.0: + dependencies: + markdown-it: 14.0.0 + prosemirror-model: 1.19.4 + + prosemirror-menu@1.2.4: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.5.2 + prosemirror-history: 1.3.2 + prosemirror-state: 1.4.3 + + prosemirror-model@1.19.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.2: + dependencies: + prosemirror-model: 1.19.4 + + prosemirror-schema-list@1.3.0: + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + + prosemirror-state@1.4.3: + dependencies: + prosemirror-model: 1.19.4 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + + prosemirror-tables@1.3.5: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + prosemirror-view: 1.33.1 + + prosemirror-trailing-node@2.0.7(prosemirror-model@1.19.4)(prosemirror-state@1.4.3)(prosemirror-view@1.33.1): + dependencies: + '@remirror/core-constants': 2.0.2 + '@remirror/core-helpers': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-view: 1.33.1 + + prosemirror-transform@1.8.0: + dependencies: + prosemirror-model: 1.19.4 + + prosemirror-view@1.33.1: + dependencies: + prosemirror-model: 1.19.4 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.8.0 + + protobufjs@7.2.6: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.11.20 + long: 5.2.3 + + protocol-buffers-schema@3.6.0: {} + + psl@1.9.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + pure-rand@6.0.4: {} + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quickselect@2.0.0: {} + + ramda@0.29.1: {} + + react-dom@18.2.0(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + react-dropzone@14.2.3(react@18.2.0): + dependencies: + attr-accept: 2.2.2 + file-selector: 0.6.0 + prop-types: 15.8.1 + react: 18.2.0 + + react-hook-form@7.50.1(react@18.2.0): + dependencies: + react: 18.2.0 + + react-i18next@14.0.5(i18next@23.10.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.23.9 + html-parse-stringify: 3.0.1 + i18next: 23.10.0 + react: 18.2.0 + optionalDependencies: + react-dom: 18.2.0(react@18.2.0) + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.2.0: {} + + react-map-gl@7.1.7(mapbox-gl@3.1.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@maplibre/maplibre-gl-style-spec': 19.3.3 + '@types/mapbox-gl': 3.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + mapbox-gl: 3.1.2 + + react-markdown@9.0.1(@types/react@18.2.58)(react@18.2.0): + dependencies: + '@types/hast': 3.0.4 + '@types/react': 18.2.58 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.0 + html-url-attributes: 3.0.0 + mdast-util-to-hast: 13.1.0 + react: 18.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + react-simple-maps@3.0.0(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + d3-geo: 2.0.2 + d3-selection: 2.0.0 + d3-zoom: 2.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + topojson-client: 3.1.0 + + react-smooth@4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + fast-equals: 5.0.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + + react-syntax-highlighter@15.5.0(react@18.2.0): + dependencies: + '@babel/runtime': 7.23.9 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.29.0 + react: 18.2.0 + refractor: 3.6.0 + + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.23.9 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + recharts-scale@0.4.5: + dependencies: + decimal.js-light: 2.5.1 + + recharts@2.12.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + clsx: 2.1.0 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + react-smooth: 4.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + + regenerator-runtime@0.14.1: {} + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.0 + + resolve.exports@2.0.2: {} + + resolve@1.19.0: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restructure@3.0.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rope-sequence@1.3.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + + safe-array-concat@1.1.0: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.17.0: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + scheduler@0.23.0: + dependencies: + loose-envify: 1.4.0 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + set-function-length@1.2.1: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.5: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slash@4.0.0: {} + + sonner@1.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + sort-asc@0.2.0: {} + + sort-desc@0.2.0: {} + + sort-object-keys@1.1.3: {} + + sort-object@3.0.3: + dependencies: + bytewise: 1.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + sort-asc: 0.2.0 + sort-desc: 0.2.0 + union-value: 1.0.1 + + sort-package-json@2.8.0: + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.1.0 + globby: 13.2.2 + is-plain-obj: 4.1.0 + sort-object-keys: 1.1.3 + + source-map-js@1.0.2: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + space-separated-tokens@1.1.5: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + + spdx-license-ids@3.0.17: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stop-iteration-iterator@1.0.0: + dependencies: + internal-slot: 1.0.7 + + streamsearch@1.1.0: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.10: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.5 + + string.prototype.trim@1.2.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trimend@1.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trimstart@1.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.3: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strnum@1.0.5: {} + + style-to-object@1.0.5: + dependencies: + inline-style-parser: 0.2.2 + + styled-jsx@5.1.1(@babel/core@7.23.9)(babel-plugin-macros@3.1.0)(react@18.2.0): + dependencies: + client-only: 0.0.1 + react: 18.2.0 + optionalDependencies: + '@babel/core': 7.23.9 + babel-plugin-macros: 3.1.0 + + stylis-plugin-rtl@2.1.1(stylis@4.3.1): + dependencies: + cssjanus: 2.1.0 + stylis: 4.3.1 + + stylis@4.2.0: {} + + stylis@4.3.1: {} + + supercluster@8.0.1: + dependencies: + kdbush: 4.0.2 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-arc-to-cubic-bezier@3.2.0: {} + + symbol-tree@3.2.4: {} + + synckit@0.9.0: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + + tapable@2.2.1: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + throttle-debounce@3.0.1: {} + + through2@0.4.2: + dependencies: + readable-stream: 1.0.34 + xtend: 2.1.2 + + through@2.3.8: {} + + tiny-inflate@1.0.3: {} + + tiny-invariant@1.3.3: {} + + tinyqueue@2.0.3: {} + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + topojson-client@3.1.0: + dependencies: + commander: 2.20.3 + + tough-cookie@4.1.3: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@0.0.3: {} + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@1.2.1(typescript@5.3.3): + dependencies: + typescript: 5.3.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.6.2: {} + + tsutils@3.21.0(typescript@5.3.3): + dependencies: + tslib: 1.14.1 + typescript: 5.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@2.19.0: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.5: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typescript@5.3.3: {} + + typewise-core@1.2.0: {} + + typewise@1.0.3: + dependencies: + typewise-core: 1.2.0 + + uc.micro@2.0.0: {} + + ulid@2.3.0: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici-types@5.26.5: {} + + undici@5.26.5: + dependencies: + '@fastify/busboy': 2.1.0 + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.4: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@0.2.0: {} + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-join@4.0.1: {} + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-to-istanbul@9.2.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.23 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + victory-vendor@36.9.1: + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-shape': 3.1.6 + '@types/d3-time': 3.0.3 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + vite-compatible-readable-stream@3.6.1: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + void-elements@3.1.0: {} + + vt-pbf@3.1.3: + dependencies: + '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile': 1.3.1 + pbf: 3.2.1 + + w3c-keyname@2.2.8: {} + + w3c-xmlserializer@4.0.0: + dependencies: + xml-name-validator: 4.0.0 + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@3.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.3: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.14 + + which-collection@1.0.1: + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + + which-typed-array@1.1.14: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@8.16.0: {} + + xml-name-validator@4.0.0: {} + + xmlchars@2.2.0: {} + + xtend@2.1.2: + dependencies: + object-keys: 0.4.0 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yoga-layout@2.0.1: {} + + zod@3.22.4: {} + + zwitch@2.0.4: {} diff --git a/002_source/cms/prettier.config.mjs b/002_source/cms/prettier.config.mjs new file mode 100644 index 0000000..3f8fb29 --- /dev/null +++ b/002_source/cms/prettier.config.mjs @@ -0,0 +1,34 @@ +/** @type {import('prettier').Config} */ +const config = { + endOfLine: 'lf', + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'es5', + printWidth: 120, + importOrder: [ + '^node:$', + '', + '^(react/(.*)$)|^(react$)', + '^(next/(.*)$)|^(next$)', + '', + '', + '^@/types$', + '^@/types/(.*)$', + '^@/config$', + '^@/config/(.*)$', + '^@/paths$', + '^@/data/(.*)$', + '^@/lib/(.*)$', + '^@/actions/(.*)$', + '^@/contexts/(.*)$', + '^@/hooks/(.*)$', + '^@/components/(.*)$', + '^@/styles/(.*)$', + '', + '^[./]', + ], + plugins: ['@ianvs/prettier-plugin-sort-imports'], +}; + +export default config; diff --git a/002_source/cms/public/assets/avatar-1.png b/002_source/cms/public/assets/avatar-1.png new file mode 100644 index 0000000..a0cbb82 Binary files /dev/null and b/002_source/cms/public/assets/avatar-1.png differ diff --git a/002_source/cms/public/assets/avatar-10.png b/002_source/cms/public/assets/avatar-10.png new file mode 100644 index 0000000..8ca2294 Binary files /dev/null and b/002_source/cms/public/assets/avatar-10.png differ diff --git a/002_source/cms/public/assets/avatar-11.png b/002_source/cms/public/assets/avatar-11.png new file mode 100644 index 0000000..de9e4ad Binary files /dev/null and b/002_source/cms/public/assets/avatar-11.png differ diff --git a/002_source/cms/public/assets/avatar-2.png b/002_source/cms/public/assets/avatar-2.png new file mode 100644 index 0000000..deb078e Binary files /dev/null and b/002_source/cms/public/assets/avatar-2.png differ diff --git a/002_source/cms/public/assets/avatar-3.png b/002_source/cms/public/assets/avatar-3.png new file mode 100644 index 0000000..43fe358 Binary files /dev/null and b/002_source/cms/public/assets/avatar-3.png differ diff --git a/002_source/cms/public/assets/avatar-4.png b/002_source/cms/public/assets/avatar-4.png new file mode 100644 index 0000000..bfe926c Binary files /dev/null and b/002_source/cms/public/assets/avatar-4.png differ diff --git a/002_source/cms/public/assets/avatar-5.png b/002_source/cms/public/assets/avatar-5.png new file mode 100644 index 0000000..624c12c Binary files /dev/null and b/002_source/cms/public/assets/avatar-5.png differ diff --git a/002_source/cms/public/assets/avatar-6.png b/002_source/cms/public/assets/avatar-6.png new file mode 100644 index 0000000..44c1597 Binary files /dev/null and b/002_source/cms/public/assets/avatar-6.png differ diff --git a/002_source/cms/public/assets/avatar-7.png b/002_source/cms/public/assets/avatar-7.png new file mode 100644 index 0000000..f67f21b Binary files /dev/null and b/002_source/cms/public/assets/avatar-7.png differ diff --git a/002_source/cms/public/assets/avatar-8.png b/002_source/cms/public/assets/avatar-8.png new file mode 100644 index 0000000..b494795 Binary files /dev/null and b/002_source/cms/public/assets/avatar-8.png differ diff --git a/002_source/cms/public/assets/avatar-9.png b/002_source/cms/public/assets/avatar-9.png new file mode 100644 index 0000000..f24404c Binary files /dev/null and b/002_source/cms/public/assets/avatar-9.png differ diff --git a/002_source/cms/public/assets/avatar.png b/002_source/cms/public/assets/avatar.png new file mode 100644 index 0000000..a028c46 Binary files /dev/null and b/002_source/cms/public/assets/avatar.png differ diff --git a/002_source/cms/public/assets/card-background-1.png b/002_source/cms/public/assets/card-background-1.png new file mode 100644 index 0000000..4ee0873 Binary files /dev/null and b/002_source/cms/public/assets/card-background-1.png differ diff --git a/002_source/cms/public/assets/card-background-2.png b/002_source/cms/public/assets/card-background-2.png new file mode 100644 index 0000000..cac393f Binary files /dev/null and b/002_source/cms/public/assets/card-background-2.png differ diff --git a/002_source/cms/public/assets/company-avatar-1.png b/002_source/cms/public/assets/company-avatar-1.png new file mode 100644 index 0000000..2049dba Binary files /dev/null and b/002_source/cms/public/assets/company-avatar-1.png differ diff --git a/002_source/cms/public/assets/company-avatar-2.png b/002_source/cms/public/assets/company-avatar-2.png new file mode 100644 index 0000000..67eddf2 Binary files /dev/null and b/002_source/cms/public/assets/company-avatar-2.png differ diff --git a/002_source/cms/public/assets/company-avatar-3.png b/002_source/cms/public/assets/company-avatar-3.png new file mode 100644 index 0000000..84efe77 Binary files /dev/null and b/002_source/cms/public/assets/company-avatar-3.png differ diff --git a/002_source/cms/public/assets/company-avatar-4.png b/002_source/cms/public/assets/company-avatar-4.png new file mode 100644 index 0000000..df501f0 Binary files /dev/null and b/002_source/cms/public/assets/company-avatar-4.png differ diff --git a/002_source/cms/public/assets/company-avatar-5.png b/002_source/cms/public/assets/company-avatar-5.png new file mode 100644 index 0000000..617a09e Binary files /dev/null and b/002_source/cms/public/assets/company-avatar-5.png differ diff --git a/002_source/cms/public/assets/company-image-1.jpg b/002_source/cms/public/assets/company-image-1.jpg new file mode 100644 index 0000000..2db4a17 Binary files /dev/null and b/002_source/cms/public/assets/company-image-1.jpg differ diff --git a/002_source/cms/public/assets/company-image-2.jpg b/002_source/cms/public/assets/company-image-2.jpg new file mode 100644 index 0000000..6dd19ff Binary files /dev/null and b/002_source/cms/public/assets/company-image-2.jpg differ diff --git a/002_source/cms/public/assets/company-image-3.jpg b/002_source/cms/public/assets/company-image-3.jpg new file mode 100644 index 0000000..4c33b30 Binary files /dev/null and b/002_source/cms/public/assets/company-image-3.jpg differ diff --git a/002_source/cms/public/assets/company-image-4.jpg b/002_source/cms/public/assets/company-image-4.jpg new file mode 100644 index 0000000..911583a Binary files /dev/null and b/002_source/cms/public/assets/company-image-4.jpg differ diff --git a/002_source/cms/public/assets/company-image-5.jpg b/002_source/cms/public/assets/company-image-5.jpg new file mode 100644 index 0000000..47b26c8 Binary files /dev/null and b/002_source/cms/public/assets/company-image-5.jpg differ diff --git a/002_source/cms/public/assets/company-image-6.jpg b/002_source/cms/public/assets/company-image-6.jpg new file mode 100644 index 0000000..5628ea0 Binary files /dev/null and b/002_source/cms/public/assets/company-image-6.jpg differ diff --git a/002_source/cms/public/assets/contactless.svg b/002_source/cms/public/assets/contactless.svg new file mode 100644 index 0000000..a60d8f9 --- /dev/null +++ b/002_source/cms/public/assets/contactless.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/002_source/cms/public/assets/course-1.png b/002_source/cms/public/assets/course-1.png new file mode 100644 index 0000000..b1f3ac2 Binary files /dev/null and b/002_source/cms/public/assets/course-1.png differ diff --git a/002_source/cms/public/assets/course-2.png b/002_source/cms/public/assets/course-2.png new file mode 100644 index 0000000..b1a159c Binary files /dev/null and b/002_source/cms/public/assets/course-2.png differ diff --git a/002_source/cms/public/assets/course-3.png b/002_source/cms/public/assets/course-3.png new file mode 100644 index 0000000..c21fb7a Binary files /dev/null and b/002_source/cms/public/assets/course-3.png differ diff --git a/002_source/cms/public/assets/error.svg b/002_source/cms/public/assets/error.svg new file mode 100644 index 0000000..c9502d5 --- /dev/null +++ b/002_source/cms/public/assets/error.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/flag-ca.svg b/002_source/cms/public/assets/flag-ca.svg new file mode 100644 index 0000000..8b9c7e8 --- /dev/null +++ b/002_source/cms/public/assets/flag-ca.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/002_source/cms/public/assets/flag-de.svg b/002_source/cms/public/assets/flag-de.svg new file mode 100644 index 0000000..4f4703d --- /dev/null +++ b/002_source/cms/public/assets/flag-de.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/002_source/cms/public/assets/flag-es.svg b/002_source/cms/public/assets/flag-es.svg new file mode 100644 index 0000000..7cd15d0 --- /dev/null +++ b/002_source/cms/public/assets/flag-es.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/002_source/cms/public/assets/flag-ru.svg b/002_source/cms/public/assets/flag-ru.svg new file mode 100644 index 0000000..6fc16ba --- /dev/null +++ b/002_source/cms/public/assets/flag-ru.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/002_source/cms/public/assets/flag-uk.svg b/002_source/cms/public/assets/flag-uk.svg new file mode 100644 index 0000000..043ef71 --- /dev/null +++ b/002_source/cms/public/assets/flag-uk.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/002_source/cms/public/assets/flag-us.svg b/002_source/cms/public/assets/flag-us.svg new file mode 100644 index 0000000..3e00443 --- /dev/null +++ b/002_source/cms/public/assets/flag-us.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/002_source/cms/public/assets/home-cosmic.svg b/002_source/cms/public/assets/home-cosmic.svg new file mode 100644 index 0000000..15e998b --- /dev/null +++ b/002_source/cms/public/assets/home-cosmic.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/002_source/cms/public/assets/home-cta-dark.png b/002_source/cms/public/assets/home-cta-dark.png new file mode 100644 index 0000000..7fdc31f Binary files /dev/null and b/002_source/cms/public/assets/home-cta-dark.png differ diff --git a/002_source/cms/public/assets/home-cta-light.png b/002_source/cms/public/assets/home-cta-light.png new file mode 100644 index 0000000..2925616 Binary files /dev/null and b/002_source/cms/public/assets/home-cta-light.png differ diff --git a/002_source/cms/public/assets/home-feature-1-dark.png b/002_source/cms/public/assets/home-feature-1-dark.png new file mode 100644 index 0000000..10f3f93 Binary files /dev/null and b/002_source/cms/public/assets/home-feature-1-dark.png differ diff --git a/002_source/cms/public/assets/home-feature-1-light.png b/002_source/cms/public/assets/home-feature-1-light.png new file mode 100644 index 0000000..9e55020 Binary files /dev/null and b/002_source/cms/public/assets/home-feature-1-light.png differ diff --git a/002_source/cms/public/assets/home-feature-2-dark.png b/002_source/cms/public/assets/home-feature-2-dark.png new file mode 100644 index 0000000..ca2497a Binary files /dev/null and b/002_source/cms/public/assets/home-feature-2-dark.png differ diff --git a/002_source/cms/public/assets/home-feature-2-light.png b/002_source/cms/public/assets/home-feature-2-light.png new file mode 100644 index 0000000..ee98c96 Binary files /dev/null and b/002_source/cms/public/assets/home-feature-2-light.png differ diff --git a/002_source/cms/public/assets/home-feature-3.svg b/002_source/cms/public/assets/home-feature-3.svg new file mode 100644 index 0000000..ed2c6c0 --- /dev/null +++ b/002_source/cms/public/assets/home-feature-3.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/002_source/cms/public/assets/home-feature-4-dark.png b/002_source/cms/public/assets/home-feature-4-dark.png new file mode 100644 index 0000000..e9608be Binary files /dev/null and b/002_source/cms/public/assets/home-feature-4-dark.png differ diff --git a/002_source/cms/public/assets/home-feature-4-light.png b/002_source/cms/public/assets/home-feature-4-light.png new file mode 100644 index 0000000..41165b6 Binary files /dev/null and b/002_source/cms/public/assets/home-feature-4-light.png differ diff --git a/002_source/cms/public/assets/home-hero-dark.png b/002_source/cms/public/assets/home-hero-dark.png new file mode 100644 index 0000000..dda88d7 Binary files /dev/null and b/002_source/cms/public/assets/home-hero-dark.png differ diff --git a/002_source/cms/public/assets/home-hero-light.png b/002_source/cms/public/assets/home-hero-light.png new file mode 100644 index 0000000..8ab7057 Binary files /dev/null and b/002_source/cms/public/assets/home-hero-light.png differ diff --git a/002_source/cms/public/assets/home-rectangles.svg b/002_source/cms/public/assets/home-rectangles.svg new file mode 100644 index 0000000..94813f1 --- /dev/null +++ b/002_source/cms/public/assets/home-rectangles.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/002_source/cms/public/assets/home-techs.svg b/002_source/cms/public/assets/home-techs.svg new file mode 100644 index 0000000..8612311 --- /dev/null +++ b/002_source/cms/public/assets/home-techs.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/002_source/cms/public/assets/home-widgets.png b/002_source/cms/public/assets/home-widgets.png new file mode 100644 index 0000000..f199b07 Binary files /dev/null and b/002_source/cms/public/assets/home-widgets.png differ diff --git a/002_source/cms/public/assets/icon-folder.svg b/002_source/cms/public/assets/icon-folder.svg new file mode 100644 index 0000000..1e54610 --- /dev/null +++ b/002_source/cms/public/assets/icon-folder.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/icon-jpg.svg b/002_source/cms/public/assets/icon-jpg.svg new file mode 100644 index 0000000..ebc248a --- /dev/null +++ b/002_source/cms/public/assets/icon-jpg.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/icon-mp4.svg b/002_source/cms/public/assets/icon-mp4.svg new file mode 100644 index 0000000..7101a3e --- /dev/null +++ b/002_source/cms/public/assets/icon-mp4.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/icon-other.svg b/002_source/cms/public/assets/icon-other.svg new file mode 100644 index 0000000..48f4d8f --- /dev/null +++ b/002_source/cms/public/assets/icon-other.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/icon-pdf.svg b/002_source/cms/public/assets/icon-pdf.svg new file mode 100644 index 0000000..81e9a25 --- /dev/null +++ b/002_source/cms/public/assets/icon-pdf.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/icon-png.svg b/002_source/cms/public/assets/icon-png.svg new file mode 100644 index 0000000..1d52165 --- /dev/null +++ b/002_source/cms/public/assets/icon-png.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/icon-svg.svg b/002_source/cms/public/assets/icon-svg.svg new file mode 100644 index 0000000..3e57406 --- /dev/null +++ b/002_source/cms/public/assets/icon-svg.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-chart.svg b/002_source/cms/public/assets/iconly-glass-chart.svg new file mode 100644 index 0000000..1b240a5 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-chart.svg @@ -0,0 +1,52 @@ + + + iconly-glass-chart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-discount.svg b/002_source/cms/public/assets/iconly-glass-discount.svg new file mode 100644 index 0000000..d5c1ef4 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-discount.svg @@ -0,0 +1,49 @@ + + + iconly-glass-discount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-info.svg b/002_source/cms/public/assets/iconly-glass-info.svg new file mode 100644 index 0000000..939b211 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-info.svg @@ -0,0 +1,27 @@ + + + iconly-glass-info + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-paper.svg b/002_source/cms/public/assets/iconly-glass-paper.svg new file mode 100644 index 0000000..193ed69 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-paper.svg @@ -0,0 +1,57 @@ + + + iconly-glass-paper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-shield.svg b/002_source/cms/public/assets/iconly-glass-shield.svg new file mode 100644 index 0000000..10c229c --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-shield.svg @@ -0,0 +1,49 @@ + + + iconly-glass-shield + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-tick.svg b/002_source/cms/public/assets/iconly-glass-tick.svg new file mode 100644 index 0000000..8050829 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-tick.svg @@ -0,0 +1,53 @@ + + + iconly-glass-tick + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-video.svg b/002_source/cms/public/assets/iconly-glass-video.svg new file mode 100644 index 0000000..7697a36 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-video.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/iconly-glass-volume.svg b/002_source/cms/public/assets/iconly-glass-volume.svg new file mode 100644 index 0000000..f3e0774 --- /dev/null +++ b/002_source/cms/public/assets/iconly-glass-volume.svg @@ -0,0 +1,42 @@ + + + iconly-glass-volume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/image-abstract-1.png b/002_source/cms/public/assets/image-abstract-1.png new file mode 100644 index 0000000..fdb3923 Binary files /dev/null and b/002_source/cms/public/assets/image-abstract-1.png differ diff --git a/002_source/cms/public/assets/image-abstract-2.png b/002_source/cms/public/assets/image-abstract-2.png new file mode 100644 index 0000000..a6f1429 Binary files /dev/null and b/002_source/cms/public/assets/image-abstract-2.png differ diff --git a/002_source/cms/public/assets/image-business-1.png b/002_source/cms/public/assets/image-business-1.png new file mode 100644 index 0000000..cbee07e Binary files /dev/null and b/002_source/cms/public/assets/image-business-1.png differ diff --git a/002_source/cms/public/assets/image-business-2.png b/002_source/cms/public/assets/image-business-2.png new file mode 100644 index 0000000..239ac33 Binary files /dev/null and b/002_source/cms/public/assets/image-business-2.png differ diff --git a/002_source/cms/public/assets/image-minimal-1.png b/002_source/cms/public/assets/image-minimal-1.png new file mode 100644 index 0000000..4196234 Binary files /dev/null and b/002_source/cms/public/assets/image-minimal-1.png differ diff --git a/002_source/cms/public/assets/image-minimal-2.png b/002_source/cms/public/assets/image-minimal-2.png new file mode 100644 index 0000000..6df5c46 Binary files /dev/null and b/002_source/cms/public/assets/image-minimal-2.png differ diff --git a/002_source/cms/public/assets/logo--dark.svg b/002_source/cms/public/assets/logo--dark.svg new file mode 100644 index 0000000..114a3a4 --- /dev/null +++ b/002_source/cms/public/assets/logo--dark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-amex.svg b/002_source/cms/public/assets/logo-amex.svg new file mode 100644 index 0000000..856bad0 --- /dev/null +++ b/002_source/cms/public/assets/logo-amex.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-amplify.svg b/002_source/cms/public/assets/logo-amplify.svg new file mode 100644 index 0000000..b629661 --- /dev/null +++ b/002_source/cms/public/assets/logo-amplify.svg @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-angular.svg b/002_source/cms/public/assets/logo-angular.svg new file mode 100644 index 0000000..7538546 --- /dev/null +++ b/002_source/cms/public/assets/logo-angular.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-apple-pay.svg b/002_source/cms/public/assets/logo-apple-pay.svg new file mode 100644 index 0000000..bdb4ed8 --- /dev/null +++ b/002_source/cms/public/assets/logo-apple-pay.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-auth0.svg b/002_source/cms/public/assets/logo-auth0.svg new file mode 100644 index 0000000..b8681a9 --- /dev/null +++ b/002_source/cms/public/assets/logo-auth0.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-bnb.svg b/002_source/cms/public/assets/logo-bnb.svg new file mode 100644 index 0000000..09d32ee --- /dev/null +++ b/002_source/cms/public/assets/logo-bnb.svg @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-btc.svg b/002_source/cms/public/assets/logo-btc.svg new file mode 100644 index 0000000..de7bc88 --- /dev/null +++ b/002_source/cms/public/assets/logo-btc.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-discord.svg b/002_source/cms/public/assets/logo-discord.svg new file mode 100644 index 0000000..cbb32b2 --- /dev/null +++ b/002_source/cms/public/assets/logo-discord.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-emblem--dark.png b/002_source/cms/public/assets/logo-emblem--dark.png new file mode 100644 index 0000000..4d87696 Binary files /dev/null and b/002_source/cms/public/assets/logo-emblem--dark.png differ diff --git a/002_source/cms/public/assets/logo-emblem--dark.svg b/002_source/cms/public/assets/logo-emblem--dark.svg new file mode 100644 index 0000000..e65f428 --- /dev/null +++ b/002_source/cms/public/assets/logo-emblem--dark.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-emblem.png b/002_source/cms/public/assets/logo-emblem.png new file mode 100644 index 0000000..1901806 Binary files /dev/null and b/002_source/cms/public/assets/logo-emblem.png differ diff --git a/002_source/cms/public/assets/logo-emblem.svg b/002_source/cms/public/assets/logo-emblem.svg new file mode 100644 index 0000000..84a6d02 --- /dev/null +++ b/002_source/cms/public/assets/logo-emblem.svg @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-eth.svg b/002_source/cms/public/assets/logo-eth.svg new file mode 100644 index 0000000..d4b0fb8 --- /dev/null +++ b/002_source/cms/public/assets/logo-eth.svg @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-figma.svg b/002_source/cms/public/assets/logo-figma.svg new file mode 100644 index 0000000..92eccec --- /dev/null +++ b/002_source/cms/public/assets/logo-figma.svg @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-firebase.svg b/002_source/cms/public/assets/logo-firebase.svg new file mode 100644 index 0000000..2e1a3f8 --- /dev/null +++ b/002_source/cms/public/assets/logo-firebase.svg @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-google-pay.svg b/002_source/cms/public/assets/logo-google-pay.svg new file mode 100644 index 0000000..abbade2 --- /dev/null +++ b/002_source/cms/public/assets/logo-google-pay.svg @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-google.svg b/002_source/cms/public/assets/logo-google.svg new file mode 100644 index 0000000..a36e99a --- /dev/null +++ b/002_source/cms/public/assets/logo-google.svg @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-html.svg b/002_source/cms/public/assets/logo-html.svg new file mode 100644 index 0000000..37b586f --- /dev/null +++ b/002_source/cms/public/assets/logo-html.svg @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-js.svg b/002_source/cms/public/assets/logo-js.svg new file mode 100644 index 0000000..9d25f04 --- /dev/null +++ b/002_source/cms/public/assets/logo-js.svg @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-jwt.svg b/002_source/cms/public/assets/logo-jwt.svg new file mode 100644 index 0000000..f419ddd --- /dev/null +++ b/002_source/cms/public/assets/logo-jwt.svg @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-mastercard.svg b/002_source/cms/public/assets/logo-mastercard.svg new file mode 100644 index 0000000..431edfa --- /dev/null +++ b/002_source/cms/public/assets/logo-mastercard.svg @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-react-js.svg b/002_source/cms/public/assets/logo-react-js.svg new file mode 100644 index 0000000..a94cf30 --- /dev/null +++ b/002_source/cms/public/assets/logo-react-js.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-sketch.svg b/002_source/cms/public/assets/logo-sketch.svg new file mode 100644 index 0000000..2136a11 --- /dev/null +++ b/002_source/cms/public/assets/logo-sketch.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-supabase.svg b/002_source/cms/public/assets/logo-supabase.svg new file mode 100644 index 0000000..b4201b6 --- /dev/null +++ b/002_source/cms/public/assets/logo-supabase.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-ts.svg b/002_source/cms/public/assets/logo-ts.svg new file mode 100644 index 0000000..1fcdec3 --- /dev/null +++ b/002_source/cms/public/assets/logo-ts.svg @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-visa.svg b/002_source/cms/public/assets/logo-visa.svg new file mode 100644 index 0000000..ecd25c2 --- /dev/null +++ b/002_source/cms/public/assets/logo-visa.svg @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo-vue-js.svg b/002_source/cms/public/assets/logo-vue-js.svg new file mode 100644 index 0000000..d887449 --- /dev/null +++ b/002_source/cms/public/assets/logo-vue-js.svg @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/logo.svg b/002_source/cms/public/assets/logo.svg new file mode 100644 index 0000000..4642da8 --- /dev/null +++ b/002_source/cms/public/assets/logo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/marker-truck.png b/002_source/cms/public/assets/marker-truck.png new file mode 100644 index 0000000..2fd0dd2 Binary files /dev/null and b/002_source/cms/public/assets/marker-truck.png differ diff --git a/002_source/cms/public/assets/not-found.svg b/002_source/cms/public/assets/not-found.svg new file mode 100644 index 0000000..868bed5 --- /dev/null +++ b/002_source/cms/public/assets/not-found.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/payment-method-1.png b/002_source/cms/public/assets/payment-method-1.png new file mode 100644 index 0000000..2a06b02 Binary files /dev/null and b/002_source/cms/public/assets/payment-method-1.png differ diff --git a/002_source/cms/public/assets/payment-method-2.png b/002_source/cms/public/assets/payment-method-2.png new file mode 100644 index 0000000..82e1fa9 Binary files /dev/null and b/002_source/cms/public/assets/payment-method-2.png differ diff --git a/002_source/cms/public/assets/payment-method-3.png b/002_source/cms/public/assets/payment-method-3.png new file mode 100644 index 0000000..ade72cc Binary files /dev/null and b/002_source/cms/public/assets/payment-method-3.png differ diff --git a/002_source/cms/public/assets/payment-method-4.png b/002_source/cms/public/assets/payment-method-4.png new file mode 100644 index 0000000..150b9c3 Binary files /dev/null and b/002_source/cms/public/assets/payment-method-4.png differ diff --git a/002_source/cms/public/assets/payment-method-5.png b/002_source/cms/public/assets/payment-method-5.png new file mode 100644 index 0000000..495fa4f Binary files /dev/null and b/002_source/cms/public/assets/payment-method-5.png differ diff --git a/002_source/cms/public/assets/people-talking.png b/002_source/cms/public/assets/people-talking.png new file mode 100644 index 0000000..2bfa96e Binary files /dev/null and b/002_source/cms/public/assets/people-talking.png differ diff --git a/002_source/cms/public/assets/product-1.png b/002_source/cms/public/assets/product-1.png new file mode 100644 index 0000000..a2c5271 Binary files /dev/null and b/002_source/cms/public/assets/product-1.png differ diff --git a/002_source/cms/public/assets/product-2.png b/002_source/cms/public/assets/product-2.png new file mode 100644 index 0000000..dde7db4 Binary files /dev/null and b/002_source/cms/public/assets/product-2.png differ diff --git a/002_source/cms/public/assets/product-3.png b/002_source/cms/public/assets/product-3.png new file mode 100644 index 0000000..9229198 Binary files /dev/null and b/002_source/cms/public/assets/product-3.png differ diff --git a/002_source/cms/public/assets/product-4.png b/002_source/cms/public/assets/product-4.png new file mode 100644 index 0000000..0b99ad4 Binary files /dev/null and b/002_source/cms/public/assets/product-4.png differ diff --git a/002_source/cms/public/assets/product-5.png b/002_source/cms/public/assets/product-5.png new file mode 100644 index 0000000..631be13 Binary files /dev/null and b/002_source/cms/public/assets/product-5.png differ diff --git a/002_source/cms/public/assets/pulse.svg b/002_source/cms/public/assets/pulse.svg new file mode 100644 index 0000000..7a9e86d --- /dev/null +++ b/002_source/cms/public/assets/pulse.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/002_source/cms/public/assets/sim.svg b/002_source/cms/public/assets/sim.svg new file mode 100644 index 0000000..b669422 --- /dev/null +++ b/002_source/cms/public/assets/sim.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/002_source/cms/public/assets/thumbnail-buttons-dark.png b/002_source/cms/public/assets/thumbnail-buttons-dark.png new file mode 100644 index 0000000..97525aa Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-buttons-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-buttons-light.png b/002_source/cms/public/assets/thumbnail-buttons-light.png new file mode 100644 index 0000000..2431a83 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-buttons-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-charts-dark.png b/002_source/cms/public/assets/thumbnail-charts-dark.png new file mode 100644 index 0000000..95442ee Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-charts-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-charts-light.png b/002_source/cms/public/assets/thumbnail-charts-light.png new file mode 100644 index 0000000..c89b087 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-charts-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-colors-dark.png b/002_source/cms/public/assets/thumbnail-colors-dark.png new file mode 100644 index 0000000..4cd3d10 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-colors-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-colors-light.png b/002_source/cms/public/assets/thumbnail-colors-light.png new file mode 100644 index 0000000..dd2089b Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-colors-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-detail-list-dark.png b/002_source/cms/public/assets/thumbnail-detail-list-dark.png new file mode 100644 index 0000000..1cac2dd Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-detail-list-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-detail-list-light.png b/002_source/cms/public/assets/thumbnail-detail-list-light.png new file mode 100644 index 0000000..020be8b Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-detail-list-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-forms-auth-dark.png b/002_source/cms/public/assets/thumbnail-forms-auth-dark.png new file mode 100644 index 0000000..bf2739c Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-forms-auth-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-forms-auth-light.png b/002_source/cms/public/assets/thumbnail-forms-auth-light.png new file mode 100644 index 0000000..c00960f Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-forms-auth-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-forms-dark.png b/002_source/cms/public/assets/thumbnail-forms-dark.png new file mode 100644 index 0000000..f61be6a Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-forms-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-forms-light.png b/002_source/cms/public/assets/thumbnail-forms-light.png new file mode 100644 index 0000000..ab35cc5 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-forms-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-grid-lists-dark.png b/002_source/cms/public/assets/thumbnail-grid-lists-dark.png new file mode 100644 index 0000000..f0e7ca8 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-grid-lists-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-grid-lists-light.png b/002_source/cms/public/assets/thumbnail-grid-lists-light.png new file mode 100644 index 0000000..d9bb4be Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-grid-lists-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-grouped-lists-dark.png b/002_source/cms/public/assets/thumbnail-grouped-lists-dark.png new file mode 100644 index 0000000..3b14f25 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-grouped-lists-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-grouped-lists-light.png b/002_source/cms/public/assets/thumbnail-grouped-lists-light.png new file mode 100644 index 0000000..e3fa8f4 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-grouped-lists-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-inputs-dark.png b/002_source/cms/public/assets/thumbnail-inputs-dark.png new file mode 100644 index 0000000..6e1128a Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-inputs-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-inputs-light.png b/002_source/cms/public/assets/thumbnail-inputs-light.png new file mode 100644 index 0000000..8ba9dd3 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-inputs-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-modals-dark.png b/002_source/cms/public/assets/thumbnail-modals-dark.png new file mode 100644 index 0000000..fa20074 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-modals-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-modals-light.png b/002_source/cms/public/assets/thumbnail-modals-light.png new file mode 100644 index 0000000..995f83f Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-modals-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-quick-stats-dark.png b/002_source/cms/public/assets/thumbnail-quick-stats-dark.png new file mode 100644 index 0000000..10658c5 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-quick-stats-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-quick-stats-light.png b/002_source/cms/public/assets/thumbnail-quick-stats-light.png new file mode 100644 index 0000000..0689fa2 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-quick-stats-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-tables-dark.png b/002_source/cms/public/assets/thumbnail-tables-dark.png new file mode 100644 index 0000000..13d581f Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-tables-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-tables-light.png b/002_source/cms/public/assets/thumbnail-tables-light.png new file mode 100644 index 0000000..946731c Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-tables-light.png differ diff --git a/002_source/cms/public/assets/thumbnail-typography-dark.png b/002_source/cms/public/assets/thumbnail-typography-dark.png new file mode 100644 index 0000000..d1cf9e7 Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-typography-dark.png differ diff --git a/002_source/cms/public/assets/thumbnail-typography-light.png b/002_source/cms/public/assets/thumbnail-typography-light.png new file mode 100644 index 0000000..d438aee Binary files /dev/null and b/002_source/cms/public/assets/thumbnail-typography-light.png differ diff --git a/002_source/cms/public/assets/workspace-avatar-1.png b/002_source/cms/public/assets/workspace-avatar-1.png new file mode 100644 index 0000000..2869249 Binary files /dev/null and b/002_source/cms/public/assets/workspace-avatar-1.png differ diff --git a/002_source/cms/public/assets/workspace-avatar-2.png b/002_source/cms/public/assets/workspace-avatar-2.png new file mode 100644 index 0000000..c405bd8 Binary files /dev/null and b/002_source/cms/public/assets/workspace-avatar-2.png differ diff --git a/002_source/cms/public/assets/world-countries.json b/002_source/cms/public/assets/world-countries.json new file mode 100644 index 0000000..601926d --- /dev/null +++ b/002_source/cms/public/assets/world-countries.json @@ -0,0 +1 @@ +{"type":"Topology","arcs":[[[17078,14810],[72,-46],[54,16],[15,55],[55,18],[40,38],[14,98],[59,23],[12,44],[33,-33],[21,-4]],[[17453,15019],[40,-1],[53,-25]],[[17546,14993],[22,-15],[52,39],[23,-24],[23,56],[43,-2],[11,18],[7,49],[30,43],[38,-29],[-8,-37],[22,-6],[-7,-102],[28,-40],[25,26],[31,12],[45,54],[49,-9],[73,0]],[[18053,15026],[12,-35]],[[18065,14991],[-41,-13],[-36,-23],[-81,-14],[-77,-26],[-41,-54],[17,-51],[8,-61],[-35,-51],[2,-47],[-19,-43],[-67,3],[28,-81],[-45,-31],[-30,-73],[4,-73],[-28,-35],[-26,12],[-54,-16],[-8,-35],[-53,0],[-39,-69],[-3,-103],[-92,-51],[-49,11],[-15,-27],[-42,15],[-70,-18],[-119,62]],[[17054,14099],[64,111],[-5,78],[-54,22],[-6,77],[-23,97],[30,67],[-31,18],[20,89],[29,152]],[[14437,9121],[7,-38],[-8,-59],[13,-57],[-11,-45],[6,-43],[-147,1],[-4,-388],[48,-100],[46,-77]],[[14387,8315],[-130,-49],[-171,17],[-49,58],[-287,-5],[-10,-8],[-42,56],[-46,3],[-43,-21],[-34,-24]],[[13575,8342],[-7,78],[10,107],[25,112],[3,52],[23,110],[17,50],[41,81],[23,54],[7,90],[-4,69],[-21,43],[-19,75],[-17,73],[4,26],[22,48],[-22,118],[-15,82],[-35,77],[7,24]],[[13617,9711],[29,16],[21,-2],[24,14],[209,-1],[17,-91],[21,-73],[16,-39],[27,-65],[47,10],[23,18],[40,-18],[10,31],[18,71],[44,5],[4,21],[36,0],[-6,-43],[85,1],[1,-77],[15,-48],[-11,-73],[5,-75],[24,-45],[-4,-146],[18,11],[31,-3],[44,18],[32,-7]],[[13607,9748],[-19,93]],[[13588,9841],[28,52],[22,21],[26,-42]],[[13664,9872],[-25,-25],[-12,-32],[-2,-54],[-18,-13]],[[14233,15445],[-2,-33],[-23,-18],[-4,-39],[-33,-59]],[[14171,15296],[-12,8],[-2,27],[-39,41],[-6,58],[6,84],[10,38],[-12,19]],[[14116,15571],[-5,38],[31,60],[4,-23],[19,11]],[[14165,15657],[15,-32],[17,-13],[5,-44]],[[14202,15568],[-9,-41],[10,-53],[30,-29]],[[16396,13417],[12,6],[3,-34],[55,20],[59,-4],[43,-3],[49,83],[52,78],[45,75]],[[16714,13638],[14,-41]],[[16728,13597],[9,-97]],[[16737,13500],[-36,0],[-6,-80],[13,-17],[-32,-24],[0,-50],[-21,-50],[-2,-49]],[[16653,13230],[-14,-26],[-213,61],[-28,124],[-2,28]],[[8003,3751],[-42,3],[-76,0],[-1,273]],[[7884,4027],[28,-57],[35,-91],[92,-74],[100,-30],[-32,-61],[-68,-6],[-36,43]],[[8306,7738],[130,-198],[58,-19],[87,-91],[73,-47],[10,-54],[-70,-186],[72,-33],[79,-19],[55,20],[65,93],[11,108]],[[8876,7312],[35,24],[36,-71],[-1,-98],[-60,-67],[-48,-49],[-80,-120],[-94,-165]],[[8664,6766],[-17,-98],[-19,-126],[0,-121],[-15,-27],[-5,-80]],[[8608,6314],[-5,-63],[90,-105],[-10,-85],[44,-53],[-3,-59],[-68,-157],[-106,-65],[-142,-26],[-78,13],[15,-73],[-14,-91],[13,-63],[-43,-42],[-71,-17],[-69,44],[-27,-32],[10,-121],[48,-36],[39,38],[20,-63],[-65,-39],[-57,-76],[-10,-122],[-17,-66],[-67,-1],[-55,-62],[-21,-91],[70,-89],[68,-25],[-25,-110],[-83,-69],[-46,-143],[-65,-48],[-29,-57],[23,-127],[47,-71],[-30,6]],[[7889,4068],[-66,19],[-170,16],[-30,72],[2,91],[-48,-7],[-25,44],[-6,130],[55,53],[22,77],[-8,62],[38,105],[25,161],[-7,73],[31,23],[-8,45],[-33,25],[24,51],[-32,46],[-17,141],[29,25],[-12,149],[16,125],[19,109],[43,44],[-22,120],[0,112],[53,79],[-2,103],[41,118],[0,113],[-19,23],[-32,210],[43,126],[-6,118],[25,111],[46,115],[51,75],[-22,48],[15,40],[-2,203],[77,61],[24,126],[-8,31]],[[7993,7679],[59,111],[93,-31],[41,-88],[28,98],[80,-5],[12,-26]],[[15829,15475],[99,19]],[[15928,15494],[15,-32],[27,-21],[-15,-31],[38,-42],[-20,-39],[30,-33],[32,-20],[2,-84]],[[16037,15192],[-26,-4]],[[16011,15188],[-29,70],[0,19],[-31,0],[-21,33],[-15,-4]],[[15915,15306],[-28,36],[-52,30],[6,59],[-12,44]],[[8526,680],[-20,-62],[-21,-55],[-149,17],[-157,-8],[-89,41],[0,5],[-39,36],[160,-5],[151,-12],[53,50],[38,44],[73,-51]],[[1472,747],[-136,-17],[-92,43],[-42,43],[-3,7],[-46,34],[44,45],[131,-19],[70,-38],[55,-43],[19,-55]],[[9298,923],[37,0],[105,27],[107,-27],[88,-52],[30,-74],[9,-53],[2,-63],[-109,-38],[-116,-31],[-133,-28],[-148,-24],[-168,7],[-93,41],[13,50],[151,33],[61,42],[45,52],[32,45],[42,43],[45,50]],[[4063,1460],[15,40],[85,-21],[90,-19],[85,21],[-40,-43],[-66,-31],[-99,10],[-70,43]],[[3733,1483],[50,27],[71,-29],[108,-48],[-41,5],[-92,12],[-96,33]],[[5737,1670],[76,-16],[78,14],[42,-69],[-56,9],[-86,-4],[-86,4],[-96,-7],[-72,24],[-38,50],[44,22],[91,-17],[103,-10]],[[7511,1751],[48,15],[82,-5],[21,62],[4,46],[-1,98],[40,57],[65,19],[37,-45],[17,-45],[30,-55],[24,-53],[19,-56],[9,-54],[-13,-48],[-19,-45],[-84,-17],[-78,-24],[-93,2],[35,48],[-83,-17],[-80,-16],[-54,35],[-4,51],[78,47]],[[8594,2620],[-30,-26],[-53,19],[-58,-12],[-49,-28],[-51,-31],[-35,-36],[-10,-48],[4,-45],[34,-42],[-49,-28],[-66,-10],[-39,-40],[-41,-39],[-45,-52],[-11,-45],[25,-51],[38,-39],[58,-28],[53,-38],[29,-48],[16,-45],[20,-48],[34,-42],[21,-45],[9,-112],[21,-45],[6,-48],[22,-49],[-10,-64],[-39,-50],[-41,-41],[-95,-16],[-31,-43],[-43,-42],[-107,-45],[-94,-19],[-89,-26],[-96,-27],[-56,-50],[-114,-5],[-125,5],[-113,-9],[-119,0],[22,-48],[109,-21],[79,-35],[44,-43],[-79,-38],[-122,12],[-101,-31],[-4,-50],[-3,-48],[83,-40],[15,-47],[90,-45],[150,-19],[128,-33],[101,-39],[129,-38],[176,-19],[173,-33],[121,-36],[132,-42],[69,-57],[35,-45],[86,43],[116,36],[124,38],[147,32],[126,33],[176,3],[173,-17],[144,-29],[44,53],[99,36],[179,2],[141,26],[132,26],[147,17],[157,22],[110,31],[-50,42],[-30,44],[0,46],[-138,-5],[-146,-19],[-138,0],[-19,45],[9,91],[32,26],[101,29],[119,28],[86,37],[87,36],[64,47],[96,22],[96,17],[48,9],[110,5],[104,17],[88,23],[85,29],[78,29],[98,39],[63,40],[67,36],[20,48],[-75,28],[25,51],[48,38],[73,24],[77,29],[72,38],[56,48],[35,57],[51,34],[85,-7],[35,-41],[84,-5],[3,46],[35,47],[77,-12],[18,-45],[84,-7],[92,21],[89,15],[81,-8],[30,-50],[77,41],[72,21],[81,17],[79,17],[72,28],[80,20],[60,27],[43,43],[53,-31],[73,16],[52,-57],[40,-44],[81,24],[31,49],[73,33],[92,-7],[28,-45],[58,45],[76,14],[84,5],[75,-2],[79,-15],[75,-7],[34,-40],[46,-37],[77,22],[84,5],[80,0],[80,2],[70,17],[74,14],[63,34],[67,21],[72,12],[54,34],[39,66],[40,41],[74,-19],[27,-43],[61,-29],[74,10],[50,-43],[52,-31],[73,29],[25,52],[64,21],[73,41],[69,17],[83,24],[56,27],[58,28],[56,27],[66,-15],[64,43],[46,34],[66,-3],[58,29],[14,43],[60,33],[58,24],[71,20],[65,10],[63,-7],[66,-13],[56,-34],[7,-52],[63,-41],[43,-33],[85,-15],[47,-33],[58,-33],[68,-7],[57,23],[60,50],[67,-26],[70,-14],[66,-14],[70,-10],[71,0],[58,-127],[-3,-31],[-8,-55],[-68,-31],[-56,-45],[10,-49],[79,2],[-10,-47],[-36,-46],[-33,-50],[54,-38],[82,-12],[81,22],[39,47],[24,46],[39,38],[44,35],[18,44],[38,60],[44,12],[81,5],[71,14],[71,19],[34,48],[21,45],[49,45],[69,32],[60,24],[39,41],[40,21],[52,19],[71,-12],[64,12],[68,15],[78,-8],[51,34],[36,81],[27,-33],[33,-58],[60,-24],[68,-9],[68,14],[71,-9],[67,-3],[44,12],[60,-7],[54,-26],[64,17],[77,0],[65,16],[73,-16],[47,40],[36,41],[49,33],[89,92],[45,-17],[55,-34],[47,-43],[89,-74],[70,-3],[65,0],[76,15],[77,16],[58,34],[49,35],[79,5],[52,28],[55,-25],[37,-39],[50,-38],[77,5],[49,-31],[85,-31],[89,-12],[72,10],[56,38],[47,38],[64,10],[64,-17],[74,-12],[66,19],[64,0],[62,-12],[65,-12],[64,22],[76,19],[73,4],[80,0],[66,12],[62,10],[20,61],[3,50],[44,-34],[13,-56],[23,-50],[29,-40],[60,-22],[81,7],[93,3],[64,7],[92,0],[67,2],[93,-4],[79,-10],[50,-38],[-14,-45],[46,-36],[76,-29],[78,-32],[92,-21],[96,-19],[72,-19],[81,-3],[46,41],[62,-34],[53,-38],[63,-28],[86,-12],[82,-15],[35,-47],[80,-29],[55,-44],[78,-19],[82,2],[76,-7],[85,3],[85,-10],[79,-17],[73,-28],[73,-24],[50,-36],[-8,-47],[-38,-43],[-32,-56],[-25,-43],[-32,-50],[-93,-19],[-42,-43],[-91,-27],[-32,-47],[-49,-46],[-51,-39],[-30,-50],[-18,-45],[-7,-55],[2,-45],[40,-48],[15,-46],[34,-43],[132,-17],[27,-52],[-127,-19],[-109,-27],[-134,-4],[-59,-70],[-13,-58],[-30,-45],[-38,-45],[95,-41],[36,-50],[60,-45],[86,-42],[99,-38],[107,-38],[162,-38],[36,-60],[204,-26],[13,-10],[53,-36],[196,31],[162,-39],[122,-29],[-25484,-1],[63,72],[128,-39],[8,5],[74,39],[10,-2],[8,-1],[103,-51],[89,51],[16,7],[209,22],[66,-29],[34,-14],[107,-42],[201,-31],[159,-38],[274,-28],[203,33],[301,-24],[171,-38],[187,36],[197,33],[15,57],[-279,5],[-228,30],[-60,47],[-190,27],[12,55],[27,50],[26,45],[-14,51],[-118,33],[-54,43],[-109,39],[171,-8],[164,19],[103,-40],[127,36],[115,45],[57,41],[-25,50],[-91,34],[-104,36],[-145,7],[-128,17],[-137,12],[-46,45],[-91,38],[-56,43],[-22,139],[35,-12],[63,-38],[117,12],[112,17],[58,-54],[113,13],[94,26],[89,34],[80,40],[107,12],[-3,46],[-25,45],[21,43],[91,21],[42,-40],[108,24],[82,32],[101,2],[96,12],[96,29],[76,26],[86,26],[56,-7],[47,-10],[106,17],[94,-21],[98,2],[93,17],[95,-12],[105,-12],[99,5],[103,-3],[105,-2],[97,5],[72,35],[86,19],[89,-26],[85,22],[76,43],[46,-39],[25,-43],[45,-40],[73,36],[85,-46],[96,-14],[82,-34],[100,8],[89,21],[107,-4],[96,-17],[98,-23],[37,54],[-46,40],[-35,43],[-91,10],[-41,45],[-15,46],[-25,91],[54,-17],[93,-7],[92,7],[84,-20],[71,-35],[30,-43],[96,-7],[92,16],[97,24],[88,14],[71,-28],[94,9],[62,94],[57,-56],[82,-21],[88,12],[59,-48],[92,-5],[86,-14],[85,-26],[55,45],[28,43],[71,-48],[97,12],[72,-26],[48,-40],[95,11],[73,27],[73,31],[86,16],[99,15],[90,16],[70,28],[41,38],[17,52],[-8,50],[-23,48],[-25,48],[-22,48],[-18,43],[-4,48],[7,48],[33,45],[28,50],[11,49],[-14,52],[-8,48],[35,55],[38,36],[46,45],[49,39],[57,36],[28,52],[39,34],[43,31],[68,7],[45,38],[50,24],[58,14],[51,31],[41,39],[55,15],[42,-31],[-26,-42],[-73,-36]],[[17625,4517],[46,-38],[67,-15],[2,-24],[-20,-56],[-109,-8],[-1,66],[10,50],[5,25]],[[23038,5473],[69,-42],[38,17],[56,23],[41,-8],[5,-144],[-23,-42],[-7,-99],[-25,33],[-49,-85],[-15,7],[-44,4],[-43,105],[-10,80],[-41,106],[2,56],[46,-11]],[[22908,8775],[26,-96],[45,46],[24,-51],[34,-49],[-8,-54],[15,-104],[11,-61],[18,-15],[19,-105],[-6,-63],[22,-82],[77,-64],[50,-59],[47,-53],[-9,-29],[40,-76],[28,-133],[28,27],[29,-53],[17,19],[13,-129],[50,-75],[33,-48],[55,-98],[20,-98],[2,-70],[-5,-76],[34,-103],[-4,-109],[-12,-56],[-20,-109],[2,-70],[-14,-88],[-31,-110],[-53,-60],[-26,-96],[-24,-60],[-21,-105],[-27,-60],[-18,-92],[-9,-84],[4,-39],[-41,-42],[-80,-5],[-64,-50],[-33,-48],[-42,-52],[-59,54],[-44,21],[11,65],[-38,-24],[-63,-88],[-61,33],[-40,19],[-41,9],[-67,36],[-46,75],[-13,92],[-17,62],[-35,50],[-68,15],[23,59],[-17,90],[-34,-84],[-64,-22],[38,67],[10,70],[28,60],[-6,91],[-58,-105],[-44,-41],[-27,-97],[-56,50],[3,64],[-45,90],[-36,45],[12,28],[-90,74],[-50,4],[-68,59],[-127,-12],[-92,-43],[-81,-41],[-66,8],[-76,-62],[-61,-28],[-14,-65],[-26,-50],[-60,-3],[-45,-10],[-62,22],[-51,-13],[-48,-6],[-42,-65],[-21,6],[-36,-35],[-34,-39],[-51,5],[-48,0],[-75,78],[-38,23],[1,70],[35,16],[12,29],[-2,44],[9,85],[-8,72],[-38,124],[-11,69],[3,69],[-29,80],[-1,36],[-32,49],[-9,95],[-40,97],[-10,53],[31,-54],[-24,114],[35,-36],[21,-47],[-1,63],[-35,96],[-7,38],[-16,36],[8,72],[14,30],[10,61],[-8,71],[29,88],[6,-93],[30,84],[57,41],[35,52],[54,45],[32,9],[20,-15],[56,45],[43,14],[11,27],[18,11],[40,-3],[73,35],[39,55],[18,65],[42,62],[3,49],[2,66],[49,104],[30,-106],[30,26],[-25,57],[22,59],[32,-26],[8,92],[39,60],[17,49],[36,21],[1,34],[31,-14],[1,30],[31,18],[34,16],[52,-56],[40,-72],[44,0],[45,-13],[-15,68],[34,98],[32,31],[-11,31],[31,70],[43,43],[36,-14],[60,23],[-2,62],[-52,40],[38,18],[47,-31],[38,-49],[59,-32],[20,13],[44,-38],[41,35],[27,-10],[17,23],[32,-60],[-19,-66],[-27,-50],[-24,-4],[8,-48],[-21,-61],[-25,-60],[5,-35],[57,-68],[54,-39],[37,-41],[51,-73],[20,1],[37,-32],[11,-38],[68,-41],[46,41],[14,66],[14,54],[9,67],[21,97],[-10,60],[5,35],[-8,70],[9,92],[14,24],[-11,42],[17,64],[14,67],[1,35],[27,46],[20,-60],[5,-76],[17,-15],[3,-51],[26,-63],[6,-69],[-3,-44]],[[13946,16334],[-5,-50],[-40,0],[13,-27],[-23,-79]],[[13891,16178],[-14,-20],[-62,-3],[-35,-28],[-58,9]],[[13722,16136],[-101,32],[-16,42],[-70,-21],[-9,-23],[-43,17]],[[13483,16183],[-36,3],[-32,23],[11,29],[-3,22]],[[13423,16260],[22,7],[35,-34],[11,32],[62,-5],[51,22],[34,-4],[22,-25],[7,21],[-10,80],[25,15],[25,57]],[[13707,16426],[52,-40],[40,50],[25,9],[55,-37],[33,6],[33,-23]],[[13945,16391],[-6,-15],[7,-42]],[[16011,15188],[-49,16],[-35,56],[-12,46]],[[16142,15513],[42,49]],[[16184,15562],[37,-64],[36,-87],[33,-6],[21,-33],[-58,-9],[-11,-95],[-13,-43],[-26,-28],[2,-61]],[[16205,15136],[-17,-6],[-45,64],[25,61],[-21,35],[-27,-9],[-83,-89]],[[15928,15494],[17,20],[53,-35],[38,-7],[10,14],[-35,66],[19,17]],[[16030,15569],[19,-4],[49,-74],[32,-9],[12,31]],[[14821,9906],[-5,148],[-17,55]],[[14799,10109],[43,-9],[21,69],[38,-8]],[[14901,10161],[4,-48],[15,-27],[1,-41],[-17,-25],[-28,-64],[-26,-44],[-29,-6]],[[13031,16717],[65,26],[45,-54],[39,-28]],[[13180,16661],[-8,-82]],[[13172,16579],[-18,-5],[-8,-69]],[[13146,16505],[-62,55],[-36,-9],[-50,58],[-33,49],[-33,2],[-10,43]],[[12922,16703],[57,24]],[[12979,16727],[52,-10]],[[12934,11221],[-58,-14]],[[12876,11207],[-18,83],[4,281],[-15,25],[-2,60],[-25,42],[-22,36],[9,65]],[[12807,11799],[25,14],[14,53],[35,12],[15,36]],[[12896,11914],[24,36],[26,0],[54,-70]],[[13000,11880],[-3,-40],[16,-73],[-14,-50],[7,-32],[-34,-76],[-22,-37],[-13,-77],[2,-78],[-5,-196]],[[12544,11634],[-49,31],[-33,-5],[-25,-30],[-32,25],[-12,41],[-32,26]],[[12361,11722],[-5,72],[20,51],[-2,42],[56,101],[11,84],[19,30],[35,-17],[29,25],[10,31],[55,55],[14,38],[66,50],[39,18],[18,-24],[44,1]],[[12770,12279],[-6,-59],[10,-55],[40,-80],[2,-60],[82,-27],[-2,-84]],[[12807,11799],[-62,3]],[[12745,11802],[-32,10],[-23,-20],[-31,9],[-123,-6],[-2,-70],[10,-91]],[[19305,13148],[-2,-88],[-24,19],[4,-98]],[[19283,12981],[-20,63],[-4,62],[-14,59],[-28,72],[-66,4],[7,-50],[-22,-68],[-31,24],[-10,-22],[-20,13],[-27,11]],[[19048,13149],[-11,102],[-25,91],[12,73],[-44,33],[16,45],[44,46],[-51,64],[25,83],[56,-53],[34,-6],[7,-85],[67,-16],[65,2],[41,-21],[-33,-104],[-31,-7],[-22,-70],[39,-63],[11,78],[19,1],[38,-194]],[[14348,15859],[20,-50],[28,8],[54,-19],[104,-6],[36,31],[83,28],[52,-44],[40,-13]],[[14765,15794],[-35,-50],[-26,-88],[23,-70]],[[14727,15586],[-61,17],[-73,-38]],[[14593,15565],[0,-61],[-65,-12],[-50,43],[-57,-33],[-52,3]],[[14369,15505],[-5,81],[-36,39]],[[14328,15625],[12,17],[-8,14],[12,39],[27,39],[-34,53],[-7,44],[18,28]],[[7254,13358],[-16,-6],[-18,70],[-27,36],[16,77],[21,-5],[24,-102],[0,-70]],[[7235,13702],[-78,-20],[-4,45],[33,11],[47,-3],[2,-33]],[[7292,13703],[-12,-86],[-13,15],[1,64],[-31,49],[0,14],[55,-56]],[[14090,15935],[26,0],[-18,-54],[34,-46],[-10,-58],[-17,-5]],[[14105,15772],[-13,-11],[-23,-28],[-11,-68]],[[14058,15665],[-63,46],[-26,52],[-27,27],[-33,45],[-15,38],[-35,57],[15,50],[25,-28],[16,25],[33,3],[61,-20],[49,2],[32,-27]],[[14407,17040],[68,0],[77,45],[17,70],[58,39],[-7,55]],[[14620,17249],[43,20],[76,47]],[[14739,17316],[74,-30],[10,-31],[37,15],[70,-29],[7,-57],[-16,-33],[45,-81],[29,-22],[-4,-22],[47,-21],[21,-33],[-28,-26],[-57,4],[-14,-12],[17,-40],[17,-79]],[[14994,16819],[-60,-7],[-22,-27],[-5,-61],[-28,12],[-64,-6],[-19,28],[-26,-21],[-27,18],[-55,2],[-79,29],[-72,10],[-55,-3],[-39,-33],[-33,-5]],[[14410,16755],[-2,55],[-22,57],[43,25],[0,48],[-19,47],[-3,53]],[[6433,12631],[-1,18],[9,6],[12,-15],[26,74],[13,2]],[[6492,12716],[1,-18],[13,-1],[-1,-33],[-12,-53],[7,-19],[-8,-44],[5,-12],[-9,-61],[-14,-32],[-12,-4],[-14,-42]],[[6448,12397],[-22,0],[6,137],[1,97]],[[8160,14403],[1,1],[0,1],[0,1]],[[8161,14406],[1,1]],[[8162,14407],[0,1],[1,0]],[[8163,14408],[0,-2],[1,-1],[1,1],[1,1],[0,1]],[[8166,14408],[-1,1]],[[8165,14409],[0,-1]],[[8165,14408],[-1,1]],[[8164,14409],[0,-1],[-1,0]],[[8163,14408],[0,1],[0,1],[1,0],[1,1],[1,1],[0,-2],[1,0],[0,-1],[-1,-1]],[[8166,14408],[1,-1]],[[8167,14407],[-2,-2],[-1,-1],[-1,-1],[-1,0],[-1,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1]],[[8155,14395],[-1,0]],[[8154,14395],[-1,0]],[[8153,14395],[-1,0],[-1,1],[-1,3],[1,1],[0,2]],[[8151,14402],[1,0]],[[8152,14402],[1,0],[1,3],[0,-1],[-1,-1],[-1,-2],[1,0],[-1,-1],[-1,-1],[0,-1],[1,0],[0,-2]],[[8152,14396],[2,0]],[[8154,14396],[0,1],[1,0],[1,1],[1,1],[1,0],[-1,1],[-1,1],[-1,1],[1,0],[1,-1],[0,1],[1,0],[1,0],[1,1]],[[7993,7679],[-51,-17],[-28,169],[-38,137],[22,118],[-37,52],[-10,88],[-34,82]],[[7817,8308],[44,133],[-30,102],[16,41],[-13,45],[28,62],[2,103],[3,86],[15,42],[-61,196]],[[7821,9118],[53,-10],[36,2],[16,37],[62,50],[37,46],[93,21],[-7,-92],[8,-47],[-5,-82],[77,-109],[78,-21],[28,-45],[48,-24],[29,-36],[45,2],[41,-37],[3,-70],[14,-35],[1,-54],[-21,-2],[28,-142],[136,-5],[-11,-70],[8,-49],[39,-34],[16,-76],[-12,-96],[-20,-53],[7,-70],[-22,-26]],[[8626,7991],[-1,38],[-66,63],[-66,2],[-124,-37],[-34,-107],[-2,-65],[-27,-147]],[[8876,7312],[14,71],[10,72],[0,68],[-26,22],[-26,-20],[-27,5],[-8,47],[-7,112],[-13,36],[-47,33],[-29,-24],[-75,24],[5,166],[-21,67]],[[7821,9118],[-40,-21],[-32,14],[4,186],[-57,-72],[-62,3],[-27,65],[-47,7],[15,53],[-40,74],[-29,110],[18,23],[0,51],[43,35],[-7,66],[18,42],[5,58],[82,83],[58,23],[9,19],[63,-6]],[[7795,9931],[32,335],[2,52],[-11,71],[-32,44],[0,89],[40,20],[15,-13],[2,47],[-42,13],[0,77],[138,-3],[23,42],[20,-39],[14,-72],[13,15]],[[8009,10609],[39,-65],[55,8],[14,37],[53,29],[29,21],[8,51],[50,35],[-4,25],[-59,11],[-10,77],[3,82],[-32,32],[14,11],[52,-16],[56,-30],[20,29],[51,19],[79,45],[26,47],[-9,34]],[[8444,11091],[37,5],[16,-28],[-9,-53],[25,-19],[16,-56],[-20,-44],[-11,-104],[18,-61],[5,-57],[44,-58],[35,-6],[7,25],[23,5],[32,22],[23,32],[39,-10],[18,4]],[[8742,10688],[37,-10],[6,25],[-11,24],[7,36],[28,-11],[34,12],[40,-26]],[[8883,10738],[31,-25],[22,33],[16,-5],[10,-34],[34,9],[27,46],[22,89],[42,113]],[[9087,10964],[24,6],[18,-69],[39,-213],[38,-20],[2,-85],[-53,-100],[22,-37],[124,-19],[3,-123],[54,81],[89,-44],[118,-75],[34,-71],[-11,-68],[82,38],[137,-64],[106,4],[105,-101],[91,-137],[54,-35],[61,-5],[25,-38],[24,-156],[12,-74],[-29,-202],[-35,-79],[-100,-171],[-45,-137],[-52,-107],[-18,-2],[-20,-90],[5,-229],[-20,-187],[-7,-82],[-23,-48],[-12,-163],[-72,-159],[-12,-127],[-58,-53],[-16,-73],[-76,1],[-112,-47],[-50,-54],[-79,-36],[-84,-98],[-60,-120],[-10,-92],[12,-67],[-14,-123],[-16,-60],[-48,-68],[-79,-214],[-62,-97],[-49,-57],[-32,-116],[-47,-71]],[[8965,6331],[-20,70],[32,58],[-41,83],[-56,67],[-73,79],[-26,-4],[-70,95],[-47,-13]],[[20829,11009],[28,45],[61,67]],[[20918,11121],[-3,-60],[-5,-78],[-33,4],[-15,-41],[-33,63]],[[19237,13848],[27,-39],[-4,-76],[-57,-3],[-60,9],[-45,-20],[-64,47],[-2,24]],[[19032,13790],[47,91],[38,31],[51,-28],[38,-3],[31,-33]],[[14827,7757],[-99,-89],[-64,-91],[-23,-82],[-22,-46],[-38,-10],[-13,-58],[-7,-38],[-45,-28],[-58,6],[-34,34],[-30,15],[-34,-29],[-18,-58],[-33,-36],[-36,-56],[-50,-12],[-15,44],[6,74],[-42,115],[-19,19]],[[14153,7431],[0,357],[70,4],[2,435],[52,4],[109,42],[27,-50],[46,48],[21,0],[40,27]],[[14520,8298],[13,-9]],[[14533,8289],[27,-97],[14,-22],[23,-70],[80,-135],[30,-13],[1,-43],[20,-77],[54,-19],[45,-56]],[[13825,11362],[59,9],[13,32],[12,-3],[18,-27],[89,46],[30,48],[37,43],[-7,43],[20,11],[69,-7],[66,56],[51,133],[36,50],[45,21]],[[14363,11817],[8,-52],[40,-77],[1,-50],[-12,-50],[5,-38],[24,-35]],[[14429,11515],[54,-54]],[[14483,11461],[39,-50],[1,-39],[48,-64],[29,-52],[18,-74],[53,-48],[11,-39]],[[14682,11095],[-23,-13],[-45,3],[-54,13],[-26,-11],[-11,-29],[-23,-4],[-28,26],[-79,-61],[-32,12],[-10,-9],[-21,-74],[-53,24],[-51,12],[-45,45],[-58,41],[-38,-39],[-28,-62],[-6,-85]],[[14051,10884],[-46,6],[-48,22],[-42,-66],[-38,-113]],[[13877,10733],[-7,35],[-3,56],[-33,39],[-26,64],[-6,43],[-33,64],[5,36],[-7,52],[6,95],[17,22],[35,123]],[[8237,16141],[50,-16],[66,3],[-35,-50],[-26,-7],[-89,51],[-18,41],[27,38],[25,-60]],[[8368,16453],[-35,-2],[-91,38],[-66,58],[25,10],[92,-30],[73,-51],[2,-23]],[[3999,16381],[-35,-17],[-117,55],[-21,43],[-63,43],[-13,35],[-72,22],[-28,67],[7,28],[74,-27],[43,-18],[66,-13],[24,-43],[35,-58],[71,-50],[29,-67]],[[8769,16647],[-46,-108],[46,43],[47,-28],[-25,-42],[63,-33],[33,29],[71,-37],[-22,-89],[49,21],[10,-65],[22,-77],[-30,-107],[-32,-4],[-47,23],[15,99],[-19,17],[-83,-107],[-42,4],[50,58],[-68,29],[-75,-7],[-138,4],[-11,37],[44,42],[-30,34],[59,73],[73,195],[44,69],[61,42],[33,-5],[-14,-33],[-38,-77]],[[3348,17056],[68,10],[-21,-139],[61,-98],[-28,0],[-43,56],[-26,57],[-36,37],[-13,54],[4,39],[34,-16]],[[7132,18048],[-28,-64],[-31,10],[-19,37],[4,8],[27,37],[29,-3],[18,-25]],[[6946,18115],[-84,-67],[-50,3],[-15,33],[53,56],[97,-1],[-1,-24]],[[6715,18475],[13,-54],[35,19],[42,-32],[77,-42],[82,-38],[6,-57],[52,9],[51,-41],[-63,-39],[-111,30],[-39,55],[-71,-65],[-100,-63],[-24,71],[-96,-12],[61,61],[10,96],[24,112],[51,-10]],[[7372,18657],[-79,-6],[-18,60],[30,68],[65,17],[56,-34],[1,-52],[-8,-17],[-47,-36]],[[5972,18897],[-44,-43],[-96,37],[-57,-13],[-96,54],[62,38],[49,53],[75,-35],[43,-22],[21,-23],[43,-46]],[[7991,15968],[-47,70],[0,166],[-31,35],[-48,-20],[-23,32],[-54,-92],[-22,-95],[-24,-55],[-30,-20],[-23,-6],[-7,-30],[-131,0],[-108,-1],[-32,-23],[-75,-87],[-9,-10],[-22,-47],[-64,0],[-70,-1],[-32,-19],[11,-24],[7,-38],[-2,-12],[-92,-61],[-73,-19],[-83,-65],[-18,0],[-24,19],[-8,18],[2,12],[15,43],[34,67],[21,73],[-15,106],[-15,110],[-74,58],[9,22],[-10,15],[-20,0],[-14,19],[-4,29],[-13,-13],[-20,4],[5,12],[-16,12],[-7,32],[-55,39],[-57,40],[-70,49],[-66,44],[-64,-35],[-23,-1],[-87,32],[-58,-16],[-67,38],[-73,19],[-49,7],[-22,21],[-13,67],[-24,-1],[0,-46],[-147,0],[-242,0],[-241,0],[-212,0],[-213,0],[-208,0],[-216,0],[-70,0],[-210,0],[-201,0]],[[4047,16441],[-9,0],[-138,119],[-51,54],[-127,50],[-40,108],[11,75],[-91,53],[-13,98],[-85,88],[-2,64]],[[3502,17150],[40,58],[-2,77],[-121,78],[-73,139],[-44,88],[-64,55],[-48,50],[-37,63],[-72,-39],[-69,-69],[-63,81],[-49,53],[-69,34],[-70,4],[0,695],[1,453]],[[2762,18970],[132,-29],[112,-59],[74,-11],[62,51],[86,38],[104,-15],[107,54],[116,30],[48,-51],[53,29],[16,57],[49,-13],[119,-109],[95,83],[9,-93],[87,20],[27,36],[86,-7],[108,-51],[166,-45],[97,-21],[70,8],[95,-63],[-99,-60],[128,-26],[190,14],[61,22],[75,-73],[78,61],[-73,52],[46,43],[86,5],[57,12],[56,-30],[72,-66],[79,10],[125,-55],[110,19],[103,-3],[-8,76],[63,22],[110,-42],[-1,-115],[45,97],[57,-3],[32,123],[-76,75],[-82,49],[5,136],[84,88],[94,-19],[72,-54],[95,-138],[-62,-60],[131,-25],[0,-125],[94,96],[85,-78],[-21,-91],[69,-83],[74,88],[52,106],[3,134],[100,-9],[105,-18],[95,-61],[5,-60],[-53,-66],[50,-65],[-9,-59],[-139,-85],[-98,-19],[-73,36],[-21,-62],[-69,-102],[-20,-54],[-83,-82],[-101,-8],[-56,-52],[-5,-79],[-81,-16],[-87,-98],[-77,-138],[-28,-96],[-4,-143],[105,-20],[32,-114],[33,-92],[98,24],[132,-54],[71,-46],[51,-58],[88,-33],[76,-51],[116,-7],[77,-12],[-12,-107],[22,-122],[52,-137],[105,-116],[55,40],[38,126],[-37,192],[-50,65],[114,57],[79,86],[40,84],[-6,83],[-48,103],[-86,92],[83,128],[-30,111],[-24,191],[49,28],[121,-33],[73,-12],[59,32],[66,-42],[88,-71],[21,-47],[126,-10],[-2,-102],[23,-155],[65,-19],[51,-71],[103,67],[68,136],[47,56],[55,-109],[91,-156],[79,-147],[-29,-76],[95,-69],[64,-69],[113,-32],[45,-40],[28,-103],[55,-16],[28,-46],[5,-138],[-51,-45],[-50,-43],[-117,-43],[-89,-100],[-120,-20],[-151,26],[-106,1],[-74,-9],[-59,-88],[-91,-54],[-102,-161],[-81,-114],[59,20],[114,161],[149,102],[106,12],[63,-60],[-67,-82],[23,-132],[23,-92],[91,-60],[117,17],[71,137],[5,-88],[46,-44],[-88,-81],[-157,-72],[-69,-50],[-80,-87],[-53,9],[-3,103],[123,100],[-113,-4],[-79,-15]],[[4661,19386],[-35,-57],[157,37],[98,-61],[81,62],[64,-40],[58,-120],[36,51],[-50,124],[62,19],[71,-20],[78,-49],[45,-119],[22,-86],[119,-61],[128,-58],[-8,-53],[-116,-10],[45,-47],[-24,-44],[-128,19],[-121,33],[-83,-8],[-133,-41],[-180,-18],[-125,-13],[-39,59],[-96,33],[-63,-14],[-88,96],[47,13],[110,21],[100,-5],[92,21],[-137,28],[-151,-9],[-101,2],[-37,46],[164,49],[-109,-2],[-124,32],[59,91],[50,49],[190,75],[72,-25]],[[5345,19424],[-62,-82],[-110,86],[24,17],[94,5],[54,-26]],[[7339,19384],[6,-34],[-75,4],[-76,2],[-77,-16],[-21,7],[-78,66],[3,44],[34,8],[162,-13],[122,-68]],[[6616,19391],[56,-76],[65,99],[179,50],[122,-127],[-11,-80],[140,36],[67,48],[157,-62],[98,-58],[9,-53],[132,28],[73,-78],[171,-49],[61,-49],[68,-114],[-131,-56],[167,-81],[113,-27],[101,-111],[112,-9],[-22,-86],[-124,-141],[-87,52],[-112,118],[-92,-16],[-9,-70],[75,-71],[96,-56],[30,-32],[46,-122],[-25,-87],[-89,33],[-178,97],[100,-105],[74,-73],[12,-43],[-193,49],[-151,71],[-86,59],[25,34],[-106,64],[-103,59],[1,-36],[-204,-19],[-60,42],[46,89],[133,3],[146,15],[-24,44],[25,61],[92,119],[-20,54],[-27,41],[-109,59],[-144,43],[46,31],[-75,75],[-62,7],[-56,42],[-38,-36],[-128,-16],[-258,27],[-150,36],[-115,18],[-59,43],[74,57],[-100,0],[-23,123],[55,109],[73,51],[183,32],[-52,-79]],[[5639,19475],[85,-25],[125,15],[19,-35],[-67,-60],[108,-52],[-13,-110],[-116,-47],[-68,10],[-49,47],[-176,94],[1,39],[145,-15],[-78,80],[84,59]],[[6146,19344],[-76,-91],[-81,4],[-44,107],[1,62],[37,51],[70,34],[148,-5],[135,-29],[-105,-110],[-85,-23]],[[4216,19175],[-187,-59],[-37,53],[-164,65],[30,51],[49,89],[62,81],[-69,75],[239,19],[102,-25],[180,-7],[69,-36],[76,-51],[-89,-30],[-174,-87],[-87,-85],[0,-53]],[[6116,19613],[-38,-47],[-103,9],[-86,32],[38,55],[102,34],[62,-44],[25,-39]],[[5770,19826],[54,-56],[2,-63],[-32,-91],[-116,-13],[-76,20],[1,72],[-116,-10],[-5,95],[77,-4],[107,41],[98,-7],[6,16]],[[5083,19763],[28,-43],[63,20],[74,-5],[12,-61],[-43,-58],[-240,-18],[-179,-53],[-107,-3],[-9,40],[147,54],[-320,-15],[-99,22],[97,120],[66,34],[199,-41],[126,-72],[124,-11],[-101,118],[65,44],[73,-14],[24,-58]],[[6040,19872],[79,-39],[139,0],[61,-40],[-16,-45],[81,-28],[45,-29],[96,-5],[104,-11],[112,27],[144,10],[115,-8],[76,-47],[16,-51],[-44,-32],[-106,-26],[-91,15],[-202,-19],[-146,-2],[-115,15],[-187,39],[-25,67],[-8,61],[-71,53],[-147,15],[-82,38],[26,50],[146,-8]],[[4046,19753],[120,91],[145,79],[109,-2],[97,18],[-10,-94],[-54,-42],[-66,-6],[-132,-52],[-113,-19],[-96,27]],[[6100,19924],[-32,-4],[-133,8],[-19,34],[143,-2],[50,-23],[-9,-13]],[[4943,19945],[-133,-35],[-104,39],[57,40],[103,13],[100,-19],[-23,-38]],[[4980,20056],[-87,-24],[-117,1],[1,17],[73,36],[38,-5],[92,-25]],[[5959,19990],[-105,-25],[-58,28],[-30,46],[-6,50],[92,-5],[42,-8],[84,-42],[-19,-44]],[[5660,20022],[28,-50],[-116,13],[-117,40],[-158,4],[69,36],[-86,30],[-5,46],[139,-16],[192,-45],[54,-58]],[[6583,20185],[86,-39],[-98,-37],[-131,-91],[-125,-9],[-146,16],[-77,49],[2,45],[56,32],[-130,-1],[-78,40],[-45,56],[49,55],[49,37],[73,8],[-31,28],[165,6],[89,-65],[120,-26],[116,-23],[56,-81]],[[7894,20606],[190,-9],[152,-16],[129,-33],[-3,-33],[-172,-53],[-172,-25],[-64,-27],[154,1],[-167,-74],[-116,-35],[-120,-100],[-146,-20],[-46,-25],[-214,-13],[97,-15],[-49,-22],[59,-60],[-67,-42],[-109,-34],[-34,-49],[-99,-36],[10,-28],[121,5],[2,-30],[-190,-73],[-185,34],[-207,-19],[-106,15],[-134,6],[-9,58],[131,28],[-35,89],[43,8],[190,-53],[-97,79],[-115,23],[58,47],[126,29],[20,43],[-100,47],[-31,64],[193,-5],[56,-14],[111,45],[-160,14],[-247,-8],[-125,42],[-59,49],[-83,35],[-16,42],[106,23],[82,4],[140,20],[104,46],[87,-6],[77,-35],[53,66],[94,20],[127,13],[216,5],[38,-13],[205,21],[153,-8],[153,-8]],[[13483,16183],[-5,-50],[-32,-20],[-52,15],[-15,-49],[-34,-4],[-13,19],[-39,-41],[-34,-6],[-30,26]],[[13229,16073],[-24,54],[-34,-19],[1,55],[52,68],[-3,31],[32,-11],[19,21]],[[13272,16272],[61,-1],[14,27],[76,-38]],[[8003,3751],[-23,-49],[-61,-38],[-35,4],[-42,10],[-51,36],[-74,18],[-89,68],[-72,66],[-98,136],[58,-25],[100,-81],[94,-44],[36,56],[23,83],[65,50],[50,-14]],[[7889,4068],[-63,1],[-34,-30],[-63,-44],[-12,-114],[-30,-3],[-80,40],[-81,85]],[[7526,4003],[-88,69],[-23,78],[21,72],[-36,81],[-9,208],[30,117],[75,95],[-108,36],[68,107],[24,203],[79,-42],[37,253],[-48,32],[-22,-153],[-45,17],[23,175],[24,227],[32,83],[-20,119],[-6,138],[30,4],[43,197],[50,195],[30,182],[-17,184],[21,100],[-8,150],[41,150],[13,236],[22,254],[22,273],[-5,200],[-15,172]],[[7761,8215],[37,31],[19,62]],[[20556,12737],[-61,-58],[-58,37],[-2,105],[35,55],[77,35],[41,-2],[16,-48],[-31,-53],[-17,-71]],[[21905,16494],[84,-86],[29,-115],[108,0],[61,48],[116,36],[-37,-110],[-26,-45],[-25,-133],[-47,-120],[-86,22],[-61,-43],[18,-104],[-10,-145],[-36,-4],[0,-61]],[[21993,15634],[-45,72],[-29,-69],[-109,-52],[11,-64],[-62,4],[-32,38],[-49,-86],[-78,-66],[-58,-79]],[[21542,15332],[-99,-35],[-52,-57],[-77,-33],[38,56],[-15,48],[56,82],[-37,64],[-62,-44],[-79,-84],[-44,-79],[-69,-6],[-37,-56],[38,-84],[58,-20],[2,-54],[56,-36],[79,87],[63,-47],[46,-4],[11,-63],[-100,-34],[-33,-67],[-68,-61],[-37,-85],[76,-67],[28,-121],[43,-111],[48,-94],[-1,-91],[-45,-34],[17,-64],[42,-38],[-11,-100],[-18,-97],[-40,-11],[-51,-131],[-57,-161],[-66,-145],[-97,-114],[-99,-102],[-80,-14],[-43,-54],[-25,39],[-40,-61],[-98,-61],[-75,-19],[-24,-128],[-40,-8],[-18,89],[16,47],[-95,39],[-33,-20]],[[20394,13088],[-72,32],[-33,50],[11,70],[-64,22],[-34,46],[-61,-65],[-69,-14],[-56,1],[-38,-30]],[[19978,13200],[-37,-18],[11,-140],[-38,3],[-7,29]],[[19907,13074],[-2,50],[-52,-35],[-31,22],[-52,46],[20,102],[-44,24],[-16,112],[-75,-21],[8,146],[67,101],[3,101],[-2,94],[-31,29],[-23,72],[-42,-9]],[[19635,13908],[-76,18],[24,51],[-34,77],[-50,-53],[-60,31],[-82,-78],[-64,-91],[-56,-15]],[[19032,13790],[-6,96],[-43,-25]],[[18983,13861],[-83,12],[-80,28],[-58,53],[-54,24],[-24,59],[-39,18],[-72,79],[-57,38],[-29,-30]],[[18487,14142],[-99,86],[-70,78],[-20,134],[51,-17],[3,63],[-29,62],[8,100],[-77,143]],[[18254,14791],[-115,49],[-21,95],[-53,56]],[[18053,15026],[-11,70],[3,47],[-44,29],[-23,-13],[-18,113]],[[17960,15272],[20,28],[-9,28],[67,58],[49,24],[75,-17],[27,79],[90,14],[26,49],[111,66],[10,27]],[[18426,15628],[-5,70],[48,32],[-64,212],[141,48],[36,28],[51,218],[140,-40],[40,55],[3,123],[59,12],[54,81]],[[18929,16467],[28,10]],[[18957,16477],[18,-85],[60,-65],[101,-46],[49,-98],[-27,-143],[25,-53],[84,-21],[95,-17],[86,-76],[44,-14],[32,-112],[42,-73],[78,3],[145,-28],[95,17],[70,-18],[105,-74],[85,0],[32,-37],[81,65],[115,42],[106,5],[83,43],[51,66],[50,41],[-12,40],[-22,47],[37,78],[40,-11],[72,-25],[71,65],[108,48],[52,81],[50,34],[103,16],[56,-13],[7,43],[-64,86],[-57,39],[-54,-46],[-70,20],[-41,-15],[-18,49],[50,122],[35,92]],[[21005,16549],[85,-46],[100,78],[-1,53],[63,129],[40,39],[-1,68],[-39,29],[59,61],[88,22],[94,3],[106,-36],[62,-45],[44,-124],[27,-52],[23,-75],[27,-120],[123,-39]],[[12542,11066],[-32,-1],[-50,23],[-45,-1],[-84,-21],[-50,-35],[-69,-45],[-14,3]],[[12198,10989],[6,100],[7,16],[-3,48],[-30,52],[-22,8],[-21,33],[16,54],[-7,59],[3,35]],[[12147,11394],[11,1],[4,53],[-5,24],[7,17],[26,15],[-18,97],[-16,50],[6,42],[14,9]],[[12176,11702],[9,11],[20,-18],[54,-1],[13,35],[12,-2],[20,14],[11,-52],[17,15],[29,18]],[[12544,11634],[19,-175],[-30,-102],[-19,-137],[31,-106],[-3,-48]],[[13670,10733],[-9,7],[-42,-16],[-43,16],[-34,-8]],[[13542,10732],[-115,3]],[[13427,10735],[10,96],[-27,82],[-33,20],[-14,55],[-18,17],[1,34]],[[13346,11039],[18,86],[34,118],[20,1],[42,72],[27,2],[40,-50],[49,41],[6,50],[16,49],[11,63],[38,50],[15,85],[15,27],[10,64],[18,78],[59,94],[4,41],[8,22],[-28,48]],[[13748,11980],[2,39],[20,7]],[[13770,12026],[28,-78],[5,-81],[-3,-80],[39,-112],[-40,1],[-20,-9],[-32,13],[-15,-58],[41,-71],[31,-20],[10,-51],[23,-85],[-12,-33]],[[13877,10733],[-5,-66],[-56,29],[-57,32],[-89,5]],[[14951,10725],[-23,-43],[-27,-32],[-27,-65],[-15,-56],[-4,-98],[-16,-46],[-1,-93]],[[14838,10292],[-20,-34],[-3,-73],[-10,-9],[-6,-67]],[[14821,9906],[13,-112],[-7,-64],[14,-71],[41,-68],[38,-154]],[[14920,9437],[-28,12],[-95,-20],[-19,-15],[-20,-77],[16,-54],[-13,-145],[-9,-122],[19,-22],[50,-47],[20,22],[5,-132],[-54,1],[-29,67],[-25,52],[-54,17],[-16,64],[-44,-38],[-57,17],[-23,55],[-45,11],[-34,-3],[-4,38],[-24,3]],[[13617,9711],[-10,37]],[[13664,9872],[19,-12],[24,46],[38,-1],[5,-34],[26,-22],[42,76],[41,60],[18,39],[-2,101],[30,118],[33,63],[47,59],[8,39],[2,45],[11,42],[-4,69],[9,109],[14,76],[21,65],[5,74]],[[14682,11095],[43,-100],[31,-15],[19,20],[33,-8],[40,26],[16,-52],[63,-82]],[[14927,10884],[-4,-142],[28,-17]],[[13588,9841],[-58,129]],[[13530,9970],[54,67],[-27,81],[24,31],[48,15],[6,54],[38,-59],[62,-5],[21,58],[9,81],[-8,96],[-32,72],[29,141],[-16,25],[-53,-11],[-20,64],[5,53]],[[7407,10438],[-30,28],[-35,41],[-20,-20],[-60,17],[-16,53],[-14,-2],[-71,70]],[[7161,10625],[-9,38],[26,9],[-3,61],[17,44],[35,8],[29,77],[27,65],[-26,28],[13,71],[-16,111],[15,32],[-11,104],[-28,65]],[[7230,11338],[10,59],[21,-8],[14,36],[-17,72],[9,18]],[[7267,11515],[37,-4],[53,85],[29,13],[1,41],[13,103],[40,57],[45,2],[6,26],[55,-11],[56,62],[28,27],[34,59],[25,-8],[19,-32],[-14,-41]],[[7694,11894],[-45,-20],[-18,-61],[-28,-35],[-21,-46],[-8,-87],[-20,-71],[37,-8],[9,-56],[15,-27],[6,-50],[-8,-45],[2,-25],[18,-11],[17,-42],[91,12],[40,-16],[50,-105],[29,13],[51,-6],[40,14],[25,-21],[-13,-67],[-15,-41],[-6,-87],[14,-81],[20,-37],[3,-27],[-36,-61],[26,-27],[19,-42],[21,-122]],[[7795,9931],[-35,65],[-21,2],[45,125],[-53,57],[-43,-10],[-25,21],[-39,-32],[-53,15],[-42,128],[-33,31],[-23,58],[-47,58],[-19,-11]],[[6870,11460],[-39,28],[-14,26],[8,21],[-3,27],[-19,29],[-28,24],[-25,15],[-3,36],[-19,22],[5,-36],[-14,-29],[-17,34],[-22,12],[-10,24],[0,38],[10,39],[-20,17],[16,24]],[[6676,11811],[11,15],[46,-32],[16,16],[22,-10],[12,-25],[21,-8],[17,25]],[[6821,11792],[18,-67],[27,-49],[34,-52]],[[6900,11624],[-28,-11],[1,-49],[14,-18],[-10,-14],[2,-22],[-5,-25],[-4,-25]],[[6919,13288],[62,-9],[55,-1],[67,-41],[28,-45],[66,14],[26,-29],[59,-76],[44,-55],[23,2],[42,-25],[-5,-34],[53,-5],[53,-50],[-8,-29],[-47,-15],[-48,-7],[-49,10],[-101,-12],[47,68],[-29,32],[-45,8],[-24,35],[-17,70],[-40,-5],[-66,32],[-22,26],[-92,19],[-25,25],[27,30],[-70,6],[-51,-64],[-29,-2],[-10,-29],[-35,-14],[-30,12],[37,37],[15,45],[32,27],[36,24],[54,12],[17,13]],[[15062,14748],[5,0],[10,30],[51,-2],[64,36],[-48,-51],[6,-23]],[[15150,14738],[-8,4],[-14,-9],[-10,2],[-4,-4],[-1,12],[-5,7],[-14,2],[-19,-11],[-13,7]],[[15150,14738],[2,-10],[-73,-49],[-35,15],[-16,49],[34,5]],[[13707,16426],[-40,52],[-36,29],[-8,51],[-12,38],[51,26],[27,30],[51,24],[16,23],[19,-14],[32,13]],[[13807,16698],[33,-39],[53,-11],[-4,-33],[39,-26],[10,32],[49,-14],[7,-38],[52,-8],[33,-60]],[[14079,16501],[-21,0],[-11,-22],[-16,-5],[-5,-28],[-14,-6],[-2,-11],[-24,-13],[-31,2],[-10,-27]],[[13446,17172],[2,-48],[71,-29],[0,-43],[72,23],[40,33],[80,-48],[33,-39]],[[13744,17021],[16,-61],[-19,-33],[25,-43],[17,-66],[-5,-42],[29,-78]],[[13272,16272],[9,87],[36,84],[-101,22],[-34,32]],[[13182,16497],[4,53],[-14,29]],[[13180,16661],[-12,128],[43,0],[18,45],[17,113],[-13,41]],[[13233,16988],[13,26],[60,6],[13,-26],[48,60],[-16,45],[-4,70]],[[13347,17169],[54,-16],[45,19]],[[15794,12007],[17,-38],[-3,-51],[-40,-29],[30,-33]],[[15798,11856],[-26,-65]],[[15772,11791],[-16,22],[-16,-9],[-39,2],[-1,37],[-6,34],[24,57],[25,53]],[[15743,11987],[29,-10],[22,30]],[[13643,17248],[-43,-99],[-74,69],[-10,51],[104,40],[23,-61]],[[13347,17169],[-28,68],[-3,124],[12,33],[21,38],[62,7],[25,34],[57,34],[-2,-63],[-21,-40],[8,-34],[39,-19],[-18,-46],[-21,14],[-51,-88],[19,-59]],[[7667,12863],[9,21],[55,0],[41,-32],[19,3],[13,-43],[39,3],[-3,-37],[32,-4],[35,-45],[-26,-49],[-34,26],[-33,-5],[-23,6],[-13,-22],[-27,-8],[-10,30],[-23,-18],[-29,-83],[-18,19],[-4,35]],[[7667,12660],[2,33],[-18,37],[17,20],[5,47],[-6,66]],[[13594,13323],[-243,-233],[-205,-240],[-100,-55]],[[13046,12795],[-78,-12],[-1,78],[-33,20],[-44,35],[-17,57],[-238,267],[-240,267]],[[12395,13507],[-266,295]],[[12129,13802],[2,24],[0,8]],[[12131,13834],[-1,144],[114,91],[71,18],[58,33],[27,61],[83,48],[3,91],[41,11],[32,45],[93,21],[13,47],[-19,26],[-24,129],[-5,74],[-26,78]],[[12591,14751],[68,67],[76,21],[44,51],[69,37],[120,22],[117,10],[36,-18],[67,48],[75,0],[28,-28],[49,8]],[[13340,14969],[-15,-63],[12,-117],[-17,-100],[-44,-68],[7,-93],[58,-72],[0,-30],[44,-49],[30,-219]],[[13415,14158],[23,-108],[4,-57],[-13,-100],[6,-55],[-9,-67],[6,-77],[-28,-51],[42,-89],[2,-52],[25,-69],[34,23],[56,-57],[31,-76]],[[7059,10040],[37,92],[-15,53],[-27,-57],[-42,54],[14,34],[-12,110],[25,20],[13,75],[27,79],[-5,50],[39,26],[48,49]],[[7407,10438],[10,-93],[-22,-80],[-77,-127],[-84,-48],[-44,-107],[-13,-82],[-40,-51],[-30,62],[-29,13],[-29,-10],[-2,45],[20,29],[-8,51]],[[15354,13143],[-281,0],[-275,0],[-284,0]],[[14514,13143],[0,450],[0,434],[-21,99],[18,75],[-11,52],[26,59]],[[14526,14312],[94,2],[68,-33],[70,-36],[33,-19],[54,39],[29,34],[63,11],[50,-16],[20,-60],[16,40],[57,-29],[55,-7],[35,31]],[[15170,14269],[47,-210]],[[15217,14059],[-20,-49],[-15,-92],[-20,-64],[-16,-21],[-24,39],[-32,55],[-50,175],[-8,-11],[30,-129],[43,-123],[54,-190],[26,-67],[23,-68],[63,-136],[-15,-21],[3,-79],[82,-111],[13,-24]],[[15743,11987],[-24,40],[-29,72],[-32,39],[-18,42],[-62,49],[-49,2],[-17,25],[-41,-29],[-43,56],[-23,-91],[-82,25]],[[15323,12217],[-8,49],[31,180],[7,81],[22,37],[52,20],[36,70]],[[15463,12654],[42,-141],[19,-112],[39,-59],[97,-116],[39,-70],[39,-70],[21,-42],[35,-37]],[[12105,15571],[3,87],[-29,53],[101,88],[85,-22],[96,1],[75,-21],[59,7],[115,-4]],[[12610,15760],[28,-49],[129,-55],[26,26],[80,-55],[82,16]],[[12955,15643],[4,-71],[-67,-81],[-91,-25],[-6,-42],[-44,-68],[-26,-99],[26,-69],[-40,-56],[-15,-79],[-54,-24],[-50,-94],[-90,-1],[-67,2],[-45,-43],[-27,-47],[-35,10],[-26,42],[-20,70],[-65,19]],[[12217,14987],[-6,40],[26,46],[9,33],[-24,36],[20,81],[-28,73],[30,10],[2,58],[12,17],[0,96],[33,33],[-20,61],[-40,5],[-12,-16],[-42,0],[-18,60],[-29,-18],[-25,-31]],[[14465,17515],[9,72],[-27,-16],[-45,43],[-6,70],[90,35],[89,18],[77,-20],[74,3]],[[14726,17720],[10,-22],[-50,-70],[21,-113],[-31,-39]],[[14676,17476],[-58,0],[-61,45],[-31,15],[-61,-21]],[[15772,11791],[-15,-44],[26,-67],[26,-59],[27,-43],[232,-146],[60,1]],[[16128,11433],[-201,-366],[-92,-6],[-63,-85],[-45,-3],[-19,-38]],[[15708,10935],[-49,0],[-28,41],[-65,-51],[-21,-52],[-47,10],[-16,14],[-17,-3],[-22,1],[-90,104],[-49,0],[-25,40],[0,69],[-36,20]],[[15243,11128],[-41,134],[-33,28],[-12,48],[-36,60],[-44,8],[24,71],[38,3],[11,37]],[[15150,11517],[-1,109]],[[15149,11626],[21,129],[33,34],[8,50],[30,93],[42,60],[29,121],[11,104]],[[14768,18892],[-10,-87],[108,-81],[-65,-92],[82,-139],[-48,-104],[64,-91],[-29,-80],[105,-84],[-26,-62],[-66,-70],[-151,-156]],[[14732,17846],[-129,-10],[-125,-45],[-115,-25],[-41,66],[-69,40],[16,121],[-34,110],[33,70],[65,77],[162,133],[47,25],[-7,52],[-99,57]],[[14436,18517],[-24,49],[-2,187],[-110,84],[-94,60]],[[14206,18897],[42,32],[78,-65],[93,6],[76,-29],[68,54],[35,89],[110,41],[90,-48],[-30,-85]],[[25373,8338],[24,-35],[-12,-64],[-44,-17],[-39,15],[-7,54],[28,42],[32,-15],[18,20]],[[25443,8404],[-45,-25],[-10,45],[36,25],[22,7],[42,38],[0,-60],[-45,-30]],[[6,8441],[-6,-7],[0,60],[15,5],[-9,-58]],[[8411,4124],[85,73],[60,-31],[43,49],[57,-55],[-22,-42],[-95,-38],[-32,44],[-61,-56],[-35,56]],[[13421,15604],[-24,-94],[-32,25],[-16,82],[14,45],[46,47],[12,-105]],[[13146,16505],[16,-11],[20,3]],[[13229,16073],[-3,-34],[20,-47],[-24,-37],[19,-94],[37,-15],[-8,-53]],[[13270,15793],[-63,-69],[-140,33],[-104,-40],[-8,-74]],[[12610,15760],[36,73],[14,243],[-73,128],[-53,62],[-108,47],[-7,89],[92,27],[119,-32],[-23,138],[67,-52],[164,96],[22,99],[62,25]],[[13530,9970],[-73,124],[-47,100],[-43,126],[2,41],[15,39],[18,89],[14,90]],[[13416,10579],[24,7],[103,-1],[-1,147]],[[12305,17035],[-54,25],[-43,-2],[15,66],[-15,66]],[[12208,17190],[59,5],[76,-76],[-38,-84]],[[12502,16737],[-111,20],[-20,49],[74,37],[-39,67],[14,80],[105,-11]],[[12525,16979],[11,70],[-48,75],[-1,2],[-86,22],[-17,33],[26,55],[-24,33],[-38,-57],[-4,117],[-36,62],[26,127],[55,99],[57,-10],[85,10],[-76,-132],[73,17],[78,0],[-19,-101],[-64,-109],[74,-7],[5,-13],[63,-145],[49,-19],[43,-139],[20,-48],[86,-23],[-9,-79],[-36,-36],[28,-63],[-63,-64],[-94,2],[-121,-34],[-33,24],[-47,-57],[-66,14],[-50,-48],[-37,26],[104,127],[63,27]],[[15686,15529],[11,52],[-18,83],[-41,45],[-39,15],[-26,37]],[[15573,15761],[9,15],[60,-21],[103,-20],[97,-59],[12,-23],[43,19],[66,-25],[22,-50],[45,-28]],[[15829,15475],[-68,60],[-75,-6]],[[12819,11180],[-111,-72],[-39,-41],[-64,-36],[-63,35]],[[12745,11802],[-4,-38],[29,-64],[-1,-88],[7,-96],[18,-44],[-16,-111],[6,-60],[19,-78],[16,-43]],[[12147,11394],[-20,4],[-15,-49],[-20,0],[-14,26],[5,49],[-30,75],[-18,-13],[-15,-3]],[[12020,11483],[-20,-7],[1,45],[-11,32],[2,35],[-15,51],[-20,44],[-57,0],[-16,-23],[-20,-3],[-12,-26],[-8,-34],[-38,-53]],[[11806,11544],[-31,72],[-28,47],[-17,16],[-18,24],[-8,55],[-10,27],[-21,20]],[[11673,11805],[32,59],[21,-2],[18,20],[15,0],[12,16],[-7,41],[8,13],[2,41]],[[11774,11993],[34,-1],[51,-30],[15,3],[6,13],[38,-9],[11,6]],[[11929,11975],[4,-44],[11,0],[19,16],[11,-4],[20,-31],[30,-10],[20,27],[23,16],[17,17],[14,-3],[16,-27],[8,-33],[29,-51],[-14,-32],[-3,-39],[15,12],[9,-14],[-4,-38],[22,-35]],[[11552,12063],[9,54]],[[11561,12117],[77,3],[16,29],[23,2],[28,-30],[22,-1],[22,21],[14,-35],[-29,-28],[-31,2],[-31,26],[-26,-28],[-13,-1],[-17,-17],[-64,3]],[[11673,11805],[-38,51],[-30,8],[-16,34],[1,18],[-22,26],[-5,26]],[[11563,11968],[38,20],[23,-4],[19,14],[131,-5]],[[13416,10579],[-13,18],[24,138]],[[14422,14816],[39,-41],[55,7],[53,-8],[-2,-21],[39,14],[-9,-36],[-102,-10],[0,20],[-86,24],[13,51]],[[14589,15442],[-43,4],[-37,11],[-86,-32],[49,-69],[-36,-19],[-40,-1],[-37,63],[-13,-27],[15,-72],[36,-57],[-27,-27],[40,-56],[35,-36],[1,-69],[-66,32],[21,-62],[-45,-13],[27,-107],[-47,-2],[-58,53],[-27,98],[-11,81],[-28,56],[-36,70],[-5,35]],[[14233,15445],[45,11],[27,26],[39,-2],[11,21],[14,4]],[[14593,15565],[35,-33],[-22,-76],[-17,-14]],[[9433,20548],[238,73],[248,-6],[91,45],[249,12],[566,-15],[443,-97],[-130,-48],[-272,-5],[-381,-12],[36,-22],[250,14],[214,-42],[138,37],[59,-44],[-78,-70],[179,45],[345,47],[212,-23],[39,-52],[-288,-87],[-40,-28],[-227,-21],[165,-7],[-83,-89],[-57,-79],[2,-136],[85,-79],[-111,-6],[-115,-38],[129,-65],[17,-104],[-76,-11],[92,-105],[-156,-9],[81,-49],[-23,-43],[-99,-19],[-99,0],[89,-84],[1,-54],[-141,50],[-36,-32],[95,-31],[93,-74],[27,-99],[-126,-23],[-55,47],[-88,70],[25,-83],[-83,-64],[187,-5],[98,-7],[-190,-106],[-193,-97],[-207,-42],[-78,0],[-73,-47],[-99,-129],[-151,-86],[-49,-5],[-95,-30],[-102,-28],[-61,-76],[-1,-85],[-35,-81],[-115,-97],[28,-95],[-31,-102],[-37,-119],[-100,-7],[-105,99],[-141,1],[-69,66],[-47,120],[-122,152],[-36,80],[-10,109],[-98,113],[25,90],[-47,43],[70,142],[107,47],[28,51],[15,95],[-81,-43],[-39,-19],[-64,-17],[-87,40],[-5,83],[28,64],[66,2],[145,-32],[-122,78],[-64,42],[-70,-17],[-60,30],[80,113],[-43,45],[-57,86],[-84,129],[-90,47],[0,51],[-190,72],[-151,9],[-188,-5],[-173,-9],[-83,39],[-122,76],[185,39],[143,6],[-302,32],[-160,50],[9,48],[268,58],[260,59],[27,44],[-191,44],[62,49],[245,85],[102,13],[-29,55],[168,32],[218,19],[217,1],[78,-38],[188,67],[168,-45],[100,-10],[147,-40],[-169,66],[10,53]],[[6365,12134],[-36,21],[-45,2],[-32,24],[-37,50]],[[6215,12231],[1,36],[9,28],[-10,24],[33,99],[91,1],[2,41],[-12,8],[-8,26],[-26,28],[-26,41],[32,0],[0,69],[66,1],[66,-2]],[[6448,12397],[23,-22],[6,18],[21,-16]],[[6498,12377],[-33,-46],[-33,-35],[-5,-24],[5,-24],[-14,-31]],[[6418,12217],[-17,-7],[4,-14],[-14,-14],[-24,-30],[-2,-18]],[[8883,10738],[18,52],[7,56],[12,52]],[[8920,10898],[-28,73],[-5,83],[37,105]],[[8924,11159],[24,-14],[52,-29],[75,-102],[12,-50]],[[8513,11478],[47,-45],[44,-80],[2,-62],[26,-3],[38,-60],[28,-43]],[[8698,11185],[-11,-110],[-43,-31],[4,-29],[-13,-63],[31,-89],[23,0],[9,-69],[44,-106]],[[8444,11091],[-48,92],[19,35],[-1,56],[43,19],[18,23],[-24,45],[6,45],[56,72]],[[6562,12042],[-12,38],[-22,11]],[[6528,12091],[5,49],[-9,13],[-15,9],[-31,-15],[-3,16],[-21,20],[-15,24],[-21,10]],[[6498,12377],[7,-5],[16,22],[20,2],[6,-10],[11,6],[33,-11],[33,3],[23,13],[8,14],[23,-6],[17,-9],[19,3],[14,11],[31,-17],[11,-3],[22,-23],[20,-27],[26,-18],[19,-35]],[[6857,12287],[-24,3],[-10,-17],[-25,-16],[-18,0],[-15,-15],[-15,5],[-11,19],[-7,-4],[-9,-29],[-7,1],[-1,-25],[-25,-34],[-13,-14],[-7,-15],[-21,25],[-16,-33],[-14,1],[-17,-3],[1,-60],[-10,-1],[-9,-28],[-22,-5]],[[14077,16063],[18,-47],[22,-36],[-27,-45]],[[14058,15665],[-8,-21]],[[14050,15644],[-66,45],[-41,45],[-65,36],[-60,90],[14,9],[-32,51],[-1,41],[-46,19],[-21,-52],[-21,40],[2,44],[2,2]],[[13715,16014],[49,-5],[13,21],[24,-20],[28,-2],[0,34],[24,12],[7,49],[57,33]],[[13917,16136],[22,-15],[53,-52],[59,-24],[26,18]],[[7667,12660],[-47,21],[-33,-9],[-43,9],[-34,-23],[-38,38],[7,40],[65,-17],[53,-10],[26,27],[-32,53],[0,46],[-45,19],[16,35],[44,-7],[61,-19]],[[13946,16334],[36,-31],[26,-14],[60,15],[6,25],[28,3],[34,19],[8,-8],[33,16],[17,28],[23,8],[75,-37],[15,12]],[[14307,16370],[40,-33],[5,-33]],[[14352,16304],[-44,-26],[-33,-83],[-42,-82],[-57,-23]],[[14176,16090],[-44,5],[-55,-32]],[[13917,16136],[-14,41],[-12,1]],[[21290,9206],[-30,-4],[-93,87],[66,24],[37,-37],[25,-37],[-5,-33]],[[21592,9370],[7,-24],[1,-37]],[[21600,9309],[-46,-91],[-61,-28],[-8,16],[6,41],[31,74],[70,49]],[[21092,9467],[25,-33],[44,10],[18,-52],[-82,-24],[-50,-16],[-38,1],[25,70],[39,1],[19,43]],[[21445,9467],[-10,-68],[-107,-34],[-93,15],[0,44],[55,26],[45,-37],[47,9],[63,45]],[[20434,9628],[136,-12],[16,50],[132,-58],[24,-79],[107,-22],[87,-74],[-81,-46],[-78,49],[-63,-3],[-74,9],[-66,21],[-83,48],[-52,12],[-29,-15],[-129,50],[-13,52],[-64,9],[48,116],[86,-7],[57,-47],[30,-10],[9,-43]],[[22282,9697],[-36,-83],[-6,91],[11,44],[15,42],[16,-36],[0,-58]],[[21753,10033],[-26,-40],[-49,22],[-14,53],[72,6],[17,-41]],[[21981,10078],[26,-94],[-60,51],[-59,10],[-40,-8],[-49,4],[17,68],[87,5],[78,-36]],[[22727,10139],[1,-399],[2,-398]],[[22730,9342],[-63,100],[-73,25],[-17,-35],[-90,-4],[30,100],[45,34],[-19,132],[-34,104],[-137,103],[-59,10],[-105,112],[-21,-59],[-27,-11],[-17,45],[0,53],[-54,61],[76,44],[51,-3],[-6,32],[-104,1],[-28,72],[-63,23],[-30,61],[95,29],[37,40],[114,-50],[10,-46],[20,-197],[73,-74],[59,130],[82,74],[63,0],[61,-43],[52,-43],[76,-23]],[[21611,10630],[-57,-122],[-53,-23],[-68,23],[-119,-6],[-62,-17],[-10,-92],[64,-109],[38,56],[132,41],[-5,-57],[-31,19],[-31,-73],[-63,-47],[68,-156],[-13,-43],[63,-140],[0,-80],[-38,-37],[-28,44],[34,100],[-69,-47],[-18,33],[9,47],[-51,72],[5,119],[-47,-37],[6,-143],[3,-174],[-44,-18],[-30,36],[20,112],[-11,118],[-30,1],[-22,84],[29,80],[11,96],[35,185],[14,50],[60,90],[56,-36],[89,-16],[82,5],[70,89],[12,-27]],[[21855,10594],[-4,-107],[-36,12],[-11,-74],[29,-64],[-20,-15],[-28,78],[-22,155],[15,98],[23,45],[5,-67],[42,-10],[7,-51]],[[20508,10701],[12,-81],[49,-70],[45,25],[46,-9],[41,63],[34,10],[66,-35],[58,27],[36,169],[28,43],[24,139],[82,0],[61,-20]],[[21090,10962],[-40,-111],[52,-116],[-12,-56],[79,-113],[-84,-15],[-23,-83],[3,-110],[-69,-84],[-1,-121],[-28,-187],[-10,43],[-81,-55],[-28,75],[-50,6],[-36,40],[-83,-44],[-26,60],[-47,-7],[-58,14],[-11,163],[-35,34],[-34,105],[-10,107],[8,113],[42,81]],[[20236,9741],[-78,-3],[-60,103],[-91,99],[-30,74],[-54,100],[-35,91],[-54,172],[-63,101],[-20,105],[-26,96],[-64,77],[-37,104],[-53,69],[-74,134],[-6,62],[45,-5],[110,-23],[63,-120],[54,-83],[39,-51],[67,-130],[72,-2],[60,-84],[41,-103],[54,-55],[-28,-100],[40,-43],[26,-3],[12,-85],[24,-68],[53,-11],[33,-77],[-17,-152],[-3,-189]],[[18487,14142],[-45,-55],[-28,-115],[69,-46],[67,-59],[92,-69],[97,-15],[40,-63],[55,-12],[86,-28],[59,2],[8,48],[-10,78],[6,53]],[[19635,13908],[5,-47],[-24,-22],[5,-75],[-50,22],[-92,-85],[2,-70],[-39,-102],[-4,-59],[-31,-101],[-56,27],[-3,-125],[-16,-42],[8,-52],[-35,-29]],[[19048,13149],[-11,-44],[-48,1],[-87,-25],[4,-91],[-38,-72],[-102,-83],[-79,-144],[-53,-76],[-71,-81],[0,-56],[-35,-30],[-64,-44],[-33,-6],[-21,-94],[14,-158],[4,-101],[-30,-117],[0,-207],[-37,-6],[-32,-93],[21,-40],[-64,-35],[-24,-84],[-28,-35],[-67,115],[-33,171],[-27,123],[-25,58],[-37,117],[-18,153],[-12,76],[-65,168],[-29,237],[-21,156],[0,148],[-14,114],[-103,-73],[-49,15],[-93,147],[34,45],[-21,48],[-83,103]],[[17571,13349],[47,82],[155,-1],[-14,106],[-39,62],[-8,93],[-46,56],[77,127],[83,-9],[74,128],[44,124],[69,122],[-1,88],[60,71],[-57,60],[-24,82],[-26,108],[35,52],[108,-30],[79,19],[67,102]],[[12305,17035],[12,-87],[-54,-110],[-125,-72],[-100,19],[57,128],[-37,124],[97,96],[53,57]],[[16562,14999],[62,24],[51,69],[47,-3],[30,23],[51,-12],[78,-61],[57,-14],[81,-107],[53,-5],[6,-103]],[[17054,14099],[35,-64],[29,-74],[68,-54],[1,-107],[34,-20],[6,-57],[-102,-62],[-27,-142]],[[17098,13519],[-133,37],[-78,28],[-80,16],[-30,150],[-34,21],[-53,-21],[-72,-60],[-87,40],[-71,95],[-69,34],[-47,116],[-52,163],[-38,-20],[-45,41],[-26,-48]],[[16183,14111],[-39,64],[-1,65],[-23,0],[12,89],[-37,93],[-86,66],[-50,117],[17,95],[36,42],[-6,71],[-46,37],[-46,146]],[[15914,14996],[-39,97],[14,38],[-22,141],[48,34]],[[16205,15136],[23,-90],[66,-25],[49,-61],[101,-21],[111,32],[7,28]],[[16183,14111],[-42,6]],[[16141,14117],[-48,10],[-52,-118]],[[16041,14009],[-132,11],[-199,245],[-105,86],[-86,33]],[[15519,14384],[-29,148]],[[15490,14532],[158,128],[26,147],[-6,90],[38,30],[37,76]],[[15743,15003],[29,19],[83,-16],[25,-31],[34,21]],[[11717,18573],[-16,-80],[79,-83],[-91,-93],[-205,-84],[-61,-22],[-93,18],[-197,39],[69,54],[-154,60],[126,23],[-3,36],[-149,28],[48,80],[107,18],[110,-83],[108,67],[89,-35],[116,66],[117,-9]],[[15273,14451],[-13,-38]],[[15260,14413],[-24,16],[-15,-81],[17,-13],[-18,-17],[-3,-33],[33,17]],[[15250,14302],[1,-48],[-34,-195]],[[15170,14269],[21,41],[-5,7],[19,56],[14,92],[10,31],[2,1]],[[15231,14497],[23,0],[7,21],[19,2]],[[15280,14520],[1,-50],[-10,-18],[2,-1]],[[13843,15125],[-26,-96],[11,-38],[-15,-62],[-55,46],[-35,13],[-99,62],[10,62],[83,-11],[72,13],[54,11]],[[13396,15489],[42,-87],[-10,-161],[-32,8],[-29,-41],[-27,32],[-2,147],[-17,71],[39,-6],[36,37]],[[13722,16136],[-8,-60],[17,-51]],[[13731,16025],[-56,17],[-58,-44],[4,-60],[-9,-35],[24,-62],[66,-61],[36,-102],[78,-98],[55,1],[18,-27],[-20,-24],[63,-44],[52,-37],[61,-65],[8,-22],[-14,-44],[-39,57],[-62,20],[-30,-79],[52,-45],[-9,-63],[-29,-8],[-38,-105],[-30,-9],[0,37],[15,66],[15,26],[-27,71],[-22,61],[-29,15],[-21,53],[-45,23],[-31,49],[-52,8],[-56,55],[-65,79],[-48,70],[-22,121],[-35,14],[-58,41],[-33,-17],[-41,-56],[-29,-9]],[[7252,12714],[47,-11],[38,-29],[12,-33],[-50,-2],[-22,-21],[-38,20],[-41,44],[9,28],[29,8],[16,-4]],[[15273,14451],[79,-48],[138,129]],[[15519,14384],[-13,-18],[-143,-61],[71,-123],[-23,-21],[-12,-40],[-54,-17],[-17,-44],[-31,-38],[-78,20]],[[15219,14042],[-2,17]],[[15250,14302],[10,36],[0,75]],[[22276,14627],[9,-42],[-40,-74],[-28,39],[-36,-29],[-19,-71],[-46,35],[0,58],[39,73],[41,-14],[29,51],[51,-26]],[[22726,14992],[-27,-97],[12,-62],[-37,-86],[-90,-57],[-125,-7],[-101,-140],[-48,48],[-3,91],[-122,-27],[-84,-58],[-83,-2],[72,-90],[-48,-208],[-45,-52],[-35,48],[18,110],[-45,36],[-29,83],[67,38],[37,77],[72,63],[52,83],[140,37],[76,-25],[74,217],[47,-58],[104,122],[41,47],[44,150],[-12,137],[30,78],[74,22],[39,-170],[-2,-99],[-65,-123],[2,-126]],[[22933,15851],[50,-26],[50,52],[16,-137],[-106,-34],[-62,-121],[-111,83],[-38,-133],[-79,-2],[-10,121],[35,95],[75,7],[21,168],[21,96],[83,-128],[55,-41]],[[17768,15618],[-40,-23],[-94,-84],[-31,-88],[-26,-1],[-19,58],[-91,4],[-14,100],[-35,1],[6,122],[-85,90],[-121,-10],[-83,-17],[-68,109],[-58,46],[-110,89],[-13,10],[-182,-73],[3,-450]],[[16707,15501],[-36,-5],[-50,95],[-48,34],[-81,-25],[-31,-41]],[[16461,15559],[-4,30],[18,51],[-14,42],[-82,42],[-32,110],[-39,31],[-3,39],[69,-11],[3,89],[60,20],[62,-19],[13,120],[-13,75],[-71,-6],[-60,30],[-82,-53],[-65,-26]],[[16221,16123],[-36,20],[7,62],[-45,83],[-53,-4],[-60,83],[41,92],[-21,25],[57,135],[73,-72],[9,90],[145,132],[111,3],[156,-84],[84,-49],[74,51],[113,3],[91,-63],[20,36],[100,-6],[18,58],[-115,84],[68,60],[-14,33],[69,32],[-52,83],[33,42],[264,42],[35,30],[178,46],[63,51],[127,-27],[22,-127],[74,30],[91,-42],[-6,-66],[68,7],[178,115],[-26,-38],[90,-94],[158,-311],[38,64],[98,-70],[102,31],[39,-22],[34,-70],[49,-23],[30,-53],[91,16],[38,-74]],[[18426,15628],[-43,18],[-36,44],[-105,13],[-117,3],[-26,-14],[-101,53],[-40,-26],[-11,-72],[-117,41],[-46,-17],[-16,-53]],[[15689,10250],[-50,-48],[-18,-51],[-26,-9],[-10,-86],[-23,-50],[-14,-81],[-28,-40]],[[15520,9885],[-102,121],[-5,72],[-256,248],[-12,14]],[[15145,10340],[-1,129],[20,50],[35,80],[26,90],[-31,140],[-8,61],[-34,85]],[[15152,10975],[44,73],[47,80]],[[15708,10935],[-62,-139],[1,-444],[42,-102]],[[17960,15272],[-134,-19],[-87,40],[-77,-9],[7,70],[76,-21],[26,38]],[[17771,15371],[54,-12],[91,89],[-84,64],[-50,-31],[-52,46],[59,79],[-21,12]],[[20007,11944],[-17,148],[46,101],[91,24],[67,-18]],[[20194,12199],[57,-48],[33,84],[62,-44]],[[20346,12191],[17,-82],[-9,-146],[-118,-94],[30,-74],[-73,-9],[-62,-50]],[[20131,11736],[-59,19],[-29,63],[-36,126]],[[21831,15172],[61,-144],[18,-79],[0,-141],[-27,-67],[-64,-24],[-56,-50],[-63,-11],[-8,67],[13,91],[-32,128],[53,20],[-48,104]],[[21678,15066],[4,11],[32,-4],[26,55],[50,6],[31,8],[10,30]],[[14165,15657],[14,28]],[[14179,15685],[17,8],[9,42],[13,6],[10,-17],[13,-7],[9,-21],[11,-5],[14,-23],[10,1],[-8,-30],[-8,-14],[2,-10]],[[14271,15615],[-16,-4],[-41,-19],[-3,-25],[-9,1]],[[16141,14117],[15,-54],[-7,-27],[23,-93]],[[16172,13943],[-50,-3],[-18,58],[-63,11]],[[20194,12199],[23,55],[3,104],[-57,106],[-5,120],[-54,100],[-53,8],[-15,-42],[-41,-3],[-21,21],[-75,-74],[-2,110],[18,129],[-48,5],[-4,74],[-31,38]],[[19832,12950],[15,45],[60,79]],[[19978,13200],[41,-97],[32,-111],[87,-1],[28,-107],[-46,-32],[-20,-43],[85,-73],[58,-145],[45,-107],[53,-85],[18,-87],[-13,-121]],[[15231,14497],[25,100],[35,86],[1,4]],[[15292,14687],[32,-6],[12,-47],[-39,-46],[-17,-68]],[[12198,10989],[-18,-1],[-73,58],[-65,93],[-60,67],[-48,79]],[[11934,11285],[17,39],[4,35],[32,66],[33,58]],[[13795,13249],[-50,-46],[-39,67],[-112,53]],[[13415,14158],[35,28],[6,51],[-8,51],[49,48],[22,39],[35,34],[4,94]],[[13558,14503],[83,-42],[30,11],[59,-21],[93,-54],[33,-109],[64,-24],[100,-51],[76,-60],[34,31],[34,56],[-16,94],[22,60],[51,57],[48,16],[96,-25],[24,-54],[26,-1],[23,-20],[70,-15],[18,-40]],[[14514,13143],[0,-244],[-82,0],[0,-52]],[[14432,12847],[-282,234],[-283,234],[-72,-66]],[[18535,11375],[-11,-127],[-30,-35],[-61,-29],[-34,98],[-13,175],[32,199],[49,-68],[33,-86],[35,-127]],[[14795,6919],[25,-37],[-22,-59],[-12,-40],[-39,-19],[-13,-39],[-25,-12],[-53,94],[38,77],[38,48],[32,25],[31,-38]],[[14353,17091],[-6,31],[8,34],[-31,20],[-75,21]],[[14249,17197],[-14,102]],[[14235,17299],[80,38],[119,-8],[70,12],[10,-26],[38,-7],[68,-59]],[[14407,17040],[-18,38],[-36,13]],[[14235,17299],[3,92],[34,77],[66,42],[57,-91],[57,2],[13,94]],[[14676,17476],[35,-28],[6,-60],[22,-72]],[[12131,13834],[-11,0]],[[12120,13834],[2,-65],[-44,-4],[-23,-28],[-32,0],[-26,16],[-60,-13],[-23,-96],[-22,-9],[-33,-153],[-99,-133],[-22,-168],[-29,-55],[-9,-44],[-160,-10],[-1,0]],[[11539,13072],[3,57],[28,33],[23,64],[-5,41],[25,86],[39,78],[24,19],[19,72],[1,65],[26,75],[46,45],[45,125],[2,2],[35,46],[66,14],[56,83],[36,32],[59,103],[-18,151],[27,106],[10,64],[45,82],[71,56],[52,51],[48,126],[22,75],[52,0],[43,-52],[67,8],[74,-27],[31,-1]],[[14629,16346],[17,18],[47,12],[51,-38],[29,-5],[33,-33],[-6,-42],[26,-20],[11,-51],[24,-31],[-5,-18],[13,-12],[-18,-9],[-42,4],[-7,16],[-15,-9],[5,-22],[-19,-39],[-13,-42],[-17,-13]],[[14743,16012],[-12,56],[7,52],[-2,53],[-41,72],[-22,53],[-22,36],[-22,12]],[[16251,8933],[19,-52],[18,-81],[11,-146],[18,-58],[-7,-58],[-12,-36],[-24,71],[-14,-36],[14,-90],[-6,-52],[-20,-28],[-4,-104],[-27,-142],[-35,-169],[-44,-231],[-27,-169],[-32,-143],[-58,-28],[-62,-52],[-41,31],[-56,44],[-20,64],[-5,109],[-24,97],[-7,88],[13,88],[32,21],[1,41],[33,92],[7,79],[-17,57],[-13,77],[-6,112],[25,69],[10,77],[35,5],[40,25],[26,22],[31,2],[40,69],[59,76],[21,61],[-10,52],[31,-15],[39,85],[1,74],[23,55],[24,-53]],[[6215,12231],[-81,132],[-36,40],[-58,32],[-40,-9],[-57,-46],[-35,-12],[-51,32],[-53,23],[-65,56],[-53,17],[-81,57],[-59,59],[-18,32],[-39,8],[-73,38],[-30,56],[-76,69],[-35,78],[-17,59],[23,12],[-7,35],[16,31],[1,42],[-24,55],[-7,49],[-22,62],[-63,121],[-71,96],[-35,76],[-61,49],[-13,30],[11,75],[-36,29],[-42,60],[-18,85],[-38,10],[-41,64],[-33,59],[-3,39],[-38,92],[-25,93],[2,47],[-52,49],[-23,-5],[-41,33],[-11,-50],[11,-59],[7,-91],[25,-50],[52,-85],[12,-29],[11,-8],[9,-42],[13,1],[13,-78],[22,-31],[15,-43],[44,-63],[24,-113],[21,-54],[20,-57],[3,-65],[35,-4],[28,-55],[26,-54],[-2,-22],[-30,-45],[-12,1],[-19,74],[-46,69],[-52,59],[-36,32],[2,89],[-10,66],[-34,38],[-48,54],[-9,-16],[-18,33],[-44,29],[-42,71],[5,9],[30,-7],[26,46],[3,55],[-55,87],[-42,34],[-26,76],[-26,80],[-33,98],[-29,110]],[[4451,14430],[81,9],[90,13],[-7,-24],[107,-59],[161,-86],[141,0],[57,0],[0,52],[123,0],[26,-44],[35,-39],[42,-53],[23,-64],[18,-67],[37,-37],[59,-37],[44,97],[58,2],[50,-48],[36,-85],[25,-71],[41,-69],[16,-85],[20,-59],[54,-37],[51,-27],[27,4]],[[5866,13616],[-27,-107],[-13,-89],[-5,-163],[-7,-59],[13,-68],[22,-59],[14,-95],[47,-90],[16,-71],[28,-60],[75,-32],[30,-51],[62,34],[54,13],[53,21],[44,21],[45,50],[17,71],[6,103],[12,36],[48,32],[75,28],[63,-4],[43,10],[17,-26],[-2,-58],[-39,-73],[-16,-75],[13,-21],[-11,-53],[-18,-95],[-18,32],[-15,-2]],[[14271,15615],[24,8],[33,2]],[[11882,12241],[24,22],[12,73],[22,3],[50,-35],[40,25],[27,-8],[11,27],[284,2],[15,85],[-12,15],[-34,527],[-34,527],[108,3]],[[13046,12795],[0,-281],[-38,-81],[-6,-75],[-63,-20],[-97,-10],[-26,-44],[-46,-5]],[[11929,11975],[3,38],[-6,48],[-27,35],[-14,69],[-3,76]],[[13775,14834],[-3,-4],[-6,1],[-6,6],[0,13],[6,-3],[7,-8],[2,-5]],[[13757,14856],[-4,-2],[-5,4],[-1,2],[6,2],[3,-2],[1,-3],[0,-1]],[[19722,11669],[-7,91],[22,93],[-24,72],[6,134],[-29,63],[-23,146],[-13,155],[-30,100],[-47,-61],[-81,-86],[-40,10],[-44,29],[25,151],[-15,115],[-56,140],[9,44],[-41,15],[-51,101]],[[19832,12950],[-41,-28],[-41,-54],[-49,-5],[-33,-132],[-29,-22],[34,-107],[45,-90],[28,-80],[-25,-106],[-25,-23],[17,-61],[47,-97],[8,-68],[-1,-58],[27,-111],[-39,-113],[-33,-126]],[[14116,15571],[-15,9],[-20,40],[-31,24]],[[14105,15772],[19,-21],[10,-17],[23,-13],[27,-26],[-5,-10]],[[18957,16477],[75,21],[135,106],[107,57],[61,-37],[74,-2],[48,-58],[71,-5],[102,-30],[69,86],[-29,71],[73,126],[79,-50],[65,-14],[83,-31],[14,-92],[100,-51],[68,23],[88,16],[71,-16],[70,-60],[43,-62],[66,1],[89,-20],[65,31],[94,20],[103,86],[42,-13],[37,-41],[85,10]],[[15191,9049],[53,10],[85,-34],[18,15],[50,3],[25,37],[43,-2],[77,47],[57,70]],[[15599,9195],[11,-54],[-3,-121],[9,-108],[3,-190],[12,-60],[-21,-88],[-28,-85],[-45,-75],[-65,-46],[-79,-60],[-81,-131],[-27,-22],[-48,-88],[-30,-28],[-6,-87],[34,-92],[13,-71],[1,-38],[12,7],[-2,-120],[-11,-56],[17,-21],[-11,-51],[-29,-44],[-58,-41],[-85,-66],[-32,-45],[6,-51],[19,-9],[-6,-65]],[[15069,7189],[-54,1]],[[15015,7190],[-6,55],[-11,55]],[[14998,7300],[-6,43],[13,136],[-19,88],[-34,171]],[[14952,7738],[75,139],[19,88],[10,11],[8,72],[-11,37],[3,91],[14,84],[0,155],[-37,39],[-34,9],[-15,30],[-33,26],[-59,-3],[-5,46]],[[14887,8562],[-7,87],[216,101]],[[15096,8750],[41,-59],[19,11],[28,-30],[4,-50],[-15,-57],[6,-86],[46,-75],[21,85],[30,25],[-6,158],[-29,88],[-25,39],[-25,-2],[-20,159],[20,93]],[[11882,12241],[-47,85],[-43,89],[-47,32],[-33,36],[-39,-1],[-35,-27],[-35,11],[-24,-39]],[[11579,12427],[-7,65],[20,60],[9,116],[-8,120],[-8,61],[7,61],[-19,58],[-37,53]],[[11536,13021],[15,40],[277,0],[-13,176],[17,63],[67,11],[-3,312],[233,-6],[0,185]],[[15096,8750],[-38,31],[22,113],[22,44],[-13,100],[14,99],[12,33],[-18,104],[-33,55]],[[15064,9329],[69,-23],[14,-34],[24,-57],[20,-166]],[[19976,11216],[16,-11],[42,-75],[30,-81],[4,-82],[-8,-55],[7,-43],[5,-72],[25,-34],[28,-107],[-1,-43],[-51,-8],[-67,91],[-84,97],[-8,62],[-41,82],[-10,101],[-25,67],[7,89],[-15,52]],[[19830,11246],[12,21],[58,-53],[6,-63],[46,14],[24,51]],[[20508,10701],[52,-42],[55,23],[14,103],[31,23],[84,27],[50,97],[35,77]],[[20918,11121],[54,86],[36,95],[29,0],[36,-61],[4,-53],[46,-35],[59,-37],[-5,-48],[-47,-6],[12,-59],[-52,-41]],[[13901,6966],[-53,92],[-27,89],[-16,119],[-18,89],[-23,188],[-2,146],[-9,66],[-27,51],[-36,101],[-38,146],[-15,77],[-58,119],[-4,93]],[[14387,8315],[59,28],[46,-7],[28,-27],[0,-11]],[[14153,7431],[0,-451],[-63,-63],[-39,-9],[-44,23],[-32,10],[-12,52],[-28,33],[-34,-60]],[[24481,7881],[58,-75],[37,-57],[-27,-29],[-39,33],[-50,56],[-46,64],[-47,86],[-10,41],[31,-2],[39,-41],[32,-41],[22,-35]],[[13795,13249],[17,-191],[27,-31],[1,-39],[30,-42],[-16,-52],[-27,-248],[-4,-159],[-89,-115],[-31,-161],[30,-46],[-1,-78],[45,-3],[-7,-58]],[[13748,11980],[-13,-2],[-48,134],[-16,5],[-56,-68],[-55,35],[-38,7],[-20,-17],[-42,4],[-42,-53],[-36,-3],[-86,64],[-33,-30],[-36,2],[-26,46],[-71,46],[-77,-15],[-18,-26],[-10,-70],[-20,-50],[-5,-109]],[[13346,11039],[-74,-44],[-27,6],[-26,-27],[-57,3],[-38,76],[-23,88],[-51,81],[-53,-1],[-63,0]],[[6676,11811],[-25,38],[-33,49],[-15,41],[-30,38],[-36,55],[8,20],[12,-19],[5,9]],[[6857,12287],[-6,-12],[-4,-27],[7,-44],[-16,-42],[-8,-49],[-2,-53],[4,-33],[2,-55],[-11,-11],[-7,-53],[5,-32],[-14,-31],[3,-33],[11,-20]],[[12979,16727],[36,33],[62,181],[97,50],[59,-3]],[[14206,18897],[-44,-5],[-10,-82],[-134,20],[-19,-68],[-68,1],[-47,-87],[-71,-136],[-109,-171],[26,-42],[-25,-48],[-70,2],[-46,-115],[4,-162],[46,-62],[-24,-143],[-59,-84],[-31,-71]],[[13525,17644],[-48,76],[-140,-142],[-93,-29],[-99,62],[-25,132],[-22,282],[65,78],[186,103],[140,126],[130,170],[170,236],[118,91],[195,154],[155,53],[117,-6],[108,102],[129,-6],[128,25],[221,-90],[-92,-33],[78,-76]],[[14946,18952],[-121,-49],[-57,-11]],[[14494,19965],[-158,-51],[-124,29],[48,32],[-42,39],[146,24],[28,-45],[102,-28]],[[14036,20190],[233,-91],[-178,-48],[-39,-90],[-62,-23],[-34,-101],[-86,-5],[-151,75],[63,43],[-105,36],[-138,103],[-56,95],[194,44],[39,-43],[100,2],[27,41],[104,5],[89,-43]],[[14546,20277],[139,-44],[-105,-65],[-206,-15],[-208,21],[-13,33],[-102,2],[-77,57],[219,34],[102,-29],[71,36],[180,-30]],[[24994,5458],[16,-50],[50,49],[21,-51],[0,-52],[-26,-56],[-47,-91],[-36,-49],[26,-58],[-55,-2],[-60,-46],[-19,-79],[-41,-124],[-55,-55],[-35,-34],[-65,2],[-46,40],[-77,9],[-12,45],[38,90],[89,121],[46,23],[50,46],[61,64],[42,64],[32,91],[27,31],[10,67],[50,57],[16,-52]],[[25107,6040],[51,-129],[2,84],[32,-34],[10,-92],[56,-39],[48,-10],[41,46],[36,-14],[-17,-109],[-22,-71],[-54,3],[-19,-37],[7,-53],[-11,-22],[-27,-67],[-34,-83],[-55,-49],[-12,32],[-29,18],[40,100],[-23,68],[-76,49],[2,44],[51,42],[12,95],[-3,79],[-29,81],[2,22],[-34,50],[-56,108],[-29,87],[26,9],[39,-67],[55,-32],[20,-109]],[[16504,12490],[-23,85],[-56,201]],[[16425,12776],[213,123],[48,244],[-33,87]],[[16737,13500],[31,-84],[40,-44],[52,-16],[42,-22],[32,-70],[19,-40],[25,-16],[0,-27],[-26,-73],[-11,-34],[-30,-39],[-26,-84],[-32,7],[-15,-29],[-12,-63],[9,-81],[-7,-15],[-32,0],[-45,-45],[-6,-60],[-16,-25],[-44,1],[-28,-31],[1,-50],[-35,-34],[-39,11],[-47,-41],[-33,-6]],[[16714,13638],[21,42],[8,-11],[-6,-50],[-9,-22]],[[17571,13349],[-52,31],[-21,89],[-55,92],[-131,-23],[-114,-2],[-100,-17]],[[7230,11338],[-23,35],[-15,66],[17,33],[-18,9],[-13,40],[-35,34],[-31,-8],[-15,-42],[-29,-31],[-15,-4],[-7,-26],[34,-66],[-19,-16],[-11,-18],[-33,-6],[-12,72],[-9,-20],[-24,7],[-14,49],[-29,8],[-18,14],[-31,0],[-2,-26],[-8,18]],[[6900,11624],[25,-43],[-1,-26],[28,-6],[7,10],[19,-30],[35,9],[30,31],[43,24],[24,37],[40,-7],[-3,-12],[40,-4],[31,-22],[23,-36],[26,-34]],[[7761,8215],[-70,70],[-6,50],[-141,123],[-127,133],[-55,76],[-29,101],[12,35],[-61,160],[-68,225],[-68,243],[-29,57],[-22,89],[-55,80],[-51,49],[23,54],[-34,118],[22,85],[57,77]],[[21692,11484],[7,-82],[4,-68],[-24,-111],[-26,124],[-33,-62],[23,-90],[-21,-58],[-83,72],[-20,88],[22,58],[-45,57],[-23,-50],[-33,5],[-53,-68],[-11,35],[28,103],[44,35],[39,46],[25,-56],[54,34],[12,55],[50,3],[-5,94],[58,-58],[6,-61],[5,-45]],[[21522,11711],[-25,-40],[-23,-77],[-22,-36],[-44,84],[15,33],[18,34],[8,76],[39,8],[-12,-83],[53,118],[-7,-117]],[[21134,11594],[-94,-116],[35,85],[51,76],[43,84],[37,122],[12,-100],[-46,-68],[-38,-83]],[[21373,11908],[43,-37],[45,0],[-2,-51],[-32,-52],[-45,-37],[-3,57],[5,62],[-11,58]],[[21630,11941],[20,-136],[-55,33],[2,-41],[17,-76],[-34,-28],[-3,87],[-21,6],[-11,74],[41,-10],[0,46],[-44,93],[68,-2],[20,-46]],[[21348,12053],[-19,-107],[-30,61],[-37,94],[61,-5],[25,-43]],[[21333,12716],[44,-35],[22,32],[6,-31],[-11,-50],[24,-89],[-19,-101],[-42,-40],[-11,-99],[16,-97],[38,-14],[31,15],[89,-68],[-7,-66],[23,-29],[-7,-57],[-56,61],[-26,63],[-18,-44],[-45,73],[-65,-18],[-35,27],[4,50],[22,31],[-21,28],[-9,-44],[-36,70],[-9,54],[-3,117],[28,-41],[7,192],[23,110],[43,0]],[[23780,9623],[-20,-12],[-30,47],[-31,77],[-15,94],[10,11],[7,-36],[22,-27],[33,-79],[34,-41],[-10,-34]],[[23504,9787],[-37,-10],[-11,-35],[-39,-29],[-36,-29],[-38,0],[-58,36],[-41,34],[6,38],[64,-18],[39,10],[10,58],[11,3],[7,-64],[40,9],[20,42],[40,43],[-8,72],[42,2],[15,-20],[-2,-67],[-24,-75]],[[22727,10139],[122,-84],[132,-71],[48,-62],[40,-61],[11,-72],[118,-76],[17,-65],[-65,-13],[16,-81],[63,-81],[45,-129],[41,4],[-3,-54],[54,-21],[-21,-23],[76,-52],[-8,-35],[-47,-8],[-18,31],[-61,14],[-70,19],[-55,78],[-41,67],[-37,106],[-92,54],[-60,-34],[-44,-42],[10,-89],[-56,-42],[-40,20],[-72,5]],[[23587,9906],[-23,-32],[-13,72],[-17,47],[-32,40],[-40,53],[-51,35],[19,30],[39,-34],[24,-27],[30,-29],[28,-52],[27,-39],[9,-64]],[[13744,17021],[48,36],[110,57],[90,42],[70,-21],[6,-31],[68,-1]],[[14136,17103],[88,-14],[129,2]],[[14410,16755],[35,-106],[-7,-34],[-36,-14],[-64,-102],[18,-55],[-15,7]],[[14341,16451],[-68,47],[-50,-17],[-33,12],[-42,-26],[-36,43],[-29,-16],[-4,7]],[[8051,12717],[37,-10],[12,-25],[-18,-30],[-53,0],[-42,-4],[-4,52],[10,18],[58,-1]],[[21993,15634],[10,-22]],[[22003,15612],[-27,8],[-30,-42],[-22,-41],[3,-87],[-37,-28],[-12,-22],[-27,-36],[-47,-20],[-31,-32],[-2,-53],[-9,-14],[29,-19],[40,-54]],[[21678,15066],[-35,23],[-8,-22],[-21,-10],[-3,22],[-18,12],[-19,19],[19,55],[17,14],[-6,22],[18,66],[-5,20],[-41,13],[-34,32]],[[12217,14987],[-29,-32],[-37,18],[-37,-14],[11,95],[-7,75],[-31,11],[-17,48],[5,79],[29,44],[5,50],[14,74],[-1,51],[-14,44],[-3,41]],[[16341,13480],[-5,88],[19,64],[20,13],[21,-38],[2,-71],[-16,-72]],[[16382,13464],[-20,-8],[-21,24]],[[14352,16304],[30,27],[44,-14],[46,0],[33,-30],[24,19],[52,11],[18,29],[30,0]],[[14743,16012],[31,-23],[33,20],[33,-22]],[[14840,15987],[1,-31],[-34,-26],[-22,11],[-20,-147]],[[14348,15859],[-13,21],[16,20],[-17,16],[-22,-28],[-42,36],[-5,50],[-43,29],[-8,39],[-38,48]],[[22914,16654],[72,-216],[-106,40],[-43,-176],[69,-126],[-2,-85],[-54,74],[-46,-95],[-13,103],[8,119],[-9,131],[17,92],[3,164],[-42,120],[7,167],[65,56],[-28,56],[32,18],[18,-81],[25,-117],[-2,-121],[29,-123]],[[14136,17103],[16,54],[97,40]],[[353,18589],[48,-31],[-17,89],[193,-18],[139,-115],[-71,-53],[-116,-13],[-2,-119],[-28,-25],[-67,3],[-54,43],[-94,35],[-16,53],[-71,20],[-81,-16],[-38,43],[15,45],[-85,-29],[32,-57],[-40,-52],[0,487],[174,-94],[185,-121],[-6,-75]],[[25488,19107],[-78,-7],[-12,40],[90,51],[0,-84]],[[93,19114],[-93,-7],[0,84],[9,5],[60,0],[103,-35],[-6,-17],[-73,-30]],[[22911,19397],[-108,-1],[-144,15],[-12,6],[67,49],[88,11],[100,-47],[9,-33]],[[23416,19626],[-82,-48],[-113,11],[-132,48],[17,39],[133,-18],[177,-32]],[[23016,19685],[-56,-91],[-260,3],[-118,-28],[-140,79],[38,84],[93,23],[187,-5],[256,-65]],[[16817,19093],[-42,-11],[-231,16],[-18,55],[-129,33],[-10,66],[72,26],[-2,66],[141,105],[-66,15],[170,107],[-19,55],[158,65],[234,78],[235,23],[122,45],[138,16],[49,-48],[-48,-38],[-251,-60],[-216,-59],[-220,-116],[-106,-119],[-110,-118],[14,-101],[135,-101]],[[16221,16123],[-33,-72],[-68,-20],[-71,-127],[65,-115],[-7,-83],[77,-144]],[[15573,15761],[-90,103],[-81,46],[-62,71],[52,21],[59,102],[-40,48],[105,50],[-2,26],[-64,-19]],[[15450,16209],[2,54],[37,35],[69,9],[11,40],[-16,67],[29,64],[-1,36],[-105,39],[-41,-1],[-44,58],[-54,-19],[-90,42],[1,24],[-24,53],[-57,6],[-5,38],[17,25],[-45,68],[-74,-11],[-21,6],[-18,-28],[-27,5]],[[14726,17720],[79,68],[-73,58]],[[14946,18952],[73,42],[117,-74],[193,-29],[268,-138],[54,-58],[5,-81],[-79,-64],[-116,-34],[-315,94],[-52,-16],[115,-90],[5,-56],[4,-124],[91,-38],[55,-32],[9,60],[-42,52],[45,46],[171,-76],[60,30],[-48,89],[166,120],[64,-7],[66,-43],[42,85],[-59,72],[34,73],[-52,75],[199,-39],[40,-68],[-90,-15],[1,-68],[56,-41],[109,26],[18,78],[147,58],[247,105],[54,-6],[-70,-75],[88,-12],[51,41],[132,4],[105,51],[81,-74],[80,81],[-74,71],[37,40],[210,-37],[97,-38],[257,-140],[47,65],[-72,64],[-2,26],[-85,12],[23,58],[-38,95],[-2,40],[131,110],[46,110],[53,24],[187,-32],[15,-67],[-67,-99],[44,-39],[22,-86],[-16,-167],[79,-75],[-31,-82],[-139,-173],[81,-18],[29,44],[78,32],[18,60],[62,58],[-42,69],[34,81],[-78,10],[-17,68],[57,122],[-93,100],[127,82],[-16,87],[35,3],[38,-68],[-28,-117],[76,-22],[-33,87],[119,48],[146,7],[131,-70],[-63,102],[-7,130],[123,25],[171,-5],[153,15],[-58,64],[82,80],[82,3],[138,62],[186,16],[24,33],[186,12],[58,-28],[158,65],[131,-2],[19,52],[68,52],[167,50],[121,-39],[-96,-30],[160,-19],[19,-60],[65,30],[208,-2],[158,-59],[57,-46],[-17,-64],[-78,-36],[-186,-68],[-53,-36],[87,-17],[105,-31],[63,23],[36,-78],[32,32],[113,19],[228,-20],[17,-58],[296,-18],[4,94],[150,-21],[113,0],[114,-65],[33,-78],[-42,-51],[89,-95],[111,-51],[69,129],[114,-55],[119,33],[138,-38],[52,34],[116,-17],[-51,113],[94,53],[638,-79],[61,-72],[185,-94],[286,24],[141,-21],[59,-51],[-9,-89],[88,-34],[95,25],[125,3],[134,-24],[134,14],[123,-109],[88,39],[-58,78],[32,54],[226,-34],[148,7],[203,-58],[99,-53],[0,-487],[-1,0],[-91,-54],[-92,9],[64,-65],[43,-101],[32,-33],[9,-50],[-19,-32],[-132,26],[-197,-91],[-63,-15],[-109,-86],[-103,-75],[-26,-55],[-100,84],[-185,-95],[-33,45],[-68,-52],[-95,16],[-23,-81],[-84,-118],[3,-49],[80,-27],[-10,-178],[-65,-5],[-30,-101],[29,-53],[-124,-63],[-24,-139],[-106,-30],[-21,-124],[-103,-114],[-26,84],[-30,179],[-40,271],[34,169],[60,74],[4,56],[110,28],[127,154],[122,125],[127,97],[57,173],[-87,-11],[-42,-100],[-179,-134],[-58,150],[-183,-42],[-177,-204],[59,-76],[-159,-32],[-109,-12],[5,89],[-111,18],[-87,-60],[-216,22],[-234,-38],[-229,-237],[-271,-288],[111,-16],[35,-77],[69,-27],[46,61],[77,-8],[102,-134],[2,-104],[-54,-122],[-6,-145],[-32,-196],[-107,-177],[-24,-84],[-96,-143],[-96,-140],[-46,-72],[-93,-73],[-45,-1],[-44,60],[-96,-90],[-11,-41]],[[20184,20020],[-400,-47],[129,160],[59,14],[53,-8],[180,-69],[-21,-50]],[[16364,20294],[-95,-16],[-63,-9],[-10,-20],[-83,-21],[-77,29],[41,38],[-158,4],[139,22],[107,2],[15,-33],[41,29],[65,20],[106,-26],[-28,-19]],[[19819,20090],[-153,-15],[-198,35],[-118,47],[-54,87],[-96,25],[183,83],[154,28],[138,-62],[162,-118],[-18,-110]],[[14897,10317],[29,-69],[-4,-71],[-21,-16]],[[14838,10292],[17,-13],[42,38]],[[11536,13021],[3,51]],[[15772,12453],[-9,52],[-20,36],[-6,49],[-36,44],[-38,102],[-20,100],[-49,84],[-32,20],[-47,116],[-8,85],[3,73],[-41,135],[-33,47],[-38,26],[-24,70],[4,28],[-20,63],[-20,27],[-28,91],[-43,99],[-35,83],[-36,0],[11,67],[4,42],[8,50]],[[16172,13943],[28,-105],[35,-28],[11,-43],[48,-52],[5,-50],[-7,-40],[9,-41],[20,-34],[9,-40],[11,-30]],[[16382,13464],[14,-47]],[[16425,12776],[-203,-46],[-66,-55],[-51,-129],[-33,-20],[-18,40],[-27,-6],[-69,13],[-13,12],[-82,-3],[-19,-11],[-29,33],[-19,-61],[7,-52],[-31,-38]],[[15149,11612],[-10,2],[1,61],[-8,42],[-37,49],[-8,87],[8,90],[-33,9],[-4,-28],[-43,-6],[17,-35],[6,-73],[-39,-68],[-35,-88],[-37,-13],[-59,71],[-27,-25],[-8,-35],[-36,-23],[-3,-25],[-69,0],[-10,25],[-51,4],[-26,-21],[-19,11],[-37,71],[-12,33],[-51,-17],[-20,-56],[-18,-109],[-24,-23],[-22,-13]],[[14435,11509],[-6,6]],[[14363,11817],[0,30],[-26,35],[0,71],[-15,47],[-25,-7],[7,46],[18,50],[-8,51],[24,37],[-15,29],[19,75],[32,90],[61,-8],[-3,484]],[[15354,13143],[23,-120],[-16,-22],[10,-126],[27,-146],[27,-30],[38,-45]],[[15149,11626],[0,-14]],[[15149,11612],[1,-95]],[[15152,10975],[-44,-56],[-50,1],[-57,-30],[-45,28],[-29,-34]],[[14483,11461],[-48,48]],[[11561,12117],[-29,94],[-36,44],[31,23],[35,86],[17,63]],[[11563,11968],[-11,95]],[[24222,9175],[19,-42],[-48,1],[-27,76],[42,-30],[14,-5]],[[24133,9250],[-28,-2],[-44,12],[-14,19],[4,48],[47,-19],[23,-26],[12,-32]],[[24191,9284],[-10,-23],[-53,106],[-15,72],[24,0],[26,-97],[28,-58]],[[24063,9437],[3,-24],[-55,51],[-39,45],[-27,41],[11,12],[32,-29],[59,-57],[16,-39]],[[23898,9559],[-15,-7],[-31,28],[-29,50],[4,20],[42,-52],[29,-39]],[[11934,11285],[-19,9],[-51,49],[-37,65],[-13,45],[-8,91]],[[6528,12091],[-8,-29],[-41,2],[-25,12],[-30,24],[-39,8],[-20,26]],[[15798,11856],[23,-22],[14,-51],[32,-52],[36,0],[66,32],[78,14],[62,38],[35,8],[26,22],[40,5]],[[16210,11850],[0,-2],[-1,-50],[0,-124],[0,-64],[-32,-74],[-49,-103]],[[16210,11850],[23,2],[31,18],[38,12],[34,42],[26,0],[2,-33],[-7,-71],[1,-64],[-15,-45],[-20,-131],[-34,-137],[-44,-156],[-60,-179],[-61,-136],[-83,-167],[-71,-99],[-106,-122],[-66,-92],[-77,-148],[-16,-65],[-16,-29]],[[8698,11185],[84,-24],[8,22],[57,9],[77,-33]],[[8920,10898],[-12,-53],[-6,-55],[-19,-52]],[[14341,16451],[-20,-32],[-14,-49]],[[13715,16014],[16,11]],[[14436,18517],[-122,-34],[-69,-85],[11,-75],[-111,-98],[-137,-105],[-52,-172],[50,-86],[68,-68],[-65,-138],[-74,-29],[-27,-204],[-40,-115],[-86,12],[-39,-97],[-82,-5],[-23,115],[-59,139],[-54,172]],[[13952,17465],[-50,-102],[5,-46],[55,141],[-10,7]],[[14115,17535],[1,4],[-19,0],[-5,-6],[-27,-2],[-40,-46],[4,-19],[-5,-15],[8,-20],[-6,-27],[15,4],[10,26],[18,9],[-1,12],[18,8],[3,9],[-12,0],[-2,25],[40,38]],[[14220,18251],[-3,-6],[1,-8],[-8,-15],[9,-1],[10,16],[7,14],[-16,0]],[[15015,7190],[-15,-54],[-41,-13],[-43,66],[0,43],[19,46],[7,35],[20,9],[36,-22]],[[15292,14687],[-6,94],[17,50]],[[15303,14831],[19,26],[19,28],[4,68],[23,-24],[78,34],[38,-23],[58,1],[82,45],[38,-2],[81,19]],[[12876,11207],[-57,-27]],[[20007,11944],[-64,56],[-60,-2],[10,96],[-62,0],[-6,-135],[-38,-178],[-23,-108],[5,-89],[46,-3],[29,-111],[12,-107],[40,-69],[43,-15],[37,-63]],[[19830,11246],[-28,46],[-12,61],[-38,68],[-33,59],[-12,-72],[-14,68],[8,76],[21,117]],[[17546,14993],[40,123],[-15,92],[-52,29],[18,53],[60,-6],[33,68],[23,78],[94,29],[-14,-57],[9,-34],[29,3]],[[16562,14999],[-13,86],[10,129],[-55,41],[18,83],[-47,7],[15,104],[67,-31],[63,40],[-52,73],[-20,70],[-57,-31],[-8,-90],[-22,79]],[[16707,15501],[79,2],[-12,61],[61,42],[60,71],[95,-64],[8,-97],[27,-25],[77,5],[24,-22],[34,-126],[82,-84],[45,-58],[74,-60],[94,-52],[-2,-75]],[[21592,9370],[8,28],[61,28],[50,4],[22,15],[26,-15],[-25,-33],[-74,-53],[-60,-35]],[[8377,11771],[41,15],[15,-4],[-3,-92],[-60,-13],[-12,11],[20,33],[-1,50]],[[13340,14969],[77,49],[50,-15],[-2,-62],[60,45],[5,-23],[-36,-60],[0,-57],[25,-30],[-10,-106],[-46,-61],[13,-67],[37,-2],[18,-58],[27,-19]],[[15303,14831],[-26,56],[27,46],[-43,-11],[-59,28],[-49,-70],[-107,-15],[-58,67],[-76,4],[-17,-51],[-49,-14],[-68,65],[-77,-2],[-42,121],[-51,67],[34,96],[-45,58],[79,116],[108,5],[30,94],[135,-16],[85,79],[83,34],[117,2],[123,-85],[102,-47],[83,18],[61,-10],[83,63]],[[14727,15586],[8,-46],[61,-40],[-13,-29],[-83,-7],[-30,-39],[-60,-65],[-22,56],[1,26]],[[21366,13435],[-43,-195],[-31,-101],[-37,104],[-8,90],[42,120],[57,93],[32,-37],[-12,-74]],[[15520,9885],[-33,-151],[4,-69],[45,-44],[3,-32],[-20,-74],[4,-38],[-5,-58],[25,-76],[30,-120],[26,-28]],[[15064,9329],[-41,36],[-45,21],[-28,20],[-30,31]],[[14897,10317],[25,15],[78,-2],[145,10]],[[15450,16209],[-56,-10],[-48,-40],[-66,-6],[-60,-45],[4,-76],[34,-29],[72,7],[-14,-45],[-77,-21],[-96,-70],[-39,25],[15,57],[-77,36],[12,24],[68,40],[-20,28],[-111,31],[-4,45],[-66,-15],[-26,-67],[-55,-91]],[[8965,6331],[-31,-76],[-80,-68],[-52,24],[-39,-13],[-64,53],[-48,-4],[-43,67]],[[1732,12787],[-10,-21],[-18,18],[2,34],[-12,44],[4,13],[12,21],[-5,24],[4,12],[6,-3],[27,-20],[12,-11],[11,-17],[18,-43],[-2,-6],[-27,-26],[-22,-19]],[[1694,12977],[-24,-8],[-12,25],[-8,10],[-1,8],[7,10],[25,-11],[19,-19],[-6,-15]],[[1646,13042],[-2,-13],[-38,4],[5,15],[35,-6]],[[1582,13060],[-3,-7],[-6,2],[-24,4],[-9,27],[-3,5],[19,17],[6,-8],[20,-40]],[[1462,13140],[-8,-12],[-24,22],[4,9],[10,13],[17,-2],[1,-30]],[[7991,15968],[12,-39],[-76,-59],[-73,-42],[-75,-36],[-36,-73],[-12,-28],[-1,-65],[22,-64],[30,-3],[-8,44],[22,-27],[-6,-35],[-47,-19],[-34,2],[-52,-21],[-31,-6],[-41,-6],[-60,-35],[105,22],[21,-23],[-100,-37],[-45,0],[2,16],[-21,-35],[20,-6],[-15,-87],[-51,-94],[-6,31],[-15,7],[-24,30],[15,-65],[18,-22],[1,-47],[-23,-47],[-40,-98],[-6,5],[22,83],[-37,47],[-8,102],[-14,-53],[16,-78],[-47,19],[49,-39],[3,-116],[20,-8],[7,-43],[10,-122],[-45,-91],[-73,-36],[-46,-71],[-35,-8],[-36,-46],[-10,-40],[-78,-79],[-40,-58],[-34,-74],[-11,-86],[13,-85],[24,-104],[31,-87],[1,-52],[33,-142],[-2,-83],[-3,-47],[-18,-74],[-21,-16],[-35,15],[-11,54],[-27,28],[-38,104],[-33,94],[-10,48],[14,81],[-20,67],[-55,102],[-28,19],[-70,-55],[-13,6],[-34,57],[-45,30],[-80,-15],[-63,13],[-54,-8],[-29,-19],[12,-33],[-1,-49],[15,-24],[-13,-16],[-27,18],[-26,-24],[-52,4],[-53,65],[-61,-15],[-51,28],[-44,-9],[-60,-28],[-65,-91],[-70,-53],[-39,-58],[-16,-55],[-1,-85],[4,-58],[13,-41]],[[4451,14430],[-12,62],[-46,70],[-33,14],[-7,36],[-40,6],[-26,33],[-65,12],[-18,20],[-8,67],[-69,123],[-59,169],[2,28],[-31,41],[-55,103],[-10,99],[-38,66],[16,102],[-2,105],[-23,93],[28,116],[8,110],[9,111],[-13,164],[-22,105],[-21,56],[9,24],[102,-41],[38,-116],[17,32],[-11,101],[-24,100]],[[1911,17432],[-71,-47],[-36,32],[-11,57],[64,44],[38,18],[47,-8],[30,-38],[-61,-58]],[[1021,17773],[-43,-19],[-47,23],[-43,33],[70,21],[56,-11],[7,-47]],[[586,18246],[43,-24],[45,13],[57,-32],[69,-16],[-5,-14],[-53,-25],[-54,26],[-27,22],[-63,-7],[-17,11],[5,46]],[[3502,17150],[-39,46],[-62,38],[-21,106],[-91,100],[-38,115],[-67,8],[-113,3],[-83,35],[-147,127],[-68,23],[-123,44],[-98,-11],[-140,56],[-84,52],[-79,-26],[15,-84],[-38,-8],[-82,-26],[-63,-41],[-79,-26],[-10,72],[32,120],[76,37],[-20,31],[-90,-68],[-49,-81],[-102,-87],[52,-60],[-67,-87],[-75,-51],[-71,-37],[-18,-54],[-111,-64],[-22,-57],[-83,-52],[-49,9],[-66,-34],[-72,-41],[-58,-41],[-122,-36],[-11,21],[78,58],[69,37],[75,67],[88,13],[35,50],[98,74],[16,25],[52,43],[13,92],[36,72],[-82,-37],[-23,21],[-38,-45],[-47,62],[-19,-43],[-26,60],[-71,-48],[-44,0],[-6,72],[13,46],[-45,43],[-92,-23],[-60,57],[-48,29],[-1,69],[-54,52],[27,71],[58,68],[25,62],[58,9],[48,-19],[56,58],[52,-10],[54,38],[-13,56],[-40,22],[53,47],[-44,-1],[-74,-27],[-22,-27],[-56,27],[-100,-14],[-104,30],[-30,49],[-90,70],[100,51],[158,61],[59,0],[-10,-62],[149,5],[-57,76],[-87,46],[-51,61],[-68,52],[-97,39],[40,64],[126,4],[89,56],[17,59],[71,58],[70,14],[134,54],[65,-8],[109,66],[107,-26],[51,-56],[32,24],[119,-8],[-4,-28],[109,-20],[72,12],[149,-39],[136,-11],[55,-16],[94,20],[108,-37],[76,-17]],[[7694,11894],[-2,-29],[-42,-14],[24,-55],[-1,-65],[-32,-70],[27,-97],[31,8],[16,88],[-22,43],[-4,93],[88,49],[-10,58],[25,38],[25,-85],[50,-2],[46,-68],[3,-41],[63,-2],[76,14],[41,-56],[54,-15],[40,38],[1,32],[87,7],[85,2],[-61,-37],[25,-57],[56,-9],[54,-60],[11,-98],[37,3],[28,-29]],[[20394,13088],[-95,-104],[-59,-116],[-15,-85],[54,-128],[66,-160],[64,-75],[43,-98],[33,-226],[-10,-215],[-59,-80],[-81,-80],[-58,-101],[-87,-113],[-26,78],[20,82],[-53,69]],[[24628,8445],[-24,-16],[-23,53],[2,33],[45,-70]],[[24575,8631],[12,-98],[-19,16],[-15,-7],[-10,34],[-2,94],[34,-39]],[[16504,12490],[-51,-33],[-14,-54],[-2,-42],[-70,-52],[-114,-57],[-62,-86],[-31,-6],[-22,7],[-41,-51],[-45,-23],[-60,-7],[-18,-6],[-15,-33],[-19,-8],[-11,-32],[-35,2],[-23,-16],[-49,6],[-18,72],[2,67],[-12,35],[-14,91],[-20,50],[14,6],[-7,56],[8,24],[-3,53]],[[14827,7757],[29,-1],[35,-21],[24,15],[37,-12]],[[15069,7189],[-18,-88],[-9,-101],[-18,-55],[-48,-63],[-14,-17],[-30,-62],[-20,-63],[-40,-88],[-80,-125],[-50,-73],[-53,-56],[-74,-48],[-36,-6],[-10,-34],[-43,18],[-35,-23],[-77,23],[-43,-15],[-29,7],[-73,-48],[-60,-20],[-44,-46],[-32,-3],[-30,44],[-24,2],[-30,54],[-4,-17],[-9,33],[0,73],[-23,81],[23,22],[-2,94],[-46,115],[-36,103]],[[13952,6807],[-51,159]],[[14887,8562],[-54,-17],[-40,-49],[-9,-42],[-25,-9],[-61,-101],[-39,-79],[-24,-3],[-23,14],[-79,13]]],"transform":{"scale":[0.014124293785310738,0.00818760487616099],"translate":[-180,-85.609038]},"objects":{"countries1":{"type":"GeometryCollection","geometries":[{"arcs":[[0,1,2,3,4,5]],"type":"Polygon","properties":{"name":"Afghanistan","Alpha-2":"AF"},"id":"AFG"},{"arcs":[[[6,7,8,9]],[[10,11,12]]],"type":"MultiPolygon","properties":{"name":"Angola","Alpha-2":"AO"},"id":"AGO"},{"arcs":[[13,14,15,16,17]],"type":"Polygon","properties":{"name":"Albania","Alpha-2":"AL"},"id":"ALB"},{"arcs":[[18,19,20,21,22]],"type":"Polygon","properties":{"name":"United Arab Emirates","Alpha-2":"AE"},"id":"ARE"},{"arcs":[[[23,24]],[[25,26,27,28,29,30]]],"type":"MultiPolygon","properties":{"name":"Argentina","Alpha-2":"AR"},"id":"ARG"},{"arcs":[[31,32,33,34,35]],"type":"Polygon","properties":{"name":"Armenia","Alpha-2":"AM"},"id":"ARM"},{"arcs":[[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42]],[[43]]],"type":"MultiPolygon","properties":{"name":"Antarctica","Alpha-2":"AQ"},"id":"ATA"},{"arcs":[[44]],"type":"Polygon","properties":{"name":"French Southern and Antarctic Lands","Alpha-2":"TF"},"id":"ATF"},{"arcs":[[[45]],[[46]]],"type":"MultiPolygon","properties":{"name":"Australia","Alpha-2":"AU"},"id":"AUS"},{"arcs":[[47,48,49,50,51,52,53]],"type":"Polygon","properties":{"name":"Austria","Alpha-2":"AT"},"id":"AUT"},{"arcs":[[[54,-35]],[[55,56,57,-33,58,59]]],"type":"MultiPolygon","properties":{"name":"Azerbaijan","Alpha-2":"AZ"},"id":"AZE"},{"arcs":[[60,61,62]],"type":"Polygon","properties":{"name":"Burundi","Alpha-2":"BI"},"id":"BDI"},{"arcs":[[63,64,65,66,67,68]],"type":"Polygon","properties":{"name":"Belgium","Alpha-2":"BE"},"id":"BEL"},{"arcs":[[69,70,71,72,73]],"type":"Polygon","properties":{"name":"Benin","Alpha-2":"BJ"},"id":"BEN"},{"arcs":[[74,75,76,-72,77,78]],"type":"Polygon","properties":{"name":"Burkina Faso","Alpha-2":"BF"},"id":"BFA"},{"arcs":[[79,80,81]],"type":"Polygon","properties":{"name":"Bangladesh","Alpha-2":"BD"},"id":"BGD"},{"arcs":[[82,83,84,85,86,87]],"type":"Polygon","properties":{"name":"Bulgaria","Alpha-2":"BG"},"id":"BGR"},{"arcs":[[[88]],[[89]],[[90]]],"type":"MultiPolygon","properties":{"name":"The Bahamas","Alpha-2":"BS"},"id":"BHS"},{"arcs":[[91,92,93]],"type":"Polygon","properties":{"name":"Bosnia and Herzegovina","Alpha-2":"BA"},"id":"BIH"},{"arcs":[[94,95,96,97,98]],"type":"Polygon","properties":{"name":"Belarus","Alpha-2":"BY"},"id":"BLR"},{"arcs":[[99,100,101]],"type":"Polygon","properties":{"name":"Belize","Alpha-2":"BZ"},"id":"BLZ"},{"arcs":[[102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]],"type":"Polygon","properties":{"name":"Bermuda","Alpha-2":"BM"},"id":"BMU"},{"arcs":[[120,121,122,123,-31]],"type":"Polygon","properties":{"name":"Bolivia","Alpha-2":"BO"},"id":"BOL"},{"arcs":[[-27,124,-123,125,126,127,128,129,130,131,132]],"type":"Polygon","properties":{"name":"Brazil","Alpha-2":"BR"},"id":"BRA"},{"arcs":[[133,134]],"type":"Polygon","properties":{"name":"Brunei","Alpha-2":"BN"},"id":"BRN"},{"arcs":[[135,136]],"type":"Polygon","properties":{"name":"Bhutan","Alpha-2":"BT"},"id":"BTN"},{"arcs":[[137,138,139,140]],"type":"Polygon","properties":{"name":"Botswana","Alpha-2":"BW"},"id":"BWA"},{"arcs":[[141,142,143,144,145,146,147]],"type":"Polygon","properties":{"name":"Central African Republic","Alpha-2":"CF"},"id":"CAF"},{"arcs":[[[148]],[[149]],[[150]],[[151]],[[152]],[[153]],[[154]],[[155]],[[156]],[[157]],[[158,159,160,161]],[[162]],[[163]],[[164]],[[165]],[[166]],[[167]],[[168]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]]],"type":"MultiPolygon","properties":{"name":"Canada","Alpha-2":"CA"},"id":"CAN"},{"arcs":[[-51,181,182,183]],"type":"Polygon","properties":{"name":"Switzerland","Alpha-2":"CH"},"id":"CHE"},{"arcs":[[[-24,184]],[[-30,185,186,187,-121]]],"type":"MultiPolygon","properties":{"name":"Chile","Alpha-2":"CL"},"id":"CHL"},{"arcs":[[[188]],[[189,190,191,192,193,194,195,-137,196,197,198,199,-4,200,201,202,203,204,205]]],"type":"MultiPolygon","properties":{"name":"China","Alpha-2":"CN"},"id":"CHN"},{"arcs":[[206,207,208,209,-75,210]],"type":"Polygon","properties":{"name":"Ivory Coast","Alpha-2":"CI"},"id":"CIV"},{"arcs":[[211,212,213,214,215,216,-148,217]],"type":"Polygon","properties":{"name":"Cameroon","Alpha-2":"CM"},"id":"CMR"},{"arcs":[[218,219,-61,220,221,-10,222,-13,223,-146,224,225]],"type":"Polygon","properties":{"name":"Democratic Republic of the Congo","Alpha-2":"CD"},"id":"COD"},{"arcs":[[-12,226,227,-218,-147,-224]],"type":"Polygon","properties":{"name":"Republic of the Congo","Alpha-2":"CG"},"id":"COG"},{"arcs":[[228,229,230,231,232,-127,233]],"type":"Polygon","properties":{"name":"Colombia","Alpha-2":"CO"},"id":"COL"},{"arcs":[[234,235,236,237]],"type":"Polygon","properties":{"name":"Costa Rica","Alpha-2":"CR"},"id":"CRI"},{"arcs":[[238]],"type":"Polygon","properties":{"name":"Cuba","Alpha-2":"CU"},"id":"CUB"},{"arcs":[[239,240]],"type":"Polygon","properties":{"name":"Northern Cyprus","Alpha-2":null},"id":"-99"},{"arcs":[[241,-241]],"type":"Polygon","properties":{"name":"Cyprus","Alpha-2":"CY"},"id":"CYP"},{"arcs":[[-53,242,243,244]],"type":"Polygon","properties":{"name":"Czech Republic","Alpha-2":"CZ"},"id":"CZE"},{"arcs":[[245,246,-243,-52,-184,247,248,-65,249,250,251]],"type":"Polygon","properties":{"name":"Germany","Alpha-2":"DE"},"id":"DEU"},{"arcs":[[252,253,254,255]],"type":"Polygon","properties":{"name":"Djibouti","Alpha-2":"DJ"},"id":"DJI"},{"arcs":[[[256]],[[-252,257]]],"type":"MultiPolygon","properties":{"name":"Denmark","Alpha-2":"DK"},"id":"DNK"},{"arcs":[[258,259]],"type":"Polygon","properties":{"name":"Dominican Republic","Alpha-2":"DO"},"id":"DOM"},{"arcs":[[260,261,262,263,264,265,266,267]],"type":"Polygon","properties":{"name":"Algeria","Alpha-2":"DZ"},"id":"DZA"},{"arcs":[[268,-229,269]],"type":"Polygon","properties":{"name":"Ecuador","Alpha-2":"EC"},"id":"ECU"},{"arcs":[[270,271,272,273,274]],"type":"Polygon","properties":{"name":"Egypt","Alpha-2":"EG"},"id":"EGY"},{"arcs":[[275,276,277,-256]],"type":"Polygon","properties":{"name":"Eritrea","Alpha-2":"ER"},"id":"ERI"},{"arcs":[[278,279,280,281]],"type":"Polygon","properties":{"name":"Spain","Alpha-2":"ES"},"id":"ESP"},{"arcs":[[282,283,284]],"type":"Polygon","properties":{"name":"Estonia","Alpha-2":"EE"},"id":"EST"},{"arcs":[[-276,-255,285,286,287,288,289,290]],"type":"Polygon","properties":{"name":"Ethiopia","Alpha-2":"ET"},"id":"ETH"},{"arcs":[[291,292,293,294]],"type":"Polygon","properties":{"name":"Finland","Alpha-2":"FI"},"id":"FIN"},{"arcs":[[[295]],[[296]],[[297]]],"type":"MultiPolygon","properties":{"name":"Fiji","Alpha-2":"FJ"},"id":"FJI"},{"arcs":[[298]],"type":"Polygon","properties":{"name":"Falkland Islands","Alpha-2":"FK"},"id":"FLK"},{"arcs":[[[299]],[[300,-248,-183,301,302,-280,303,-67]]],"type":"MultiPolygon","properties":{"name":"France","Alpha-2":"FR"},"id":"FRA"},{"arcs":[[304,305,-212,-228]],"type":"Polygon","properties":{"name":"Gabon","Alpha-2":"GA"},"id":"GAB"},{"arcs":[[[306,307]],[[308,309]]],"type":"MultiPolygon","properties":{"name":"United Kingdom","Alpha-2":"GB"},"id":"GBR"},{"arcs":[[310,311,-59,-32,312]],"type":"Polygon","properties":{"name":"Georgia","Alpha-2":"GE"},"id":"GEO"},{"arcs":[[313,-211,-79,314]],"type":"Polygon","properties":{"name":"Ghana","Alpha-2":"GH"},"id":"GHA"},{"arcs":[[315,316,317,318,319,320,-209]],"type":"Polygon","properties":{"name":"Guinea","Alpha-2":"GN"},"id":"GIN"},{"arcs":[[321,322]],"type":"Polygon","properties":{"name":"Gambia","Alpha-2":"GM"},"id":"GMB"},{"arcs":[[323,324,-319]],"type":"Polygon","properties":{"name":"Guinea Bissau","Alpha-2":"GW"},"id":"GNB"},{"arcs":[[325,-213,-306]],"type":"Polygon","properties":{"name":"Equatorial Guinea","Alpha-2":"GQ"},"id":"GNQ"},{"arcs":[[[326]],[[327,-14,328,-86,329]]],"type":"MultiPolygon","properties":{"name":"Greece","Alpha-2":"GR"},"id":"GRC"},{"arcs":[[330]],"type":"Polygon","properties":{"name":"Greenland","Alpha-2":"GL"},"id":"GRL"},{"arcs":[[331,332,-102,333,334,335]],"type":"Polygon","properties":{"name":"Guatemala","Alpha-2":"GT"},"id":"GTM"},{"arcs":[[336,337,338,-131]],"type":"Polygon","properties":{"name":"French Guiana","Alpha-2":"GF"},"id":"GUF"},{"arcs":[[339,340,-129,341]],"type":"Polygon","properties":{"name":"Guyana","Alpha-2":"GY"},"id":"GUY"},{"arcs":[[342,343,-335,344,345]],"type":"Polygon","properties":{"name":"Honduras","Alpha-2":"HN"},"id":"HND"},{"arcs":[[346,-94,347,348,349,350]],"type":"Polygon","properties":{"name":"Croatia","Alpha-2":"HR"},"id":"HRV"},{"arcs":[[-260,351]],"type":"Polygon","properties":{"name":"Haiti","Alpha-2":"HT"},"id":"HTI"},{"arcs":[[-48,352,353,354,355,-351,356]],"type":"Polygon","properties":{"name":"Hungary","Alpha-2":"HU"},"id":"HUN"},{"arcs":[[[357]],[[358,359]],[[360]],[[361]],[[362]],[[363]],[[364]],[[365]],[[366,367]],[[368]],[[369]],[[370,371]],[[372]]],"type":"MultiPolygon","properties":{"name":"Indonesia","Alpha-2":"ID"},"id":"IDN"},{"arcs":[[-199,373,-197,-136,-196,374,-82,375,376]],"type":"Polygon","properties":{"name":"India","Alpha-2":"IN"},"id":"IND"},{"arcs":[[377,-307]],"type":"Polygon","properties":{"name":"Ireland","Alpha-2":"IE"},"id":"IRL"},{"arcs":[[378,-6,379,380,381,382,-55,-34,-58,383]],"type":"Polygon","properties":{"name":"Iran","Alpha-2":"IR"},"id":"IRN"},{"arcs":[[-382,384,385,386,387,388,389]],"type":"Polygon","properties":{"name":"Iraq","Alpha-2":"IQ"},"id":"IRQ"},{"arcs":[[390]],"type":"Polygon","properties":{"name":"Iceland","Alpha-2":"IS"},"id":"ISL"},{"arcs":[[391,392,393,-274,394,395,396]],"type":"Polygon","properties":{"name":"Israel","Alpha-2":"IL"},"id":"ISR"},{"arcs":[[[397]],[[398]],[[399,400,-302,-182,-50]]],"type":"MultiPolygon","properties":{"name":"Italy","Alpha-2":"IT"},"id":"ITA"},{"arcs":[[401]],"type":"Polygon","properties":{"name":"Jamaica","Alpha-2":"JM"},"id":"JAM"},{"arcs":[[-392,402,-388,403,404,-394,405]],"type":"Polygon","properties":{"name":"Jordan","Alpha-2":"JO"},"id":"JOR"},{"arcs":[[[406]],[[407]],[[408]]],"type":"MultiPolygon","properties":{"name":"Japan","Alpha-2":"JP"},"id":"JPN"},{"arcs":[[409,410,411,412,-203,413]],"type":"Polygon","properties":{"name":"Kazakhstan","Alpha-2":"KZ"},"id":"KAZ"},{"arcs":[[414,415,416,417,-288,418]],"type":"Polygon","properties":{"name":"Kenya","Alpha-2":"KE"},"id":"KEN"},{"arcs":[[-414,-202,419,420]],"type":"Polygon","properties":{"name":"Kyrgyzstan","Alpha-2":"KG"},"id":"KGZ"},{"arcs":[[421,422,423,424]],"type":"Polygon","properties":{"name":"Cambodia","Alpha-2":"KH"},"id":"KHM"},{"arcs":[[425,426]],"type":"Polygon","properties":{"name":"South Korea","Alpha-2":"KR"},"id":"KOR"},{"arcs":[[-17,427,428,429]],"type":"Polygon","properties":{"name":"Kosovo","Alpha-2":null},"id":"CS-KM"},{"arcs":[[430,431,-386]],"type":"Polygon","properties":{"name":"Kuwait","Alpha-2":"KW"},"id":"KWT"},{"arcs":[[432,433,-194,434,-423]],"type":"Polygon","properties":{"name":"Laos","Alpha-2":"LA"},"id":"LAO"},{"arcs":[[-396,435,436]],"type":"Polygon","properties":{"name":"Lebanon","Alpha-2":"LB"},"id":"LBN"},{"arcs":[[437,438,-316,-208]],"type":"Polygon","properties":{"name":"Liberia","Alpha-2":"LR"},"id":"LBR"},{"arcs":[[439,-268,440,441,-272,442,443]],"type":"Polygon","properties":{"name":"Libya","Alpha-2":"LY"},"id":"LBY"},{"arcs":[[444]],"type":"Polygon","properties":{"name":"Sri Lanka","Alpha-2":"LK"},"id":"LKA"},{"arcs":[[445]],"type":"Polygon","properties":{"name":"Lesotho","Alpha-2":"LS"},"id":"LSO"},{"arcs":[[446,447,448,-95,449]],"type":"Polygon","properties":{"name":"Lithuania","Alpha-2":"LT"},"id":"LTU"},{"arcs":[[-249,-301,-66]],"type":"Polygon","properties":{"name":"Luxembourg","Alpha-2":"LU"},"id":"LUX"},{"arcs":[[450,-285,451,-96,-449]],"type":"Polygon","properties":{"name":"Latvia","Alpha-2":"LV"},"id":"LVA"},{"arcs":[[-265,452,453,454]],"type":"Polygon","properties":{"name":"Morocco","Alpha-2":"MA"},"id":"MAR"},{"arcs":[[455,456]],"type":"Polygon","properties":{"name":"Moldova","Alpha-2":"MD"},"id":"MDA"},{"arcs":[[457]],"type":"Polygon","properties":{"name":"Madagascar","Alpha-2":"MG"},"id":"MDG"},{"arcs":[[-100,-333,458,459,460]],"type":"Polygon","properties":{"name":"Mexico","Alpha-2":"MX"},"id":"MEX"},{"arcs":[[-430,461,-87,-329,-18]],"type":"Polygon","properties":{"name":"Macedonia","Alpha-2":"MK"},"id":"MKD"},{"arcs":[[462,-262,463,-76,-210,-321,464]],"type":"Polygon","properties":{"name":"Mali","Alpha-2":"ML"},"id":"MLI"},{"arcs":[[[465]],[[466]]],"type":"MultiPolygon","properties":{"name":"Malta","Alpha-2":"MT"},"id":"MLT"},{"arcs":[[467,-80,-375,-195,-434,468]],"type":"Polygon","properties":{"name":"Myanmar","Alpha-2":"MM"},"id":"MMR"},{"arcs":[[-16,469,-348,-93,470,-428]],"type":"Polygon","properties":{"name":"Montenegro","Alpha-2":"ME"},"id":"MNE"},{"arcs":[[471,-205]],"type":"Polygon","properties":{"name":"Mongolia","Alpha-2":"MN"},"id":"MNG"},{"arcs":[[472,473,474,475,476,477,478,479]],"type":"Polygon","properties":{"name":"Mozambique","Alpha-2":"MZ"},"id":"MOZ"},{"arcs":[[480,481,482,-263,-463]],"type":"Polygon","properties":{"name":"Mauritania","Alpha-2":"MR"},"id":"MRT"},{"arcs":[[-480,483,484]],"type":"Polygon","properties":{"name":"Malawi","Alpha-2":"MW"},"id":"MWI"},{"arcs":[[[485,486]],[[-371,487,-135,488]]],"type":"MultiPolygon","properties":{"name":"Malaysia","Alpha-2":"MY"},"id":"MYS"},{"arcs":[[489,-8,490,-139,491]],"type":"Polygon","properties":{"name":"Namibia","Alpha-2":"NA"},"id":"NAM"},{"arcs":[[492]],"type":"Polygon","properties":{"name":"New Caledonia","Alpha-2":"NC"},"id":"NCL"},{"arcs":[[-77,-464,-261,-440,493,-216,494,-73]],"type":"Polygon","properties":{"name":"Niger","Alpha-2":"NE"},"id":"NER"},{"arcs":[[495,-74,-495,-215]],"type":"Polygon","properties":{"name":"Nigeria","Alpha-2":"NG"},"id":"NGA"},{"arcs":[[496,-346,497,-236]],"type":"Polygon","properties":{"name":"Nicaragua","Alpha-2":"NI"},"id":"NIC"},{"arcs":[[-250,-64,-69,498]],"type":"Polygon","properties":{"name":"Netherlands","Alpha-2":"NL"},"id":"NLD"},{"arcs":[[[-295,499,500,501]],[[502]],[[503]],[[504]]],"type":"MultiPolygon","properties":{"name":"Norway","Alpha-2":"NO"},"id":"NOR"},{"arcs":[[-374,-198]],"type":"Polygon","properties":{"name":"Nepal","Alpha-2":"NP"},"id":"NPL"},{"arcs":[[[505]],[[506]]],"type":"MultiPolygon","properties":{"name":"New Zealand","Alpha-2":"NZ"},"id":"NZL"},{"arcs":[[[507,508,-22,509]],[[-20,510]]],"type":"MultiPolygon","properties":{"name":"Oman","Alpha-2":"OM"},"id":"OMN"},{"arcs":[[-200,-377,511,-380,-5]],"type":"Polygon","properties":{"name":"Pakistan","Alpha-2":"PK"},"id":"PAK"},{"arcs":[[512,-238,513,-231]],"type":"Polygon","properties":{"name":"Panama","Alpha-2":"PA"},"id":"PAN"},{"arcs":[[-188,514,-270,-234,-126,-122]],"type":"Polygon","properties":{"name":"Peru","Alpha-2":"PE"},"id":"PER"},{"arcs":[[[515]],[[516]],[[517]],[[518]],[[519]],[[520]],[[521]]],"type":"MultiPolygon","properties":{"name":"Philippines","Alpha-2":"PH"},"id":"PHL"},{"arcs":[[[522]],[[523]],[[-367,524]],[[525]]],"type":"MultiPolygon","properties":{"name":"Papua New Guinea","Alpha-2":"PG"},"id":"PNG"},{"arcs":[[-247,526,527,-450,-99,528,529,-244]],"type":"Polygon","properties":{"name":"Poland","Alpha-2":"PL"},"id":"POL"},{"arcs":[[530]],"type":"Polygon","properties":{"name":"Puerto Rico","Alpha-2":"PR"},"id":"PRI"},{"arcs":[[531,532,-427,533,-191]],"type":"Polygon","properties":{"name":"North Korea","Alpha-2":"KP"},"id":"PRK"},{"arcs":[[-282,534]],"type":"Polygon","properties":{"name":"Portugal","Alpha-2":"PT"},"id":"PRT"},{"arcs":[[-124,-125,-26]],"type":"Polygon","properties":{"name":"Paraguay","Alpha-2":"PY"},"id":"PRY"},{"arcs":[[535,536]],"type":"Polygon","properties":{"name":"Qatar","Alpha-2":"QA"},"id":"QAT"},{"arcs":[[537,-457,538,539,-83,540,-355]],"type":"Polygon","properties":{"name":"Romania","Alpha-2":"RO"},"id":"ROU"},{"arcs":[[[541]],[[-528,542,-447]],[[543]],[[544]],[[545]],[[546]],[[547]],[[548]],[[549]],[[-190,-206,-472,-204,-413,550,-56,-60,-312,551,552,-97,-452,-284,553,-292,-502,554,-532]],[[555]],[[556]],[[557]]],"type":"MultiPolygon","properties":{"name":"Russia","Alpha-2":"RU"},"id":"RUS"},{"arcs":[[558,-62,-220,559]],"type":"Polygon","properties":{"name":"Rwanda","Alpha-2":"RW"},"id":"RWA"},{"arcs":[[-453,-264,-483,560,-454]],"type":"Polygon","properties":{"name":"Western Sahara","Alpha-2":"EH"},"id":"ESH"},{"arcs":[[561,-404,-387,-432,562,-537,563,-23,-509,564]],"type":"Polygon","properties":{"name":"Saudi Arabia","Alpha-2":"SA"},"id":"SAU"},{"arcs":[[565,566,-143,567,-443,-271,568,-277,-291,569]],"type":"Polygon","properties":{"name":"Sudan","Alpha-2":"SD"},"id":"SDN"},{"arcs":[[570,-289,-418,571,-225,-145,572,-566]],"type":"Polygon","properties":{"name":"South Sudan","Alpha-2":null},"id":"SSD"},{"arcs":[[573,-481,-465,-320,-325,574,-323]],"type":"Polygon","properties":{"name":"Senegal","Alpha-2":"SN"},"id":"SEN"},{"arcs":[[[575]],[[576]],[[577]],[[578]],[[579]]],"type":"MultiPolygon","properties":{"name":"Solomon Islands","Alpha-2":"SB"},"id":"SLB"},{"arcs":[[580,-317,-439]],"type":"Polygon","properties":{"name":"Sierra Leone","Alpha-2":"SL"},"id":"SLE"},{"arcs":[[581,-336,-344]],"type":"Polygon","properties":{"name":"El Salvador","Alpha-2":"SV"},"id":"SLV"},{"arcs":[[-286,-254,582,583]],"type":"Polygon","properties":{"name":"Somaliland","Alpha-2":null},"id":"-99"},{"arcs":[[-419,-287,-584,584]],"type":"Polygon","properties":{"name":"Somalia","Alpha-2":"SO"},"id":"SOM"},{"arcs":[[-88,-462,-429,-471,-92,-347,-356,-541]],"type":"Polygon","properties":{"name":"Republic of Serbia","Alpha-2":"RS"},"id":"SRB"},{"arcs":[[585,-338,586,-130,-341]],"type":"Polygon","properties":{"name":"Suriname","Alpha-2":"SR"},"id":"SUR"},{"arcs":[[-530,587,-353,-54,-245]],"type":"Polygon","properties":{"name":"Slovakia","Alpha-2":"SK"},"id":"SVK"},{"arcs":[[-49,-357,-350,588,-400]],"type":"Polygon","properties":{"name":"Slovenia","Alpha-2":"SI"},"id":"SVN"},{"arcs":[[-500,-294,589],[590],[591],[592]],"type":"Polygon","properties":{"name":"Sweden","Alpha-2":"SE"},"id":"SWE"},{"arcs":[[593,-476]],"type":"Polygon","properties":{"name":"Swaziland","Alpha-2":"SZ"},"id":"SWZ"},{"arcs":[[-403,-397,-437,594,595,-389]],"type":"Polygon","properties":{"name":"Syria","Alpha-2":"SY"},"id":"SYR"},{"arcs":[[-494,-444,-568,-142,-217]],"type":"Polygon","properties":{"name":"Chad","Alpha-2":"TD"},"id":"TCD"},{"arcs":[[596,-315,-78,-71]],"type":"Polygon","properties":{"name":"Togo","Alpha-2":"TG"},"id":"TGO"},{"arcs":[[597,-487,598,-469,-433,-422]],"type":"Polygon","properties":{"name":"Thailand","Alpha-2":"TH"},"id":"THA"},{"arcs":[[-420,-201,-3,599]],"type":"Polygon","properties":{"name":"Tajikistan","Alpha-2":"TJ"},"id":"TJK"},{"arcs":[[-379,600,-411,601,-1]],"type":"Polygon","properties":{"name":"Turkmenistan","Alpha-2":"TM"},"id":"TKM"},{"arcs":[[602,-359]],"type":"Polygon","properties":{"name":"East Timor","Alpha-2":"TL"},"id":"TLS"},{"arcs":[[603]],"type":"Polygon","properties":{"name":"Trinidad and Tobago","Alpha-2":"TT"},"id":"TTO"},{"arcs":[[-267,604,-441]],"type":"Polygon","properties":{"name":"Tunisia","Alpha-2":"TN"},"id":"TUN"},{"arcs":[[[-313,-36,-383,-390,-596,605]],[[-330,-85,606]]],"type":"MultiPolygon","properties":{"name":"Turkey","Alpha-2":"TR"},"id":"TUR"},{"arcs":[[607]],"type":"Polygon","properties":{"name":"Taiwan","Alpha-2":"TW"},"id":"TWN"},{"arcs":[[-416,608,-473,-485,609,-221,-63,-559,610]],"type":"Polygon","properties":{"name":"United Republic of Tanzania","Alpha-2":"TZ"},"id":"TZA"},{"arcs":[[-560,-219,-226,-572,-417,-611]],"type":"Polygon","properties":{"name":"Uganda","Alpha-2":"UG"},"id":"UGA"},{"arcs":[[-553,611,-539,-456,-538,-354,-588,-529,-98]],"type":"Polygon","properties":{"name":"Ukraine","Alpha-2":"UA"},"id":"UKR"},{"arcs":[[-133,612,-28]],"type":"Polygon","properties":{"name":"Uruguay","Alpha-2":"UY"},"id":"URY"},{"arcs":[[[613]],[[614]],[[615]],[[616]],[[617]],[[618,-460,619,-159]],[[620]],[[621]],[[622]],[[-161,623]]],"type":"MultiPolygon","properties":{"name":"United States of America","Alpha-2":"US"},"id":"USA"},{"arcs":[[-602,-410,-421,-600,-2]],"type":"Polygon","properties":{"name":"Uzbekistan","Alpha-2":"UZ"},"id":"UZB"},{"arcs":[[624,-342,-128,-233]],"type":"Polygon","properties":{"name":"Venezuela","Alpha-2":"VE"},"id":"VEN"},{"arcs":[[625,-424,-435,-193]],"type":"Polygon","properties":{"name":"Vietnam","Alpha-2":"VN"},"id":"VNM"},{"arcs":[[[626]],[[627]]],"type":"MultiPolygon","properties":{"name":"Vanuatu","Alpha-2":"VU"},"id":"VUT"},{"arcs":[[-406,-393]],"type":"Polygon","properties":{"name":"West Bank","Alpha-2":"PS"},"id":"PSE"},{"arcs":[[628,-565,-508]],"type":"Polygon","properties":{"name":"Yemen","Alpha-2":"YE"},"id":"YEM"},{"arcs":[[-492,-138,629,-477,-594,-475,630,631],[-446]],"type":"Polygon","properties":{"name":"South Africa","Alpha-2":"ZA"},"id":"ZAF"},{"arcs":[[-484,-479,632,-140,-491,-7,-222,-610]],"type":"Polygon","properties":{"name":"Zambia","Alpha-2":"ZM"},"id":"ZMB"},{"arcs":[[-630,-141,-633,-478]],"type":"Polygon","properties":{"name":"Zimbabwe","Alpha-2":"ZW"},"id":"ZWE"}]},"countries2":{"type":"GeometryCollection","geometries":[{"type":null,"properties":{"Alpha-2":"AF","Alpha-3":"AFG"}},{"type":null,"properties":{"Alpha-2":"AL","Alpha-3":"ALB"}},{"type":null,"properties":{"Alpha-2":"DZ","Alpha-3":"DZA"}},{"type":null,"properties":{"Alpha-2":"AS","Alpha-3":"ASM"}},{"type":null,"properties":{"Alpha-2":"AD","Alpha-3":"AND"}},{"type":null,"properties":{"Alpha-2":"AO","Alpha-3":"AGO"}},{"type":null,"properties":{"Alpha-2":"AI","Alpha-3":"AIA"}},{"type":null,"properties":{"Alpha-2":"AQ","Alpha-3":"ATA"}},{"type":null,"properties":{"Alpha-2":"AG","Alpha-3":"ATG"}},{"type":null,"properties":{"Alpha-2":"AR","Alpha-3":"ARG"}},{"type":null,"properties":{"Alpha-2":"AM","Alpha-3":"ARM"}},{"type":null,"properties":{"Alpha-2":"AW","Alpha-3":"ABW"}},{"type":null,"properties":{"Alpha-2":"AU","Alpha-3":"AUS"}},{"type":null,"properties":{"Alpha-2":"AT","Alpha-3":"AUT"}},{"type":null,"properties":{"Alpha-2":"AZ","Alpha-3":"AZE"}},{"type":null,"properties":{"Alpha-2":"BS","Alpha-3":"BHS"}},{"type":null,"properties":{"Alpha-2":"BH","Alpha-3":"BHR"}},{"type":null,"properties":{"Alpha-2":"BD","Alpha-3":"BGD"}},{"type":null,"properties":{"Alpha-2":"BB","Alpha-3":"BRB"}},{"type":null,"properties":{"Alpha-2":"BY","Alpha-3":"BLR"}},{"type":null,"properties":{"Alpha-2":"BE","Alpha-3":"BEL"}},{"type":null,"properties":{"Alpha-2":"BZ","Alpha-3":"BLZ"}},{"type":null,"properties":{"Alpha-2":"BJ","Alpha-3":"BEN"}},{"type":null,"properties":{"Alpha-2":"BM","Alpha-3":"BMU"}},{"type":null,"properties":{"Alpha-2":"BT","Alpha-3":"BTN"}},{"type":null,"properties":{"Alpha-2":"BO","Alpha-3":"BOL"}},{"type":null,"properties":{"Alpha-2":"BO","Alpha-3":"BOL"}},{"type":null,"properties":{"Alpha-2":"BA","Alpha-3":"BIH"}},{"type":null,"properties":{"Alpha-2":"BW","Alpha-3":"BWA"}},{"type":null,"properties":{"Alpha-2":"BV","Alpha-3":"BVT"}},{"type":null,"properties":{"Alpha-2":"BR","Alpha-3":"BRA"}},{"type":null,"properties":{"Alpha-2":"IO","Alpha-3":"IOT"}},{"type":null,"properties":{"Alpha-2":"BN","Alpha-3":"BRN"}},{"type":null,"properties":{"Alpha-2":"BN","Alpha-3":"BRN"}},{"type":null,"properties":{"Alpha-2":"BG","Alpha-3":"BGR"}},{"type":null,"properties":{"Alpha-2":"BF","Alpha-3":"BFA"}},{"type":null,"properties":{"Alpha-2":"BI","Alpha-3":"BDI"}},{"type":null,"properties":{"Alpha-2":"KH","Alpha-3":"KHM"}},{"type":null,"properties":{"Alpha-2":"CM","Alpha-3":"CMR"}},{"type":null,"properties":{"Alpha-2":"CA","Alpha-3":"CAN"}},{"type":null,"properties":{"Alpha-2":"CV","Alpha-3":"CPV"}},{"type":null,"properties":{"Alpha-2":"KY","Alpha-3":"CYM"}},{"type":null,"properties":{"Alpha-2":"CF","Alpha-3":"CAF"}},{"type":null,"properties":{"Alpha-2":"TD","Alpha-3":"TCD"}},{"type":null,"properties":{"Alpha-2":"CL","Alpha-3":"CHL"}},{"type":null,"properties":{"Alpha-2":"CN","Alpha-3":"CHN"}},{"type":null,"properties":{"Alpha-2":"CX","Alpha-3":"CXR"}},{"type":null,"properties":{"Alpha-2":"CC","Alpha-3":"CCK"}},{"type":null,"properties":{"Alpha-2":"CO","Alpha-3":"COL"}},{"type":null,"properties":{"Alpha-2":"KM","Alpha-3":"COM"}},{"type":null,"properties":{"Alpha-2":"CG","Alpha-3":"COG"}},{"type":null,"properties":{"Alpha-2":"CD","Alpha-3":"COD"}},{"type":null,"properties":{"Alpha-2":"CK","Alpha-3":"COK"}},{"type":null,"properties":{"Alpha-2":"CR","Alpha-3":"CRI"}},{"type":null,"properties":{"Alpha-2":"CI","Alpha-3":"CIV"}},{"type":null,"properties":{"Alpha-2":"CI","Alpha-3":"CIV"}},{"type":null,"properties":{"Alpha-2":"HR","Alpha-3":"HRV"}},{"type":null,"properties":{"Alpha-2":"CU","Alpha-3":"CUB"}},{"type":null,"properties":{"Alpha-2":"CY","Alpha-3":"CYP"}},{"type":null,"properties":{"Alpha-2":"CZ","Alpha-3":"CZE"}},{"type":null,"properties":{"Alpha-2":"DK","Alpha-3":"DNK"}},{"type":null,"properties":{"Alpha-2":"DJ","Alpha-3":"DJI"}},{"type":null,"properties":{"Alpha-2":"DM","Alpha-3":"DMA"}},{"type":null,"properties":{"Alpha-2":"DO","Alpha-3":"DOM"}},{"type":null,"properties":{"Alpha-2":"EC","Alpha-3":"ECU"}},{"type":null,"properties":{"Alpha-2":"EG","Alpha-3":"EGY"}},{"type":null,"properties":{"Alpha-2":"SV","Alpha-3":"SLV"}},{"type":null,"properties":{"Alpha-2":"GQ","Alpha-3":"GNQ"}},{"type":null,"properties":{"Alpha-2":"ER","Alpha-3":"ERI"}},{"type":null,"properties":{"Alpha-2":"EE","Alpha-3":"EST"}},{"type":null,"properties":{"Alpha-2":"ET","Alpha-3":"ETH"}},{"type":null,"properties":{"Alpha-2":"FK","Alpha-3":"FLK"}},{"type":null,"properties":{"Alpha-2":"FO","Alpha-3":"FRO"}},{"type":null,"properties":{"Alpha-2":"FJ","Alpha-3":"FJI"}},{"type":null,"properties":{"Alpha-2":"FI","Alpha-3":"FIN"}},{"type":null,"properties":{"Alpha-2":"FR","Alpha-3":"FRA"}},{"type":null,"properties":{"Alpha-2":"GF","Alpha-3":"GUF"}},{"type":null,"properties":{"Alpha-2":"PF","Alpha-3":"PYF"}},{"type":null,"properties":{"Alpha-2":"TF","Alpha-3":"ATF"}},{"type":null,"properties":{"Alpha-2":"GA","Alpha-3":"GAB"}},{"type":null,"properties":{"Alpha-2":"GM","Alpha-3":"GMB"}},{"type":null,"properties":{"Alpha-2":"GE","Alpha-3":"GEO"}},{"type":null,"properties":{"Alpha-2":"DE","Alpha-3":"DEU"}},{"type":null,"properties":{"Alpha-2":"GH","Alpha-3":"GHA"}},{"type":null,"properties":{"Alpha-2":"GI","Alpha-3":"GIB"}},{"type":null,"properties":{"Alpha-2":"GR","Alpha-3":"GRC"}},{"type":null,"properties":{"Alpha-2":"GL","Alpha-3":"GRL"}},{"type":null,"properties":{"Alpha-2":"GD","Alpha-3":"GRD"}},{"type":null,"properties":{"Alpha-2":"GP","Alpha-3":"GLP"}},{"type":null,"properties":{"Alpha-2":"GU","Alpha-3":"GUM"}},{"type":null,"properties":{"Alpha-2":"GT","Alpha-3":"GTM"}},{"type":null,"properties":{"Alpha-2":"GG","Alpha-3":"GGY"}},{"type":null,"properties":{"Alpha-2":"GN","Alpha-3":"GIN"}},{"type":null,"properties":{"Alpha-2":"GW","Alpha-3":"GNB"}},{"type":null,"properties":{"Alpha-2":"GY","Alpha-3":"GUY"}},{"type":null,"properties":{"Alpha-2":"HT","Alpha-3":"HTI"}},{"type":null,"properties":{"Alpha-2":"HM","Alpha-3":"HMD"}},{"type":null,"properties":{"Alpha-2":"VA","Alpha-3":"VAT"}},{"type":null,"properties":{"Alpha-2":"HN","Alpha-3":"HND"}},{"type":null,"properties":{"Alpha-2":"HK","Alpha-3":"HKG"}},{"type":null,"properties":{"Alpha-2":"HU","Alpha-3":"HUN"}},{"type":null,"properties":{"Alpha-2":"IS","Alpha-3":"ISL"}},{"type":null,"properties":{"Alpha-2":"IN","Alpha-3":"IND"}},{"type":null,"properties":{"Alpha-2":"ID","Alpha-3":"IDN"}},{"type":null,"properties":{"Alpha-2":"IR","Alpha-3":"IRN"}},{"type":null,"properties":{"Alpha-2":"IQ","Alpha-3":"IRQ"}},{"type":null,"properties":{"Alpha-2":"IE","Alpha-3":"IRL"}},{"type":null,"properties":{"Alpha-2":"IM","Alpha-3":"IMN"}},{"type":null,"properties":{"Alpha-2":"IL","Alpha-3":"ISR"}},{"type":null,"properties":{"Alpha-2":"IT","Alpha-3":"ITA"}},{"type":null,"properties":{"Alpha-2":"JM","Alpha-3":"JAM"}},{"type":null,"properties":{"Alpha-2":"JP","Alpha-3":"JPN"}},{"type":null,"properties":{"Alpha-2":"JE","Alpha-3":"JEY"}},{"type":null,"properties":{"Alpha-2":"JO","Alpha-3":"JOR"}},{"type":null,"properties":{"Alpha-2":"KZ","Alpha-3":"KAZ"}},{"type":null,"properties":{"Alpha-2":"KE","Alpha-3":"KEN"}},{"type":null,"properties":{"Alpha-2":"KI","Alpha-3":"KIR"}},{"type":null,"properties":{"Alpha-2":"KP","Alpha-3":"PRK"}},{"type":null,"properties":{"Alpha-2":"KR","Alpha-3":"KOR"}},{"type":null,"properties":{"Alpha-2":"KR","Alpha-3":"KOR"}},{"type":null,"properties":{"Alpha-2":"KW","Alpha-3":"KWT"}},{"type":null,"properties":{"Alpha-2":"KG","Alpha-3":"KGZ"}},{"type":null,"properties":{"Alpha-2":"LA","Alpha-3":"LAO"}},{"type":null,"properties":{"Alpha-2":"LV","Alpha-3":"LVA"}},{"type":null,"properties":{"Alpha-2":"LB","Alpha-3":"LBN"}},{"type":null,"properties":{"Alpha-2":"LS","Alpha-3":"LSO"}},{"type":null,"properties":{"Alpha-2":"LR","Alpha-3":"LBR"}},{"type":null,"properties":{"Alpha-2":"LY","Alpha-3":"LBY"}},{"type":null,"properties":{"Alpha-2":"LY","Alpha-3":"LBY"}},{"type":null,"properties":{"Alpha-2":"LI","Alpha-3":"LIE"}},{"type":null,"properties":{"Alpha-2":"LT","Alpha-3":"LTU"}},{"type":null,"properties":{"Alpha-2":"LU","Alpha-3":"LUX"}},{"type":null,"properties":{"Alpha-2":"MO","Alpha-3":"MAC"}},{"type":null,"properties":{"Alpha-2":"MK","Alpha-3":"MKD"}},{"type":null,"properties":{"Alpha-2":"MG","Alpha-3":"MDG"}},{"type":null,"properties":{"Alpha-2":"MW","Alpha-3":"MWI"}},{"type":null,"properties":{"Alpha-2":"MY","Alpha-3":"MYS"}},{"type":null,"properties":{"Alpha-2":"MV","Alpha-3":"MDV"}},{"type":null,"properties":{"Alpha-2":"ML","Alpha-3":"MLI"}},{"type":null,"properties":{"Alpha-2":"MT","Alpha-3":"MLT"}},{"type":null,"properties":{"Alpha-2":"MH","Alpha-3":"MHL"}},{"type":null,"properties":{"Alpha-2":"MQ","Alpha-3":"MTQ"}},{"type":null,"properties":{"Alpha-2":"MR","Alpha-3":"MRT"}},{"type":null,"properties":{"Alpha-2":"MU","Alpha-3":"MUS"}},{"type":null,"properties":{"Alpha-2":"YT","Alpha-3":"MYT"}},{"type":null,"properties":{"Alpha-2":"MX","Alpha-3":"MEX"}},{"type":null,"properties":{"Alpha-2":"FM","Alpha-3":"FSM"}},{"type":null,"properties":{"Alpha-2":"MD","Alpha-3":"MDA"}},{"type":null,"properties":{"Alpha-2":"MC","Alpha-3":"MCO"}},{"type":null,"properties":{"Alpha-2":"MN","Alpha-3":"MNG"}},{"type":null,"properties":{"Alpha-2":"ME","Alpha-3":"MNE"}},{"type":null,"properties":{"Alpha-2":"MS","Alpha-3":"MSR"}},{"type":null,"properties":{"Alpha-2":"MA","Alpha-3":"MAR"}},{"type":null,"properties":{"Alpha-2":"MZ","Alpha-3":"MOZ"}},{"type":null,"properties":{"Alpha-2":"MM","Alpha-3":"MMR"}},{"type":null,"properties":{"Alpha-2":"MM","Alpha-3":"MMR"}},{"type":null,"properties":{"Alpha-2":"NA","Alpha-3":"NAM"}},{"type":null,"properties":{"Alpha-2":"NR","Alpha-3":"NRU"}},{"type":null,"properties":{"Alpha-2":"NP","Alpha-3":"NPL"}},{"type":null,"properties":{"Alpha-2":"NL","Alpha-3":"NLD"}},{"type":null,"properties":{"Alpha-2":"AN","Alpha-3":"ANT"}},{"type":null,"properties":{"Alpha-2":"NC","Alpha-3":"NCL"}},{"type":null,"properties":{"Alpha-2":"NZ","Alpha-3":"NZL"}},{"type":null,"properties":{"Alpha-2":"NI","Alpha-3":"NIC"}},{"type":null,"properties":{"Alpha-2":"NE","Alpha-3":"NER"}},{"type":null,"properties":{"Alpha-2":"NG","Alpha-3":"NGA"}},{"type":null,"properties":{"Alpha-2":"NU","Alpha-3":"NIU"}},{"type":null,"properties":{"Alpha-2":"NF","Alpha-3":"NFK"}},{"type":null,"properties":{"Alpha-2":"MP","Alpha-3":"MNP"}},{"type":null,"properties":{"Alpha-2":"NO","Alpha-3":"NOR"}},{"type":null,"properties":{"Alpha-2":"OM","Alpha-3":"OMN"}},{"type":null,"properties":{"Alpha-2":"PK","Alpha-3":"PAK"}},{"type":null,"properties":{"Alpha-2":"PW","Alpha-3":"PLW"}},{"type":null,"properties":{"Alpha-2":"PS","Alpha-3":"PSE"}},{"type":null,"properties":{"Alpha-2":"PA","Alpha-3":"PAN"}},{"type":null,"properties":{"Alpha-2":"PG","Alpha-3":"PNG"}},{"type":null,"properties":{"Alpha-2":"PY","Alpha-3":"PRY"}},{"type":null,"properties":{"Alpha-2":"PE","Alpha-3":"PER"}},{"type":null,"properties":{"Alpha-2":"PH","Alpha-3":"PHL"}},{"type":null,"properties":{"Alpha-2":"PN","Alpha-3":"PCN"}},{"type":null,"properties":{"Alpha-2":"PL","Alpha-3":"POL"}},{"type":null,"properties":{"Alpha-2":"PT","Alpha-3":"PRT"}},{"type":null,"properties":{"Alpha-2":"PR","Alpha-3":"PRI"}},{"type":null,"properties":{"Alpha-2":"QA","Alpha-3":"QAT"}},{"type":null,"properties":{"Alpha-2":"RE","Alpha-3":"REU"}},{"type":null,"properties":{"Alpha-2":"RO","Alpha-3":"ROU"}},{"type":null,"properties":{"Alpha-2":"RU","Alpha-3":"RUS"}},{"type":null,"properties":{"Alpha-2":"RU","Alpha-3":"RUS"}},{"type":null,"properties":{"Alpha-2":"RW","Alpha-3":"RWA"}},{"type":null,"properties":{"Alpha-2":"SH","Alpha-3":"SHN"}},{"type":null,"properties":{"Alpha-2":"KN","Alpha-3":"KNA"}},{"type":null,"properties":{"Alpha-2":"LC","Alpha-3":"LCA"}},{"type":null,"properties":{"Alpha-2":"PM","Alpha-3":"SPM"}},{"type":null,"properties":{"Alpha-2":"VC","Alpha-3":"VCT"}},{"type":null,"properties":{"Alpha-2":"VC","Alpha-3":"VCT"}},{"type":null,"properties":{"Alpha-2":"VC","Alpha-3":"VCT"}},{"type":null,"properties":{"Alpha-2":"WS","Alpha-3":"WSM"}},{"type":null,"properties":{"Alpha-2":"SM","Alpha-3":"SMR"}},{"type":null,"properties":{"Alpha-2":"ST","Alpha-3":"STP"}},{"type":null,"properties":{"Alpha-2":"SA","Alpha-3":"SAU"}},{"type":null,"properties":{"Alpha-2":"SN","Alpha-3":"SEN"}},{"type":null,"properties":{"Alpha-2":"RS","Alpha-3":"SRB"}},{"type":null,"properties":{"Alpha-2":"SC","Alpha-3":"SYC"}},{"type":null,"properties":{"Alpha-2":"SL","Alpha-3":"SLE"}},{"type":null,"properties":{"Alpha-2":"SG","Alpha-3":"SGP"}},{"type":null,"properties":{"Alpha-2":"SK","Alpha-3":"SVK"}},{"type":null,"properties":{"Alpha-2":"SI","Alpha-3":"SVN"}},{"type":null,"properties":{"Alpha-2":"SB","Alpha-3":"SLB"}},{"type":null,"properties":{"Alpha-2":"SO","Alpha-3":"SOM"}},{"type":null,"properties":{"Alpha-2":"ZA","Alpha-3":"ZAF"}},{"type":null,"properties":{"Alpha-2":"GS","Alpha-3":"SGS"}},{"type":null,"properties":{"Alpha-2":"ES","Alpha-3":"ESP"}},{"type":null,"properties":{"Alpha-2":"LK","Alpha-3":"LKA"}},{"type":null,"properties":{"Alpha-2":"SD","Alpha-3":"SDN"}},{"type":null,"properties":{"Alpha-2":"SR","Alpha-3":"SUR"}},{"type":null,"properties":{"Alpha-2":"SJ","Alpha-3":"SJM"}},{"type":null,"properties":{"Alpha-2":"SZ","Alpha-3":"SWZ"}},{"type":null,"properties":{"Alpha-2":"SE","Alpha-3":"SWE"}},{"type":null,"properties":{"Alpha-2":"CH","Alpha-3":"CHE"}},{"type":null,"properties":{"Alpha-2":"SY","Alpha-3":"SYR"}},{"type":null,"properties":{"Alpha-2":"TW","Alpha-3":"TWN"}},{"type":null,"properties":{"Alpha-2":"TW","Alpha-3":"TWN"}},{"type":null,"properties":{"Alpha-2":"TJ","Alpha-3":"TJK"}},{"type":null,"properties":{"Alpha-2":"TZ","Alpha-3":"TZA"}},{"type":null,"properties":{"Alpha-2":"TH","Alpha-3":"THA"}},{"type":null,"properties":{"Alpha-2":"TL","Alpha-3":"TLS"}},{"type":null,"properties":{"Alpha-2":"TG","Alpha-3":"TGO"}},{"type":null,"properties":{"Alpha-2":"TK","Alpha-3":"TKL"}},{"type":null,"properties":{"Alpha-2":"TO","Alpha-3":"TON"}},{"type":null,"properties":{"Alpha-2":"TT","Alpha-3":"TTO"}},{"type":null,"properties":{"Alpha-2":"TT","Alpha-3":"TTO"}},{"type":null,"properties":{"Alpha-2":"TN","Alpha-3":"TUN"}},{"type":null,"properties":{"Alpha-2":"TR","Alpha-3":"TUR"}},{"type":null,"properties":{"Alpha-2":"TM","Alpha-3":"TKM"}},{"type":null,"properties":{"Alpha-2":"TC","Alpha-3":"TCA"}},{"type":null,"properties":{"Alpha-2":"TV","Alpha-3":"TUV"}},{"type":null,"properties":{"Alpha-2":"UG","Alpha-3":"UGA"}},{"type":null,"properties":{"Alpha-2":"UA","Alpha-3":"UKR"}},{"type":null,"properties":{"Alpha-2":"AE","Alpha-3":"ARE"}},{"type":null,"properties":{"Alpha-2":"GB","Alpha-3":"GBR"}},{"type":null,"properties":{"Alpha-2":"US","Alpha-3":"USA"}},{"type":null,"properties":{"Alpha-2":"UM","Alpha-3":"UMI"}},{"type":null,"properties":{"Alpha-2":"UY","Alpha-3":"URY"}},{"type":null,"properties":{"Alpha-2":"UZ","Alpha-3":"UZB"}},{"type":null,"properties":{"Alpha-2":"VU","Alpha-3":"VUT"}},{"type":null,"properties":{"Alpha-2":"VE","Alpha-3":"VEN"}},{"type":null,"properties":{"Alpha-2":"VE","Alpha-3":"VEN"}},{"type":null,"properties":{"Alpha-2":"VN","Alpha-3":"VNM"}},{"type":null,"properties":{"Alpha-2":"VN","Alpha-3":"VNM"}},{"type":null,"properties":{"Alpha-2":"VG","Alpha-3":"VGB"}},{"type":null,"properties":{"Alpha-2":"VI","Alpha-3":"VIR"}},{"type":null,"properties":{"Alpha-2":"WF","Alpha-3":"WLF"}},{"type":null,"properties":{"Alpha-2":"EH","Alpha-3":"ESH"}},{"type":null,"properties":{"Alpha-2":"YE","Alpha-3":"YEM"}},{"type":null,"properties":{"Alpha-2":"ZM","Alpha-3":"ZMB"}},{"type":null,"properties":{"Alpha-2":"ZW","Alpha-3":"ZWE"}}]}}} \ No newline at end of file diff --git a/002_source/cms/public/favicon.ico b/002_source/cms/public/favicon.ico new file mode 100644 index 0000000..7c82958 Binary files /dev/null and b/002_source/cms/public/favicon.ico differ diff --git a/002_source/cms/public/locales/de/translation.json b/002_source/cms/public/locales/de/translation.json new file mode 100644 index 0000000..e3e4482 --- /dev/null +++ b/002_source/cms/public/locales/de/translation.json @@ -0,0 +1,3 @@ +{ + "languageChanged": "Sprache geändert" +} diff --git a/002_source/cms/public/locales/en/translation.json b/002_source/cms/public/locales/en/translation.json new file mode 100644 index 0000000..069eb58 --- /dev/null +++ b/002_source/cms/public/locales/en/translation.json @@ -0,0 +1,3 @@ +{ + "languageChanged": "Language changed" +} diff --git a/002_source/cms/public/locales/es/translation.json b/002_source/cms/public/locales/es/translation.json new file mode 100644 index 0000000..1a632be --- /dev/null +++ b/002_source/cms/public/locales/es/translation.json @@ -0,0 +1,3 @@ +{ + "languageChanged": "Idioma cambiado" +} diff --git a/002_source/cms/src/app/(marketing)/components/buttons/page.tsx b/002_source/cms/src/app/(marketing)/components/buttons/page.tsx new file mode 100644 index 0000000..fba27e0 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/buttons/page.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Buttons1 } from '@/components/widgets/buttons/buttons-1'; +import { Buttons2 } from '@/components/widgets/buttons/buttons-2'; +import { Buttons3 } from '@/components/widgets/buttons/buttons-3'; +import { Buttons4 } from '@/components/widgets/buttons/buttons-4'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Buttons | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Simple buttons', element: }, + { title: 'Buttons with text and icon', element: }, + { title: 'Button groups', element: }, + { title: 'Icon buttons', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/charts/page.tsx b/002_source/cms/src/app/(marketing)/components/charts/page.tsx new file mode 100644 index 0000000..ed10c0b --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/charts/page.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Chart1 } from '@/components/widgets/charts/chart-1'; +import { Chart2 } from '@/components/widgets/charts/chart-2'; +import { Chart3 } from '@/components/widgets/charts/chart-3'; +import { Chart4 } from '@/components/widgets/charts/chart-4'; +import { Chart5 } from '@/components/widgets/charts/chart-5'; +import { Chart6 } from '@/components/widgets/charts/chart-6'; +import { Chart7 } from '@/components/widgets/charts/chart-7'; +import { Chart8 } from '@/components/widgets/charts/chart-8'; +import { Chart9 } from '@/components/widgets/charts/chart-9'; +import { Chart10 } from '@/components/widgets/charts/chart-10'; +import { Chart11 } from '@/components/widgets/charts/chart-11'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Charts | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Chart 1', element: }, + { title: 'Chart 2', element: }, + { title: 'Chart 3', element: }, + { title: 'Chart 4', element: }, + { title: 'Chart 5', element: }, + { title: 'Chart 6', element: }, + { title: 'Chart 7', element: }, + { title: 'Chart 8', element: }, + { title: 'Chart 9', element: }, + { title: 'Chart 10', element: }, + { title: 'Chart 11', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/colors/page.tsx b/002_source/cms/src/app/(marketing)/components/colors/page.tsx new file mode 100644 index 0000000..f3cb084 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/colors/page.tsx @@ -0,0 +1,31 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Colors1 } from '@/components/widgets/colors/colors-1'; +import { Colors2 } from '@/components/widgets/colors/colors-2'; +import { Colors3 } from '@/components/widgets/colors/colors-3'; +import { Colors4 } from '@/components/widgets/colors/colors-4'; +import { Colors5 } from '@/components/widgets/colors/colors-5'; +import { Colors6 } from '@/components/widgets/colors/colors-6'; +import { Colors7 } from '@/components/widgets/colors/colors-7'; +import { Colors8 } from '@/components/widgets/colors/colors-8'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Colors | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { element: , title: 'Text colors' }, + { element: , title: 'Primary colors' }, + { element: , title: 'Secondary colors' }, + { element: , title: 'Success colors' }, + { element: , title: 'Info colors' }, + { element: , title: 'Warning colors' }, + { element: , title: 'Error colors' }, + { element: , title: 'Neutral colors' }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/detail-lists/page.tsx b/002_source/cms/src/app/(marketing)/components/detail-lists/page.tsx new file mode 100644 index 0000000..c0618a0 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/detail-lists/page.tsx @@ -0,0 +1,29 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { DetailList1 } from '@/components/widgets/detail-lists/detail-list-1'; +import { DetailList2 } from '@/components/widgets/detail-lists/detail-list-2'; +import { DetailList3 } from '@/components/widgets/detail-lists/detail-list-3'; +import { DetailList4 } from '@/components/widgets/detail-lists/detail-list-4'; +import { DetailList5 } from '@/components/widgets/detail-lists/detail-list-5'; +import { DetailList6 } from '@/components/widgets/detail-lists/detail-list-6'; +import { DetailList7 } from '@/components/widgets/detail-lists/detail-list-7'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Detail lists | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Detail list 1', element: }, + { title: 'Detail list 2', element: }, + { title: 'Detail list 3', element: }, + { title: 'Detail list 4', element: }, + { title: 'Detail list 5', element: }, + { title: 'Detail list 6', element: }, + { title: 'Detail list 7', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/forms/page.tsx b/002_source/cms/src/app/(marketing)/components/forms/page.tsx new file mode 100644 index 0000000..0523d8a --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/forms/page.tsx @@ -0,0 +1,47 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Form1 } from '@/components/widgets/forms/form-1'; +import { Form2 } from '@/components/widgets/forms/form-2'; +import { Form3 } from '@/components/widgets/forms/form-3'; +import { Form4 } from '@/components/widgets/forms/form-4'; +import { Form5 } from '@/components/widgets/forms/form-5'; +import { Form6 } from '@/components/widgets/forms/form-6'; +import { Form7 } from '@/components/widgets/forms/form-7'; +import { Form8 } from '@/components/widgets/forms/form-8'; +import { Form9 } from '@/components/widgets/forms/form-9'; +import { Form10 } from '@/components/widgets/forms/form-10'; +import { Form11 } from '@/components/widgets/forms/form-11'; +import { Form12 } from '@/components/widgets/forms/form-12'; +import { Form13 } from '@/components/widgets/forms/form-13'; +import { Form14 } from '@/components/widgets/forms/form-14'; +import { Form15 } from '@/components/widgets/forms/form-15'; +import { Form16 } from '@/components/widgets/forms/form-16'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Forms | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Form 1', element: }, + { title: 'Form 2', element: }, + { title: 'Form 3', element: }, + { title: 'Form 4', element: }, + { title: 'Form 5', element: }, + { title: 'Form 6', element: }, + { title: 'Form 7', element: }, + { title: 'Form 8', element: }, + { title: 'Form 9', element: }, + { title: 'Form 10', element: }, + { title: 'Form 11', element: }, + { title: 'Form 12', element: }, + { title: 'Form 13', element: }, + { title: 'Form 14', element: }, + { title: 'Form 15', element: }, + { title: 'Form 16', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/grid-lists/page.tsx b/002_source/cms/src/app/(marketing)/components/grid-lists/page.tsx new file mode 100644 index 0000000..c71008a --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/grid-lists/page.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { GridList1 } from '@/components/widgets/grid-lists/grid-list-1'; +import { GridList2 } from '@/components/widgets/grid-lists/grid-list-2'; +import { GridList3 } from '@/components/widgets/grid-lists/grid-list-3'; +import { GridList4 } from '@/components/widgets/grid-lists/grid-list-4'; +import { GridList5 } from '@/components/widgets/grid-lists/grid-list-5'; +import { GridList6 } from '@/components/widgets/grid-lists/grid-list-6'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Grid lists | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Grid list 1', element: }, + { title: 'Grid list 2', element: }, + { title: 'Grid list 3', element: }, + { title: 'Grid list 4', element: }, + { title: 'Grid list 5', element: }, + { title: 'Grid list 6', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/grouped-lists/page.tsx b/002_source/cms/src/app/(marketing)/components/grouped-lists/page.tsx new file mode 100644 index 0000000..c80b272 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/grouped-lists/page.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { GroupedList1 } from '@/components/widgets/grouped-lists/grouped-list-1'; +import { GroupedList2 } from '@/components/widgets/grouped-lists/grouped-list-2'; +import { GroupedList3 } from '@/components/widgets/grouped-lists/grouped-list-3'; +import { GroupedList4 } from '@/components/widgets/grouped-lists/grouped-list-4'; +import { GroupedList5 } from '@/components/widgets/grouped-lists/grouped-list-5'; +import { GroupedList6 } from '@/components/widgets/grouped-lists/grouped-list-6'; +import { GroupedList7 } from '@/components/widgets/grouped-lists/grouped-list-7'; +import { GroupedList8 } from '@/components/widgets/grouped-lists/grouped-list-8'; +import { GroupedList9 } from '@/components/widgets/grouped-lists/grouped-list-9'; +import { GroupedList10 } from '@/components/widgets/grouped-lists/grouped-list-10'; +import { GroupedList11 } from '@/components/widgets/grouped-lists/grouped-list-11'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Grouped lists | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Grouped list 1', element: }, + { title: 'Grouped list 2', element: }, + { title: 'Grouped list 3', element: }, + { title: 'Grouped list 4', element: }, + { title: 'Grouped list 5', element: }, + { title: 'Grouped list 6', element: }, + { title: 'Grouped list 7', element: }, + { title: 'Grouped list 8', element: }, + { title: 'Grouped list 9', element: }, + { title: 'Grouped list 10', element: }, + { title: 'Grouped list 11', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/inputs/page.tsx b/002_source/cms/src/app/(marketing)/components/inputs/page.tsx new file mode 100644 index 0000000..e0295cb --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/inputs/page.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Inputs1 } from '@/components/widgets/inputs/inputs-1'; +import { Inputs2 } from '@/components/widgets/inputs/inputs-2'; +import { Inputs3 } from '@/components/widgets/inputs/inputs-3'; +import { Inputs4 } from '@/components/widgets/inputs/inputs-4'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; + +export const metadata = { title: `Inputs | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Inputs 1', element: }, + { title: 'Inputs 2', element: }, + { title: 'Inputs 3', element: }, + { title: 'Inputs 4', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/modals/page.tsx b/002_source/cms/src/app/(marketing)/components/modals/page.tsx new file mode 100644 index 0000000..7d4fa25 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/modals/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; +import { Modal1 } from '@/components/widgets/modals/modal-1'; +import { Modal2 } from '@/components/widgets/modals/modal-2'; +import { Modal3 } from '@/components/widgets/modals/modal-3'; +import { Modal4 } from '@/components/widgets/modals/modal-4'; +import { Modal5 } from '@/components/widgets/modals/modal-5'; +import { Modal6 } from '@/components/widgets/modals/modal-6'; +import { Modal7 } from '@/components/widgets/modals/modal-7'; +import { Modal8 } from '@/components/widgets/modals/modal-8'; +import { Modal9 } from '@/components/widgets/modals/modal-9'; +import { Modal10 } from '@/components/widgets/modals/modal-10'; + +export const metadata = { title: `Modals | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Modal 1', element: }, + { title: 'Modal 2', element: }, + { title: 'Modal 3', element: }, + { title: 'Modal 4', element: }, + { title: 'Modal 5', element: }, + { title: 'Modal 6', element: }, + { title: 'Modal 7', element: }, + { title: 'Modal 8', element: }, + { title: 'Modal 9', element: }, + { title: 'Modal 10', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/page.tsx b/002_source/cms/src/app/(marketing)/components/page.tsx new file mode 100644 index 0000000..c443eb4 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/page.tsx @@ -0,0 +1,219 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import Container from '@mui/material/Container'; +import Divider from '@mui/material/Divider'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { Link as LinkIcon } from '@phosphor-icons/react/dist/ssr/Link'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { Thumbnail } from '@/components/widgets/thumbnail'; + +export const metadata = { title: `Components | ${config.site.name}` } satisfies Metadata; + +interface Item { + title: string; + description: string; + imageDark: string; + imageLight: string; + href: string; + newTab?: boolean; +} + +interface Section { + title: string; + items: Item[]; +} + +const sections: Section[] = [ + { + title: 'Data Display', + items: [ + { + title: 'Detail Lists', + description: '8 components', + imageDark: `/assets/thumbnail-detail-list-dark.png`, + imageLight: `/assets/thumbnail-detail-list-light.png`, + href: paths.components.detailLists, + }, + { + title: 'Tables', + description: '11 components', + imageDark: `/assets/thumbnail-tables-dark.png`, + imageLight: `/assets/thumbnail-tables-light.png`, + href: paths.components.tables, + }, + { + title: 'Quick Stats', + description: '8 components', + imageDark: `/assets/thumbnail-quick-stats-dark.png`, + imageLight: `/assets/thumbnail-quick-stats-light.png`, + href: paths.components.quickStats, + }, + ], + }, + { + title: 'Lists', + items: [ + { + title: 'Grouped Lists', + description: '11 components', + imageDark: `/assets/thumbnail-grouped-lists-dark.png`, + imageLight: `/assets/thumbnail-grouped-lists-light.png`, + href: paths.components.groupedLists, + }, + { + title: 'Grid Lists', + description: '6 components', + imageDark: `/assets/thumbnail-grid-lists-dark.png`, + imageLight: `/assets/thumbnail-grid-lists-light.png`, + href: paths.components.gridLists, + }, + ], + }, + { + title: 'Forms', + items: [ + { + title: 'Forms', + description: '17 components', + imageDark: `/assets/thumbnail-forms-dark.png`, + imageLight: `/assets/thumbnail-forms-light.png`, + href: paths.components.forms, + }, + ], + }, + { + title: 'Overlays', + items: [ + { + title: 'Modals', + description: '12 components', + imageDark: `/assets/thumbnail-modals-dark.png`, + imageLight: `/assets/thumbnail-modals-light.png`, + href: paths.components.modals, + }, + ], + }, + { + title: 'Charts', + items: [ + { + title: 'Charts', + description: '12 components', + imageDark: `/assets/thumbnail-charts-dark.png`, + imageLight: `/assets/thumbnail-charts-light.png`, + href: paths.components.charts, + }, + ], + }, + { + title: 'Components', + items: [ + { + title: 'Buttons', + description: '', + imageDark: `/assets/thumbnail-buttons-dark.png`, + imageLight: `/assets/thumbnail-buttons-light.png`, + href: paths.components.buttons, + }, + { + title: 'Typography', + description: '', + imageDark: `/assets/thumbnail-typography-dark.png`, + imageLight: `/assets/thumbnail-typography-light.png`, + href: paths.components.typography, + }, + { + title: 'Colors', + description: '', + imageDark: `/assets/thumbnail-colors-dark.png`, + imageLight: `/assets/thumbnail-colors-light.png`, + href: paths.components.colors, + }, + { + title: 'Inputs', + description: '', + imageDark: `/assets/thumbnail-inputs-dark.png`, + imageLight: `/assets/thumbnail-inputs-light.png`, + href: paths.components.inputs, + }, + ], + }, +]; + +export default function Page(): React.JSX.Element { + return ( +
+ + + + Browse components + + Browse through over 100 individual components and over 35 screens + + + + + + + } spacing={3}> + {sections.map((section) => ( + + + + {section.title} + + + + + {section.items.map((item) => ( + + + +
+ + {item.title} + {item.newTab ? : null} + + + {item.description} + +
+
+
+ ))} +
+
+
+ ))} +
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/(marketing)/components/quick-stats/page.tsx b/002_source/cms/src/app/(marketing)/components/quick-stats/page.tsx new file mode 100644 index 0000000..14a534f --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/quick-stats/page.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; +import { QuickStats1 } from '@/components/widgets/quick-stats/quick-stats-1'; +import { QuickStats2 } from '@/components/widgets/quick-stats/quick-stats-2'; +import { QuickStats3 } from '@/components/widgets/quick-stats/quick-stats-3'; +import { QuickStats4 } from '@/components/widgets/quick-stats/quick-stats-4'; +import { QuickStats5 } from '@/components/widgets/quick-stats/quick-stats-5'; +import { QuickStats6 } from '@/components/widgets/quick-stats/quick-stats-6'; +import { QuickStats7 } from '@/components/widgets/quick-stats/quick-stats-7'; +import { QuickStats8 } from '@/components/widgets/quick-stats/quick-stats-8'; +import { QuickStats9 } from '@/components/widgets/quick-stats/quick-stats-9'; +import { QuickStats10 } from '@/components/widgets/quick-stats/quick-stats-10'; +import { QuickStats11 } from '@/components/widgets/quick-stats/quick-stats-11'; + +export const metadata = { title: `Quick stats | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Quick stats 1', element: }, + { title: 'Quick stats 2', element: }, + { title: 'Quick stats 3', element: }, + { title: 'Quick stats 4', element: }, + { title: 'Quick stats 5', element: }, + { title: 'Quick stats 6', element: }, + { title: 'Quick stats 7', element: }, + { title: 'Quick stats 8', element: }, + { title: 'Quick stats 9', element: }, + { title: 'Quick stats 10', element: }, + { title: 'Quick stats 11', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/tables/page.tsx b/002_source/cms/src/app/(marketing)/components/tables/page.tsx new file mode 100644 index 0000000..c99f0e5 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/tables/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import type { Component } from '@/components/widgets/layout'; +import { Layout } from '@/components/widgets/layout'; +import { Table1 } from '@/components/widgets/tables/table-1'; +import { Table2 } from '@/components/widgets/tables/table-2'; +import { Table3 } from '@/components/widgets/tables/table-3'; +import { Table4 } from '@/components/widgets/tables/table-4'; +import { Table5 } from '@/components/widgets/tables/table-5'; +import { Table6 } from '@/components/widgets/tables/table-6'; +import { Table7 } from '@/components/widgets/tables/table-7'; +import { Table8 } from '@/components/widgets/tables/table-8'; +import { Table9 } from '@/components/widgets/tables/table-9'; +import { Table10 } from '@/components/widgets/tables/table-10'; + +export const metadata = { title: `Tables | Components | ${config.site.name}` } satisfies Metadata; + +const components = [ + { title: 'Table 1', element: }, + { title: 'Table 2', element: }, + { title: 'Table 3', element: }, + { title: 'Table 4', element: }, + { title: 'Table 5', element: }, + { title: 'Table 6', element: }, + { title: 'Table 7', element: }, + { title: 'Table 8', element: }, + { title: 'Table 9', element: }, + { title: 'Table 10', element: }, +] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/components/typography/page.tsx b/002_source/cms/src/app/(marketing)/components/typography/page.tsx new file mode 100644 index 0000000..05d3fde --- /dev/null +++ b/002_source/cms/src/app/(marketing)/components/typography/page.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Layout } from '@/components/widgets/layout'; +import type { Component } from '@/components/widgets/layout'; +import { Typography1 } from '@/components/widgets/typography/typography-1'; + +export const metadata = { title: `Typography | Components | ${config.site.name}` } satisfies Metadata; + +const components = [{ title: 'Typography 1', element: }] satisfies Component[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/(marketing)/layout.tsx b/002_source/cms/src/app/(marketing)/layout.tsx new file mode 100644 index 0000000..ba5df1b --- /dev/null +++ b/002_source/cms/src/app/(marketing)/layout.tsx @@ -0,0 +1,33 @@ +import * as React from 'react'; +import GlobalStyles from '@mui/material/GlobalStyles'; + +import { Footer } from '@/components/marketing/layout/footer'; +import { MainNav } from '@/components/marketing/layout/main-nav'; + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return ( + + +
+ + {children} +
+
+
+ ); +} diff --git a/002_source/cms/src/app/(marketing)/page.tsx b/002_source/cms/src/app/(marketing)/page.tsx new file mode 100644 index 0000000..3c52ede --- /dev/null +++ b/002_source/cms/src/app/(marketing)/page.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { Faqs } from '@/components/marketing/home/faqs'; +import { Features } from '@/components/marketing/home/features'; +import { Hero } from '@/components/marketing/home/hero'; +import { Included } from '@/components/marketing/home/included'; +import { Productivity } from '@/components/marketing/home/productivity'; +import { StartBuilding } from '@/components/marketing/home/start-building'; +import { Testimonails } from '@/components/marketing/home/testimonials'; + +export const metadata = { title: config.site.name, description: config.site.description } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( +
+ + + + + + + +
+ ); +} diff --git a/002_source/cms/src/app/(marketing)/pricing/page.tsx b/002_source/cms/src/app/(marketing)/pricing/page.tsx new file mode 100644 index 0000000..e29c4f7 --- /dev/null +++ b/002_source/cms/src/app/(marketing)/pricing/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Divider from '@mui/material/Divider'; + +import { config } from '@/config'; +import { Faqs } from '@/components/marketing/pricing/faqs'; +import { PlansTable } from '@/components/marketing/pricing/plans-table'; + +export const metadata = { title: `Pricing | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( +
+ + + +
+ ); +} diff --git a/002_source/cms/src/app/auth/auth0/callback/route.ts b/002_source/cms/src/app/auth/auth0/callback/route.ts new file mode 100644 index 0000000..83b6d37 --- /dev/null +++ b/002_source/cms/src/app/auth/auth0/callback/route.ts @@ -0,0 +1,10 @@ +import type { NextRequest } from 'next/server'; +import type { AppRouteHandlerFnContext } from '@auth0/nextjs-auth0'; + +import { auth0 } from '@/lib/auth/auth0/server'; + +export const dynamic = 'force-dynamic'; + +export async function GET(req: NextRequest, ctx: AppRouteHandlerFnContext): Promise { + return auth0.handleCallback(req, ctx); +} diff --git a/002_source/cms/src/app/auth/auth0/profile/route.ts b/002_source/cms/src/app/auth/auth0/profile/route.ts new file mode 100644 index 0000000..0a2e88b --- /dev/null +++ b/002_source/cms/src/app/auth/auth0/profile/route.ts @@ -0,0 +1,10 @@ +import type { NextRequest } from 'next/server'; +import type { AppRouteHandlerFnContext } from '@auth0/nextjs-auth0'; + +import { auth0 } from '@/lib/auth/auth0/server'; + +export const dynamic = 'force-dynamic'; + +export async function GET(req: NextRequest, ctx: AppRouteHandlerFnContext): Promise { + return auth0.handleProfile(req, ctx, {}); +} diff --git a/002_source/cms/src/app/auth/auth0/sign-in/route.ts b/002_source/cms/src/app/auth/auth0/sign-in/route.ts new file mode 100644 index 0000000..e8d4e1e --- /dev/null +++ b/002_source/cms/src/app/auth/auth0/sign-in/route.ts @@ -0,0 +1,15 @@ +import type { NextRequest } from 'next/server'; +import type { AppRouteHandlerFnContext } from '@auth0/nextjs-auth0'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { auth0 } from '@/lib/auth/auth0/server'; + +export const dynamic = 'force-dynamic'; + +export async function GET(req: NextRequest, ctx: AppRouteHandlerFnContext): Promise { + return auth0.handleLogin(req, ctx, { + authorizationParams: { redirect_uri: new URL(paths.auth.auth0.callback, config.auth0.baseUrl).toString() }, + returnTo: new URL(paths.dashboard.overview, config.auth0.baseUrl).toString(), + }); +} diff --git a/002_source/cms/src/app/auth/auth0/sign-out/route.ts b/002_source/cms/src/app/auth/auth0/sign-out/route.ts new file mode 100644 index 0000000..c0f3883 --- /dev/null +++ b/002_source/cms/src/app/auth/auth0/sign-out/route.ts @@ -0,0 +1,10 @@ +import type { NextRequest } from 'next/server'; +import type { AppRouteHandlerFnContext } from '@auth0/nextjs-auth0'; + +import { auth0 } from '@/lib/auth/auth0/server'; + +export const dynamic = 'force-dynamic'; + +export async function GET(req: NextRequest, ctx: AppRouteHandlerFnContext): Promise { + return auth0.handleLogout(req, ctx); +} diff --git a/002_source/cms/src/app/auth/auth0/sign-up/route.ts b/002_source/cms/src/app/auth/auth0/sign-up/route.ts new file mode 100644 index 0000000..72d85c2 --- /dev/null +++ b/002_source/cms/src/app/auth/auth0/sign-up/route.ts @@ -0,0 +1,13 @@ +import type { NextRequest } from 'next/server'; +import type { AppRouteHandlerFnContext } from '@auth0/nextjs-auth0'; + +import { config } from '@/config'; +import { auth0 } from '@/lib/auth/auth0/server'; + +export const dynamic = 'force-dynamic'; + +export async function GET(req: NextRequest, ctx: AppRouteHandlerFnContext): Promise { + return auth0.handleLogin(req, ctx, { + authorizationParams: { redirect_uri: `${config.auth0.baseUrl}/auth/auth0/callback`, login_hint: 'signup' }, + }); +} diff --git a/002_source/cms/src/app/auth/cognito/layout.tsx b/002_source/cms/src/app/auth/cognito/layout.tsx new file mode 100644 index 0000000..04d4763 --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/layout.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; + +import { AuthStrategy } from '@/lib/auth/strategy'; +import { StrategyGuard } from '@/components/auth/strategy-guard'; + +// We are not adding the auth check because there might be individual pages that require the user to be authenticated. +// Another reason is that layouts get cached and loaded only once for all children. + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return {children}; +} diff --git a/002_source/cms/src/app/auth/cognito/new-password-required/page.tsx b/002_source/cms/src/app/auth/cognito/new-password-required/page.tsx new file mode 100644 index 0000000..9b59e62 --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/new-password-required/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { NewPasswordRequiredForm } from '@/components/auth/cognito/new-password-required-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `New password required | Cognito | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/cognito/reset-password/page.tsx b/002_source/cms/src/app/auth/cognito/reset-password/page.tsx new file mode 100644 index 0000000..1256f58 --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/reset-password/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ResetPasswordForm } from '@/components/auth/cognito/reset-password-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Reset password | Cognito | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/cognito/sign-in/page.tsx b/002_source/cms/src/app/auth/cognito/sign-in/page.tsx new file mode 100644 index 0000000..592a7a2 --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/sign-in/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { SignInForm } from '@/components/auth/cognito/sign-in-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign in | Cognito | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/cognito/sign-up-confirm/page.tsx b/002_source/cms/src/app/auth/cognito/sign-up-confirm/page.tsx new file mode 100644 index 0000000..8383e0b --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/sign-up-confirm/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; + +import { config } from '@/config'; +import { SignUpConfirmForm } from '@/components/auth/cognito/sign-up-confirm-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign up confirm | Cognito | Auth | ${config.site.name}` }; + +interface PageProps { + searchParams: { email?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { email } = searchParams; + + if (!email) { + return ( + + Email is required + + ); + } + + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/cognito/sign-up/page.tsx b/002_source/cms/src/app/auth/cognito/sign-up/page.tsx new file mode 100644 index 0000000..b768204 --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/sign-up/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { SignUpForm } from '@/components/auth/cognito/sign-up-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign up | Cognito | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/cognito/update-password/page.tsx b/002_source/cms/src/app/auth/cognito/update-password/page.tsx new file mode 100644 index 0000000..7f7ec45 --- /dev/null +++ b/002_source/cms/src/app/auth/cognito/update-password/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; + +import { config } from '@/config'; +import { UpdatePasswordForm } from '@/components/auth/cognito/update-password-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Update password | Cognito | Auth | ${config.site.name}` }; + +interface PageProps { + searchParams: { email?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { email } = searchParams; + + if (!email) { + return ( + + Email is required + + ); + } + + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/custom/layout.tsx b/002_source/cms/src/app/auth/custom/layout.tsx new file mode 100644 index 0000000..ded64ca --- /dev/null +++ b/002_source/cms/src/app/auth/custom/layout.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; + +import { AuthStrategy } from '@/lib/auth/strategy'; +import { StrategyGuard } from '@/components/auth/strategy-guard'; + +// We are not adding the auth check because there might be individual pages that require the user to be authenticated. +// Another reason is that layouts get cached and loaded only once for all children. + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return {children}; +} diff --git a/002_source/cms/src/app/auth/custom/reset-password/page.tsx b/002_source/cms/src/app/auth/custom/reset-password/page.tsx new file mode 100644 index 0000000..b04e51c --- /dev/null +++ b/002_source/cms/src/app/auth/custom/reset-password/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ResetPasswordForm } from '@/components/auth/custom/reset-password-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Reset password | Custom | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/custom/sign-in/page.tsx b/002_source/cms/src/app/auth/custom/sign-in/page.tsx new file mode 100644 index 0000000..e397cf2 --- /dev/null +++ b/002_source/cms/src/app/auth/custom/sign-in/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { SignInForm } from '@/components/auth/custom/sign-in-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign in | Custom | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/custom/sign-up/page.tsx b/002_source/cms/src/app/auth/custom/sign-up/page.tsx new file mode 100644 index 0000000..d8106ea --- /dev/null +++ b/002_source/cms/src/app/auth/custom/sign-up/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { SignUpForm } from '@/components/auth/custom/sign-up-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign up | Custom | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/firebase/layout.tsx b/002_source/cms/src/app/auth/firebase/layout.tsx new file mode 100644 index 0000000..265292f --- /dev/null +++ b/002_source/cms/src/app/auth/firebase/layout.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; + +import { AuthStrategy } from '@/lib/auth/strategy'; +import { StrategyGuard } from '@/components/auth/strategy-guard'; + +// We are not adding the auth check because there might be individual pages that require the user to be authenticated. +// Another reason is that layouts get cached and loaded only once for all children. + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return {children}; +} diff --git a/002_source/cms/src/app/auth/firebase/recovery-link-sent/page.tsx b/002_source/cms/src/app/auth/firebase/recovery-link-sent/page.tsx new file mode 100644 index 0000000..dc34ed7 --- /dev/null +++ b/002_source/cms/src/app/auth/firebase/recovery-link-sent/page.tsx @@ -0,0 +1,63 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { ResetPasswordButton } from '@/components/auth/firebase/reset-password-button'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Recovery link sent | Firebase | Auth | ${config.site.name}` }; + +interface PageProps { + searchParams: { email?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { email } = searchParams; + + if (!email) { + return ( + + Email is required + + ); + } + + return ( + + + +
+ + + +
+ Recovery link sent + + + If an account exists with email{' '} + + "{email}" + + , you will receive a recovery email. + +
+ + Use another email + +
+
+ Resend +
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/firebase/reset-password/page.tsx b/002_source/cms/src/app/auth/firebase/reset-password/page.tsx new file mode 100644 index 0000000..13a5ad0 --- /dev/null +++ b/002_source/cms/src/app/auth/firebase/reset-password/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ResetPasswordForm } from '@/components/auth/firebase/reset-password-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Reset password | Firebase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/firebase/sign-in/page.tsx b/002_source/cms/src/app/auth/firebase/sign-in/page.tsx new file mode 100644 index 0000000..e806928 --- /dev/null +++ b/002_source/cms/src/app/auth/firebase/sign-in/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { SignInForm } from '@/components/auth/firebase/sign-in-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign in | Firebase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/firebase/sign-up/page.tsx b/002_source/cms/src/app/auth/firebase/sign-up/page.tsx new file mode 100644 index 0000000..61393e5 --- /dev/null +++ b/002_source/cms/src/app/auth/firebase/sign-up/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { SignUpForm } from '@/components/auth/firebase/sign-up-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Sign up | Firebase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/firebase/update-password/page.tsx b/002_source/cms/src/app/auth/firebase/update-password/page.tsx new file mode 100644 index 0000000..d38a284 --- /dev/null +++ b/002_source/cms/src/app/auth/firebase/update-password/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; + +import { config } from '@/config'; +import { UpdatePasswordForm } from '@/components/auth/firebase/update-password-form'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; + +export const metadata: Metadata = { title: `Update password | Firebase | Auth | ${config.site.name}` }; + +interface PageProps { + searchParams: { oobCode?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { oobCode } = searchParams; + + if (!oobCode) { + return ( + + Code is required + + ); + } + + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/samples/reset-password/centered/page.tsx b/002_source/cms/src/app/auth/samples/reset-password/centered/page.tsx new file mode 100644 index 0000000..f6c6058 --- /dev/null +++ b/002_source/cms/src/app/auth/samples/reset-password/centered/page.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CenteredLayout } from '@/components/auth/centered-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Reset password | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + + + + + Email address + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/reset-password/split/page.tsx b/002_source/cms/src/app/auth/samples/reset-password/split/page.tsx new file mode 100644 index 0000000..b871e96 --- /dev/null +++ b/002_source/cms/src/app/auth/samples/reset-password/split/page.tsx @@ -0,0 +1,55 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Reset password | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ Reset Password + + + Email address + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/sign-in/centered/page.tsx b/002_source/cms/src/app/auth/samples/sign-in/centered/page.tsx new file mode 100644 index 0000000..6ad136f --- /dev/null +++ b/002_source/cms/src/app/auth/samples/sign-in/centered/page.tsx @@ -0,0 +1,78 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CenteredLayout } from '@/components/auth/centered-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Sign in | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + + Don't have an account? Sign up + + } + title="Sign in" + /> + + + + + Email address + + + + Password + + + + +
+ Forgot password? +
+
+
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/sign-in/split/page.tsx b/002_source/cms/src/app/auth/samples/sign-in/split/page.tsx new file mode 100644 index 0000000..d26874f --- /dev/null +++ b/002_source/cms/src/app/auth/samples/sign-in/split/page.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Sign in | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + Sign in + + Don't have an account? Sign up + + + + + + Email address + + + + Password + + + + +
+ Forgot password? +
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/sign-up/centered/page.tsx b/002_source/cms/src/app/auth/samples/sign-up/centered/page.tsx new file mode 100644 index 0000000..9cd1be4 --- /dev/null +++ b/002_source/cms/src/app/auth/samples/sign-up/centered/page.tsx @@ -0,0 +1,89 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import Checkbox from '@mui/material/Checkbox'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CenteredLayout } from '@/components/auth/centered-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Sign up | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + + Already have an account? Sign in + + } + title="Sign up" + /> + + + + Name + + + + Email address + + + + Password + + +
+ } + label={ + + I have read the terms and conditions + + } + /> +
+ +
+
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/sign-up/split/page.tsx b/002_source/cms/src/app/auth/samples/sign-up/split/page.tsx new file mode 100644 index 0000000..ea460af --- /dev/null +++ b/002_source/cms/src/app/auth/samples/sign-up/split/page.tsx @@ -0,0 +1,80 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Sign up | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + Sign up + + Already have an account? Sign in + + + + + Name + + + + Email address + + + + Password + + +
+ } + label={ + + I have read the terms and conditions + + } + /> +
+ +
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/update-password/centered/page.tsx b/002_source/cms/src/app/auth/samples/update-password/centered/page.tsx new file mode 100644 index 0000000..0c9d6ef --- /dev/null +++ b/002_source/cms/src/app/auth/samples/update-password/centered/page.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CenteredLayout } from '@/components/auth/centered-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Update password | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + + + + + Password + + + + Confirm password + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/update-password/split/page.tsx b/002_source/cms/src/app/auth/samples/update-password/split/page.tsx new file mode 100644 index 0000000..76014b8 --- /dev/null +++ b/002_source/cms/src/app/auth/samples/update-password/split/page.tsx @@ -0,0 +1,59 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Update password | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ Update Password + + + Password + + + + Confirm password + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/verify-code/centered/page.tsx b/002_source/cms/src/app/auth/samples/verify-code/centered/page.tsx new file mode 100644 index 0000000..223205e --- /dev/null +++ b/002_source/cms/src/app/auth/samples/verify-code/centered/page.tsx @@ -0,0 +1,61 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CenteredLayout } from '@/components/auth/centered-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Verify code | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ + + + + + Code + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/auth/samples/verify-code/split/page.tsx b/002_source/cms/src/app/auth/samples/verify-code/split/page.tsx new file mode 100644 index 0000000..ce1344f --- /dev/null +++ b/002_source/cms/src/app/auth/samples/verify-code/split/page.tsx @@ -0,0 +1,55 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Verify code | Samples | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Dashboard + +
+
+ + + +
+ Verify code + + + Code + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/auth/supabase/callback/implicit/page.tsx b/002_source/cms/src/app/auth/supabase/callback/implicit/page.tsx new file mode 100644 index 0000000..674c4f5 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/callback/implicit/page.tsx @@ -0,0 +1,75 @@ +'use client'; + +import * as React from 'react'; +import { useRouter } from 'next/navigation'; +import Alert from '@mui/material/Alert'; + +import { paths } from '@/paths'; +import { logger } from '@/lib/default-logger'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; +import { toast } from '@/components/core/toaster'; + +// NOTE: This is a `Page` and not a `GET` route because +// Supabase has endpoints that still use +// Implicit Flow instead of PKCE Flow, such as `resend sign-up email` process. + +export default function Page(): React.JSX.Element | null { + const [supabaseClient] = React.useState(createSupabaseClient()); + const router = useRouter(); + const executedRef = React.useRef(false); + const [displayError, setDisplayError] = React.useState(null); + + const handle = React.useCallback(async (): Promise => { + // Prevent rerun on DEV mode + if (executedRef.current) { + return; + } + + executedRef.current = true; + + // Callback `error` is received as a URL hash `#error=value` + // Callback `access_token` is received as a URL hash `#access_token=value` + + const hash = window.location.hash || '#'; + const hashParams = new URLSearchParams(hash.split('#')[1]); + const searchParams = new URLSearchParams(window.location.search); + + if (hashParams.get('error')) { + logger.debug(hashParams.get('error_description')); + setDisplayError('Something went wrong'); + return; + } + + const accessToken = hashParams.get('access_token'); + const refreshToken = hashParams.get('refresh_token'); + + if (!accessToken || !refreshToken) { + setDisplayError('Access token or refresh token is missing'); + return; + } + + const { error } = await supabaseClient.auth.setSession({ access_token: accessToken, refresh_token: refreshToken }); + + if (error) { + logger.debug(error.message); + toast.error('Something went wrong'); + router.push(paths.auth.supabase.signIn); + return; + } + + const next = searchParams.get('next') || paths.dashboard.overview; + + router.push(next); + }, [supabaseClient, router]); + + React.useEffect((): void => { + handle().catch(logger.error); + // eslint-disable-next-line react-hooks/exhaustive-deps -- Expected + }, []); + + if (displayError) { + return {displayError}; + } + + return null; +} diff --git a/002_source/cms/src/app/auth/supabase/callback/pkce/route.tsx b/002_source/cms/src/app/auth/supabase/callback/pkce/route.tsx new file mode 100644 index 0000000..cea5943 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/callback/pkce/route.tsx @@ -0,0 +1,53 @@ +import { cookies } from 'next/headers'; +import { NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; +import { AuthApiError } from '@supabase/supabase-js'; + +import { paths } from '@/paths'; +import { logger } from '@/lib/default-logger'; +import { createClient } from '@/lib/supabase/server'; + +export const dynamic = 'force-dynamic'; + +// NOTE: If you have a proxy in front of this app +// the request origin might be a local address. +// Consider using `config.site.url` from `@/config` instead. + +// NOTE: This is not a `Page` because we only redirect and it will never render React content. + +export async function GET(req: NextRequest): Promise { + const { searchParams, origin } = req.nextUrl; + + if (searchParams.get('error')) { + return NextResponse.json({ error: searchParams.get('error_description') || 'Something went wrong' }); + } + + const code = searchParams.get('code'); + + if (!code) { + return NextResponse.json({ error: 'Code is missing' }); + } + + const cookieStore = cookies(); + const supabaseClient = createClient(cookieStore); + + try { + const { error } = await supabaseClient.auth.exchangeCodeForSession(code); + + if (error) { + return NextResponse.json({ error: error.message }); + } + } catch (err) { + if (err instanceof AuthApiError && err.message.includes('code and code verifier should be non-empty')) { + return NextResponse.json({ error: 'Please open the link in the same browser' }); + } + + logger.error('Callback error', err); + + return NextResponse.json({ error: 'Something went wrong' }); + } + + const next = searchParams.get('next') || paths.home; + + return NextResponse.redirect(new URL(next, origin)); +} diff --git a/002_source/cms/src/app/auth/supabase/layout.tsx b/002_source/cms/src/app/auth/supabase/layout.tsx new file mode 100644 index 0000000..d8eccf1 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/layout.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; + +import { AuthStrategy } from '@/lib/auth/strategy'; +import { StrategyGuard } from '@/components/auth/strategy-guard'; + +// We are not adding the auth check because there might be individual pages that require the user to be authenticated. +// Another reason is that layouts get cached and loaded only once for all children. + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return {children}; +} diff --git a/002_source/cms/src/app/auth/supabase/recovery-link-sent/page.tsx b/002_source/cms/src/app/auth/supabase/recovery-link-sent/page.tsx new file mode 100644 index 0000000..99465c0 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/recovery-link-sent/page.tsx @@ -0,0 +1,63 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { ResetPasswordButton } from '@/components/auth/supabase/reset-password-button'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Recovery link sent | Supabase | Auth | ${config.site.name}` }; + +interface PageProps { + searchParams: { email?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { email } = searchParams; + + if (!email) { + return ( + + Email is required + + ); + } + + return ( + + + +
+ + + +
+ Recovery link sent + + + If an account exists with email{' '} + + "{email}" + + , you will receive a recovery email. + +
+ + Use another email + +
+
+ Resend +
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/supabase/reset-password/page.tsx b/002_source/cms/src/app/auth/supabase/reset-password/page.tsx new file mode 100644 index 0000000..19c7557 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/reset-password/page.tsx @@ -0,0 +1,33 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { ResetPasswordForm } from '@/components/auth/supabase/reset-password-form'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Reset password | Supabase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + +
+ Reset password + +
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/supabase/sign-in/page.tsx b/002_source/cms/src/app/auth/supabase/sign-in/page.tsx new file mode 100644 index 0000000..cd6eec1 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/sign-in/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { SignInForm } from '@/components/auth/supabase/sign-in-form'; + +export const metadata: Metadata = { title: `Sign in | Supabase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/supabase/sign-up-confirm/page.tsx b/002_source/cms/src/app/auth/supabase/sign-up-confirm/page.tsx new file mode 100644 index 0000000..4331c0e --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/sign-up-confirm/page.tsx @@ -0,0 +1,55 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { SignUpResendButton } from '@/components/auth/supabase/sign-up-resend-button'; +import { DynamicLogo } from '@/components/core/logo'; + +export const metadata: Metadata = { title: `Sign up confirm | Supabase | Auth | ${config.site.name}` }; + +interface PageProps { + searchParams: { email?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { email } = searchParams; + + if (!email) { + return ( + + Email is required + + ); + } + + return ( + + + +
+ + + +
+ Confirm your email + + We've sent a verification email to{' '} + + "{email}" + + . + + Resend +
+
+
+ ); +} diff --git a/002_source/cms/src/app/auth/supabase/sign-up/page.tsx b/002_source/cms/src/app/auth/supabase/sign-up/page.tsx new file mode 100644 index 0000000..0b0717f --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/sign-up/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { GuestGuard } from '@/components/auth/guest-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { SignUpForm } from '@/components/auth/supabase/sign-up-form'; + +export const metadata: Metadata = { title: `Sign up | Supabase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/auth/supabase/update-password/page.tsx b/002_source/cms/src/app/auth/supabase/update-password/page.tsx new file mode 100644 index 0000000..efddc37 --- /dev/null +++ b/002_source/cms/src/app/auth/supabase/update-password/page.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { AuthGuard } from '@/components/auth/auth-guard'; +import { SplitLayout } from '@/components/auth/split-layout'; +import { UpdatePasswordForm } from '@/components/auth/supabase/update-password-form'; + +export const metadata: Metadata = { title: `Update password | Supabase | Auth | ${config.site.name}` }; + +export default function Page(): React.JSX.Element { + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/checkout/page.tsx b/002_source/cms/src/app/checkout/page.tsx new file mode 100644 index 0000000..a30b6b6 --- /dev/null +++ b/002_source/cms/src/app/checkout/page.tsx @@ -0,0 +1,77 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; +import { ArrowRight as ArrowRightIcon } from '@phosphor-icons/react/dist/ssr/ArrowRight'; +import { Lock as LockIcon } from '@phosphor-icons/react/dist/ssr/Lock'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CheckoutForm } from '@/components/marketing/checkout/checkout-form'; +import { OrderSummary } from '@/components/marketing/checkout/order-summary'; + +export const metadata = { title: `Checkout | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( +
+ + + +
+ + + Home + +
+ Checkout +
+ + + + + + + + + + + + + + Secure checkout + + + Your purchases are secured by an industry best encryption service - Stripe + +
+ +
+
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/contact/page.tsx b/002_source/cms/src/app/contact/page.tsx new file mode 100644 index 0000000..988081d --- /dev/null +++ b/002_source/cms/src/app/contact/page.tsx @@ -0,0 +1,76 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { ContactForm } from '@/components/marketing/contact/contact-form'; +import { Customers } from '@/components/marketing/contact/customers'; + +export const metadata = { title: `Contact | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + +
+ + + Home + +
+ + Talk to our account expert + + Have questions about integrating our APIs? Fill out the form and a senior web expert will be in touch + shortly. + + + Join 10,000+ forward-thinking companies: + + + +
+
+
+ + + + Fill the form below + + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/academy/courses/[courseId]/page.tsx b/002_source/cms/src/app/dashboard/academy/courses/[courseId]/page.tsx new file mode 100644 index 0000000..c584e79 --- /dev/null +++ b/002_source/cms/src/app/dashboard/academy/courses/[courseId]/page.tsx @@ -0,0 +1,104 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { ChapterView } from '@/components/dashboard/academy/chapter-view'; +import { CourseSummary } from '@/components/dashboard/academy/course-summary'; +import type { Chapter, Course } from '@/components/dashboard/academy/types'; + +export const metadata = { title: `Course | Academy | ${config.site.name}` } satisfies Metadata; + +const course = { + id: 'CRS-001', + title: 'React and Redux Tutorial', + description: 'Introductory course for design and framework basics', + duration: '78 hours', + progress: 50, +} satisfies Course; + +const chapters = [ + { id: 'CHAP-001', number: 1, title: 'Introduction', description: 'Introducing the app and how it works', lesson: '' }, + { + id: 'CHAP-002', + number: 2, + title: 'Installing required packages', + description: 'Installing the required packages for the project', + lesson: `Alias animi labque, deserunt distinctio eum excepturi fuga iure labore magni molestias mollitia natus, officia pofro quis sunt +temporibus veritatis voluptatem, voluptatum. Aut blanditiis esse et illum maxim, obcaecati possimus voluptate! Accusamus adipisci +amet aperiam, assumenda consequuntur fugiat inventore iusto magnam molestias natus necessitatibus, nulla pariatur. + +Adipisci alias animi debitis eos et impedit maiores, modi nam nobis officia optio perspiciatis, rerum. Accusantium esse nostrum odit quis quo: + +\`\`\`ts +const mongoose = require('mongoose'), +const uniqueValidator = require('mongoose-unique-validator'), +const bcrypt = require('bcrypt'), + +const SALT_WORK_FACTOR = 10; + +const Schema = mongoose.Schema; + +const Email = new Schema({ address: { type: String, + lowercase: true, + required: [true, "can't be blank"], + match: [/\\S+@\\S+\\.\\S+/, 'is invalid'], + index: true, + }, + // Change the default to true if you don't need to validate a new user's email address + validated: { type: Boolean, default: false }, +}); +\`\`\``, + }, + { + id: 'CHAP-003', + number: 3, + title: 'Setting up the project', + description: "Structuring the project's folders and files", + lesson: '', + }, +] satisfies Chapter[]; + +export default function Page(): React.JSX.Element { + const currentChapter = chapters[1]; + + return ( + + + + +
+ + + Academy + +
+ +
+
+ + + +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/academy/page.tsx b/002_source/cms/src/app/dashboard/academy/page.tsx new file mode 100644 index 0000000..f5290b2 --- /dev/null +++ b/002_source/cms/src/app/dashboard/academy/page.tsx @@ -0,0 +1,114 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; + +import { config } from '@/config'; +import { CourseCard } from '@/components/dashboard/academy/course-card'; +import { CoursesFilters } from '@/components/dashboard/academy/courses-filters'; +import { DailyProgress } from '@/components/dashboard/academy/daily-progress'; +import { Help } from '@/components/dashboard/academy/help'; +import type { Course } from '@/components/dashboard/academy/types'; + +export const metadata = { title: `Browse | Academy | ${config.site.name}` } satisfies Metadata; + +const courses = [ + { + id: 'CRS-003', + title: 'React Crash Course: Beginner', + description: 'Introductory course for design and framework basics', + media: '/assets/course-3.png', + duration: '21 hours', + progress: 90, + }, + { + id: 'CRS-002', + title: 'React and Express Tutorial', + description: 'Introductory course for design and framework basics', + media: '/assets/course-2.png', + duration: '14 hours', + progress: 52, + }, + { + id: 'CRS-001', + title: 'React and Redux Tutorial', + description: 'Introductory course for design and framework basics', + media: '/assets/course-1.png', + duration: '78 hours', + progress: 23, + }, +] satisfies Course[]; + +export default function Page(): React.JSX.Element { + return ( + + + + + + + Find unparalleled knowledge + Learn from the top-tier creatives and leading experts in AI + + + + + + Welcome back, Sofia + + Nice progress so far, keep it up! + + + + + + + + + + + + My courses + + {courses.map((course) => ( + + + + ))} + + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/analytics/page.tsx b/002_source/cms/src/app/dashboard/analytics/page.tsx new file mode 100644 index 0000000..e8079b1 --- /dev/null +++ b/002_source/cms/src/app/dashboard/analytics/page.tsx @@ -0,0 +1,125 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { ChannelSessionsVsBounce } from '@/components/dashboard/analytics/channel-sessions-vs-bounce-rate'; +import { CountrySessionsVsBounce } from '@/components/dashboard/analytics/country-sessions-vs-bounce-rate'; +import { Devices } from '@/components/dashboard/analytics/devices'; +import { InboundOutbound } from '@/components/dashboard/analytics/inbound-outbound'; +import { Insight } from '@/components/dashboard/analytics/insight'; +import { Summary } from '@/components/dashboard/analytics/summary'; + +export const metadata = { title: `Analytics | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Analytics + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/blank/page.tsx b/002_source/cms/src/app/dashboard/blank/page.tsx new file mode 100644 index 0000000..cb4419c --- /dev/null +++ b/002_source/cms/src/app/dashboard/blank/page.tsx @@ -0,0 +1,38 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; + +export const metadata = { title: `Blank | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Blank + +
+ +
+
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/blog/[postId]/page.tsx b/002_source/cms/src/app/dashboard/blog/[postId]/page.tsx new file mode 100644 index 0000000..9ec7d04 --- /dev/null +++ b/002_source/cms/src/app/dashboard/blog/[postId]/page.tsx @@ -0,0 +1,158 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Breadcrumbs from '@mui/material/Breadcrumbs'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Chip from '@mui/material/Chip'; +import Container from '@mui/material/Container'; +import Divider from '@mui/material/Divider'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { BreadcrumbsSeparator } from '@/components/core/breadcrumbs-separator'; +import { CommentAdd } from '@/components/dashboard/blog/comment-add'; +import { CommentBox } from '@/components/dashboard/blog/comment-box'; +import { Content } from '@/components/dashboard/blog/content'; +import { Newsletter } from '@/components/dashboard/blog/newsletter'; +import type { Comment } from '@/components/dashboard/blog/types'; + +export const metadata = { title: `Details | Blog | Dashboard | ${config.site.name}` } satisfies Metadata; + +const content = `## Cras at molestie lacus. Phasellus feugiat leo quis sem iaculis, sed mattis nibh accumsan. + +Phasellus ullamcorper ultrices ullamcorper. Nunc auctor porttitor ex, non consequat ipsum aliquam at. Duis dapibus dolor in nisi viverra, a elementum nulla viverra. Etiam feugiat turpis leo, nec finibus diam rhoncus ac. Sed at metus et orci consequat facilisis vel vel diam. + +## Cras at molestie lacus. Phasellus feugiat leo quis sem iaculis, sed mattis nibh accumsan. + + +Etiam faucibus massa auctor gravida finibus. +Cras nulla magna, dapibus sit amet accumsan nec, ullamcorper sit amet dolor. + +Donec leo nisi, porta et gravida nec, tincidunt ac velit. Aliquam in turpis a quam tempus dapibus. Morbi in tellus tempor, hendrerit mi vel, aliquet tellus. Quisque vel interdum ante. Nunc quis purus sem. Donec at risus lacinia ipsum cursus condimentum at ac dui. Nulla bibendum feugiat tellus ac tristique. Proin auctor, lectus et accumsan varius, justo odio vulputate neque, et efficitur augue leo id ex. Aliquam eget turpis nisl. Nam sapien massa, sollicitudin et vehicula a, fringilla vitae purus. Praesent a vestibulum felis. + +\`\`\`javascript +// This is a comment + +const x = () => {}; + +\`\`\` + +Class aptent taciti sociosqu ad litora torquent \`const d = 3;\` per conubia nostra, per inceptos himenaeos. Morbi maximus metus eget nulla malesuada, sit amet luctus est fringilla. Aenean imperdiet rhoncus justo, ut pharetra lorem gravida placerat. Duis et enim lorem. Aliquam placerat elit est, vitae fermentum ipsum finibus sed. Donec dapibus magna non tortor commodo rhoncus. Suspendisse luctus tincidunt eros, aliquet pellentesque neque venenatis quis. Aliquam auctor felis nec orci ornare gravida. Fusce ac neque sit amet nibh scelerisque molestie. Nullam in lorem viverra, aliquam nunc vel, interdum orci. Fusce mattis est neque, et tincidunt justo blandit quis. Etiam tincidunt purus in libero semper, vitae placerat dui vehicula. Pellentesque sit amet imperdiet purus, quis lacinia eros. + +Duis placerat turpis non metus dapibus sagittis. Vestibulum ex massa, tempus pulvinar varius at, placerat non justo. Ut tristique nisl sed porta pulvinar. Nunc ex nibh, tempor eget elit vel, fringilla ornare risus. Praesent vel lacus finibus, laoreet nulla quis, semper tellus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec volutpat quis dui ac varius. Suspendisse potenti. Maecenas sagittis lacus vitae ex rhoncus, eu fringilla urna luctus. + +## Donec vel erat augue. Aenean ut nisl cursus nulla tempus ultricies vel eget lorem. + +Suspendisse pharetra dolor in massa molestie, vel molestie nunc accumsan. Cras varius aliquet pellentesque. Curabitur ac mi fermentum nibh congue pharetra in eu nunc. Vivamus mattis urna a fringilla facilisis. Cras finibus nulla in nulla imperdiet pharetra. Morbi vel tortor turpis.`; + +const comments = [ + { + id: 'MSG-002', + content: 'Great article! Thanks for sharing.', + author: { name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + createdAt: dayjs().subtract(2, 'hour').toDate(), + }, + { + id: 'MSG-001', + createdAt: dayjs().subtract(8, 'hour').toDate(), + author: { name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + content: 'I find this article very helpful. Do you have any other resources on this topic?', + }, +] satisfies Comment[]; + +export default function Page(): React.JSX.Element | null { + return ( + + + + Post + }> + + Dashboard + + + Blog + + + Details + + + + + Hello, Sofia + + + +
+ +
+ + How to Create a Productivity Dashboard + + Learn how to create a productivity dashboard using Google Cloud and Supabase for your team. + + + + +
+ + By Jie Yan •{' '} + {dayjs().subtract(39, 'minute').subtract(7, 'hour').subtract(5, 'day').format('MMM D, YYYY')} + + + 5 min read + +
+
+ + + + + + + {comments.map((comment) => ( + + ))} + + + +
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/blog/create/page.tsx b/002_source/cms/src/app/dashboard/blog/create/page.tsx new file mode 100644 index 0000000..b50f18d --- /dev/null +++ b/002_source/cms/src/app/dashboard/blog/create/page.tsx @@ -0,0 +1,79 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Breadcrumbs from '@mui/material/Breadcrumbs'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import IconButton from '@mui/material/IconButton'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { DotsThree as DotsThreeIcon } from '@phosphor-icons/react/dist/ssr/DotsThree'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { BreadcrumbsSeparator } from '@/components/core/breadcrumbs-separator'; +import { PostForm } from '@/components/dashboard/blog/post-form'; + +export const metadata = { title: `Create | Blog | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + Create a new post + }> + + Dashboard + + + Blog + + + Create + + + + + Hello, Sofia + + + + + + + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/blog/page.tsx b/002_source/cms/src/app/dashboard/blog/page.tsx new file mode 100644 index 0000000..f7a65cd --- /dev/null +++ b/002_source/cms/src/app/dashboard/blog/page.tsx @@ -0,0 +1,141 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Breadcrumbs from '@mui/material/Breadcrumbs'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Divider from '@mui/material/Divider'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; +import { ArrowRight as ArrowRightIcon } from '@phosphor-icons/react/dist/ssr/ArrowRight'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { BreadcrumbsSeparator } from '@/components/core/breadcrumbs-separator'; +import { Newsletter } from '@/components/dashboard/blog/newsletter'; +import { PostCard } from '@/components/dashboard/blog/post-card'; +import type { Post } from '@/components/dashboard/blog/types'; + +export const metadata = { title: `List | Blog | Dashboard | ${config.site.name}` } satisfies Metadata; + +const posts = [ + { + id: 'POST-004', + title: 'Building a Design System from Scratch', + description: 'Learn how to build a design system from scratch using Figma and React that scales.', + cover: '/assets/image-business-2.png', + category: 'Programming', + author: { name: 'Iulia Albu', avatar: '/assets/avatar-6.png' }, + readTime: '5 min', + publishedAt: dayjs().subtract(45, 'minute').toDate(), + }, + { + id: 'POST-003', + title: 'Passive Income Ideas for Designers', + description: 'Explore the best passive income ideas for designers and how to get started.', + cover: '/assets/image-abstract-2.png', + category: 'Productivity', + author: { name: 'Omar Darobe', avatar: '/assets/avatar-11.png' }, + readTime: '6 min', + publishedAt: dayjs().subtract(51, 'minute').subtract(6, 'hour').toDate(), + }, + { + id: 'POST-002', + title: 'Five Ways to Improve Your Workspace', + description: 'Discover the five ways to improve your workspace and increase your productivity.', + cover: '/assets/image-minimal-2.png', + category: 'Entrepreneurs', + author: { name: 'Siegbert Gottfried', avatar: '/assets/avatar-2.png' }, + readTime: '3 min', + publishedAt: dayjs().subtract(46, 'minute').subtract(16, 'hour').toDate(), + }, + { + id: 'POST-001', + title: 'How to Create a Productivity Dashboard', + description: 'Learn how to create a productivity dashboard using Google Cloud and Supabase for your team.', + cover: '/assets/image-business-1.png', + category: 'Innovation', + author: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + readTime: '1 min', + publishedAt: dayjs().subtract(39, 'minute').subtract(7, 'hour').subtract(5, 'day').toDate(), + }, +] satisfies Post[]; + +export default function Page(): React.JSX.Element { + return ( + + + + Posts + }> + + Dashboard + + + Blog + + + List + + + + + Hello, Sofia + + + + + Recent articles +
+ + Discover the latest news, tips and user research insights from Acme. + + + You will learn about web infrastructure, design systems and devops APIs best practices. + +
+
+ + + {posts.map((post) => ( + + + + ))} + + + + + +
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/calendar/page.tsx b/002_source/cms/src/app/dashboard/calendar/page.tsx new file mode 100644 index 0000000..942ddf6 --- /dev/null +++ b/002_source/cms/src/app/dashboard/calendar/page.tsx @@ -0,0 +1,96 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { CalendarProvider } from '@/components/dashboard/calendar/calendar-context'; +import { CalendarView } from '@/components/dashboard/calendar/calendar-view'; +import type { Event, ViewMode } from '@/components/dashboard/calendar/types'; + +export const metadata = { title: `Calendar | Dashboard | ${config.site.name}` } satisfies Metadata; + +const events = [ + { + id: 'EV-007', + title: 'Sign contract', + description: 'Discuss about the new partnership', + start: dayjs().subtract(6, 'day').set('hour', 17).set('minute', 30).toDate(), + end: dayjs().subtract(6, 'day').set('hour', 19).set('minute', 0).toDate(), + allDay: false, + }, + { + id: 'EV-006', + title: 'Lunch meeting', + description: 'Meeting with the client', + start: dayjs().add(2, 'day').set('hour', 12).set('minute', 0).toDate(), + end: dayjs().add(2, 'day').set('hour', 15).set('minute', 30).toDate(), + allDay: false, + }, + { + id: 'EV-005', + title: 'Scrum meeting', + description: 'Discuss about the new project', + start: dayjs().add(5, 'day').set('hour', 8).set('minute', 0).toDate(), + end: dayjs().add(5, 'day').set('hour', 12).set('minute', 0).toDate(), + allDay: false, + }, + { + id: 'EV-004', + title: 'Meet the team', + description: 'Introduction to the new team members', + start: dayjs().subtract(11, 'day').startOf('day').toDate(), + end: dayjs().subtract(11, 'day').endOf('day').toDate(), + allDay: true, + }, + { + id: 'EV-003', + title: 'Fire John', + description: 'Sorry, John!', + start: dayjs().add(3, 'day').set('hour', 7).set('minute', 30).toDate(), + end: dayjs().add(3, 'day').set('hour', 7).set('minute', 31).toDate(), + allDay: false, + priority: 'high', + }, + { + id: 'EV-002', + title: 'Design meeting', + description: 'Plan the new design for the landing page', + start: dayjs().subtract(6, 'day').set('hour', 9).set('minute', 0).toDate(), + end: dayjs().subtract(6, 'day').set('hour', 9).set('minute', 30).toDate(), + allDay: false, + priority: 'medium', + }, + { + id: 'EV-001', + title: 'HR meeting', + description: 'Discuss about the new open positions', + start: dayjs().set('hour', 15).set('minute', 30).toDate(), + end: dayjs().set('hour', 17).set('minute', 30).toDate(), + allDay: false, + priority: 'medium', + }, +] satisfies Event[]; + +interface PageProps { + searchParams: { view?: ViewMode }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { view = 'dayGridMonth' } = searchParams; + + return ( + + + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/chat/[threadType]/[threadId]/page.tsx b/002_source/cms/src/app/dashboard/chat/[threadType]/[threadId]/page.tsx new file mode 100644 index 0000000..74a10ec --- /dev/null +++ b/002_source/cms/src/app/dashboard/chat/[threadType]/[threadId]/page.tsx @@ -0,0 +1,18 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ThreadView } from '@/components/dashboard/chat/thread-view'; +import type { ThreadType } from '@/components/dashboard/chat/types'; + +export const metadata = { title: `Thread | Chat | Dashboard | ${config.site.name}` } satisfies Metadata; + +interface PageProps { + params: { threadId: string; threadType: ThreadType }; +} + +export default function Page({ params }: PageProps): React.JSX.Element { + const { threadId, threadType } = params; + + return ; +} diff --git a/002_source/cms/src/app/dashboard/chat/compose/page.tsx b/002_source/cms/src/app/dashboard/chat/compose/page.tsx new file mode 100644 index 0000000..21e0200 --- /dev/null +++ b/002_source/cms/src/app/dashboard/chat/compose/page.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ComposeView } from '@/components/dashboard/chat/compose-view'; + +export const metadata = { title: `Compose | Chat | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/dashboard/chat/layout.tsx b/002_source/cms/src/app/dashboard/chat/layout.tsx new file mode 100644 index 0000000..8f76bea --- /dev/null +++ b/002_source/cms/src/app/dashboard/chat/layout.tsx @@ -0,0 +1,211 @@ +import * as React from 'react'; + +import { dayjs } from '@/lib/dayjs'; +import { ChatProvider } from '@/components/dashboard/chat/chat-context'; +import { ChatView } from '@/components/dashboard/chat/chat-view'; +import type { Contact, Message, Thread } from '@/components/dashboard/chat/types'; + +const contacts = [ + { + id: 'USR-010', + name: 'Alcides Antonio', + avatar: '/assets/avatar-10.png', + isActive: false, + lastActivity: dayjs().subtract(1, 'hour').toDate(), + }, + { + id: 'USR-003', + name: 'Carson Darrin', + avatar: '/assets/avatar-3.png', + isActive: false, + lastActivity: dayjs().subtract(15, 'minute').toDate(), + }, + { id: 'USR-005', name: 'Fran Perez', avatar: '/assets/avatar-5.png', isActive: true, lastActivity: dayjs().toDate() }, + { id: 'USR-006', name: 'Iulia Albu', avatar: '/assets/avatar-6.png', isActive: true, lastActivity: dayjs().toDate() }, + { id: 'USR-008', name: 'Jie Yan', avatar: '/assets/avatar-8.png', isActive: true, lastActivity: dayjs().toDate() }, + { + id: 'USR-009', + name: 'Marcus Finn', + avatar: '/assets/avatar-9.png', + isActive: false, + lastActivity: dayjs().subtract(2, 'hour').toDate(), + }, + { + id: 'USR-001', + name: 'Miron Vitold', + avatar: '/assets/avatar-1.png', + isActive: true, + lastActivity: dayjs().toDate(), + }, + { + id: 'USR-007', + name: 'Nasimiyu Danai', + avatar: '/assets/avatar-7.png', + isActive: true, + lastActivity: dayjs().toDate(), + }, + { + id: 'USR-011', + name: 'Omar Darobe', + avatar: '/assets/avatar-11.png', + isActive: true, + lastActivity: dayjs().toDate(), + }, + { + id: 'USR-004', + name: 'Penjani Inyene', + avatar: '/assets/avatar-4.png', + isActive: false, + lastActivity: dayjs().subtract(6, 'hour').toDate(), + }, + { + id: 'USR-002', + name: 'Siegbert Gottfried', + avatar: '/assets/avatar-2.png', + isActive: true, + lastActivity: dayjs().toDate(), + }, +] satisfies Contact[]; + +const threads = [ + { + id: 'TRD-004', + type: 'direct', + participants: [ + { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + { id: 'USR-003', name: 'Carson Darrin', avatar: '/assets/avatar-3.png' }, + ], + unreadCount: 0, + }, + { + id: 'TRD-003', + type: 'direct', + participants: [ + { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + { id: 'USR-005', name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + ], + unreadCount: 1, + }, + { + id: 'TRD-002', + type: 'group', + participants: [ + { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + { id: 'USR-007', name: 'Nasimiyu Danai', avatar: '/assets/avatar-7.png' }, + { id: 'USR-001', name: 'Miron Vitold', avatar: '/assets/avatar-1.png' }, + ], + unreadCount: 0, + }, + { + id: 'TRD-001', + type: 'direct', + participants: [ + { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + { id: 'USR-010', name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + ], + unreadCount: 2, + }, +] satisfies Thread[]; + +const messages = [ + { + id: 'MSG-011', + threadId: 'TRD-004', + type: 'text', + content: 'Hi, how are you?', + author: { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + createdAt: dayjs().subtract(10, 'minute').toDate(), + }, + { + id: 'MSG-010', + threadId: 'TRD-003', + type: 'text', + content: 'Are you available for a call?', + author: { id: 'USR-005', name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + createdAt: dayjs().subtract(5, 'minute').subtract(1, 'hour').toDate(), + }, + { + id: 'MSG-009', + threadId: 'TRD-002', + type: 'text', + content: 'Hello everyone 😀', + author: { id: 'USR-001', name: 'Miron Vitold', avatar: '/assets/avatar-1.png' }, + createdAt: dayjs().subtract(56, 'minute').subtract(2, 'hour').toDate(), + }, + { + id: 'MSG-008', + threadId: 'TRD-002', + type: 'text', + content: 'Hi!', + author: { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + createdAt: dayjs().subtract(51, 'minute').subtract(3, 'hour').toDate(), + }, + { + id: 'MSG-007', + threadId: 'TRD-002', + type: 'text', + content: 'Hey, would you like to collaborate?', + author: { id: 'USR-007', name: 'Nasimiyu Danai', avatar: '/assets/avatar-7.png' }, + createdAt: dayjs().subtract(46, 'minute').subtract(5, 'hour').toDate(), + }, + { + id: 'MSG-006', + threadId: 'TRD-001', + type: 'image', + content: '/assets/image-abstract-1.png', + author: { id: 'USR-010', name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + createdAt: dayjs().subtract(1, 'hour').subtract(2, 'day').toDate(), + }, + { + id: 'MSG-005', + threadId: 'TRD-001', + type: 'text', + content: 'Ok, I will think about it. Thanks!', + author: { id: 'USR-010', name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + createdAt: dayjs().subtract(2, 'hour').subtract(2, 'day').toDate(), + }, + { + id: 'MSG-004', + threadId: 'TRD-001', + type: 'text', + content: "I'm sorry, I can't go lower than $45.", + author: { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + createdAt: dayjs().subtract(3, 'hour').subtract(3, 'day').toDate(), + }, + { + id: 'MSG-003', + threadId: 'TRD-001', + type: 'text', + content: "Can't you make it $40? I'm on a tight budget.", + author: { id: 'USR-010', name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + createdAt: dayjs().subtract(5, 'hour').subtract(3, 'day').toDate(), + }, + { + id: 'MSG-002', + threadId: 'TRD-001', + type: 'text', + content: 'Sure, it is $50 per hour.', + author: { id: 'USR-000', name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + createdAt: dayjs().subtract(2, 'hour').subtract(4, 'day').toDate(), + }, + { + id: 'MSG-001', + threadId: 'TRD-001', + type: 'text', + content: "I'm interested in your services, can you tell me more about your hourly rate?", + author: { id: 'USR-010', name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + createdAt: dayjs().subtract(5, 'hour').subtract(4, 'day').toDate(), + }, +] satisfies Message[]; + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return ( + + {children} + + ); +} diff --git a/002_source/cms/src/app/dashboard/chat/page.tsx b/002_source/cms/src/app/dashboard/chat/page.tsx new file mode 100644 index 0000000..ba678e4 --- /dev/null +++ b/002_source/cms/src/app/dashboard/chat/page.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; + +export const metadata = { title: `Chat | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Start meaningful conversations! + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/crypto/page.tsx b/002_source/cms/src/app/dashboard/crypto/page.tsx new file mode 100644 index 0000000..e105341 --- /dev/null +++ b/002_source/cms/src/app/dashboard/crypto/page.tsx @@ -0,0 +1,151 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { AccountUpgrade } from '@/components/dashboard/crypto/account-upgrade'; +import { CreditCard } from '@/components/dashboard/crypto/credit-card'; +import { CurrencyConverter } from '@/components/dashboard/crypto/currency-converter'; +import { CurrentBalance } from '@/components/dashboard/crypto/current-balance'; +import { DigitalWallet } from '@/components/dashboard/crypto/digital-wallet'; +import { Transactions } from '@/components/dashboard/crypto/transactions'; + +export const metadata = { title: `Crypto | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Crypto + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/customers/[customerId]/page.tsx b/002_source/cms/src/app/dashboard/customers/[customerId]/page.tsx new file mode 100644 index 0000000..edf064e --- /dev/null +++ b/002_source/cms/src/app/dashboard/customers/[customerId]/page.tsx @@ -0,0 +1,308 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import Chip from '@mui/material/Chip'; +import Divider from '@mui/material/Divider'; +import IconButton from '@mui/material/IconButton'; +import LinearProgress from '@mui/material/LinearProgress'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; +import { CaretDown as CaretDownIcon } from '@phosphor-icons/react/dist/ssr/CaretDown'; +import { CheckCircle as CheckCircleIcon } from '@phosphor-icons/react/dist/ssr/CheckCircle'; +import { CreditCard as CreditCardIcon } from '@phosphor-icons/react/dist/ssr/CreditCard'; +import { House as HouseIcon } from '@phosphor-icons/react/dist/ssr/House'; +import { PencilSimple as PencilSimpleIcon } from '@phosphor-icons/react/dist/ssr/PencilSimple'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; +import { ShieldWarning as ShieldWarningIcon } from '@phosphor-icons/react/dist/ssr/ShieldWarning'; +import { User as UserIcon } from '@phosphor-icons/react/dist/ssr/User'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { PropertyItem } from '@/components/core/property-item'; +import { PropertyList } from '@/components/core/property-list'; +import { Notifications } from '@/components/dashboard/customer/notifications'; +import { Payments } from '@/components/dashboard/customer/payments'; +import type { Address } from '@/components/dashboard/customer/shipping-address'; +import { ShippingAddress } from '@/components/dashboard/customer/shipping-address'; + +export const metadata = { title: `Details | Customers | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Customers + +
+ + + + MV + +
+ + Miron Vitold + } + label="Active" + size="small" + variant="outlined" + /> + + + miron.vitold@domain.com + +
+
+
+ +
+
+
+ + + + + + + + } + avatar={ + + + + } + title="Basic details" + /> + } + orientation="vertical" + sx={{ '--PropertyItem-padding': '12px 24px' }} + > + {( + [ + { key: 'Customer ID', value: }, + { key: 'Name', value: 'Miron Vitold' }, + { key: 'Email', value: 'miron.vitold@domain.com' }, + { key: 'Phone', value: '(425) 434-5535' }, + { key: 'Company', value: 'Devias IO' }, + { + key: 'Quota', + value: ( + + + + 50% + + + ), + }, + ] satisfies { key: string; value: React.ReactNode }[] + ).map( + (item): React.JSX.Element => ( + + ) + )} + + + + + + + } + title="Security" + /> + + +
+ +
+ + A deleted customer cannot be restored. All data will be permanently removed. + +
+
+
+
+
+ + + + + }> + Edit + + } + avatar={ + + + + } + title="Billing details" + /> + + + } sx={{ '--PropertyItem-padding': '16px' }}> + {( + [ + { key: 'Credit card', value: '**** 4142' }, + { key: 'Country', value: 'United States' }, + { key: 'State', value: 'Michigan' }, + { key: 'City', value: 'Southfield' }, + { key: 'Address', value: '1721 Bartlett Avenue, 48034' }, + { key: 'Tax ID', value: 'EU87956621' }, + ] satisfies { key: string; value: React.ReactNode }[] + ).map( + (item): React.JSX.Element => ( + + ) + )} + + + + + + }> + Add + + } + avatar={ + + + + } + title="Shipping addresses" + /> + + + {( + [ + { + id: 'ADR-001', + country: 'United States', + state: 'Michigan', + city: 'Lansing', + zipCode: '48933', + street: '480 Haven Lane', + primary: true, + }, + { + id: 'ADR-002', + country: 'United States', + state: 'Missouri', + city: 'Springfield', + zipCode: '65804', + street: '4807 Lighthouse Drive', + }, + ] satisfies Address[] + ).map((address) => ( + + + + ))} + + + + + + +
+
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/customers/create/page.tsx b/002_source/cms/src/app/dashboard/customers/create/page.tsx new file mode 100644 index 0000000..a0460ab --- /dev/null +++ b/002_source/cms/src/app/dashboard/customers/create/page.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { CustomerCreateForm } from '@/components/dashboard/customer/customer-create-form'; + +export const metadata = { title: `Create | Customers | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Customers + +
+
+ Create customer +
+
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/customers/page.tsx b/002_source/cms/src/app/dashboard/customers/page.tsx new file mode 100644 index 0000000..724c79c --- /dev/null +++ b/002_source/cms/src/app/dashboard/customers/page.tsx @@ -0,0 +1,155 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Divider from '@mui/material/Divider'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { CustomersFilters } from '@/components/dashboard/customer/customers-filters'; +import type { Filters } from '@/components/dashboard/customer/customers-filters'; +import { CustomersPagination } from '@/components/dashboard/customer/customers-pagination'; +import { CustomersSelectionProvider } from '@/components/dashboard/customer/customers-selection-context'; +import { CustomersTable } from '@/components/dashboard/customer/customers-table'; +import type { Customer } from '@/components/dashboard/customer/customers-table'; + +export const metadata = { title: `List | Customers | Dashboard | ${config.site.name}` } satisfies Metadata; + +const customers = [ + { + id: 'USR-005', + name: 'Fran Perez', + avatar: '/assets/avatar-5.png', + email: 'fran.perez@domain.com', + phone: '(815) 704-0045', + quota: 50, + status: 'active', + createdAt: dayjs().subtract(1, 'hour').toDate(), + }, + { + id: 'USR-004', + name: 'Penjani Inyene', + avatar: '/assets/avatar-4.png', + email: 'penjani.inyene@domain.com', + phone: '(803) 937-8925', + quota: 100, + status: 'active', + createdAt: dayjs().subtract(3, 'hour').toDate(), + }, + { + id: 'USR-003', + name: 'Carson Darrin', + avatar: '/assets/avatar-3.png', + email: 'carson.darrin@domain.com', + phone: '(715) 278-5041', + quota: 10, + status: 'blocked', + createdAt: dayjs().subtract(1, 'hour').subtract(1, 'day').toDate(), + }, + { + id: 'USR-002', + name: 'Siegbert Gottfried', + avatar: '/assets/avatar-2.png', + email: 'siegbert.gottfried@domain.com', + phone: '(603) 766-0431', + quota: 0, + status: 'pending', + createdAt: dayjs().subtract(7, 'hour').subtract(1, 'day').toDate(), + }, + { + id: 'USR-001', + name: 'Miron Vitold', + avatar: '/assets/avatar-1.png', + email: 'miron.vitold@domain.com', + phone: '(425) 434-5535', + quota: 50, + status: 'active', + createdAt: dayjs().subtract(2, 'hour').subtract(2, 'day').toDate(), + }, +] satisfies Customer[]; + +interface PageProps { + searchParams: { email?: string; phone?: string; sortDir?: 'asc' | 'desc'; status?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { email, phone, sortDir, status } = searchParams; + + const sortedCustomers = applySort(customers, sortDir); + const filteredCustomers = applyFilters(sortedCustomers, { email, phone, status }); + + return ( + + + + + Customers + + + + + + + + + + + + + + + + + + + ); +} + +// Sorting and filtering has to be done on the server. + +function applySort(row: Customer[], sortDir: 'asc' | 'desc' | undefined): Customer[] { + return row.sort((a, b) => { + if (sortDir === 'asc') { + return a.createdAt.getTime() - b.createdAt.getTime(); + } + + return b.createdAt.getTime() - a.createdAt.getTime(); + }); +} + +function applyFilters(row: Customer[], { email, phone, status }: Filters): Customer[] { + return row.filter((item) => { + if (email) { + if (!item.email?.toLowerCase().includes(email.toLowerCase())) { + return false; + } + } + + if (phone) { + if (!item.phone?.toLowerCase().includes(phone.toLowerCase())) { + return false; + } + } + + if (status) { + if (item.status !== status) { + return false; + } + } + + return true; + }); +} diff --git a/002_source/cms/src/app/dashboard/e-commerce/page.tsx b/002_source/cms/src/app/dashboard/e-commerce/page.tsx new file mode 100644 index 0000000..0f57927 --- /dev/null +++ b/002_source/cms/src/app/dashboard/e-commerce/page.tsx @@ -0,0 +1,157 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { Conversions } from '@/components/dashboard/e-commerce/conversions'; +import { CostBreakdown } from '@/components/dashboard/e-commerce/cost-breakdown'; +import { SalesByCountry } from '@/components/dashboard/e-commerce/sales-by-country'; +import { Stats } from '@/components/dashboard/e-commerce/stats'; +import { TopProducts } from '@/components/dashboard/e-commerce/top-products'; + +export const metadata = { title: `E-commerce | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + E-commerce + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/file-storage/page.tsx b/002_source/cms/src/app/dashboard/file-storage/page.tsx new file mode 100644 index 0000000..2f62dd2 --- /dev/null +++ b/002_source/cms/src/app/dashboard/file-storage/page.tsx @@ -0,0 +1,228 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { ItemsFilters } from '@/components/dashboard/file-storage/items-filters'; +import type { Filters } from '@/components/dashboard/file-storage/items-filters'; +import { ItemsPagination } from '@/components/dashboard/file-storage/items-pagination'; +import { Stats } from '@/components/dashboard/file-storage/stats'; +import { StorageProvider } from '@/components/dashboard/file-storage/storage-context'; +import { StorageView } from '@/components/dashboard/file-storage/storage-view'; +import type { Item } from '@/components/dashboard/file-storage/types'; +import { UplaodButton } from '@/components/dashboard/file-storage/upload-button'; + +export const metadata = { title: `File storage | Dashboard | ${config.site.name}` } satisfies Metadata; + +const items = [ + { + id: 'FILE-009', + type: 'folder', + name: 'AWS Credentials', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: true, + isPublic: false, + tags: ['Secrets', 'Important'], + shared: [ + { name: 'Miron Vitold', avatar: '/assets/avatar-1.png' }, + { name: 'Alcides Antonio', avatar: '/assets/avatar-10.png' }, + { name: 'Nasimiyu Danai', avatar: '/assets/avatar-7.png' }, + ], + itemsCount: 3, + size: '5 MB', + createdAt: dayjs().subtract(3, 'minute').subtract(4, 'hour').toDate(), + updatedAt: dayjs().subtract(3, 'minute').subtract(4, 'hour').toDate(), + }, + { + id: 'FILE-008', + type: 'folder', + name: 'invoices', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: false, + isPublic: false, + tags: ['Work', 'Accounting'], + shared: [], + itemsCount: 71, + size: '1.2 GB', + createdAt: dayjs().subtract(16, 'minute').subtract(20, 'hour').toDate(), + updatedAt: dayjs().subtract(16, 'minute').subtract(20, 'hour').toDate(), + }, + { + id: 'FILE-007', + type: 'folder', + name: 'assets', + author: { name: 'Carson Darrin', avatar: '/assets/avatar-3.png' }, + isFavorite: false, + isPublic: true, + tags: [], + shared: [], + itemsCount: 12, + size: '325.2 MB', + createdAt: dayjs().subtract(23, 'minute').subtract(26, 'hour').toDate(), + updatedAt: dayjs().subtract(23, 'minute').subtract(26, 'hour').toDate(), + }, + { + id: 'FILE-006', + type: 'file', + name: 'company-logo.svg', + extension: 'svg', + author: { name: 'Siegbert Gottfried', avatar: '/assets/avatar-2.png' }, + isFavorite: false, + isPublic: false, + tags: ['Work'], + shared: [ + { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + { name: 'Nasimiyu Danai', avatar: '/assets/avatar-7.png' }, + ], + size: '1.2 MB', + createdAt: dayjs().subtract(41, 'minute').subtract(6, 'hour').subtract(2, 'day').toDate(), + updatedAt: dayjs().subtract(41, 'minute').subtract(6, 'hour').subtract(2, 'day').toDate(), + }, + { + id: 'FILE-005', + type: 'file', + name: 'devias-kit.fig', + extension: 'pkg', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: true, + isPublic: false, + tags: ['Personal'], + shared: [{ name: 'Omar Darobe', avatar: '/assets/avatar-11.png' }], + size: '16.7 MB', + createdAt: dayjs().subtract(11, 'minute').subtract(16, 'hour').subtract(18, 'day').toDate(), + updatedAt: dayjs().subtract(11, 'minute').subtract(16, 'hour').subtract(18, 'day').toDate(), + }, + { + id: 'FILE-004', + type: 'file', + name: 'not_a_virus.exe', + extension: 'exe', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: false, + isPublic: false, + tags: ['Security'], + shared: [{ name: 'Siegbert Gottfried', avatar: '/assets/avatar-2.png' }], + size: '13.37 KB', + createdAt: dayjs().subtract(1, 'minute').subtract(3, 'hour').subtract(37, 'day').toDate(), + updatedAt: dayjs().subtract(1, 'minute').subtract(3, 'hour').subtract(37, 'day').toDate(), + }, + { + id: 'FILE-003', + type: 'file', + name: 'website-hero-illustration.psd', + extension: 'psd', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: false, + isPublic: false, + tags: ['Work', 'Design'], + shared: [{ name: 'Siegbert Gottfried', avatar: '/assets/avatar-2.png' }], + size: '2.3 MB', + createdAt: dayjs().subtract(12, 'minute').subtract(11, 'hour').subtract(40, 'day').toDate(), + updatedAt: dayjs().subtract(12, 'minute').subtract(11, 'hour').subtract(40, 'day').toDate(), + }, + { + id: 'FILE-002', + type: 'file', + name: 'ssl-certs.tar', + extension: 'tar', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: false, + isPublic: false, + tags: ['Work', 'Security'], + shared: [{ name: 'Omar Darobe', avatar: '/assets/avatar-11.png' }], + size: '684.1 KB', + createdAt: dayjs().subtract(15, 'minute').subtract(23, 'hour').subtract(41, 'day').toDate(), + updatedAt: dayjs().subtract(15, 'minute').subtract(23, 'hour').subtract(41, 'day').toDate(), + }, + { + id: 'FILE-001', + type: 'file', + name: 'tablet-driver-adapter.deb', + extension: 'deb', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + isFavorite: false, + isPublic: false, + tags: [], + shared: [], + size: '5.2 MB', + createdAt: dayjs().subtract(40, 'minute').subtract(11, 'hour').subtract(62, 'day').toDate(), + updatedAt: dayjs().subtract(40, 'minute').subtract(11, 'hour').subtract(62, 'day').toDate(), + }, +] satisfies Item[]; + +interface PageProps { + searchParams: { query?: string; sortDir?: 'asc' | 'desc'; view?: 'grid' | 'list' }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { query, sortDir, view = 'grid' } = searchParams; + + const filters = { query }; + + const sortedItems = applySort(items, sortDir); + const filteredItems = applyFilters(sortedItems, filters); + + return ( + + + + + File storage + + + + + + + + + + + + + + + + + + + + + + ); +} + +// Sorting and filtering has to be done on the server. + +function applySort(row: Item[], sortDir: 'asc' | 'desc' | undefined): Item[] { + return row.sort((a, b) => { + if (sortDir === 'asc') { + return a.createdAt.getTime() - b.createdAt.getTime(); + } + + return b.createdAt.getTime() - a.createdAt.getTime(); + }); +} + +function applyFilters(row: Item[], { query }: Filters): Item[] { + return row.filter((item) => { + if (query) { + if (!item.name?.toLowerCase().includes(query.toLowerCase())) { + return false; + } + } + + return true; + }); +} diff --git a/002_source/cms/src/app/dashboard/invoices/[invoiceId]/page.tsx b/002_source/cms/src/app/dashboard/invoices/[invoiceId]/page.tsx new file mode 100644 index 0000000..ee8b603 --- /dev/null +++ b/002_source/cms/src/app/dashboard/invoices/[invoiceId]/page.tsx @@ -0,0 +1,202 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Chip from '@mui/material/Chip'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { DynamicLogo } from '@/components/core/logo'; +import { InvoicePDFLink } from '@/components/dashboard/invoice/invoice-pdf-link'; +import { LineItemsTable } from '@/components/dashboard/invoice/line-items-table'; +import type { LineItem } from '@/components/dashboard/invoice/line-items-table'; + +export const metadata = { title: `Details | Invoices | Dashboard | ${config.site.name}` } satisfies Metadata; + +const lineItems = [ + { id: 'LI-001', name: 'Pro Subscription', quantity: 1, currency: 'USD', unitAmount: 14.99, totalAmount: 14.99 }, +] satisfies LineItem[]; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Invoices + +
+ + + INV-001 +
+ +
+
+ + + + + + +
+
+ + + + + Invoice + + + + + + + + + Number: + +
+ INV-008 +
+
+ + + Due date: + +
+ {dayjs().add(15, 'day').format('MMM D,YYYY')} +
+
+ + + Issue date: + +
+ {dayjs().subtract(1, 'hour').format('MMM D, YYYY')} +
+
+ + + Issuer VAT No: + + RO4675933 + +
+ + + + Devias IO + + 2674 Alfred Drive +
+ Brooklyn, New York, United States +
+ 11206 +
+ accounts@devias.io +
+ (+1) 757 737 1980 +
+
+
+ + + Billed to + + Miron Vitold +
+ Acme Inc. +
+ 1721 Bartlett Avenue +
+ Southfield, Michigan, United States +
+ 48034 +
+ RO8795621 +
+
+
+
+
+ + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(19.99)} due{' '} + {dayjs().add(15, 'day').format('MMM D, YYYY')} + +
+ + + + + + + + Subtotal + + + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(14.99)} + + + + + + Tax + + + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(5)} + + + + + + Total + + + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(19.99)} + + + + + + + Notes + + Please make sure you have the right bank registration number as I had issues before and make sure you + cover transfer expenses. + + +
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/invoices/create/page.tsx b/002_source/cms/src/app/dashboard/invoices/create/page.tsx new file mode 100644 index 0000000..5f0d7ab --- /dev/null +++ b/002_source/cms/src/app/dashboard/invoices/create/page.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { InvoiceCreateForm } from '@/components/dashboard/invoice/invoice-create-form'; + +export const metadata = { title: `Create | Invoices | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Invoices + +
+
+ Create invoice +
+
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/invoices/page.tsx b/002_source/cms/src/app/dashboard/invoices/page.tsx new file mode 100644 index 0000000..33c7429 --- /dev/null +++ b/002_source/cms/src/app/dashboard/invoices/page.tsx @@ -0,0 +1,175 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { InvoicesFiltersCard } from '@/components/dashboard/invoice//invoices-filters-card'; +import { InvoicesPagination } from '@/components/dashboard/invoice//invoices-pagination'; +import { InvoicesStats } from '@/components/dashboard/invoice//invoices-stats'; +import { InvoicesTable } from '@/components/dashboard/invoice//invoices-table'; +import { ViewModeButton } from '@/components/dashboard/invoice//view-mode-button'; +import type { Filters } from '@/components/dashboard/invoice/invoices-filters'; +import { InvoicesFiltersButton } from '@/components/dashboard/invoice/invoices-filters-button'; +import { InvoicesSort } from '@/components/dashboard/invoice/invoices-sort'; +import type { Invoice } from '@/components/dashboard/invoice/invoices-table'; + +export const metadata = { title: `List | Invoices | Dashboard | ${config.site.name}` } satisfies Metadata; + +const invoices = [ + { + id: 'INV-005', + customer: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + currency: 'USD', + totalAmount: 23.11, + status: 'pending', + issueDate: dayjs().subtract(1, 'hour').toDate(), + dueDate: dayjs().add(25, 'day').toDate(), + }, + { + id: 'INV-004', + customer: { name: 'Omar Darobe', avatar: '/assets/avatar-11.png' }, + currency: 'USD', + totalAmount: 253.76, + status: 'paid', + issueDate: dayjs().subtract(2, 'hour').subtract(4, 'day').toDate(), + dueDate: dayjs().add(17, 'day').toDate(), + }, + { + id: 'INV-003', + customer: { name: 'Carson Darrin', avatar: '/assets/avatar-3.png' }, + currency: 'USD', + totalAmount: 781.5, + status: 'canceled', + issueDate: dayjs().subtract(4, 'hour').subtract(6, 'day').toDate(), + dueDate: dayjs().add(11, 'day').toDate(), + }, + { + id: 'INV-002', + customer: { name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + currency: 'USD', + totalAmount: 96.64, + status: 'paid', + issueDate: dayjs().subtract(2, 'hour').subtract(15, 'day').toDate(), + dueDate: dayjs().add(3, 'day').toDate(), + }, + { + id: 'INV-001', + customer: { name: 'Miron Vitold', avatar: '/assets/avatar-1.png' }, + currency: 'USD', + totalAmount: 19.99, + status: 'pending', + issueDate: dayjs().subtract(2, 'hour').subtract(15, 'day').toDate(), + dueDate: dayjs().add(1, 'day').toDate(), + }, +] satisfies Invoice[]; + +interface PageProps { + searchParams: { + customer?: string; + endDate?: string; + id?: string; + sortDir?: 'asc' | 'desc'; + startDate?: string; + status?: string; + view?: 'group' | 'list'; + }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { customer, endDate, id, sortDir, startDate, status, view = 'group' } = searchParams; + + const filters = { customer, endDate, id, startDate, status }; + + const sortedInvoices = applySort(invoices, sortDir); + const filteredInvoices = applyFilters(sortedInvoices, filters); + + return ( + + + + + Invoices + +
+ +
+
+ + + + + + + + + + + + + +
+
+ ); +} + +// Sorting and filtering has to be done on the server. + +function applySort(row: Invoice[], sortDir: 'asc' | 'desc' | undefined): Invoice[] { + return row.sort((a, b) => { + if (sortDir === 'asc') { + return a.issueDate.getTime() - b.issueDate.getTime(); + } + + return b.issueDate.getTime() - a.issueDate.getTime(); + }); +} + +function applyFilters(row: Invoice[], { customer, id, endDate, status, startDate }: Filters): Invoice[] { + return row.filter((item) => { + if (id) { + if (!item.id.toLowerCase().includes(id.toLowerCase())) { + return false; + } + } + + if (status) { + if (item.status !== status) { + return false; + } + } + + if (customer) { + if (!item.customer.name?.toLowerCase().includes(customer.toLowerCase())) { + return false; + } + } + + if (startDate) { + if (dayjs(item.issueDate).isBefore(dayjs(startDate))) { + return false; + } + } + + if (endDate) { + if (dayjs(item.issueDate).isAfter(dayjs(endDate).add(1, 'day'))) { + return false; + } + } + + return true; + }); +} diff --git a/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/activity/page.tsx b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/activity/page.tsx new file mode 100644 index 0000000..9850ed9 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/activity/page.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; +import Timeline from '@mui/lab/Timeline'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { dayjs } from '@/lib/dayjs'; +import { ActivityItem } from '@/components/dashboard/jobs/activity-item'; +import type { Event } from '@/components/dashboard/jobs/activity-item'; + +const events = [ + { + id: 'EV-004', + createdAt: dayjs().subtract(7, 'minute').subtract(5, 'hour').subtract(1, 'day').toDate(), + type: 'new_job', + author: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + job: { title: 'Remote React / React Native Developer' }, + }, + { + id: 'EV-003', + createdAt: dayjs().subtract(18, 'minute').subtract(3, 'hour').subtract(5, 'day').toDate(), + type: 'new_job', + author: { name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + job: { title: 'Senior Golang Backend Engineer' }, + }, + { + id: 'EV-002', + createdAt: dayjs().subtract(41, 'minute').subtract(5, 'hour').subtract(7, 'day').toDate(), + type: 'new_member', + author: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + member: { name: 'Omar Darboe' }, + }, + { + id: 'EV-001', + createdAt: dayjs().subtract(7, 'minute').subtract(8, 'hour').subtract(7, 'day').toDate(), + type: 'new_company', + author: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + company: { name: 'Stripe' }, + }, +] satisfies Event[]; + +export default function Page(): React.JSX.Element { + return ( + +
+ Activity +
+ + + {events.map((event, index) => ( + + ))} + + + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/assets/page.tsx b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/assets/page.tsx new file mode 100644 index 0000000..c3caf96 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/assets/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; + +import { AssetCard } from '@/components/dashboard/jobs/asset-card'; +import type { Asset } from '@/components/dashboard/jobs/types'; + +const assets = [ + { + id: 'ASSET-002', + mimeType: 'image/png', + name: 'company-cover.png', + size: '23 KB', + url: '/assets/image-business-2.png', + }, + { id: 'ASSET-001', mimeType: 'application/pdf', name: 'Presentation.pdf', size: '3 MB', url: '' }, +] satisfies Asset[]; + +export default function Page(): React.JSX.Element { + return ( + +
+ Assets ({assets.length}) +
+ + {assets.map((asset) => ( + + + + ))} + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/layout.tsx b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/layout.tsx new file mode 100644 index 0000000..beeb9b4 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/layout.tsx @@ -0,0 +1,126 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import Divider from '@mui/material/Divider'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { PropertyItem } from '@/components/core/property-item'; +import { PropertyList } from '@/components/core/property-list'; +import { CompanyTabs } from '@/components/dashboard/jobs/company-tabs'; + +export const metadata = { title: `Company | Jobs | Dashboard | ${config.site.name}` } satisfies Metadata; + +interface Founder { + id: string; + name: string; + avatar?: string; + role: string; +} + +const founders = [ + { id: 'USR-008', name: 'Jie Yan', avatar: '/assets/avatar-8.png', role: 'CEO & Co-founder' }, + { id: 'USR-005', name: 'Fran Perez', avatar: '/assets/avatar-5.png', role: 'CTO & Co-founder' }, + { id: 'USR-011', name: 'Omar Darboe', avatar: '/assets/avatar-11.png', role: 'CFO' }, +] satisfies Founder[]; + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return ( + + +
+ + + Jobs + +
+ + + + + +
+ Stripe + + The new standard in online payments. Stripe is the best software platform for running an internet + +
+
+ + + + {children} +
+
+ + + + } spacing={2}> + + About + + {( + [ + { key: 'Website', value: https://stripe.com }, + { key: 'Industry', value: 'Financial Services' }, + { key: 'Locations', value: 'New York City, Milano, Moscow' }, + { key: 'Company size', value: '50-100' }, + ] satisfies { key: string; value: React.ReactNode }[] + ).map( + (item): React.JSX.Element => ( + + ) + )} + + + + Founders + + {founders.map((founder) => ( + + +
+ {founder.name} + + {founder.role} + +
+
+ ))} +
+
+
+
+
+
+
+
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/page.tsx b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/page.tsx new file mode 100644 index 0000000..5634a55 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/page.tsx @@ -0,0 +1,140 @@ +import * as React from 'react'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Divider from '@mui/material/Divider'; +import ImageList from '@mui/material/ImageList'; +import ImageListItem from '@mui/material/ImageListItem'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowRight as ArrowRightIcon } from '@phosphor-icons/react/dist/ssr/ArrowRight'; + +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { Description } from '@/components/dashboard/jobs/description'; +import { JobsCard } from '@/components/dashboard/jobs/jobs-card'; +import { MemberCard } from '@/components/dashboard/jobs/member-card'; +import type { Job, Member } from '@/components/dashboard/jobs/types'; + +const description = `## Stripe is a technology company that builds economic infrastructure for the internet. + +Businesses of every size—from new startups to public companies—use our software to accept payments and manage their businesses online. + +Stripe's software is used by millions of businesses in over 120 countries and across nearly every industry. We are a global company with a global team that is committed to building a more fair, more inclusive world. + +Our mission emphasizes seeking and hiring diverse voices, including those who are traditionally underrepresented in the technology industry, and we consider this to be one of the most important values we hold close. We're a hard-working, fun, and exciting group who value intellectual curiosity and a passion for problem-solving! We have growing offices located in San Francisco, Sunnyvale, Bellevue, Los Angeles, Tokyo, Hamburg, London, and Zurich.`; + +const images = [ + '/assets/company-image-1.jpg', + '/assets/company-image-2.jpg', + '/assets/company-image-3.jpg', + '/assets/company-image-4.jpg', + '/assets/company-image-5.jpg', + '/assets/company-image-6.jpg', +] satisfies string[]; + +const jobs = [ + { + id: 'JOB-001', + title: 'Senior React Developer', + currency: 'USD', + budgetMin: 94000, + budgetMax: 140000, + isRemote: true, + publishedAt: dayjs().subtract(49, 'minute').subtract(2, 'hour').subtract(7, 'day').toDate(), + }, + { + id: 'JOB-002', + title: 'Senior Ruby Engineer', + currency: 'USD', + budgetMin: 120000, + budgetMax: 145000, + isRemote: true, + publishedAt: dayjs().subtract(10, 'minute').subtract(7, 'hour').subtract(8, 'day').toDate(), + }, +] satisfies Job[]; + +const members = [ + { + id: 'USR-008', + name: 'Jie Yan', + avatar: '/assets/avatar-8.png', + role: 'CEO & Co-founder', + skills: ['JavaScript', 'React', 'Go'], + }, + { + id: 'USR-005', + name: 'Fran Perez', + avatar: '/assets/avatar-5.png', + role: 'CTO & Co-founder', + skills: ['C', 'C++', 'Java'], + }, +] satisfies Member[]; + +export default function Page(): React.JSX.Element { + return ( + + + + {images.map((image) => ( + + + + ))} + + + + + Jobs + + Jobs + + + + + + + + + + + Members + + Members + + + + + + + {members.map((member) => ( + + + + ))} + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/reviews/page.tsx b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/reviews/page.tsx new file mode 100644 index 0000000..4e9324a --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/reviews/page.tsx @@ -0,0 +1,63 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { dayjs } from '@/lib/dayjs'; +import { CompanyReviewAdd } from '@/components/dashboard/jobs/review-add'; +import { ReviewCard } from '@/components/dashboard/jobs/review-card'; +import { ReviewsSummary } from '@/components/dashboard/jobs/reviews-summary'; +import type { Review } from '@/components/dashboard/jobs/types'; + +const reviews = [ + { + id: 'REV-003', + title: 'Great company, providing an awesome & easy to use product', + comment: + 'I have been working with this company full-time. Great for the work life balance. Cons, decentralized decision making process across the organization.', + rating: 3.8, + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + createdAt: dayjs().subtract(4, 'minute').subtract(4, 'hour').subtract(2, 'day').toDate(), + }, + { + id: 'REV-002', + title: 'Friendly environment', + comment: + 'Every day you learn something new - that is a typical day at work in Stripe. I am surrounded by supportive people, from different cultures, we have a strong and unified team and help each other whenever is needed. The most enjoyable part of the job is that you meet new people, experts on different disciplines that might help you in your work, but the hardest part of the job is that there are too many tools and systems to use.', + rating: 3.4, + author: { name: 'Carson Darrin', avatar: '/assets/avatar-3.png' }, + createdAt: dayjs().subtract(17, 'minute').subtract(4, 'hour').subtract(5, 'day').toDate(), + }, + { + id: 'REV-001', + title: 'Great company, providing an awesome & easy to use product', + comment: + 'I have been working with this company full-time. Great for the work life balance. Cons, decentralized decision making process across the organization.', + rating: 3.8, + author: { name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + createdAt: dayjs().subtract(34, 'minute').subtract(5, 'hour').subtract(7, 'day').toDate(), + }, +] satisfies Review[]; + +export default function Page(): React.JSX.Element { + const averageRating = 3.66; + + return ( + +
+ Reviews +
+ + + {reviews.map((review) => ( + + ))} + + + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/team/page.tsx b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/team/page.tsx new file mode 100644 index 0000000..eb5a355 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/companies/[companyId]/team/page.tsx @@ -0,0 +1,42 @@ +import * as React from 'react'; +import Grid from '@mui/material/Grid'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { MemberCard } from '@/components/dashboard/jobs/member-card'; +import type { Member } from '@/components/dashboard/jobs/types'; + +const members = [ + { + id: 'USR-008', + name: 'Jie Yan', + avatar: '/assets/avatar-8.png', + role: 'CEO & Co-founder', + skills: ['JavaScript', 'React', 'Go'], + }, + { + id: 'USR-005', + name: 'Fran Perez', + avatar: '/assets/avatar-5.png', + role: 'CTO & Co-founder', + skills: ['C', 'C++', 'Java'], + }, + { id: 'USR-011', name: 'Omar Darboe', avatar: '/assets/avatar-11.png', role: 'CFO', skills: ['Go', 'Python'] }, +] satisfies Member[]; + +export default function Page(): React.JSX.Element { + return ( + +
+ Team ({members.length}) +
+ + {members.map((member) => ( + + + + ))} + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/create/page.tsx b/002_source/cms/src/app/dashboard/jobs/create/page.tsx new file mode 100644 index 0000000..9892c35 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/create/page.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { JobCreateForm } from '@/components/dashboard/jobs/job-create-form'; + +export const metadata = { title: `Create | Jobs | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Create job ad + + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/jobs/page.tsx b/002_source/cms/src/app/dashboard/jobs/page.tsx new file mode 100644 index 0000000..d464d79 --- /dev/null +++ b/002_source/cms/src/app/dashboard/jobs/page.tsx @@ -0,0 +1,188 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { CaretLeft as CaretLeftIcon } from '@phosphor-icons/react/dist/ssr/CaretLeft'; +import { CaretRight as CaretRightIcon } from '@phosphor-icons/react/dist/ssr/CaretRight'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { CompanyCard } from '@/components/dashboard/jobs/company-card'; +import type { Company } from '@/components/dashboard/jobs/company-card'; +import { JobsFilters } from '@/components/dashboard/jobs/jobs-filters'; + +export const metadata = { title: `Browse | Jobs | Dashboard | ${config.site.name}` } satisfies Metadata; + +const companies = [ + { + id: 'COM-004', + name: 'Vercel', + logo: '/assets/company-avatar-4.png', + description: 'Develop. Preview. Ship. For the best frontend teams.', + rating: 4.5, + employees: '10-20', + isVerified: true, + jobs: [ + { + id: 'JOB-005', + title: 'Remote React / React Native Developer', + currency: 'USD', + budgetMin: 55000, + budgetMax: 75000, + isRemote: true, + publishedAt: dayjs().subtract(24, 'minute').toDate(), + }, + { + id: 'JOB-006', + title: 'Senior Golang Backend Engineer', + currency: 'USD', + budgetMin: 80000, + budgetMax: 160000, + country: 'Germany', + state: 'Bavaria', + city: 'Munich', + publishedAt: dayjs().subtract(45, 'minute').subtract(2, 'hour').toDate(), + }, + ], + }, + { + id: 'COM-003', + name: 'Auth0', + logo: '/assets/company-avatar-3.png', + description: 'Secure access for everyone. But not just anyone.', + rating: 4.3, + employees: '50-100', + isVerified: false, + jobs: [ + { + id: 'JOB-004', + title: 'Remote React / React Native Developer', + currency: 'USD', + budgetMin: 87000, + budgetMax: 135000, + isRemote: true, + publishedAt: dayjs().subtract(1, 'hour').toDate(), + }, + ], + }, + { + id: 'COM-002', + name: 'Google Cloud', + logo: '/assets/company-avatar-2.png', + description: 'Build, modernize, and scale your applications with Google Cloud.', + rating: 4.5, + employees: '1-10', + isVerified: false, + jobs: [ + { + id: 'JOB-003', + title: 'Senior Backend Engineer', + currency: 'USD', + budgetMin: 150000, + budgetMax: 210000, + isRemote: true, + publishedAt: dayjs().subtract(39, 'minute').subtract(7, 'hour').subtract(5, 'day').toDate(), + }, + ], + }, + { + id: 'COM-001', + name: 'Stripe', + logo: '/assets/company-avatar-1.png', + description: 'The new standard in online payments', + rating: 4.9, + employees: '50-100', + isVerified: true, + jobs: [ + { + id: 'JOB-001', + title: 'Senior React Developer', + currency: 'USD', + budgetMin: 94000, + budgetMax: 140000, + isRemote: true, + publishedAt: dayjs().subtract(49, 'minute').subtract(2, 'hour').subtract(7, 'day').toDate(), + }, + { + id: 'JOB-002', + title: 'Senior Ruby Engineer', + currency: 'USD', + budgetMin: 120000, + budgetMax: 145000, + isRemote: true, + publishedAt: dayjs().subtract(10, 'minute').subtract(7, 'hour').subtract(8, 'day').toDate(), + }, + ], + }, +] satisfies Company[]; + +export default function Page(): React.JSX.Element { + return ( + + + + + + + + + Reach 50K+ potential candidates. + + + Post your job today for free. Promotions start at $99. + + +
+ +
+
+
+ + + +
+
+ + {companies.map((company) => ( + + ))} + + + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/layout.tsx b/002_source/cms/src/app/dashboard/layout.tsx new file mode 100644 index 0000000..5a88944 --- /dev/null +++ b/002_source/cms/src/app/dashboard/layout.tsx @@ -0,0 +1,16 @@ +import * as React from 'react'; + +import { AuthGuard } from '@/components/auth/auth-guard'; +import { DynamicLayout } from '@/components/dashboard/layout/dynamic-layout'; + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return ( + + {children} + + ); +} diff --git a/002_source/cms/src/app/dashboard/logistics/fleet/page.tsx b/002_source/cms/src/app/dashboard/logistics/fleet/page.tsx new file mode 100644 index 0000000..bdc26f0 --- /dev/null +++ b/002_source/cms/src/app/dashboard/logistics/fleet/page.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { FleetView } from '@/components/dashboard/logistics/fleet-view'; +import type { Vehicle } from '@/components/dashboard/logistics/types'; + +export const metadata = { title: `Fleet | Logistics | Dashboard | ${config.site.name}` } satisfies Metadata; + +const vehicles = [ + { + id: 'VEH-004', + location: 'Brooklyn, New York, United States', + latitude: 40.683717, + longitude: -73.938242, + temperature: 6, + startedAt: dayjs().subtract(21, 'minute').subtract(2, 'hour').toDate(), + departedAt: dayjs().subtract(34, 'minute').toDate(), + arrivedAt: dayjs().subtract(9, 'minute').toDate(), + }, + { + id: 'VEH-003', + location: 'Brooklyn, New York, United States', + latitude: 40.698211, + longitude: -73.92369, + temperature: 8, + startedAt: dayjs().subtract(10, 'minute').subtract(3, 'hour').toDate(), + departedAt: dayjs().subtract(56, 'minute').subtract(2, 'hour').toDate(), + arrivedAt: dayjs().subtract(10, 'minute').subtract(1, 'hour').toDate(), + }, + { + id: 'VEH-002', + location: 'Brooklyn, New York, United States', + latitude: 40.657431, + longitude: -73.960399, + temperature: 6, + startedAt: dayjs().subtract(34, 'minute').subtract(4, 'hour').toDate(), + departedAt: undefined, + arrivedAt: undefined, + }, + { + id: 'VEH-001', + location: 'Brooklyn, New York, United States', + latitude: 40.675966, + longitude: -73.876617, + temperature: 8, + startedAt: dayjs().subtract(9, 'minute').subtract(5, 'hour').toDate(), + departedAt: dayjs().subtract(12, 'minute').subtract(2, 'hour').toDate(), + arrivedAt: dayjs().subtract(21, 'minute').subtract(1, 'hour').toDate(), + }, +] satisfies Vehicle[]; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/dashboard/logistics/page.tsx b/002_source/cms/src/app/dashboard/logistics/page.tsx new file mode 100644 index 0000000..8b76fbc --- /dev/null +++ b/002_source/cms/src/app/dashboard/logistics/page.tsx @@ -0,0 +1,111 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { DeviatedVehicles } from '@/components/dashboard/logistics/deviated-vehicles'; +import { LateVehicles } from '@/components/dashboard/logistics/late-vehicles'; +import { OnRouteVehicles } from '@/components/dashboard/logistics/on-route-vehicles'; +import { VehiclesCondition } from '@/components/dashboard/logistics/vehicles-condition'; +import { VehiclesOverview } from '@/components/dashboard/logistics/vehicles-overview'; +import { VehiclesTable } from '@/components/dashboard/logistics/vehicles-table'; +import { VehiclesWithErrors } from '@/components/dashboard/logistics/vehicles-with-errors'; + +export const metadata = { title: `Metrics | Logistics | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Logistics + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/mail/[labelId]/[threadId]/page.tsx b/002_source/cms/src/app/dashboard/mail/[labelId]/[threadId]/page.tsx new file mode 100644 index 0000000..cf93176 --- /dev/null +++ b/002_source/cms/src/app/dashboard/mail/[labelId]/[threadId]/page.tsx @@ -0,0 +1,17 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ThreadView } from '@/components/dashboard/mail/thread-view'; + +export const metadata = { title: `Thread | Mail | Dashboard | ${config.site.name}` } satisfies Metadata; + +interface PageProps { + params: { threadId: string }; +} + +export default function Page({ params }: PageProps): React.JSX.Element { + const { threadId } = params; + + return ; +} diff --git a/002_source/cms/src/app/dashboard/mail/[labelId]/layout.tsx b/002_source/cms/src/app/dashboard/mail/[labelId]/layout.tsx new file mode 100644 index 0000000..cdde2e8 --- /dev/null +++ b/002_source/cms/src/app/dashboard/mail/[labelId]/layout.tsx @@ -0,0 +1,142 @@ +import * as React from 'react'; + +import { dayjs } from '@/lib/dayjs'; +import { MailProvider } from '@/components/dashboard/mail/mail-context'; +import { MailView } from '@/components/dashboard/mail/mail-view'; +import type { Label, Thread } from '@/components/dashboard/mail/types'; + +function filterThreads(threads: Thread[], labelId: string): Thread[] { + return threads.filter((thread) => { + if (['inbox', 'sent', 'drafts', 'spam', 'trash'].includes(labelId)) { + return thread.folder === labelId; + } + + if (labelId === 'important') { + return thread.isImportant; + } + + if (labelId === 'starred') { + return thread.isStarred; + } + + if (thread.labels.includes(labelId)) { + return true; + } + + return false; + }); +} + +const labels = [ + { id: 'inbox', type: 'system', name: 'Inbox', unreadCount: 1, totalCount: 0 }, + { id: 'sent', type: 'system', name: 'Sent', unreadCount: 0, totalCount: 0 }, + { id: 'drafts', type: 'system', name: 'Drafts', unreadCount: 0, totalCount: 0 }, + { id: 'spam', type: 'system', name: 'Spam', unreadCount: 0, totalCount: 0 }, + { id: 'trash', type: 'system', name: 'Trash', unreadCount: 0, totalCount: 1 }, + { id: 'important', type: 'system', name: 'Important', unreadCount: 0, totalCount: 1 }, + { id: 'starred', type: 'system', name: 'Starred', unreadCount: 1, totalCount: 1 }, + { id: 'work', type: 'custom', name: 'Work', color: '#43A048', unreadCount: 0, totalCount: 1 }, + { id: 'business', type: 'custom', name: 'Business', color: '#1E88E5', unreadCount: 1, totalCount: 2 }, + { id: 'personal', type: 'custom', name: 'Personal', color: '#FB8A00', unreadCount: 0, totalCount: 1 }, +] satisfies Label[]; + +const threads = [ + { + id: 'TRD-004', + from: { avatar: '/assets/avatar-9.png', email: 'marcus.finn@domain.com', name: 'Marcus Finn' }, + to: [{ avatar: '/assets/avatar.png', email: 'sofia@devias.io', name: 'Sofia Rivers' }], + subject: 'Website redesign. Interested in collaboration', + message: `Hey there, + +I hope this email finds you well. I'm glad you liked my projects, and I would be happy to provide you with a quote for a similar project. + +Please let me know your requirements and any specific details you have in mind, so I can give you an accurate quote. + +Looking forward to hearing from you soon. + +Best regards, + +Marcus Finn`, + attachments: [ + { + id: 'ATT-001', + name: 'working-sketch.png', + size: '128.5 KB', + type: 'image', + url: '/assets/image-abstract-1.png', + }, + { id: 'ATT-002', name: 'summer-customers.pdf', size: '782.3 KB', type: 'file', url: '#' }, + { + id: 'ATT-003', + name: 'desktop-coffee.png', + size: '568.2 KB', + type: 'image', + url: '/assets/image-minimal-1.png', + }, + ], + folder: 'inbox', + labels: ['work', 'business'], + isImportant: true, + isStarred: false, + isUnread: true, + createdAt: dayjs().subtract(3, 'hour').toDate(), + }, + { + id: 'TRD-003', + to: [{ name: 'Sofia Rivers', avatar: '/assets/avatar.png', email: 'sofia@devias.io' }], + from: { name: 'Miron Vitold', avatar: '/assets/avatar-1.png', email: 'miron.vitold@domain.com' }, + subject: 'Amazing work', + message: `Hey, nice projects! I really liked the one in react. What's your quote on kinda similar project?`, + folder: 'spam', + labels: [], + isImportant: false, + isStarred: true, + isUnread: false, + createdAt: dayjs().subtract(1, 'day').toDate(), + }, + { + id: 'TRD-002', + from: { name: 'Penjani Inyene', avatar: '/assets/avatar-4.png', email: 'penjani.inyene@domain.com' }, + to: [{ name: 'Sofia Rivers', avatar: '/assets/avatar.png', email: 'sofia@devias.io' }], + subject: 'Flight reminder', + message: `Dear Sofia, + +Your flight is coming up soon. Please don't forget to check in for your scheduled flight.`, + folder: 'inbox', + labels: ['business'], + isImportant: false, + isStarred: false, + isUnread: false, + createdAt: dayjs().subtract(2, 'day').toDate(), + }, + { + id: 'TRD-001', + from: { name: 'Carson Darrin', avatar: '/assets/avatar-3.png', email: 'carson.darrin@domain.com' }, + to: [{ name: 'Sofia Rivers', avatar: '/assets/avatar.png', email: 'sofia@devias.io' }], + subject: 'Possible candidates for the position', + message: `My market leading client has another fantastic opportunity for an experienced Software Developer to join them on a heavily remote basis`, + folder: 'trash', + labels: ['personal'], + isImportant: false, + isStarred: false, + isUnread: true, + createdAt: dayjs().subtract(2, 'day').toDate(), + }, +] satisfies Thread[]; + +interface LayoutProps { + children: React.ReactNode; + params: { labelId: string }; +} + +export default function Layout({ children, params }: LayoutProps): React.JSX.Element { + const { labelId } = params; + + const filteredThreads = filterThreads(threads, labelId); + + return ( + + {children} + + ); +} diff --git a/002_source/cms/src/app/dashboard/mail/[labelId]/page.tsx b/002_source/cms/src/app/dashboard/mail/[labelId]/page.tsx new file mode 100644 index 0000000..9989b26 --- /dev/null +++ b/002_source/cms/src/app/dashboard/mail/[labelId]/page.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { ThreadsView } from '@/components/dashboard/mail/threads-view'; + +export const metadata = { title: `Mail | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/app/dashboard/orders/[orderId]/page.tsx b/002_source/cms/src/app/dashboard/orders/[orderId]/page.tsx new file mode 100644 index 0000000..0df687c --- /dev/null +++ b/002_source/cms/src/app/dashboard/orders/[orderId]/page.tsx @@ -0,0 +1,270 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import Chip from '@mui/material/Chip'; +import Divider from '@mui/material/Divider'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; +import { CaretDown as CaretDownIcon } from '@phosphor-icons/react/dist/ssr/CaretDown'; +import { CheckCircle as CheckCircleIcon } from '@phosphor-icons/react/dist/ssr/CheckCircle'; +import { CreditCard as CreditCardIcon } from '@phosphor-icons/react/dist/ssr/CreditCard'; +import { PencilSimple as PencilSimpleIcon } from '@phosphor-icons/react/dist/ssr/PencilSimple'; +import { ShoppingCartSimple as ShoppingCartSimpleIcon } from '@phosphor-icons/react/dist/ssr/ShoppingCartSimple'; +import { Timer as TimerIcon } from '@phosphor-icons/react/dist/ssr/Timer'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { PropertyItem } from '@/components/core/property-item'; +import { PropertyList } from '@/components/core/property-list'; +import type { Event } from '@/components/dashboard/order/events-timeline'; +import { EventsTimeline } from '@/components/dashboard/order/events-timeline'; +import { LineItemsTable } from '@/components/dashboard/order/line-items-table'; +import type { LineItem } from '@/components/dashboard/order/line-items-table'; + +export const metadata = { title: `Details | Orders | Dashboard | ${config.site.name}` } satisfies Metadata; + +const lineItems = [ + { + id: 'LI-001', + product: 'Erbology Aloe Vera', + image: '/assets/product-1.png', + quantity: 1, + currency: 'USD', + unitAmount: 24, + totalAmount: 24, + }, + { + id: 'LI-002', + product: 'Lancome Rouge', + image: '/assets/product-2.png', + quantity: 1, + currency: 'USD', + unitAmount: 35, + totalAmount: 35, + }, +] satisfies LineItem[]; + +const events = [ + { + id: 'EV-004', + createdAt: dayjs().subtract(3, 'hour').toDate(), + type: 'note_added', + author: { name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + note: 'Customer states that the products have been damaged by the courier.', + }, + { + id: 'EV-003', + createdAt: dayjs().subtract(12, 'hour').toDate(), + type: 'shipment_notice', + description: 'Left the package in front of the door', + }, + { + id: 'EV-002', + createdAt: dayjs().subtract(18, 'hour').toDate(), + type: 'items_shipped', + carrier: 'USPS', + trackingNumber: '940011189', + }, + { id: 'EV-001', createdAt: dayjs().subtract(21, 'hour').toDate(), type: 'order_created' }, +] satisfies Event[]; + +export default function Page(): React.JSX.Element { + return ( + + +
+ + + Orders + +
+
+ + + ORD-001 + +
+ +
+
+
+ + + + + }> + Edit + + } + avatar={ + + + + } + title="Order information" + /> + + + } sx={{ '--PropertyItem-padding': '12px 24px' }}> + {( + [ + { key: 'Customer', value: Miron Vitold }, + { + key: 'Address', + value: ( + + 1721 Bartlett Avenue +
+ Southfield, Michigan, United States +
+ 48034 +
+ ), + }, + { key: 'Date', value: dayjs().subtract(3, 'hour').format('MMMM D, YYYY hh:mm A') }, + { + key: 'Status', + value: ( + } + label="Completed" + size="small" + variant="outlined" + /> + ), + }, + { + key: 'Payment method', + value: ( + + + + +
+ Mastercard + + **** 4242 + +
+
+ ), + }, + ] satisfies { key: string; value: React.ReactNode }[] + ).map( + (item): React.JSX.Element => ( + + ) + )} +
+
+
+
+ + + + + } + title="Checkout Summary" + /> + + + + + + + + + + + Subtotal + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(59)} + + + + Discount + - + + + Shipping + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(20)} + + + + Taxes + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(15.01)} + + + + Total + + {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(94.01)} + + + + + + + +
+
+ + + + + + } + title="Timeline" + /> + + + + + +
+
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/orders/create/page.tsx b/002_source/cms/src/app/dashboard/orders/create/page.tsx new file mode 100644 index 0000000..fb47ec4 --- /dev/null +++ b/002_source/cms/src/app/dashboard/orders/create/page.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { OrderCreateForm } from '@/components/dashboard/order/order-create-form'; + +export const metadata = { title: `Create | Orders | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Orders + +
+
+ Create order +
+
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/orders/page.tsx b/002_source/cms/src/app/dashboard/orders/page.tsx new file mode 100644 index 0000000..ad2e2fa --- /dev/null +++ b/002_source/cms/src/app/dashboard/orders/page.tsx @@ -0,0 +1,159 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Divider from '@mui/material/Divider'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { OrderModal } from '@/components/dashboard/order/order-modal'; +import { OrdersFilters } from '@/components/dashboard/order/orders-filters'; +import type { Filters } from '@/components/dashboard/order/orders-filters'; +import { OrdersPagination } from '@/components/dashboard/order/orders-pagination'; +import { OrdersSelectionProvider } from '@/components/dashboard/order/orders-selection-context'; +import { OrdersTable } from '@/components/dashboard/order/orders-table'; +import type { Order } from '@/components/dashboard/order/orders-table'; + +export const metadata = { title: `List | Orders | Dashboard | ${config.site.name}` } satisfies Metadata; + +const orders = [ + { + id: 'ORD-005', + customer: { name: 'Penjani Inyene', avatar: '/assets/avatar-4.png', email: 'penjani.inyene@domain.com' }, + lineItems: 1, + paymentMethod: { type: 'visa', last4: '4011' }, + currency: 'USD', + totalAmount: 56.7, + status: 'pending', + createdAt: dayjs().subtract(3, 'hour').toDate(), + }, + { + id: 'ORD-004', + customer: { name: 'Jie Yan', avatar: '/assets/avatar-8.png', email: 'jie.yan@domain.com' }, + lineItems: 1, + paymentMethod: { type: 'amex', last4: '5678' }, + currency: 'USD', + totalAmount: 49.12, + status: 'completed', + createdAt: dayjs().subtract(6, 'hour').toDate(), + }, + { + id: 'ORD-003', + customer: { name: 'Fran Perez', avatar: '/assets/avatar-5.png', email: 'fran.perez@domain.com' }, + lineItems: 2, + paymentMethod: { type: 'applepay' }, + currency: 'USD', + totalAmount: 18.75, + status: 'canceled', + createdAt: dayjs().subtract(7, 'hour').toDate(), + }, + { + id: 'ORD-002', + customer: { name: 'Carson Darrin', avatar: '/assets/avatar-3.png', email: 'carson.darrin@domain.com' }, + lineItems: 1, + paymentMethod: { type: 'googlepay' }, + currency: 'USD', + totalAmount: 49.99, + status: 'rejected', + createdAt: dayjs().subtract(1, 'hour').subtract(1, 'day').toDate(), + }, + { + id: 'ORD-001', + customer: { name: 'Miron Vitold', avatar: '/assets/avatar-1.png', email: 'miron.vitold@domain.com' }, + lineItems: 2, + paymentMethod: { type: 'mastercard', last4: '4242' }, + currency: 'USD', + totalAmount: 94.01, + status: 'completed', + createdAt: dayjs().subtract(3, 'hour').subtract(1, 'day').toDate(), + }, +] satisfies Order[]; + +interface PageProps { + searchParams: { customer?: string; id?: string; previewId?: string; sortDir?: 'asc' | 'desc'; status?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { customer, id, previewId, sortDir, status } = searchParams; + + const sortedOrders = applySort(orders, sortDir); + const filteredOrders = applyFilters(sortedOrders, { customer, id, status }); + + return ( + + + + + + Orders + +
+ +
+
+ + + + + + + + + + + +
+
+ +
+ ); +} + +// Sorting and filtering has to be done on the server. + +function applySort(row: Order[], sortDir: 'asc' | 'desc' | undefined): Order[] { + return row.sort((a, b) => { + if (sortDir === 'asc') { + return a.createdAt.getTime() - b.createdAt.getTime(); + } + + return b.createdAt.getTime() - a.createdAt.getTime(); + }); +} + +function applyFilters(row: Order[], { customer, id, status }: Filters): Order[] { + return row.filter((item) => { + if (customer) { + if (!item.customer?.name?.toLowerCase().includes(customer.toLowerCase())) { + return false; + } + } + + if (id) { + if (!item.id?.toLowerCase().includes(id.toLowerCase())) { + return false; + } + } + + if (status) { + if (item.status !== status) { + return false; + } + } + + return true; + }); +} diff --git a/002_source/cms/src/app/dashboard/page.tsx b/002_source/cms/src/app/dashboard/page.tsx new file mode 100644 index 0000000..92036ed --- /dev/null +++ b/002_source/cms/src/app/dashboard/page.tsx @@ -0,0 +1,236 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; +import { ArrowRight as ArrowRightIcon } from '@phosphor-icons/react/dist/ssr/ArrowRight'; +import { Briefcase as BriefcaseIcon } from '@phosphor-icons/react/dist/ssr/Briefcase'; +import { FileCode as FileCodeIcon } from '@phosphor-icons/react/dist/ssr/FileCode'; +import { Info as InfoIcon } from '@phosphor-icons/react/dist/ssr/Info'; +import { ListChecks as ListChecksIcon } from '@phosphor-icons/react/dist/ssr/ListChecks'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; +import { Users as UsersIcon } from '@phosphor-icons/react/dist/ssr/Users'; +import { Warning as WarningIcon } from '@phosphor-icons/react/dist/ssr/Warning'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { AppChat } from '@/components/dashboard/overview/app-chat'; +import { AppLimits } from '@/components/dashboard/overview/app-limits'; +import { AppUsage } from '@/components/dashboard/overview/app-usage'; +import { Events } from '@/components/dashboard/overview/events'; +import { HelperWidget } from '@/components/dashboard/overview/helper-widget'; +import { Subscriptions } from '@/components/dashboard/overview/subscriptions'; +import { Summary } from '@/components/dashboard/overview/summary'; + +export const metadata = { title: `Overview | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + Overview + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + } size="small"> + Search jobs + + } + description="Search for jobs that match your skills and apply to them directly." + icon={BriefcaseIcon} + label="Jobs" + title="Find your dream job" + /> + + + } size="small"> + Help center + + } + description="Find answers to your questions and get in touch with our team." + icon={InfoIcon} + label="Help center" + title="Need help figuring things out?" + /> + + + } size="small"> + Documentation + + } + description="Learn how to get started with our product and make the most of it." + icon={FileCodeIcon} + label="Documentation" + title="Explore documentation" + /> + + + + + ); +} diff --git a/002_source/cms/src/app/dashboard/products/[productId]/page.tsx b/002_source/cms/src/app/dashboard/products/[productId]/page.tsx new file mode 100644 index 0000000..ad2019c --- /dev/null +++ b/002_source/cms/src/app/dashboard/products/[productId]/page.tsx @@ -0,0 +1,73 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { ProductEditForm } from '@/components/dashboard/product/product-edit-form'; + +export const metadata = { title: `Details | Products | Dashboard | ${config.site.name}` } satisfies Metadata; + +// The page should load the product from the API based on the productId param and pass it to the form component. +// For the sake of simplicity, we are just using a static product object. + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Products + +
+
+ Edit product +
+
+ Erbology Aloe Vera is a natural, eco-friendly, and vegan product.

It is made from natural ingredients. It is a great product for healthcare.

', + tags: 'Natural, Eco-Friendly, Vegan', + currency: 'USD', + price: 24, + images: [{ id: 'IMG-001', url: '/assets/product-1.png', fileName: 'product-1.png' }], + sku: '401_1BBXBK', + barcode: '', + quantity: 10, + backorder: true, + height: 25, + width: 15, + length: 5, + weight: 0.25, + }} + /> +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/products/create/page.tsx b/002_source/cms/src/app/dashboard/products/create/page.tsx new file mode 100644 index 0000000..65886a2 --- /dev/null +++ b/002_source/cms/src/app/dashboard/products/create/page.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowLeft as ArrowLeftIcon } from '@phosphor-icons/react/dist/ssr/ArrowLeft'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { ProductCreateForm } from '@/components/dashboard/product/product-create-form'; + +export const metadata = { title: `Create | Products | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + +
+ + + Products + +
+
+ Create product +
+
+ +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/products/page.tsx b/002_source/cms/src/app/dashboard/products/page.tsx new file mode 100644 index 0000000..b73e73c --- /dev/null +++ b/002_source/cms/src/app/dashboard/products/page.tsx @@ -0,0 +1,178 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import Divider from '@mui/material/Divider'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Plus as PlusIcon } from '@phosphor-icons/react/dist/ssr/Plus'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { dayjs } from '@/lib/dayjs'; +import { ProductModal } from '@/components/dashboard/product/product-modal'; +import type { Filters } from '@/components/dashboard/product/products-filters'; +import { ProductsFilters } from '@/components/dashboard/product/products-filters'; +import { ProductsPagination } from '@/components/dashboard/product/products-pagination'; +import { ProductsTable } from '@/components/dashboard/product/products-table'; +import type { Product } from '@/components/dashboard/product/products-table'; + +export const metadata = { title: `List | Products | Dashboard | ${config.site.name}` } satisfies Metadata; + +const products = [ + { + id: 'PRD-005', + name: 'Soja & Co. Eucalyptus', + image: '/assets/product-5.png', + category: 'Skincare', + type: 'physical', + quantity: 10, + currency: 'USD', + price: 65.99, + sku: '592_LDKDI', + status: 'draft', + createdAt: dayjs().subtract(23, 'minute').toDate(), + }, + { + id: 'PRD-004', + name: 'Necessaire Body Lotion', + image: '/assets/product-4.png', + category: 'Skincare', + type: 'physical', + quantity: 5, + currency: 'USD', + price: 17.99, + sku: '321_UWEAJT', + status: 'published', + createdAt: dayjs().subtract(5, 'minute').subtract(1, 'hour').toDate(), + }, + { + id: 'PRD-003', + name: 'Ritual of Sakura', + image: '/assets/product-3.png', + category: 'Skincare', + type: 'physical', + quantity: 8, + currency: 'USD', + price: 155, + sku: '211_QFEXJO', + status: 'draft', + createdAt: dayjs().subtract(43, 'minute').subtract(3, 'hour').toDate(), + }, + { + id: 'PRD-002', + name: 'Lancome Rouge', + image: '/assets/product-2.png', + category: 'Makeup', + type: 'physical', + quantity: 0, + currency: 'USD', + price: 95, + sku: '978_UBFGJC', + status: 'published', + createdAt: dayjs().subtract(15, 'minute').subtract(4, 'hour').toDate(), + }, + { + id: 'PRD-001', + name: 'Erbology Aloe Vera', + image: '/assets/product-1.png', + category: 'Healthcare', + type: 'physical', + quantity: 10, + currency: 'USD', + price: 24, + sku: '401_1BBXBK', + status: 'published', + createdAt: dayjs().subtract(39, 'minute').subtract(7, 'hour').toDate(), + }, +] satisfies Product[]; + +interface PageProps { + searchParams: { category?: string; previewId?: string; sortDir?: 'asc' | 'desc'; sku?: string; status?: string }; +} + +export default function Page({ searchParams }: PageProps): React.JSX.Element { + const { category, previewId, sortDir, sku, status } = searchParams; + + const orderedProducts = applySort(products, sortDir); + const filteredProducts = applyFilters(orderedProducts, { category, sku, status }); + + return ( + + + + + + Products + +
+ +
+
+ + + + + + + + + +
+
+ +
+ ); +} + +// Sorting and filtering has to be done on the server. + +function applySort(row: Product[], sortDir: 'asc' | 'desc' | undefined): Product[] { + return row.sort((a, b) => { + if (sortDir === 'asc') { + return a.createdAt.getTime() - b.createdAt.getTime(); + } + + return b.createdAt.getTime() - a.createdAt.getTime(); + }); +} + +function applyFilters(row: Product[], { category, status, sku }: Filters): Product[] { + return row.filter((item) => { + if (category) { + if (item.category !== category) { + return false; + } + } + + if (status) { + if (item.status !== status) { + return false; + } + } + + if (sku) { + if (!item.sku?.toLowerCase().includes(sku.toLowerCase())) { + return false; + } + } + + return true; + }); +} diff --git a/002_source/cms/src/app/dashboard/settings/account/page.tsx b/002_source/cms/src/app/dashboard/settings/account/page.tsx new file mode 100644 index 0000000..32d91c3 --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/account/page.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { AccountDetails } from '@/components/dashboard/settings/account-details'; +import { DeleteAccount } from '@/components/dashboard/settings/delete-account'; +import { Privacy } from '@/components/dashboard/settings/privacy'; +import { ThemeSwitch } from '@/components/dashboard/settings/theme-switch'; + +export const metadata = { title: `Account | Settings | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + +
+ Account +
+ + + + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/settings/billing/page.tsx b/002_source/cms/src/app/dashboard/settings/billing/page.tsx new file mode 100644 index 0000000..2f723f9 --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/billing/page.tsx @@ -0,0 +1,31 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { Invoices } from '@/components/dashboard/settings/invoices'; +import { Plans } from '@/components/dashboard/settings/plans'; + +export const metadata = { title: `Billing | Settings | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + +
+ Billing & plans +
+ + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/settings/integrations/page.tsx b/002_source/cms/src/app/dashboard/settings/integrations/page.tsx new file mode 100644 index 0000000..3aebce1 --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/integrations/page.tsx @@ -0,0 +1,51 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { Integrations } from '@/components/dashboard/settings/integrations'; + +export const metadata = { title: `Integrations | Settings | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + +
+ Integrations +
+ +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/settings/layout.tsx b/002_source/cms/src/app/dashboard/settings/layout.tsx new file mode 100644 index 0000000..db24330 --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/layout.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; + +import { SideNav } from '@/components/dashboard/settings/side-nav'; + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return ( + + + + {children} + + + ); +} diff --git a/002_source/cms/src/app/dashboard/settings/notifications/page.tsx b/002_source/cms/src/app/dashboard/settings/notifications/page.tsx new file mode 100644 index 0000000..15f2203 --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/notifications/page.tsx @@ -0,0 +1,24 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { EmailNotifications } from '@/components/dashboard/settings/email-notifications'; +import { PhoneNotifications } from '@/components/dashboard/settings/phone-notifications'; + +export const metadata = { title: `Notifications | Settings | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + +
+ Notifications +
+ + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/settings/security/page.tsx b/002_source/cms/src/app/dashboard/settings/security/page.tsx new file mode 100644 index 0000000..07629f9 --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/security/page.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { LoginHistory } from '@/components/dashboard/settings/login-history'; +import { MultiFactor } from '@/components/dashboard/settings/multi-factor'; +import { PasswordForm } from '@/components/dashboard/settings/password-form'; + +export const metadata = { title: `Security | Settings | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + +
+ Security +
+ + + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/settings/team/page.tsx b/002_source/cms/src/app/dashboard/settings/team/page.tsx new file mode 100644 index 0000000..5139aab --- /dev/null +++ b/002_source/cms/src/app/dashboard/settings/team/page.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { Members } from '@/components/dashboard/settings/members'; + +export const metadata = { title: `Team | Settings | Dashboard | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + +
+ Team +
+ +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/social/feed/page.tsx b/002_source/cms/src/app/dashboard/social/feed/page.tsx new file mode 100644 index 0000000..a7e9f9b --- /dev/null +++ b/002_source/cms/src/app/dashboard/social/feed/page.tsx @@ -0,0 +1,103 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { PostAdd } from '@/components/dashboard/social/post-add'; +import { PostCard } from '@/components/dashboard/social/post-card'; +import type { Post } from '@/components/dashboard/social/types'; + +export const metadata = { title: `Feed | Social | Dashboard | ${config.site.name}` } satisfies Metadata; + +const posts = [ + { + id: 'POST-003', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + content: "Hey! What's your favorite framework?", + comments: [ + { + id: 'MSG-003', + content: "We use React at work, but I'm a fan of Web Components", + author: { name: 'Nasimiyu Danai', avatar: '/assets/avatar-7.png' }, + createdAt: dayjs().subtract(4, 'minute').toDate(), + }, + ], + createdAt: dayjs().subtract(16, 'minute').toDate(), + isLiked: true, + likes: 1, + }, + { + id: 'POST-002', + author: { name: 'Siegbert Gottfried', avatar: '/assets/avatar-2.png' }, + content: "What's the most important skill a developer should have?", + comments: [ + { + id: 'MSG-004', + content: 'I think it is being able to communicate clearly', + author: { name: 'Iulia Albu', avatar: '/assets/avatar-6.png' }, + createdAt: dayjs().subtract(35, 'minute').toDate(), + }, + { + id: 'MSG-005', + content: 'Patience definitely', + author: { name: 'Fran Perez', avatar: '/assets/avatar-5.png' }, + createdAt: dayjs().subtract(1, 'hour').toDate(), + }, + ], + isLiked: true, + likes: 6, + createdAt: dayjs().subtract(7, 'hour').toDate(), + }, + { + id: 'POST-001', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + content: 'Staying focused on the goal is key to success', + media: '/assets/image-business-2.png', + comments: [ + { + id: 'MSG-001', + content: "I agree, it's easy to get lost in the details", + author: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + createdAt: dayjs().subtract(1, 'hour').toDate(), + }, + { + id: 'MSG-002', + content: 'Absolutely!', + author: { name: 'Penjani Inyene', avatar: '/assets/avatar-4.png' }, + createdAt: dayjs().subtract(2, 'hour').toDate(), + }, + ], + createdAt: dayjs().subtract(4, 'hour').toDate(), + isLiked: false, + likes: 4, + }, +] satisfies Post[]; + +export default function Page(): React.JSX.Element { + return ( + + + + + Social Feed + + Here's what your connections posted + + + {posts.map((post) => ( + + ))} + + + ); +} diff --git a/002_source/cms/src/app/dashboard/social/profile/connections/page.tsx b/002_source/cms/src/app/dashboard/social/profile/connections/page.tsx new file mode 100644 index 0000000..8b36848 --- /dev/null +++ b/002_source/cms/src/app/dashboard/social/profile/connections/page.tsx @@ -0,0 +1,56 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import CardHeader from '@mui/material/CardHeader'; +import Divider from '@mui/material/Divider'; +import Input from '@mui/material/Input'; +import InputAdornment from '@mui/material/InputAdornment'; +import Grid from '@mui/material/Unstable_Grid2'; +import { MagnifyingGlass as MagnifyingGlassIcon } from '@phosphor-icons/react/dist/ssr/MagnifyingGlass'; + +import { ConnectionCard } from '@/components/dashboard/social/connection-card'; +import type { Connection } from '@/components/dashboard/social/connection-card'; + +const connections = [ + { + id: 'USR-010', + name: 'Alcides Antonio', + avatar: '/assets/avatar-10.png', + commonContacts: 5, + status: 'not_connected', + }, + { id: 'USR-003', name: 'Carson Darrin', avatar: '/assets/avatar-3.png', commonContacts: 10, status: 'rejected' }, + { id: 'USR-005', name: 'Fran Perez', avatar: '/assets/avatar-5.png', commonContacts: 8, status: 'pending' }, + { id: 'USR-004', name: 'Penjani Inyene', avatar: '/assets/avatar-4.png', commonContacts: 1, status: 'connected' }, +] satisfies Connection[]; + +export default function Page(): React.JSX.Element { + return ( +
+ + + + + + + } + sx={{ px: 3, py: 2 }} + /> + + + + {connections.map((connection) => ( + + + + ))} + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/social/profile/layout.tsx b/002_source/cms/src/app/dashboard/social/profile/layout.tsx new file mode 100644 index 0000000..84e6162 --- /dev/null +++ b/002_source/cms/src/app/dashboard/social/profile/layout.tsx @@ -0,0 +1,101 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import Stack from '@mui/material/Stack'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import { ChatText as ChatTextIcon } from '@phosphor-icons/react/dist/ssr/ChatText'; +import { DotsThree as DotsThreeIcon } from '@phosphor-icons/react/dist/ssr/DotsThree'; +import { Image as ImageIcon } from '@phosphor-icons/react/dist/ssr/Image'; +import { UserPlus as UserPlusIcon } from '@phosphor-icons/react/dist/ssr/UserPlus'; + +import { config } from '@/config'; +import { ProfileTabs } from '@/components/dashboard/social/profile-tabs'; + +export const metadata = { title: `Profile | Social | Dashboard | ${config.site.name}` } satisfies Metadata; + +interface LayoutProps { + children: React.ReactNode; +} + +export default function Layout({ children }: LayoutProps): React.JSX.Element { + return ( + + + + + + + + + + + +
+ Sofia Rivers + + Product Designer + +
+
+ + + + + + + + + + + +
+
+ + + {children} + +
+
+ ); +} diff --git a/002_source/cms/src/app/dashboard/social/profile/page.tsx b/002_source/cms/src/app/dashboard/social/profile/page.tsx new file mode 100644 index 0000000..281da25 --- /dev/null +++ b/002_source/cms/src/app/dashboard/social/profile/page.tsx @@ -0,0 +1,89 @@ +import * as React from 'react'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardHeader from '@mui/material/CardHeader'; +import LinearProgress from '@mui/material/LinearProgress'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import Grid from '@mui/material/Unstable_Grid2'; + +import { dayjs } from '@/lib/dayjs'; +import { About } from '@/components/dashboard/social/about'; +import { PostAdd } from '@/components/dashboard/social/post-add'; +import { PostCard } from '@/components/dashboard/social/post-card'; +import type { Post } from '@/components/dashboard/social/types'; + +const posts = [ + { + id: 'POST-003', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + content: "Hey! What's your favorite framework?", + comments: [ + { + id: 'MSG-003', + content: "We use React at work, but I'm a fan of Web Components", + author: { name: 'Nasimiyu Danai', avatar: '/assets/avatar-7.png' }, + createdAt: dayjs().subtract(4, 'minute').toDate(), + }, + ], + createdAt: dayjs().subtract(16, 'minute').toDate(), + isLiked: true, + likes: 1, + }, + { + id: 'POST-001', + author: { name: 'Sofia Rivers', avatar: '/assets/avatar.png' }, + content: 'Staying focused on the goal is key to success', + media: '/assets/image-business-2.png', + comments: [ + { + id: 'MSG-001', + content: "I agree, it's easy to get lost in the details", + author: { name: 'Jie Yan', avatar: '/assets/avatar-8.png' }, + createdAt: dayjs().subtract(1, 'hour').toDate(), + }, + { + id: 'MSG-002', + content: 'Absolutely!', + author: { name: 'Penjani Inyene', avatar: '/assets/avatar-4.png' }, + createdAt: dayjs().subtract(2, 'hour').toDate(), + }, + ], + createdAt: dayjs().subtract(4, 'hour').toDate(), + isLiked: false, + likes: 4, + }, +] satisfies Post[]; + +export default function Page(): React.JSX.Element { + return ( +
+ + + + + + + + + + 50% set up complete + + + + + + + + + + + {posts.map((post) => ( + + ))} + + + +
+ ); +} diff --git a/002_source/cms/src/app/dashboard/tasks/page.tsx b/002_source/cms/src/app/dashboard/tasks/page.tsx new file mode 100644 index 0000000..be9bcee --- /dev/null +++ b/002_source/cms/src/app/dashboard/tasks/page.tsx @@ -0,0 +1,125 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; + +import { config } from '@/config'; +import { dayjs } from '@/lib/dayjs'; +import { TasksProvider } from '@/components/dashboard/tasks/tasks-context'; +import { TasksView } from '@/components/dashboard/tasks/tasks-view'; +import type { Column, Task } from '@/components/dashboard/tasks/types'; + +export const metadata = { title: `Tasks | Dashboard | ${config.site.name}` } satisfies Metadata; + +const columns = [ + { id: 'COL-001', name: 'Todo', taskIds: ['TSK-001', 'TSK-002'] }, + { id: 'COL-002', name: 'Progress', taskIds: [] }, + { id: 'COL-003', name: 'Done', taskIds: ['TSK-003', 'TSK-004'] }, +] satisfies Column[]; + +const tasks = [ + { + id: 'TSK-001', + author: { id: 'USR-000', name: 'Sofia Rivers', username: 'sofia.rivers', avatar: '/assets/avatar.png' }, + title: 'Update the customer API for payments', + description: 'Stripe has a new API version, we need to update it to the latest version', + columnId: 'COL-001', + createdAt: dayjs().subtract(8, 'day').toDate(), + labels: ['Business', 'Design'], + subscribed: true, + dueDate: dayjs().add(7, 'day').toDate(), + assignees: [{ id: 'USR-007', name: 'Nasimiyu Danai', username: 'nasimiyu.danai', avatar: '/assets/avatar-7.png' }], + attachments: [ + { + id: 'ATT-001', + name: 'image-abstract-1.png', + extension: 'png', + url: '/assets/image-abstract-1.png', + size: '24.8 KB', + }, + ], + subtasks: [ + { id: 'STSK-001', title: 'Create a logo', done: true }, + { id: 'STSK-002', title: 'Create text styles', done: true }, + { id: 'STSK-003', title: 'Create color styles', done: true }, + { id: 'STSK-004', title: 'Create effect styles', done: false }, + { id: 'STSK-005', title: 'Create multiple elements', done: false }, + ], + comments: [ + { + id: 'MSG-001', + author: { id: 'USR-007', name: 'Nasimiyu Danai', username: 'nasimiyu.danai', avatar: '/assets/avatar-7.png' }, + createdAt: dayjs().subtract(5, 'day').toDate(), + content: 'Hi, I have updated the API to the latest version.', + comments: [ + { + id: 'MSG-002', + author: { id: 'USR-000', name: 'Sofia Rivers', username: 'sofia.rivers', avatar: '/assets/avatar.png' }, + createdAt: dayjs().subtract(4, 'day').toDate(), + content: 'Great! Thanks for the update.', + }, + ], + }, + ], + }, + { + id: 'TSK-002', + author: { id: 'USR-005', name: 'Fran Perez', username: 'fran.perez', avatar: '/assets/avatar-5.png' }, + title: 'Fix the responsive issues on the home page', + description: 'On mobile devices it looks a bit off, need to fix it', + columnId: 'COL-001', + createdAt: dayjs().subtract(2, 'day').toDate(), + dueDate: dayjs().add(6, 'day').toDate(), + subscribed: true, + assignees: [ + { id: 'USR-005', name: 'Fran Perez', username: 'fran.perez', avatar: '/assets/avatar-5.png' }, + { id: 'USR-007', name: 'Nasimiyu Danai', username: 'nasimiyu.danai', avatar: '/assets/avatar-7.png' }, + ], + attachments: [], + subtasks: [], + comments: [], + }, + { + id: 'TSK-003', + author: { id: 'USR-009', name: 'Marcus Finn', username: 'marcus.finn', avatar: '/assets/avatar-9.png' }, + title: 'Setup onboarding tour for new users', + columnId: 'COL-003', + createdAt: dayjs().subtract(3, 'day').toDate(), + assignees: [ + { id: 'USR-003', name: 'Carson Darrin', username: 'carson.darrin', avatar: '/assets/avatar-3.png' }, + { id: 'USR-000', name: 'Sofia Rivers', username: 'sofia.rivers', avatar: '/assets/avatar.png' }, + ], + attachments: [], + subtasks: [ + { id: 'STSK-006', title: 'Create a new user flow', done: true }, + { id: 'STSK-008', title: 'Create an organization settings step', done: false }, + ], + comments: [], + }, + { + id: 'TSK-004', + author: { id: 'USR-003', name: 'Carson Darrin', username: 'carson.darrin', avatar: '/assets/avatar-3.png' }, + title: 'Follow up with Devias team', + description: 'We need to finish the project as soon as possible', + columnId: 'COL-003', + createdAt: dayjs().subtract(3, 'day').toDate(), + subscribed: true, + assignees: [{ id: 'USR-009', name: 'Marcus Finn', username: 'marcus.finn', avatar: '/assets/avatar-9.png' }], + attachments: [], + subtasks: [], + comments: [ + { + id: 'MSG-003', + author: { id: 'USR-003', name: 'Carson Darrin', username: 'carson.darrin', avatar: '/assets/avatar-3.png' }, + createdAt: dayjs().subtract(2, 'day').toDate(), + content: 'Marcus, can you please follow up with the Devias team?', + }, + ], + }, +] satisfies Task[]; + +export default function Page(): React.JSX.Element { + return ( + + + + ); +} diff --git a/002_source/cms/src/app/errors/internal-server-error/page.tsx b/002_source/cms/src/app/errors/internal-server-error/page.tsx new file mode 100644 index 0000000..7228f92 --- /dev/null +++ b/002_source/cms/src/app/errors/internal-server-error/page.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; + +export const metadata = { title: `Internal server error | Errors | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + + + + 500: Internal server error + + You either tried some shady route or you came here by mistake. Whichever it is, try using the navigation. + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/errors/not-authorized/page.tsx b/002_source/cms/src/app/errors/not-authorized/page.tsx new file mode 100644 index 0000000..3b179c9 --- /dev/null +++ b/002_source/cms/src/app/errors/not-authorized/page.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; + +export const metadata = { title: `Not authorized | Errors | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + + + + 401: Authorization required + + You either tried some shady route or you came here by mistake. Whichever it is, try using the navigation. + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/errors/not-found/page.tsx b/002_source/cms/src/app/errors/not-found/page.tsx new file mode 100644 index 0000000..1a27c14 --- /dev/null +++ b/002_source/cms/src/app/errors/not-found/page.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; + +export const metadata = { title: `Not found | Errors | ${config.site.name}` } satisfies Metadata; + +export default function Page(): React.JSX.Element { + return ( + + + + + + + + 404: The page you are looking for isn't here + + You either tried some shady route or you came here by mistake. Whichever it is, try using the navigation. + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/layout.tsx b/002_source/cms/src/app/layout.tsx new file mode 100644 index 0000000..b4c41b4 --- /dev/null +++ b/002_source/cms/src/app/layout.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import type { Viewport } from 'next'; + +import '@/styles/global.css'; + +import { config } from '@/config'; +import { applyDefaultSettings } from '@/lib/settings/apply-default-settings'; +import { getSettings as getPersistedSettings } from '@/lib/settings/get-settings'; +import { UserProvider } from '@/contexts/auth/user-context'; +import { SettingsProvider } from '@/contexts/settings'; +import { Analytics } from '@/components/core/analytics'; +import { I18nProvider } from '@/components/core/i18n-provider'; +import { LocalizationProvider } from '@/components/core/localization-provider'; +import { SettingsButton } from '@/components/core/settings/settings-button'; +import { ThemeProvider } from '@/components/core/theme-provider/theme-provider'; +import { Toaster } from '@/components/core/toaster'; + +export const viewport = { + width: 'device-width', + initialScale: 1, + themeColor: config.site.themeColor, +} satisfies Viewport; + +interface LayoutProps { + children: React.ReactNode; +} + +export default async function Layout({ children }: LayoutProps): Promise { + const settings = applyDefaultSettings(await getPersistedSettings()); + + return ( + + + + + + + + + {children} + + + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/not-found.tsx b/002_source/cms/src/app/not-found.tsx new file mode 100644 index 0000000..4abf173 --- /dev/null +++ b/002_source/cms/src/app/not-found.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import type { Metadata } from 'next'; +import RouterLink from 'next/link'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Container from '@mui/material/Container'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { config } from '@/config'; +import { paths } from '@/paths'; + +export const metadata = { title: `Not found | ${config.site.name}` } satisfies Metadata; + +export default function NotFound(): React.JSX.Element { + return ( + + + + + + + + 404: The page you are looking for isn't here + + You either tried some shady route or you came here by mistake. Whichever it is, try using the navigation. + + + + + + + + + ); +} diff --git a/002_source/cms/src/app/pdf/invoices/[invoiceId]/page.tsx b/002_source/cms/src/app/pdf/invoices/[invoiceId]/page.tsx new file mode 100644 index 0000000..634d5f8 --- /dev/null +++ b/002_source/cms/src/app/pdf/invoices/[invoiceId]/page.tsx @@ -0,0 +1,14 @@ +'use client'; + +import * as React from 'react'; + +import { PDFViewer } from '@/components/core/pdf-viewer'; +import { InvoicePDFDocument } from '@/components/dashboard/invoice/invoice-pdf-document'; + +export default function Page(): React.JSX.Element { + return ( + + + + ); +} diff --git a/002_source/cms/src/components/auth/auth-guard.tsx b/002_source/cms/src/components/auth/auth-guard.tsx new file mode 100644 index 0000000..30b6e17 --- /dev/null +++ b/002_source/cms/src/components/auth/auth-guard.tsx @@ -0,0 +1,82 @@ +'use client'; + +import * as React from 'react'; +import { useRouter } from 'next/navigation'; +import Alert from '@mui/material/Alert'; + +import { config } from '@/config'; +import { paths } from '@/paths'; +import { AuthStrategy } from '@/lib/auth/strategy'; +import { logger } from '@/lib/default-logger'; +import { useUser } from '@/hooks/use-user'; + +export interface AuthGuardProps { + children: React.ReactNode; +} + +export function AuthGuard({ children }: AuthGuardProps): React.JSX.Element | null { + const router = useRouter(); + const { user, error, isLoading } = useUser(); + const [isChecking, setIsChecking] = React.useState(true); + + const checkPermissions = async (): Promise => { + if (isLoading) { + return; + } + + if (error) { + setIsChecking(false); + return; + } + + if (!user) { + logger.debug('[AuthGuard]: User is not logged in, redirecting to sign in'); + + switch (config.auth.strategy) { + case AuthStrategy.CUSTOM: { + router.replace(paths.auth.custom.signIn); + return; + } + case AuthStrategy.AUTH0: { + router.replace(paths.auth.auth0.signIn); + return; + } + case AuthStrategy.COGNITO: { + router.replace(paths.auth.cognito.signIn); + return; + } + case AuthStrategy.FIREBASE: { + router.replace(paths.auth.firebase.signIn); + return; + } + case AuthStrategy.SUPABASE: { + router.replace(paths.auth.supabase.signIn); + return; + } + default: { + logger.error('[AuthGuard]: Unknown auth strategy'); + return; + } + } + } + + setIsChecking(false); + }; + + React.useEffect(() => { + checkPermissions().catch(() => { + // noop + }); + // eslint-disable-next-line react-hooks/exhaustive-deps -- Expected + }, [user, error, isLoading]); + + if (isChecking) { + return null; + } + + if (error) { + return {error}; + } + + return {children}; +} diff --git a/002_source/cms/src/components/auth/centered-layout.tsx b/002_source/cms/src/components/auth/centered-layout.tsx new file mode 100644 index 0000000..7cc4551 --- /dev/null +++ b/002_source/cms/src/components/auth/centered-layout.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; + +export interface CenteredLayoutProps { + children: React.ReactNode; +} + +export function CenteredLayout({ children }: CenteredLayoutProps): React.JSX.Element { + return ( + + {children} + + ); +} diff --git a/002_source/cms/src/components/auth/cognito/new-password-required-form.tsx b/002_source/cms/src/components/auth/cognito/new-password-required-form.tsx new file mode 100644 index 0000000..733e402 --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/new-password-required-form.tsx @@ -0,0 +1,108 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { confirmSignIn } from 'aws-amplify/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod + .object({ + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + confirmPassword: zod.string(), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords don't match", + path: ['confirmPassword'], + }); + +type Values = zod.infer; + +const defaultValues = { password: '', confirmPassword: '' } satisfies Values; + +export function NewPasswordRequiredForm(): React.JSX.Element { + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + const { nextStep } = await confirmSignIn({ challengeResponse: values.password }); + + if (nextStep.signInStep === 'DONE') { + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + return; + } + + throw new Error(`Unhandled next step: ${nextStep.signInStep}`); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [setError] + ); + + return ( + +
+ + + +
+ New password required +
+ + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( + + Confirm password + + {errors.confirmPassword ? {errors.confirmPassword.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ ); +} diff --git a/002_source/cms/src/components/auth/cognito/reset-password-button.tsx b/002_source/cms/src/components/auth/cognito/reset-password-button.tsx new file mode 100644 index 0000000..18e1e46 --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/reset-password-button.tsx @@ -0,0 +1,47 @@ +'use client'; + +import * as React from 'react'; +import { resetPassword } from '@aws-amplify/auth'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { toast } from '@/components/core/toaster'; + +export interface ResetPasswordButtonProps { + children: React.ReactNode; + email: string; +} + +export function ResetPasswordButton({ children, email }: ResetPasswordButtonProps): React.JSX.Element { + const [isPending, setIsPending] = React.useState(false); + const [submitError, setSubmitError] = React.useState(); + + const handle = React.useCallback(async (): Promise => { + setIsPending(true); + setSubmitError(undefined); + + try { + await resetPassword({ username: email }); + + setIsPending(false); + toast.success('Recovery code sent'); + } catch (err) { + setSubmitError((err as { message: string }).message); + setIsPending(false); + } + }, [email]); + + return ( + + + {submitError ? {submitError} : null} + + Wait a few minutes then try again + + + ); +} diff --git a/002_source/cms/src/components/auth/cognito/reset-password-form.tsx b/002_source/cms/src/components/auth/cognito/reset-password-form.tsx new file mode 100644 index 0000000..bdf8d9b --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/reset-password-form.tsx @@ -0,0 +1,88 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { resetPassword } from '@aws-amplify/auth'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod.object({ email: zod.string().min(1, { message: 'Email is required' }).email() }); + +type Values = zod.infer; + +const defaultValues = { email: '' } satisfies Values; + +export function ResetPasswordForm(): React.JSX.Element { + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + await resetPassword({ username: values.email }); + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.cognito.updatePassword}?${searchParams.toString()}`); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [router, setError] + ); + + return ( + +
+ + + +
+ Reset password +
+ + + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + + +
+
+ ); +} diff --git a/002_source/cms/src/components/auth/cognito/sign-in-form.tsx b/002_source/cms/src/components/auth/cognito/sign-in-form.tsx new file mode 100644 index 0000000..231efad --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/sign-in-form.tsx @@ -0,0 +1,161 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Eye as EyeIcon } from '@phosphor-icons/react/dist/ssr/Eye'; +import { EyeSlash as EyeSlashIcon } from '@phosphor-icons/react/dist/ssr/EyeSlash'; +import { resendSignUpCode, signIn } from 'aws-amplify/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod.object({ + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(1, { message: 'Password is required' }), +}); + +type Values = zod.infer; + +const defaultValues = { email: '', password: '' } satisfies Values; + +export function SignInForm(): React.JSX.Element { + const router = useRouter(); + + const [showPassword, setShowPassword] = React.useState(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + const { nextStep } = await signIn({ username: values.email, password: values.password }); + + if (nextStep.signInStep === 'DONE') { + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + return; + } + + if (nextStep.signInStep === 'CONFIRM_SIGN_UP') { + await resendSignUpCode({ username: values.email }); + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.cognito.signUpConfirm}?${searchParams.toString()}`); + return; + } + + if (nextStep.signInStep === 'CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED') { + router.push(paths.auth.cognito.newPasswordRequired); + return; + } + + throw new Error(`Unhandled next step: ${nextStep.signInStep}`); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [router, setError] + ); + + return ( + +
+ + + +
+ + Sign in + + Don't have an account?{' '} + + Sign up + + + + +
+ + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + { + setShowPassword(false); + }} + /> + ) : ( + { + setShowPassword(true); + }} + /> + ) + } + label="Password" + type={showPassword ? 'text' : 'password'} + /> + {errors.password ? {errors.password.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ + Forgot password? + +
+
+
+ ); +} diff --git a/002_source/cms/src/components/auth/cognito/sign-up-confirm-form.tsx b/002_source/cms/src/components/auth/cognito/sign-up-confirm-form.tsx new file mode 100644 index 0000000..4ce1442 --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/sign-up-confirm-form.tsx @@ -0,0 +1,107 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { autoSignIn, confirmSignUp } from 'aws-amplify/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod.object({ confirmationCode: zod.string().min(1, { message: 'Code is required' }) }); + +type Values = zod.infer; + +const defaultValues = { confirmationCode: '' } satisfies Values; + +export interface SignUpConfirmFormProps { + email: string; +} + +export function SignUpConfirmForm({ email }: SignUpConfirmFormProps): React.JSX.Element { + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + const { nextStep } = await confirmSignUp({ username: email, confirmationCode: values.confirmationCode }); + + if (nextStep.signUpStep === 'DONE') { + // Unless you disabled `autoSignIn` in signUp + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + // Otherwise you should redirect to the sign in page. + return; + } + + if (nextStep.signUpStep === 'COMPLETE_AUTO_SIGN_IN') { + await autoSignIn(); + return; + } + + throw new Error(`Unhandled next step: ${nextStep.signUpStep}`); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [email, setError] + ); + + return ( + +
+ + + +
+ Confirm your email + + We've sent a verification email to{' '} + + "{email}" + + . + +
+ + ( + + Confirmation code + + {errors.confirmationCode ? {errors.confirmationCode.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ ); +} diff --git a/002_source/cms/src/components/auth/cognito/sign-up-form.tsx b/002_source/cms/src/components/auth/cognito/sign-up-form.tsx new file mode 100644 index 0000000..1dc8eaf --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/sign-up-form.tsx @@ -0,0 +1,170 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { signUp } from '@aws-amplify/auth'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod.object({ + firstName: zod.string().min(1, { message: 'First name is required' }), + lastName: zod.string().min(1, { message: 'Last name is required' }), + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + terms: zod.boolean().refine((value) => value, 'You must accept the terms and conditions'), +}); + +type Values = zod.infer; + +const defaultValues = { firstName: '', lastName: '', email: '', password: '', terms: false } satisfies Values; + +export function SignUpForm(): React.JSX.Element { + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + const { nextStep } = await signUp({ + username: values.email, + password: values.password, + // @ts-expect-error -- Type error + options: { autoSignIn: true }, + }); + + if (nextStep.signUpStep === 'DONE') { + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + return; + } + + if (nextStep.signUpStep === 'CONFIRM_SIGN_UP') { + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.cognito.signUpConfirm}?${searchParams.toString()}`); + return; + } + + throw new Error(`Unhandled next step: ${nextStep.signUpStep}`); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [router, setError] + ); + + return ( + +
+ + + +
+ + Sign up + + Already have an account?{' '} + + Sign in + + + +
+ + ( + + First name + + {errors.firstName ? {errors.firstName.message} : null} + + )} + /> + ( + + Last name + + {errors.lastName ? {errors.lastName.message} : null} + + )} + /> + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( +
+ } + label={ + + I have read the terms and conditions + + } + /> + {errors.terms ? {errors.terms.message} : null} +
+ )} + /> + {errors.root ? {errors.root.message} : null} + +
+
+
+ ); +} diff --git a/002_source/cms/src/components/auth/cognito/update-password-form.tsx b/002_source/cms/src/components/auth/cognito/update-password-form.tsx new file mode 100644 index 0000000..c03ede8 --- /dev/null +++ b/002_source/cms/src/components/auth/cognito/update-password-form.tsx @@ -0,0 +1,144 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { confirmResetPassword } from '@aws-amplify/auth'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +import { ResetPasswordButton } from './reset-password-button'; + +const schema = zod + .object({ + confirmationCode: zod.string().min(1, { message: 'Confirmation code is required' }), + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + confirmPassword: zod.string(), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords don't match", + path: ['confirmPassword'], + }); + +type Values = zod.infer; + +const defaultValues = { confirmationCode: '', password: '', confirmPassword: '' } satisfies Values; + +export interface UpdatePasswordFormProps { + email: string; +} + +export function UpdatePasswordForm({ email }: UpdatePasswordFormProps): React.JSX.Element { + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + await confirmResetPassword({ + username: email, + newPassword: values.password, + confirmationCode: values.confirmationCode, + }); + toast.success('Password updated'); + router.push(paths.auth.cognito.signIn); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [router, email, setError] + ); + + return ( + +
+ + + +
+ Update password + + + If an account exists with email{' '} + + "{email}" + + , you will receive a recovery email. + +
+ + Use another email + +
+
+
+ + ( + + Confirmation Code + + {errors.confirmationCode ? {errors.confirmationCode.message} : null} + + )} + /> + ( + + New password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( + + Confirm password + + {errors.confirmPassword ? {errors.confirmPassword.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+ Resend +
+ ); +} diff --git a/002_source/cms/src/components/auth/custom/reset-password-form.tsx b/002_source/cms/src/components/auth/custom/reset-password-form.tsx new file mode 100644 index 0000000..f2f2a0f --- /dev/null +++ b/002_source/cms/src/components/auth/custom/reset-password-form.tsx @@ -0,0 +1,86 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { authClient } from '@/lib/auth/custom/client'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod.object({ email: zod.string().min(1, { message: 'Email is required' }).email() }); + +type Values = zod.infer; + +const defaultValues = { email: '' } satisfies Values; + +export function ResetPasswordForm(): React.JSX.Element { + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + const { error } = await authClient.resetPassword(values); + + if (error) { + setError('root', { type: 'server', message: error }); + setIsPending(false); + return; + } + + setIsPending(false); + + // Redirect to confirm password reset + }, + [setError] + ); + + return ( + +
+ + + +
+ Reset password +
+ + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ ); +} diff --git a/002_source/cms/src/components/auth/custom/sign-in-form.tsx b/002_source/cms/src/components/auth/custom/sign-in-form.tsx new file mode 100644 index 0000000..8a8ea0b --- /dev/null +++ b/002_source/cms/src/components/auth/custom/sign-in-form.tsx @@ -0,0 +1,214 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Divider from '@mui/material/Divider'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Eye as EyeIcon } from '@phosphor-icons/react/dist/ssr/Eye'; +import { EyeSlash as EyeSlashIcon } from '@phosphor-icons/react/dist/ssr/EyeSlash'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { authClient } from '@/lib/auth/custom/client'; +import { useUser } from '@/hooks/use-user'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +interface OAuthProvider { + id: 'google' | 'discord'; + name: string; + logo: string; +} + +const oAuthProviders = [ + { id: 'google', name: 'Google', logo: '/assets/logo-google.svg' }, + { id: 'discord', name: 'Discord', logo: '/assets/logo-discord.svg' }, +] satisfies OAuthProvider[]; + +const schema = zod.object({ + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(1, { message: 'Password is required' }), +}); + +type Values = zod.infer; + +const defaultValues = { email: '', password: '' } satisfies Values; + +export function SignInForm(): React.JSX.Element { + const router = useRouter(); + + const { checkSession } = useUser(); + + const [showPassword, setShowPassword] = React.useState(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onAuth = React.useCallback(async (providerId: OAuthProvider['id']): Promise => { + setIsPending(true); + + const { error } = await authClient.signInWithOAuth({ provider: providerId }); + + if (error) { + setIsPending(false); + toast.error(error); + return; + } + + setIsPending(false); + + // Redirect to OAuth provider + }, []); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + const { error } = await authClient.signInWithPassword(values); + + if (error) { + setError('root', { type: 'server', message: error }); + setIsPending(false); + return; + } + + // Refresh the auth state + await checkSession?.(); + + // UserProvider, for this case, will not refresh the router + // After refresh, GuestGuard will handle the redirect + router.refresh(); + }, + [checkSession, router, setError] + ); + + return ( + +
+ + + +
+ + Sign in + + Don't have an account?{' '} + + Sign up + + + + + + {oAuthProviders.map( + (provider): React.JSX.Element => ( + + ) + )} + + or + +
+ + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + { + setShowPassword(false); + }} + /> + ) : ( + { + setShowPassword(true); + }} + /> + ) + } + label="Password" + type={showPassword ? 'text' : 'password'} + /> + {errors.password ? {errors.password.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ + Forgot password? + +
+
+
+ + Use{' '} + + sofia@devias.io + {' '} + with password{' '} + + Secret1 + + +
+ ); +} diff --git a/002_source/cms/src/components/auth/custom/sign-up-form.tsx b/002_source/cms/src/components/auth/custom/sign-up-form.tsx new file mode 100644 index 0000000..c4dd1db --- /dev/null +++ b/002_source/cms/src/components/auth/custom/sign-up-form.tsx @@ -0,0 +1,215 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import Divider from '@mui/material/Divider'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { authClient } from '@/lib/auth/custom/client'; +import { useUser } from '@/hooks/use-user'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +interface OAuthProvider { + id: 'google' | 'discord'; + name: string; + logo: string; +} + +const oAuthProviders = [ + { id: 'google', name: 'Google', logo: '/assets/logo-google.svg' }, + { id: 'discord', name: 'Discord', logo: '/assets/logo-discord.svg' }, +] satisfies OAuthProvider[]; + +const schema = zod.object({ + firstName: zod.string().min(1, { message: 'First name is required' }), + lastName: zod.string().min(1, { message: 'Last name is required' }), + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + terms: zod.boolean().refine((value) => value, 'You must accept the terms and conditions'), +}); + +type Values = zod.infer; + +const defaultValues = { firstName: '', lastName: '', email: '', password: '', terms: false } satisfies Values; + +export function SignUpForm(): React.JSX.Element { + const router = useRouter(); + + const { checkSession } = useUser(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onAuth = React.useCallback(async (providerId: OAuthProvider['id']): Promise => { + setIsPending(true); + + const { error } = await authClient.signInWithOAuth({ provider: providerId }); + + if (error) { + setIsPending(false); + toast.error(error); + return; + } + + setIsPending(false); + + // Redirect to OAuth provider + }, []); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + const { error } = await authClient.signUp(values); + + if (error) { + setError('root', { type: 'server', message: error }); + setIsPending(false); + return; + } + + // Refresh the auth state + await checkSession?.(); + + // UserProvider, for this case, will not refresh the router + // After refresh, GuestGuard will handle the redirect + router.refresh(); + }, + [checkSession, router, setError] + ); + + return ( + +
+ + + +
+ + Sign up + + Already have an account?{' '} + + Sign in + + + + + + {oAuthProviders.map( + (provider): React.JSX.Element => ( + + ) + )} + + or +
+ + ( + + First name + + {errors.firstName ? {errors.firstName.message} : null} + + )} + /> + ( + + Last name + + {errors.lastName ? {errors.lastName.message} : null} + + )} + /> + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( +
+ } + label={ + + I have read the terms and conditions + + } + /> + {errors.terms ? {errors.terms.message} : null} +
+ )} + /> + {errors.root ? {errors.root.message} : null} + +
+
+
+ Created users are not persisted +
+ ); +} diff --git a/002_source/cms/src/components/auth/firebase/reset-password-button.tsx b/002_source/cms/src/components/auth/firebase/reset-password-button.tsx new file mode 100644 index 0000000..c2bec46 --- /dev/null +++ b/002_source/cms/src/components/auth/firebase/reset-password-button.tsx @@ -0,0 +1,48 @@ +'use client'; + +import * as React from 'react'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { sendPasswordResetEmail } from 'firebase/auth'; +import type { Auth } from 'firebase/auth'; + +import { getFirebaseAuth } from '@/lib/auth/firebase/client'; + +export interface ResetPasswordButtonProps { + children: React.ReactNode; + email?: string; +} + +export function ResetPasswordButton({ children, email }: ResetPasswordButtonProps): React.JSX.Element { + const [firebaseAuth] = React.useState(getFirebaseAuth()); + + const [isPending, setIsPending] = React.useState(false); + const [submitError, setSubmitError] = React.useState(); + + const handle = React.useCallback(async (): Promise => { + if (!email) { + return; + } + + try { + await sendPasswordResetEmail(firebaseAuth, email); + } catch (err) { + setSubmitError((err as { message: string }).message); + setIsPending(false); + } + }, [firebaseAuth, email]); + + return ( + + {submitError ? {submitError} : null} + + + Wait a few minutes then try again + + + ); +} diff --git a/002_source/cms/src/components/auth/firebase/reset-password-form.tsx b/002_source/cms/src/components/auth/firebase/reset-password-form.tsx new file mode 100644 index 0000000..2db6984 --- /dev/null +++ b/002_source/cms/src/components/auth/firebase/reset-password-form.tsx @@ -0,0 +1,94 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { sendPasswordResetEmail } from 'firebase/auth'; +import type { Auth } from 'firebase/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { getFirebaseAuth } from '@/lib/auth/firebase/client'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod.object({ email: zod.string().min(1, { message: 'Email is required' }).email() }); + +type Values = zod.infer; + +const defaultValues = { email: '' } satisfies Values; + +export function ResetPasswordForm(): React.JSX.Element { + const [firebaseAuth] = React.useState(getFirebaseAuth()); + + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + // If you receive a link that opens a page with the error "The selected page mode is invalid" + // you might have this issue https://github.com/firebase/firebase-js-sdk/issues/7981 + // In our case, we had to wait some time and then it started to work as expected. + + try { + await sendPasswordResetEmail(firebaseAuth, values.email); + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.firebase.recoveryLinkSent}?${searchParams.toString()}`); + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [firebaseAuth, router, setError] + ); + + return ( + +
+ + + +
+ Reset password +
+ + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ ); +} diff --git a/002_source/cms/src/components/auth/firebase/sign-in-form.tsx b/002_source/cms/src/components/auth/firebase/sign-in-form.tsx new file mode 100644 index 0000000..df5d95a --- /dev/null +++ b/002_source/cms/src/components/auth/firebase/sign-in-form.tsx @@ -0,0 +1,203 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Divider from '@mui/material/Divider'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Eye as EyeIcon } from '@phosphor-icons/react/dist/ssr/Eye'; +import { EyeSlash as EyeSlashIcon } from '@phosphor-icons/react/dist/ssr/EyeSlash'; +import { GoogleAuthProvider, signInWithEmailAndPassword, signInWithPopup } from 'firebase/auth'; +import type { Auth } from 'firebase/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { getFirebaseAuth } from '@/lib/auth/firebase/client'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +interface OAuthProvider { + id: 'google' | 'github'; + name: string; + logo: string; +} + +const oAuthProviders = [{ id: 'google', name: 'Google', logo: '/assets/logo-google.svg' }] satisfies OAuthProvider[]; + +const schema = zod.object({ + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(1, { message: 'Password is required' }), +}); + +type Values = zod.infer; + +const defaultValues = { email: '', password: '' } satisfies Values; + +export function SignInForm(): React.JSX.Element { + const [firebaseAuth] = React.useState(getFirebaseAuth()); + + const [showPassword, setShowPassword] = React.useState(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onAuth = React.useCallback( + async (providerId: OAuthProvider['id']): Promise => { + setIsPending(true); + + let provider: GoogleAuthProvider; + + switch (providerId) { + case 'google': + provider = new GoogleAuthProvider(); + break; + default: + throw new Error(`Unknown provider: ${providerId}`); + } + + try { + await signInWithPopup(firebaseAuth, provider); + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + } catch (err) { + setIsPending(false); + toast.error((err as { message: string }).message); + } + }, + [firebaseAuth] + ); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + await signInWithEmailAndPassword(firebaseAuth, values.email, values.password); + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [firebaseAuth, setError] + ); + + return ( + +
+ + + +
+ + Sign in + + Don't have an account?{' '} + + Sign up + + + + + + {oAuthProviders.map( + (provider): React.JSX.Element => ( + + ) + )} + + or + +
+ + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + { + setShowPassword(false); + }} + /> + ) : ( + { + setShowPassword(true); + }} + /> + ) + } + label="Password" + type={showPassword ? 'text' : 'password'} + /> + {errors.password ? {errors.password.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ + Forgot password? + +
+
+
+
+ ); +} diff --git a/002_source/cms/src/components/auth/firebase/sign-up-form.tsx b/002_source/cms/src/components/auth/firebase/sign-up-form.tsx new file mode 100644 index 0000000..0f5b6bb --- /dev/null +++ b/002_source/cms/src/components/auth/firebase/sign-up-form.tsx @@ -0,0 +1,213 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import Divider from '@mui/material/Divider'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { createUserWithEmailAndPassword, GoogleAuthProvider, signInWithPopup } from 'firebase/auth'; +import type { Auth } from 'firebase/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { getFirebaseAuth } from '@/lib/auth/firebase/client'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +interface OAuthProvider { + id: 'google' | 'github'; + name: string; + logo: string; +} + +const oAuthProviders = [{ id: 'google', name: 'Google', logo: '/assets/logo-google.svg' }] satisfies OAuthProvider[]; + +const schema = zod.object({ + firstName: zod.string().min(1, { message: 'First name is required' }), + lastName: zod.string().min(1, { message: 'Last name is required' }), + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + terms: zod.boolean().refine((value) => value, 'You must accept the terms and conditions'), +}); + +type Values = zod.infer; + +const defaultValues = { firstName: '', lastName: '', email: '', password: '', terms: false } satisfies Values; + +export function SignUpForm(): React.JSX.Element { + const [firebaseAuth] = React.useState(getFirebaseAuth()); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onAuth = React.useCallback( + async (providerId: OAuthProvider['id']): Promise => { + setIsPending(true); + + let provider: GoogleAuthProvider; + + switch (providerId) { + case 'google': + provider = new GoogleAuthProvider(); + break; + default: + throw new Error(`Unknown provider: ${providerId}`); + } + + try { + await signInWithPopup(firebaseAuth, provider); + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + } catch (err) { + setIsPending(false); + toast.error((err as { message: string }).message); + } + }, + [firebaseAuth] + ); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + await createUserWithEmailAndPassword(firebaseAuth, values.email, values.password); + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + } catch (err) { + setError('root', { type: 'server', message: (err as { message: string }).message }); + setIsPending(false); + } + }, + [firebaseAuth, setError] + ); + + return ( + +
+ + + +
+ + Sign up + + Already have an account?{' '} + + Sign in + + + + + + {oAuthProviders.map( + (provider): React.JSX.Element => ( + + ) + )} + + or +
+ + ( + + First name + + {errors.firstName ? {errors.firstName.message} : null} + + )} + /> + ( + + Last name + + {errors.lastName ? {errors.lastName.message} : null} + + )} + /> + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( +
+ } + label={ + + I have read the terms and conditions + + } + /> + {errors.terms ? {errors.terms.message} : null} +
+ )} + /> + {errors.root ? {errors.root.message} : null} + +
+
+
+
+ ); +} diff --git a/002_source/cms/src/components/auth/firebase/update-password-form.tsx b/002_source/cms/src/components/auth/firebase/update-password-form.tsx new file mode 100644 index 0000000..f593ad9 --- /dev/null +++ b/002_source/cms/src/components/auth/firebase/update-password-form.tsx @@ -0,0 +1,117 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { confirmPasswordReset } from 'firebase/auth'; +import type { Auth } from 'firebase/auth'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { getFirebaseAuth } from '@/lib/auth/firebase/client'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +const schema = zod + .object({ + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + confirmPassword: zod.string(), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords don't match", + path: ['confirmPassword'], + }); + +type Values = zod.infer; + +const defaultValues = { password: '', confirmPassword: '' } satisfies Values; + +export interface UpdatePasswordFormProps { + oobCode: string; +} + +export function UpdatePasswordForm({ oobCode }: UpdatePasswordFormProps): React.JSX.Element { + const [firebaseAuth] = React.useState(getFirebaseAuth()); + + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + try { + await confirmPasswordReset(firebaseAuth, oobCode, values.password); + toast.success('Password updated'); + router.push(paths.auth.firebase.signIn); + } catch (err) { + setError('root', { message: (err as { message: string }).message }); + setIsPending(false); + return; + } + + router.push(paths.dashboard.overview); + }, + [firebaseAuth, oobCode, router, setError] + ); + + return ( + +
+ + + +
+ Update password +
+ + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( + + Confirm password + + {errors.confirmPassword ? {errors.confirmPassword.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ ); +} diff --git a/002_source/cms/src/components/auth/guest-guard.tsx b/002_source/cms/src/components/auth/guest-guard.tsx new file mode 100644 index 0000000..10ac5a7 --- /dev/null +++ b/002_source/cms/src/components/auth/guest-guard.tsx @@ -0,0 +1,55 @@ +'use client'; + +import * as React from 'react'; +import { useRouter } from 'next/navigation'; +import Alert from '@mui/material/Alert'; + +import { paths } from '@/paths'; +import { logger } from '@/lib/default-logger'; +import { useUser } from '@/hooks/use-user'; + +export interface GuestGuardProps { + children: React.ReactNode; +} + +export function GuestGuard({ children }: GuestGuardProps): React.JSX.Element | null { + const router = useRouter(); + const { user, error, isLoading } = useUser(); + const [isChecking, setIsChecking] = React.useState(true); + + const checkPermissions = async (): Promise => { + if (isLoading) { + return; + } + + if (error) { + setIsChecking(false); + return; + } + + if (user) { + logger.debug('[GuestGuard]: User is logged in, redirecting to dashboard'); + router.replace(paths.dashboard.overview); + return; + } + + setIsChecking(false); + }; + + React.useEffect(() => { + checkPermissions().catch(() => { + // noop + }); + // eslint-disable-next-line react-hooks/exhaustive-deps -- Expected + }, [user, error, isLoading]); + + if (isChecking) { + return null; + } + + if (error) { + return {error}; + } + + return {children}; +} diff --git a/002_source/cms/src/components/auth/split-layout.tsx b/002_source/cms/src/components/auth/split-layout.tsx new file mode 100644 index 0000000..43bdf92 --- /dev/null +++ b/002_source/cms/src/components/auth/split-layout.tsx @@ -0,0 +1,123 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +export interface SplitLayoutProps { + children: React.ReactNode; +} + +export function SplitLayout({ children }: SplitLayoutProps): React.JSX.Element { + return ( + + + + + Welcome to Devias Kit PRO + + A professional template that comes with ready-to-use MUI components developed with one common goal in + mind, help you build faster & beautiful applications. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {children} + + + + ); +} diff --git a/002_source/cms/src/components/auth/strategy-guard.tsx b/002_source/cms/src/components/auth/strategy-guard.tsx new file mode 100644 index 0000000..54985fd --- /dev/null +++ b/002_source/cms/src/components/auth/strategy-guard.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; + +import { config } from '@/config'; +import type { AuthStrategy } from '@/lib/auth/strategy'; + +interface StrategyGuardProps { + children: React.ReactNode; + expected: keyof typeof AuthStrategy; +} + +export function StrategyGuard({ children, expected }: StrategyGuardProps): React.JSX.Element { + if (config.auth.strategy !== expected) { + return ( + + + To render this page, you need to configure the auth strategy to "{expected}" + + + ); + } + + return {children}; +} diff --git a/002_source/cms/src/components/auth/supabase/reset-password-button.tsx b/002_source/cms/src/components/auth/supabase/reset-password-button.tsx new file mode 100644 index 0000000..49bcc4d --- /dev/null +++ b/002_source/cms/src/components/auth/supabase/reset-password-button.tsx @@ -0,0 +1,59 @@ +'use client'; + +import * as React from 'react'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import type { SupabaseClient } from '@supabase/supabase-js'; + +import { paths } from '@/paths'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; +import { toast } from '@/components/core/toaster'; + +export interface ResetPasswordButtonProps { + children: React.ReactNode; + email?: string; +} + +export function ResetPasswordButton({ children, email }: ResetPasswordButtonProps): React.JSX.Element { + const [supabaseClient] = React.useState(createSupabaseClient()); + + const [isPending, setIsPending] = React.useState(false); + const [submitError, setSubmitError] = React.useState(); + + const handle = React.useCallback(async (): Promise => { + if (!email) { + return; + } + + setIsPending(true); + setSubmitError(undefined); + + const redirectToUrl = new URL(paths.auth.supabase.callback.pkce, window.location.origin); + redirectToUrl.searchParams.set('next', paths.auth.supabase.updatePassword); + + const { error } = await supabaseClient.auth.resetPasswordForEmail(email, { redirectTo: redirectToUrl.href }); + + if (error) { + setSubmitError(error.message); + setIsPending(false); + return; + } + + setIsPending(false); + toast.success('Recovery link sent'); + }, [supabaseClient, email]); + + return ( + + {submitError ? {submitError} : null} + + + Wait a few minutes then try again + + + ); +} diff --git a/002_source/cms/src/components/auth/supabase/reset-password-form.tsx b/002_source/cms/src/components/auth/supabase/reset-password-form.tsx new file mode 100644 index 0000000..f5d681b --- /dev/null +++ b/002_source/cms/src/components/auth/supabase/reset-password-form.tsx @@ -0,0 +1,85 @@ +'use client'; + +import * as React from 'react'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; + +const schema = zod.object({ email: zod.string().min(1, { message: 'Email is required' }).email() }); + +type Values = zod.infer; + +const defaultValues = { email: '' } satisfies Values; + +export function ResetPasswordForm(): React.JSX.Element { + const [supabaseClient] = React.useState(createSupabaseClient()); + + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + const redirectToUrl = new URL(paths.auth.supabase.callback.pkce, window.location.origin); + redirectToUrl.searchParams.set('next', paths.auth.supabase.updatePassword); + + const { error } = await supabaseClient.auth.resetPasswordForEmail(values.email, { + redirectTo: redirectToUrl.href, + }); + + if (error) { + setError('root', { type: 'server', message: error.message }); + setIsPending(false); + return; + } + + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.supabase.recoveryLinkSent}?${searchParams.toString()}`); + }, + [supabaseClient, router, setError] + ); + + return ( +
+ + + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + + +
+ ); +} diff --git a/002_source/cms/src/components/auth/supabase/sign-in-form.tsx b/002_source/cms/src/components/auth/supabase/sign-in-form.tsx new file mode 100644 index 0000000..91eba0f --- /dev/null +++ b/002_source/cms/src/components/auth/supabase/sign-in-form.tsx @@ -0,0 +1,216 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Divider from '@mui/material/Divider'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Eye as EyeIcon } from '@phosphor-icons/react/dist/ssr/Eye'; +import { EyeSlash as EyeSlashIcon } from '@phosphor-icons/react/dist/ssr/EyeSlash'; +import type { SupabaseClient } from '@supabase/supabase-js'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +interface OAuthProvider { + id: 'google' | 'discord'; + name: string; + logo: string; +} + +const oAuthProviders = [ + { id: 'google', name: 'Google', logo: '/assets/logo-google.svg' }, + { id: 'discord', name: 'Discord', logo: '/assets/logo-discord.svg' }, +] satisfies OAuthProvider[]; + +const schema = zod.object({ + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(1, { message: 'Password is required' }), +}); + +type Values = zod.infer; + +const defaultValues = { email: '', password: '' } satisfies Values; + +export function SignInForm(): React.JSX.Element { + const [supabaseClient] = React.useState(createSupabaseClient()); + + const router = useRouter(); + + const [showPassword, setShowPassword] = React.useState(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onAuth = React.useCallback( + async (providerId: OAuthProvider['id']): Promise => { + setIsPending(true); + + const redirectToUrl = new URL(paths.auth.supabase.callback.pkce, window.location.origin); + redirectToUrl.searchParams.set('next', paths.dashboard.overview); + + const { data, error } = await supabaseClient.auth.signInWithOAuth({ + provider: providerId, + options: { redirectTo: redirectToUrl.href }, + }); + + if (error) { + setIsPending(false); + toast.error(error.message); + return; + } + + window.location.href = data.url; + }, + [supabaseClient] + ); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + const { error } = await supabaseClient.auth.signInWithPassword({ + email: values.email, + password: values.password, + }); + + if (error) { + if (error.message.includes('Email not confirmed')) { + // You should resend the verification email. + // For the sake of simplicity, we will just redirect to the confirmation page. + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.supabase.signUpConfirm}?${searchParams.toString()}`); + } else { + setError('root', { type: 'server', message: error.message }); + setIsPending(false); + } + } else { + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + } + }, + [supabaseClient, router, setError] + ); + + return ( + +
+ + + +
+ + Sign in + + Don't have an account?{' '} + + Sign up + + + + + + {oAuthProviders.map( + (provider): React.JSX.Element => ( + + ) + )} + + or + +
+ + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + { + setShowPassword(false); + }} + /> + ) : ( + { + setShowPassword(true); + }} + /> + ) + } + label="Password" + type={showPassword ? 'text' : 'password'} + /> + {errors.password ? {errors.password.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ + Forgot password? + +
+
+
+
+ ); +} diff --git a/002_source/cms/src/components/auth/supabase/sign-up-form.tsx b/002_source/cms/src/components/auth/supabase/sign-up-form.tsx new file mode 100644 index 0000000..67edc32 --- /dev/null +++ b/002_source/cms/src/components/auth/supabase/sign-up-form.tsx @@ -0,0 +1,240 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import Divider from '@mui/material/Divider'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import Link from '@mui/material/Link'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; +import { DynamicLogo } from '@/components/core/logo'; +import { toast } from '@/components/core/toaster'; + +interface OAuthProvider { + id: 'google' | 'discord'; + name: string; + logo: string; +} + +const oAuthProviders = [ + { id: 'google', name: 'Google', logo: '/assets/logo-google.svg' }, + { id: 'discord', name: 'Discord', logo: '/assets/logo-discord.svg' }, +] satisfies OAuthProvider[]; + +const schema = zod.object({ + firstName: zod.string().min(1, { message: 'First name is required' }), + lastName: zod.string().min(1, { message: 'Last name is required' }), + email: zod.string().min(1, { message: 'Email is required' }).email(), + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + terms: zod.boolean().refine((value) => value, 'You must accept the terms and conditions'), +}); + +type Values = zod.infer; + +const defaultValues = { firstName: '', lastName: '', email: '', password: '', terms: false } satisfies Values; + +export function SignUpForm(): React.JSX.Element { + const [supabaseClient] = React.useState(createSupabaseClient()); + + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onAuth = React.useCallback( + async (providerId: OAuthProvider['id']): Promise => { + setIsPending(true); + + const redirectToUrl = new URL(paths.auth.supabase.callback.pkce, window.location.origin); + redirectToUrl.searchParams.set('next', paths.dashboard.overview); + + const { data, error } = await supabaseClient.auth.signInWithOAuth({ + provider: providerId, + options: { redirectTo: redirectToUrl.href }, + }); + + if (error) { + setIsPending(false); + toast.error(error.message); + return; + } + + window.location.href = data.url; + }, + [supabaseClient] + ); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + // It is really important that you read the official notes + // under "If signUp() is called for an existing confirmed user" + // https://supabase.com/docs/reference/javascript/auth-signup + // If a user already exists with this email, they will not + // receive a confirmation email. + + const redirectToUrl = new URL(paths.auth.supabase.callback.pkce, window.location.origin); + redirectToUrl.searchParams.set('next', paths.dashboard.overview); + + const { data, error } = await supabaseClient.auth.signUp({ + email: values.email, + password: values.password, + options: { emailRedirectTo: redirectToUrl.href }, + }); + + if (error) { + setError('root', { type: 'server', message: error.message }); + setIsPending(false); + return; + } + + if (data.session) { + // UserProvider will handle Router refresh + // After refresh, GuestGuard will handle the redirect + return; + } + + if (data.user) { + const searchParams = new URLSearchParams({ email: values.email }); + router.push(`${paths.auth.supabase.signUpConfirm}?${searchParams.toString()}`); + return; + } + + setIsPending(false); + }, + [supabaseClient, router, setError] + ); + + return ( + +
+ + + +
+ + Sign up + + Already have an account?{' '} + + Sign in + + + + + + {oAuthProviders.map( + (provider): React.JSX.Element => ( + + ) + )} + + or +
+ + ( + + First name + + {errors.firstName ? {errors.firstName.message} : null} + + )} + /> + ( + + Last name + + {errors.lastName ? {errors.lastName.message} : null} + + )} + /> + ( + + Email address + + {errors.email ? {errors.email.message} : null} + + )} + /> + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( +
+ } + label={ + + I have read the terms and conditions + + } + /> + {errors.terms ? {errors.terms.message} : null} +
+ )} + /> + {errors.root ? {errors.root.message} : null} + +
+
+
+
+ ); +} diff --git a/002_source/cms/src/components/auth/supabase/sign-up-resend-button.tsx b/002_source/cms/src/components/auth/supabase/sign-up-resend-button.tsx new file mode 100644 index 0000000..018bd49 --- /dev/null +++ b/002_source/cms/src/components/auth/supabase/sign-up-resend-button.tsx @@ -0,0 +1,58 @@ +'use client'; + +import * as React from 'react'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import { paths } from '@/paths'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; +import { toast } from '@/components/core/toaster'; + +export interface SignUpResendButtonProps { + children: React.ReactNode; + email: string; +} + +export function SignUpResendButton({ children, email }: SignUpResendButtonProps): React.JSX.Element { + const [supabaseClient] = React.useState(createSupabaseClient()); + + const [isPending, setIsPending] = React.useState(false); + const [submitError, setSubmitError] = React.useState(); + + const handleAction = React.useCallback(async (): Promise => { + setIsPending(true); + setSubmitError(undefined); + + const redirectToUrl = new URL(paths.auth.supabase.callback.implicit, window.location.origin); + redirectToUrl.searchParams.set('next', paths.dashboard.overview); + + const { error } = await supabaseClient.auth.resend({ + email, + type: 'signup', + options: { emailRedirectTo: redirectToUrl.href }, + }); + + if (error) { + setSubmitError(error.message); + setIsPending(false); + return; + } + + setIsPending(false); + toast.success('Verification email sent'); + }, [supabaseClient, email]); + + return ( + + + {submitError ? {submitError} : null} + + Wait a few minutes then try again + + + ); +} diff --git a/002_source/cms/src/components/auth/supabase/update-password-form.tsx b/002_source/cms/src/components/auth/supabase/update-password-form.tsx new file mode 100644 index 0000000..5d2dd40 --- /dev/null +++ b/002_source/cms/src/components/auth/supabase/update-password-form.tsx @@ -0,0 +1,108 @@ +'use client'; + +import * as React from 'react'; +import RouterLink from 'next/link'; +import { useRouter } from 'next/navigation'; +import { zodResolver } from '@hookform/resolvers/zod'; +import Alert from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import FormHelperText from '@mui/material/FormHelperText'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { Controller, useForm } from 'react-hook-form'; +import { z as zod } from 'zod'; + +import { paths } from '@/paths'; +import { createClient as createSupabaseClient } from '@/lib/supabase/client'; +import { DynamicLogo } from '@/components/core/logo'; + +const schema = zod + .object({ + password: zod.string().min(6, { message: 'Password should be at least 6 characters' }), + confirmPassword: zod.string(), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords don't match", + path: ['confirmPassword'], + }); + +type Values = zod.infer; + +const defaultValues = { password: '', confirmPassword: '' } satisfies Values; + +export function UpdatePasswordForm(): React.JSX.Element { + const [supabaseClient] = React.useState(createSupabaseClient()); + + const router = useRouter(); + + const [isPending, setIsPending] = React.useState(false); + + const { + control, + handleSubmit, + setError, + formState: { errors }, + } = useForm({ defaultValues, resolver: zodResolver(schema) }); + + const onSubmit = React.useCallback( + async (values: Values): Promise => { + setIsPending(true); + + const { error } = await supabaseClient.auth.updateUser({ password: values.password }); + + if (error) { + setError('root', { type: 'server', message: error.message }); + setIsPending(false); + return; + } + + router.push(paths.dashboard.overview); + }, + [supabaseClient, router, setError] + ); + + return ( + +
+ + + +
+ Update password +
+ + ( + + Password + + {errors.password ? {errors.password.message} : null} + + )} + /> + ( + + Confirm password + + {errors.confirmPassword ? {errors.confirmPassword.message} : null} + + )} + /> + {errors.root ? {errors.root.message} : null} + + +
+
+ ); +} diff --git a/002_source/cms/src/components/core/analytics.tsx b/002_source/cms/src/components/core/analytics.tsx new file mode 100644 index 0000000..e93c389 --- /dev/null +++ b/002_source/cms/src/components/core/analytics.tsx @@ -0,0 +1,44 @@ +'use client'; + +import * as React from 'react'; +import { usePathname, useSearchParams } from 'next/navigation'; +import { GTMProvider, useGTMDispatch } from '@elgorditosalsero/react-gtm-hook'; + +import { config } from '@/config'; + +export interface PageViewTrackerProps { + children: React.ReactNode; +} + +function PageViewTracker({ children }: PageViewTrackerProps): React.JSX.Element { + const dispatch = useGTMDispatch(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + React.useEffect(() => { + dispatch({ event: 'page_view', page: pathname }); + }, [dispatch, pathname, searchParams]); + + return {children}; +} + +export interface AnalyticsProps { + children: React.ReactNode; +} + +/** + * This loads GTM and tracks the page views. + * + * If GTM ID is not configured, this will no track any event. + */ +export function Analytics({ children }: AnalyticsProps): React.JSX.Element { + if (!config.gtm?.id) { + return {children}; + } + + return ( + + {children} + + ); +} diff --git a/002_source/cms/src/components/core/breadcrumbs-separator.tsx b/002_source/cms/src/components/core/breadcrumbs-separator.tsx new file mode 100644 index 0000000..3028feb --- /dev/null +++ b/002_source/cms/src/components/core/breadcrumbs-separator.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; + +export function BreadcrumbsSeparator(): React.JSX.Element { + return ; +} diff --git a/002_source/cms/src/components/core/code-highlighter.tsx b/002_source/cms/src/components/core/code-highlighter.tsx new file mode 100644 index 0000000..26eeafd --- /dev/null +++ b/002_source/cms/src/components/core/code-highlighter.tsx @@ -0,0 +1,110 @@ +import * as React from 'react'; +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; + +const codeStyle: Record = { + 'code[class*="language-"]': { + color: 'var(--mui-palette-neutral-50)', + background: 'none', + textShadow: '0 1px rgba(0, 0, 0, 0.3)', + fontFamily: "'Roboto Mono', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace", + fontSize: 'var(--fontSize-sm)', + textAlign: 'left', + whiteSpace: 'pre', + wordSpacing: 'normal', + wordBreak: 'normal', + wordWrap: 'normal', + lineHeight: 1.5, + MozTabSize: '4', + OTabSize: '4', + tabSize: '4', + WebkitHyphens: 'none', + MozHyphens: 'none', + msHyphens: 'none', + hyphens: 'none', + }, + 'pre[class*="language-"]': { + color: 'var(--mui-palette-neutral-50)', + background: 'var(--mui-palette-neutral-800)', + textShadow: '0 1px rgba(0, 0, 0, 0.3)', + fontFamily: "'Roboto Mono', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace", + fontSize: 'var(--fontSize-sm)', + textAlign: 'left', + whiteSpace: 'pre', + wordSpacing: 'normal', + wordBreak: 'normal', + wordWrap: 'normal', + lineHeight: 1.5, + MozTabSize: '4', + OTabSize: '4', + tabSize: '4', + WebkitHyphens: 'none', + MozHyphens: 'none', + msHyphens: 'none', + hyphens: 'none', + padding: '1em', + margin: '.5em 0', + overflow: 'auto', + borderRadius: '8px', + }, + ':not(pre) > code[class*="language-"]': { + background: 'var(--mui-palette-neutral-800)', + padding: '.1em', + borderRadius: '.3em', + whiteSpace: 'normal', + }, + comment: { color: '#6272a4' }, + prolog: { color: '#6272a4' }, + doctype: { color: '#6272a4' }, + cdata: { color: '#6272a4' }, + punctuation: { color: '#f8f8f2' }, + '.namespace': { opacity: '.7' }, + property: { color: '#ff79c6' }, + tag: { color: '#ff79c6' }, + constant: { color: '#ff79c6' }, + symbol: { color: '#ff79c6' }, + deleted: { color: '#ff79c6' }, + boolean: { color: '#bd93f9' }, + number: { color: '#bd93f9' }, + selector: { color: '#50fa7b' }, + 'attr-name': { color: '#50fa7b' }, + string: { color: '#50fa7b' }, + char: { color: '#50fa7b' }, + builtin: { color: '#50fa7b' }, + inserted: { color: '#50fa7b' }, + operator: { color: '#f8f8f2' }, + entity: { color: '#f8f8f2', cursor: 'help' }, + url: { color: '#f8f8f2' }, + '.language-css .token.string': { color: '#f8f8f2' }, + '.style .token.string': { color: '#f8f8f2' }, + variable: { color: '#f8f8f2' }, + atrule: { color: '#f1fa8c' }, + 'attr-value': { color: '#f1fa8c' }, + function: { color: '#f1fa8c' }, + 'class-name': { color: '#f1fa8c' }, + keyword: { color: '#8be9fd' }, + regex: { color: '#ffb86c' }, + important: { color: '#ffb86c', fontWeight: 'bold' }, + bold: { fontWeight: 'bold' }, + italic: { fontStyle: 'italic' }, +}; + +export interface CodeHighlighterProps { + children: React.ReactNode; + className?: string; + inline?: boolean; +} + +export function CodeHighlighter({ children, className, inline, ...props }: CodeHighlighterProps): React.JSX.Element { + const language = (className ?? '').split('language-')[1]; + const canHighlight = !inline && Boolean(language); + + return canHighlight ? ( + + {String(children).replace(/\n$/, '')} + + ) : ( + + {children} + + ); +} diff --git a/002_source/cms/src/components/core/data-table.tsx b/002_source/cms/src/components/core/data-table.tsx new file mode 100644 index 0000000..e62e52b --- /dev/null +++ b/002_source/cms/src/components/core/data-table.tsx @@ -0,0 +1,147 @@ +'use client'; + +import * as React from 'react'; +import Checkbox from '@mui/material/Checkbox'; +import Table from '@mui/material/Table'; +import type { TableProps } from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; + +export interface ColumnDef { + align?: 'left' | 'right' | 'center'; + field?: keyof TRowModel; + formatter?: (row: TRowModel, index: number) => React.ReactNode; + hideName?: boolean; + name: string; + width?: number | string; +} + +type RowId = number | string; + +export interface DataTableProps extends Omit { + columns: ColumnDef[]; + hideHead?: boolean; + hover?: boolean; + onClick?: (event: React.MouseEvent, row: TRowModel) => void; + onDeselectAll?: (event: React.ChangeEvent) => void; + onDeselectOne?: (event: React.ChangeEvent, row: TRowModel) => void; + onSelectAll?: (event: React.ChangeEvent) => void; + onSelectOne?: (event: React.ChangeEvent, row: TRowModel) => void; + rows: TRowModel[]; + selectable?: boolean; + selected?: Set; + uniqueRowId?: (row: TRowModel) => RowId; +} + +export function DataTable({ + columns, + hideHead, + hover, + onClick, + onDeselectAll, + onDeselectOne, + onSelectOne, + onSelectAll, + rows, + selectable, + selected, + uniqueRowId, + ...props +}: DataTableProps): React.JSX.Element { + const selectedSome = (selected?.size ?? 0) > 0 && (selected?.size ?? 0) < rows.length; + const selectedAll = rows.length > 0 && selected?.size === rows.length; + + return ( + + + + {selectable ? ( + + { + if (selectedAll) { + onDeselectAll?.(event); + } else { + onSelectAll?.(event); + } + }} + /> + + ) : null} + {columns.map( + (column): React.JSX.Element => ( + + {column.hideName ? null : column.name} + + ) + )} + + + + {rows.map((row, index): React.JSX.Element => { + const rowId = row.id ? row.id : uniqueRowId?.(row); + const rowSelected = rowId ? selected?.has(rowId) : false; + + return ( + { + onClick(event, row); + }, + })} + sx={{ ...(onClick && { cursor: 'pointer' }) }} + > + {selectable ? ( + + { + if (rowSelected) { + onDeselectOne?.(event, row); + } else { + onSelectOne?.(event, row); + } + }} + onClick={(event: React.MouseEvent) => { + if (onClick) { + event.stopPropagation(); + } + }} + /> + + ) : null} + {columns.map( + (column): React.JSX.Element => ( + + { + (column.formatter + ? column.formatter(row, index) + : column.field + ? row[column.field] + : null) as React.ReactNode + } + + ) + )} + + ); + })} + +
+ ); +} diff --git a/002_source/cms/src/components/core/dropdown/dropdown-context.tsx b/002_source/cms/src/components/core/dropdown/dropdown-context.tsx new file mode 100644 index 0000000..b4d4532 --- /dev/null +++ b/002_source/cms/src/components/core/dropdown/dropdown-context.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; + +function noop(..._: unknown[]): void { + // Do nothing +} + +export interface ContextValue { + anchorEl: HTMLElement | null; + onPopoverMouseEnter: (event: React.MouseEvent) => void; + onPopoverMouseLeave: (event: React.MouseEvent) => void; + onPopoverEscapePressed: () => void; + onTriggerMouseEnter: (event: React.MouseEvent) => void; + onTriggerMouseLeave: (event: React.MouseEvent) => void; + onTriggerKeyUp: (event: React.KeyboardEvent) => void; + open: boolean; +} + +export const DropdownContext = React.createContext({ + anchorEl: null, + onPopoverMouseEnter: noop, + onPopoverMouseLeave: noop, + onPopoverEscapePressed: noop, + onTriggerMouseEnter: noop, + onTriggerMouseLeave: noop, + onTriggerKeyUp: noop, + open: false, +}); diff --git a/002_source/cms/src/components/core/dropdown/dropdown-popover.tsx b/002_source/cms/src/components/core/dropdown/dropdown-popover.tsx new file mode 100644 index 0000000..fa477a2 --- /dev/null +++ b/002_source/cms/src/components/core/dropdown/dropdown-popover.tsx @@ -0,0 +1,45 @@ +import * as React from 'react'; +import type { PaperProps } from '@mui/material/Paper'; +import type { PopoverOrigin } from '@mui/material/Popover'; +import Popover from '@mui/material/Popover'; + +import { DropdownContext } from './dropdown-context'; + +export interface DropdownPopoverProps { + anchorOrigin?: PopoverOrigin; + children?: React.ReactNode; + disableScrollLock?: boolean; + PaperProps?: PaperProps; + transformOrigin?: PopoverOrigin; +} + +export function DropdownPopover({ children, PaperProps, ...props }: DropdownPopoverProps): React.JSX.Element { + const { anchorEl, onPopoverMouseEnter, onPopoverMouseLeave, onPopoverEscapePressed, open } = + React.useContext(DropdownContext); + + return ( + { + if (reason === 'escapeKeyDown') { + onPopoverEscapePressed?.(); + } + }} + open={open} + slotProps={{ + paper: { + ...PaperProps, + onMouseEnter: onPopoverMouseEnter, + onMouseLeave: onPopoverMouseLeave, + sx: { ...PaperProps?.sx, pointerEvents: 'auto' }, + }, + }} + sx={{ pointerEvents: 'none' }} + transformOrigin={{ horizontal: 'left', vertical: 'top' }} + {...props} + > + {children} + + ); +} diff --git a/002_source/cms/src/components/core/dropdown/dropdown-trigger.tsx b/002_source/cms/src/components/core/dropdown/dropdown-trigger.tsx new file mode 100644 index 0000000..c608936 --- /dev/null +++ b/002_source/cms/src/components/core/dropdown/dropdown-trigger.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; + +import { DropdownContext } from './dropdown-context'; + +export interface DropdownButtonProps { + children: React.ReactElement; +} + +export function DropdownTrigger({ children }: DropdownButtonProps): React.JSX.Element { + const { onTriggerMouseEnter, onTriggerMouseLeave, onTriggerKeyUp } = React.useContext(DropdownContext); + + return React.cloneElement(children, { + onKeyUp: (event: React.KeyboardEvent) => { + (children.props as { onKeyUp?: (event: React.KeyboardEvent) => void }).onKeyUp?.(event); + onTriggerKeyUp(event); + }, + onMouseEnter: (event: React.MouseEvent) => { + (children.props as { onMouseEnter?: (event: React.MouseEvent) => void }).onMouseEnter?.(event); + onTriggerMouseEnter(event); + }, + onMouseLeave: (event: React.MouseEvent) => { + (children.props as { onMouseLeave?: (event: React.MouseEvent) => void }).onMouseLeave?.(event); + onTriggerMouseLeave(event); + }, + }); +} diff --git a/002_source/cms/src/components/core/dropdown/dropdown.tsx b/002_source/cms/src/components/core/dropdown/dropdown.tsx new file mode 100644 index 0000000..ff6f2da --- /dev/null +++ b/002_source/cms/src/components/core/dropdown/dropdown.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; + +import { DropdownContext } from './dropdown-context'; + +export interface DropdownProps { + children: React.ReactNode[]; + delay?: number; +} + +export function Dropdown({ children, delay = 50 }: DropdownProps): React.JSX.Element { + const [anchorEl, setAnchorEl] = React.useState(null); + const cleanupRef = React.useRef(); + + const handleTriggerMouseEnter = React.useCallback((event: React.MouseEvent) => { + clearTimeout(cleanupRef.current); + setAnchorEl(event.currentTarget); + }, []); + + const handleTriggerMouseLeave = React.useCallback( + (_: React.MouseEvent) => { + cleanupRef.current = setTimeout(() => { + setAnchorEl(null); + }, delay) as unknown as number; + }, + [delay] + ); + + const handleTriggerKeyUp = React.useCallback((event: React.KeyboardEvent) => { + if (event.key === 'Enter' || event.key === ' ') { + setAnchorEl(event.currentTarget as unknown as HTMLElement); + } + }, []); + + const handlePopoverMouseEnter = React.useCallback((_: React.MouseEvent) => { + clearTimeout(cleanupRef.current); + }, []); + + const handlePopoverMouseLeave = React.useCallback( + (_: React.MouseEvent) => { + cleanupRef.current = setTimeout(() => { + setAnchorEl(null); + }, delay) as unknown as number; + }, + [delay] + ); + + const handlePopoverEscapePressed = React.useCallback(() => { + setAnchorEl(null); + }, []); + + const open = Boolean(anchorEl); + + return ( + + {children} + + ); +} diff --git a/002_source/cms/src/components/core/file-dropzone.tsx b/002_source/cms/src/components/core/file-dropzone.tsx new file mode 100644 index 0000000..160f621 --- /dev/null +++ b/002_source/cms/src/components/core/file-dropzone.tsx @@ -0,0 +1,73 @@ +'use client'; + +import * as React from 'react'; +import Avatar from '@mui/material/Avatar'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { CloudArrowUp as CloudArrowUpIcon } from '@phosphor-icons/react/dist/ssr/CloudArrowUp'; +import type { DropzoneOptions, FileWithPath } from 'react-dropzone'; +import { useDropzone } from 'react-dropzone'; + +export type File = FileWithPath; + +export interface FileDropzoneProps extends DropzoneOptions { + caption?: string; + files?: File[]; + onRemove?: (file: File) => void; + onRemoveAll?: () => void; + onUpload?: () => void; +} + +export function FileDropzone({ caption, ...props }: FileDropzoneProps): React.JSX.Element { + const { getRootProps, getInputProps, isDragActive } = useDropzone(props); + + return ( + + + + + + + + + + + Click to upload + {' '} + or drag and drop + + {caption ? ( + + {caption} + + ) : null} + + + + + ); +} diff --git a/002_source/cms/src/components/core/file-icon.tsx b/002_source/cms/src/components/core/file-icon.tsx new file mode 100644 index 0000000..56508f6 --- /dev/null +++ b/002_source/cms/src/components/core/file-icon.tsx @@ -0,0 +1,40 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; + +const icons: Record = { + jpeg: '/assets/icon-jpg.svg', + jpg: '/assets/icon-jpg.svg', + mp4: '/assets/icon-mp4.svg', + pdf: '/assets/icon-pdf.svg', + png: '/assets/icon-png.svg', + svg: '/assets/icon-svg.svg', +}; + +export interface FileIconProps { + extension?: string; +} + +export function FileIcon({ extension }: FileIconProps): React.JSX.Element { + let icon: string; + + if (!extension) { + icon = '/assets/icon-other.svg'; + } else { + icon = icons[extension] ?? '/assets/icon-other.svg'; + } + + return ( + + + + ); +} diff --git a/002_source/cms/src/components/core/filter-button.tsx b/002_source/cms/src/components/core/filter-button.tsx new file mode 100644 index 0000000..e52d569 --- /dev/null +++ b/002_source/cms/src/components/core/filter-button.tsx @@ -0,0 +1,146 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Popover from '@mui/material/Popover'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { MinusCircle as MinusCircleIcon } from '@phosphor-icons/react/dist/ssr/MinusCircle'; +import { PlusCircle as PlusCircleIcon } from '@phosphor-icons/react/dist/ssr/PlusCircle'; + +import { usePopover } from '@/hooks/use-popover'; + +function noop(..._: unknown[]): void { + // Do nothing +} + +export interface FilterContextValue { + anchorEl: HTMLElement | null; + onApply: (value: unknown) => void; + onClose: () => void; + open: boolean; + value?: T; +} + +export const FilterContext = React.createContext({ + anchorEl: null, + onApply: noop, + onClose: noop, + open: false, + value: undefined, +}); + +export function useFilterContext(): FilterContextValue { + const context = React.useContext(FilterContext); + + if (!context) { + throw new Error('useFilterContext must be used within a FilterProvider'); + } + + return context; +} + +export interface FilterButtonProps { + displayValue?: string; + label: string; + onFilterApply?: (value: unknown) => void; + onFilterDelete?: () => void; + popover: React.ReactNode; + value?: unknown; +} + +// Currently, the `value` prop can be string | number | boolean | undefined +export function FilterButton({ + displayValue, + label, + onFilterApply, + onFilterDelete, + popover, + value, +}: FilterButtonProps): React.JSX.Element { + const { anchorRef, handleOpen, handleClose, open } = usePopover(); + + const handleApply = React.useCallback( + (newValue: unknown) => { + handleClose(); + onFilterApply?.(newValue); + }, + [handleClose, onFilterApply] + ); + + return ( + + + {popover} + + ); +} + +interface FilterPopoverProps { + anchorEl: HTMLElement | null; + children: React.ReactNode; + onClose: () => void; + open: boolean; + title: string; +} + +export function FilterPopover({ children, title, onClose, anchorEl, open }: FilterPopoverProps): React.JSX.Element { + return ( + + + {title} + {children} + + + ); +} diff --git a/002_source/cms/src/components/core/i18n-provider.tsx b/002_source/cms/src/components/core/i18n-provider.tsx new file mode 100644 index 0000000..c96627d --- /dev/null +++ b/002_source/cms/src/components/core/i18n-provider.tsx @@ -0,0 +1,25 @@ +'use client'; + +import * as React from 'react'; +import { useTranslation } from 'next-i18next'; + +import { logger } from '@/lib/default-logger'; + +import '@/lib/i18n'; + +export interface I18nProviderProps { + children: React.ReactNode; + language?: string; +} + +export function I18nProvider({ children, language = 'en' }: I18nProviderProps): React.JSX.Element { + const { i18n } = useTranslation(); + + React.useEffect(() => { + i18n.changeLanguage(language).catch(() => { + logger.error(`Failed to change language to ${language}`); + }); + }, [i18n, language]); + + return {children}; +} diff --git a/002_source/cms/src/components/core/localization-provider.tsx b/002_source/cms/src/components/core/localization-provider.tsx new file mode 100644 index 0000000..e0a218a --- /dev/null +++ b/002_source/cms/src/components/core/localization-provider.tsx @@ -0,0 +1,13 @@ +'use client'; + +import * as React from 'react'; +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import { LocalizationProvider as Provider } from '@mui/x-date-pickers/LocalizationProvider'; + +export interface LocalizationProviderProps { + children: React.ReactNode; +} + +export function LocalizationProvider({ children }: LocalizationProviderProps): React.JSX.Element { + return {children}; +} diff --git a/002_source/cms/src/components/core/logo.tsx b/002_source/cms/src/components/core/logo.tsx new file mode 100644 index 0000000..5eaab97 --- /dev/null +++ b/002_source/cms/src/components/core/logo.tsx @@ -0,0 +1,56 @@ +'use client'; + +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { useColorScheme } from '@mui/material/styles'; + +import { NoSsr } from '@/components/core/no-ssr'; + +const HEIGHT = 60; +const WIDTH = 60; + +type Color = 'dark' | 'light'; + +export interface LogoProps { + color?: Color; + emblem?: boolean; + height?: number; + width?: number; +} + +export function Logo({ color = 'dark', emblem, height = HEIGHT, width = WIDTH }: LogoProps): React.JSX.Element { + let url: string; + + if (emblem) { + url = color === 'light' ? '/assets/logo-emblem.svg' : '/assets/logo-emblem--dark.svg'; + } else { + url = color === 'light' ? '/assets/logo.svg' : '/assets/logo--dark.svg'; + } + + return ; +} + +export interface DynamicLogoProps { + colorDark?: Color; + colorLight?: Color; + emblem?: boolean; + height?: number; + width?: number; +} + +export function DynamicLogo({ + colorDark = 'light', + colorLight = 'dark', + height = HEIGHT, + width = WIDTH, + ...props +}: DynamicLogoProps): React.JSX.Element { + const { colorScheme } = useColorScheme(); + const color = colorScheme === 'dark' ? colorDark : colorLight; + + return ( + }> + + + ); +} diff --git a/002_source/cms/src/components/core/multi-select.tsx b/002_source/cms/src/components/core/multi-select.tsx new file mode 100644 index 0000000..903a0f1 --- /dev/null +++ b/002_source/cms/src/components/core/multi-select.tsx @@ -0,0 +1,75 @@ +import * as React from 'react'; +import Button from '@mui/material/Button'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import { CaretDown as CaretDownIcon } from '@phosphor-icons/react/dist/ssr/CaretDown'; + +import { usePopover } from '@/hooks/use-popover'; + +// `T` should be `string`, `number` or `boolean` +export interface MultiSelectProps { + label: string; + onChange?: (value: T[]) => void; + options: readonly { label: string; value: T }[]; + value: T[]; +} + +export function MultiSelect({ + label, + onChange, + options, + value = [], +}: MultiSelectProps): React.JSX.Element { + const popover = usePopover(); + + const handleValueChange = React.useCallback( + (v: T, checked: boolean) => { + let updateValue = [...value] as T[]; + + if (checked) { + updateValue.push(v); + } else { + updateValue = updateValue.filter((item) => item !== v); + } + + onChange?.(updateValue); + }, + [onChange, value] + ); + + return ( + + + + {options.map((option) => { + const selected = value.includes(option.value); + + return ( + { + handleValueChange(option.value, !selected); + }} + selected={selected} + > + {option.label} + + ); + })} + + + ); +} diff --git a/002_source/cms/src/components/core/no-ssr.tsx b/002_source/cms/src/components/core/no-ssr.tsx new file mode 100644 index 0000000..af83bdc --- /dev/null +++ b/002_source/cms/src/components/core/no-ssr.tsx @@ -0,0 +1,31 @@ +'use client'; + +import * as React from 'react'; +import useEnhancedEffect from '@mui/utils/useEnhancedEffect'; + +export interface NoSsrProps { + children?: React.ReactNode; + defer?: boolean; + fallback?: React.ReactNode; +} + +// https://github.com/mui/material-ui/blob/master/packages/mui-base/src/NoSsr/NoSsr.tsx +// without prop-types +export function NoSsr(props: NoSsrProps): React.JSX.Element { + const { children, defer = false, fallback = null } = props; + const [mountedState, setMountedState] = React.useState(false); + + useEnhancedEffect((): void => { + if (!defer) { + setMountedState(true); + } + }, [defer]); + + React.useEffect((): void => { + if (defer) { + setMountedState(true); + } + }, [defer]); + + return {mountedState ? children : fallback}; +} diff --git a/002_source/cms/src/components/core/option.tsx b/002_source/cms/src/components/core/option.tsx new file mode 100644 index 0000000..eb3d00d --- /dev/null +++ b/002_source/cms/src/components/core/option.tsx @@ -0,0 +1,12 @@ +import * as React from 'react'; +import MenuItem from '@mui/material/MenuItem'; + +export interface OptionProps { + children: React.ReactNode; + disabled?: boolean; + value: string | number; +} + +export function Option({ children, ...props }: OptionProps): React.JSX.Element { + return {children}; +} diff --git a/002_source/cms/src/components/core/pdf-viewer.tsx b/002_source/cms/src/components/core/pdf-viewer.tsx new file mode 100644 index 0000000..17b8fe0 --- /dev/null +++ b/002_source/cms/src/components/core/pdf-viewer.tsx @@ -0,0 +1,9 @@ +'use client'; + +import dynamic from 'next/dynamic'; +import type ReactPDF from '@react-pdf/renderer'; + +export const PDFViewer = dynamic( + () => import('@react-pdf/renderer').then((module) => module.PDFViewer), + { ssr: false } +); diff --git a/002_source/cms/src/components/core/presence.tsx b/002_source/cms/src/components/core/presence.tsx new file mode 100644 index 0000000..0230dcd --- /dev/null +++ b/002_source/cms/src/components/core/presence.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; + +type Size = 'small' | 'medium' | 'large'; + +type Status = 'online' | 'offline' | 'away' | 'busy'; + +const sizes = { small: 8, medium: 16, large: 24 }; + +export interface PresenceProps { + size?: Size; + status?: Status; +} + +export function Presence({ size = 'medium', status = 'offline' }: PresenceProps): React.JSX.Element { + const colors = { + offline: 'var(--mui-palette-neutral-100)', + away: 'var(--mui-palette-warning-main)', + busy: 'var(--mui-palette-error-main)', + online: 'var(--mui-palette-success-main)', + } as Record; + + const color = colors[status]; + + return ( + + ); +} diff --git a/002_source/cms/src/components/core/property-item.tsx b/002_source/cms/src/components/core/property-item.tsx new file mode 100644 index 0000000..2618ee0 --- /dev/null +++ b/002_source/cms/src/components/core/property-item.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; + +export interface PropertyItemProps { + name: string; + value: string | React.ReactNode; +} + +export function PropertyItem({ name, value }: PropertyItemProps): React.JSX.Element { + return ( + +
+ + {name} + +
+
+ {typeof value === 'string' ? ( + + {value || 'None'} + + ) : ( + {value} + )} +
+
+ ); +} diff --git a/002_source/cms/src/components/core/property-list.tsx b/002_source/cms/src/components/core/property-list.tsx new file mode 100644 index 0000000..bd9e8c7 --- /dev/null +++ b/002_source/cms/src/components/core/property-list.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import type { SxProps } from '@mui/system/styleFunctionSx'; + +export interface PropertyListProps { + children: React.ReactNode; + divider?: React.ReactNode; + orientation?: 'horizontal' | 'vertical'; + stripe?: 'even' | 'odd'; + sx?: SxProps; +} + +export function PropertyList({ + children, + divider, + orientation = 'horizontal', + stripe, + sx, +}: PropertyListProps): React.JSX.Element { + return ( + *:nth-child(${stripe})`]: { bgcolor: 'var(--mui-palette-background-level1)' } }), + ...sx, + }} + > + {children} + + ); +} diff --git a/002_source/cms/src/components/core/settings/option.tsx b/002_source/cms/src/components/core/settings/option.tsx new file mode 100644 index 0000000..f206c59 --- /dev/null +++ b/002_source/cms/src/components/core/settings/option.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; +import Chip from '@mui/material/Chip'; + +export interface OptionProps { + icon?: React.ReactElement; + label: string; + onClick?: () => void; + selected?: boolean; +} + +export function Option({ selected, ...props }: OptionProps): React.JSX.Element { + return ( + + ); +} diff --git a/002_source/cms/src/components/core/settings/options-color-scheme.tsx b/002_source/cms/src/components/core/settings/options-color-scheme.tsx new file mode 100644 index 0000000..1778d4f --- /dev/null +++ b/002_source/cms/src/components/core/settings/options-color-scheme.tsx @@ -0,0 +1,42 @@ +'use client'; + +import * as React from 'react'; +import InputLabel from '@mui/material/InputLabel'; +import Stack from '@mui/material/Stack'; +import { Moon as MoonIcon } from '@phosphor-icons/react/dist/ssr/Moon'; +import { Sun as SunIcon } from '@phosphor-icons/react/dist/ssr/Sun'; + +import type { ColorScheme } from '@/styles/theme/types'; + +import { Option } from './option'; + +export interface OptionsColorSchemeProps { + onChange?: (value: ColorScheme) => void; + value?: ColorScheme; +} + +export function OptionsColorScheme({ onChange, value }: OptionsColorSchemeProps): React.JSX.Element { + return ( + + Color scheme + + {( + [ + { label: 'Light', value: 'light', icon: }, + { label: 'Dark', value: 'dark', icon: }, + ] satisfies { label: string; value: string; icon: React.ReactNode }[] + ).map((option) => ( + + + ); +} diff --git a/002_source/cms/src/components/core/settings/options-direction.tsx b/002_source/cms/src/components/core/settings/options-direction.tsx new file mode 100644 index 0000000..42cc666 --- /dev/null +++ b/002_source/cms/src/components/core/settings/options-direction.tsx @@ -0,0 +1,42 @@ +'use client'; + +import * as React from 'react'; +import InputLabel from '@mui/material/InputLabel'; +import Stack from '@mui/material/Stack'; +import { TextAlignLeft as TextAlignLeftIcon } from '@phosphor-icons/react/dist/ssr/TextAlignLeft'; +import { TextAlignRight as TextAlignRightIcon } from '@phosphor-icons/react/dist/ssr/TextAlignRight'; + +import type { Direction } from '@/styles/theme/types'; + +import { Option } from './option'; + +export interface OptionsDirectionProps { + onChange?: (value: Direction) => void; + value?: Direction; +} + +export function OptionsDirection({ onChange, value }: OptionsDirectionProps): React.JSX.Element { + return ( + + Orientation + + {( + [ + { label: 'Left-to-right', value: 'ltr', icon: }, + { label: 'Right-to-left', value: 'rtl', icon: }, + ] satisfies { label: string; value: Direction; icon: React.ReactElement }[] + ).map((option) => ( + + + ); +} diff --git a/002_source/cms/src/components/core/settings/options-layout.tsx b/002_source/cms/src/components/core/settings/options-layout.tsx new file mode 100644 index 0000000..ae712db --- /dev/null +++ b/002_source/cms/src/components/core/settings/options-layout.tsx @@ -0,0 +1,143 @@ +'use client'; + +import * as React from 'react'; +import Box from '@mui/material/Box'; +import InputLabel from '@mui/material/InputLabel'; +import Stack from '@mui/material/Stack'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import { Info as InfoIcon } from '@phosphor-icons/react/dist/ssr/Info'; + +import type { Layout } from '@/types/settings'; + +export interface OptionsLayoutProps { + onChange?: (value: Layout) => void; + value?: Layout; +} + +export function OptionsLayout({ onChange, value }: OptionsLayoutProps): React.JSX.Element { + return ( + + + Layout + + + + + + {( + [ + { label: 'Vertical', value: 'vertical', icon: }, + { label: 'Horizontal', value: 'horizontal', icon: }, + ] satisfies { label: string; value: Layout; icon: React.ReactElement }[] + ).map((option) => ( + + { + onChange?.(option.value); + }} + role="button" + sx={{ + borderRadius: 1, + cursor: 'pointer', + display: 'flex', + height: '88px', + position: 'relative', + '&::before': { + borderRadius: 'inherit', + bottom: 0, + content: '" "', + left: 0, + pointerEvents: 'none', + position: 'absolute', + right: 0, + top: 0, + ...(option.value === value && { boxShadow: '0 0 0 2px var(--mui-palette-primary-main)' }), + }, + }} + tabIndex={0} + > + {option.icon} + + + {option.label} + + + ))} + + + ); +} + +function VerticalIcon(): React.JSX.Element { + return ( + + + + + + + + + + + + + ); +} + +function HorizontalIcon(): React.JSX.Element { + return ( + + + + + + + + + + + ); +} diff --git a/002_source/cms/src/components/core/settings/options-nav-color.tsx b/002_source/cms/src/components/core/settings/options-nav-color.tsx new file mode 100644 index 0000000..20b9f23 --- /dev/null +++ b/002_source/cms/src/components/core/settings/options-nav-color.tsx @@ -0,0 +1,47 @@ +'use client'; + +import * as React from 'react'; +import InputLabel from '@mui/material/InputLabel'; +import Stack from '@mui/material/Stack'; +import Tooltip from '@mui/material/Tooltip'; +import { Info as InfoIcon } from '@phosphor-icons/react/dist/ssr/Info'; + +import type { NavColor } from '@/types/settings'; + +import { Option } from './option'; + +export interface OptionsNavColorProps { + onChange?: (value: NavColor) => void; + value?: NavColor; +} + +export function OptionsNavColor({ onChange, value }: OptionsNavColorProps): React.JSX.Element { + return ( + + + Nav color + + + + + + {( + [ + { label: 'Blend-in', value: 'blend_in' }, + { label: 'Discrete', value: 'discrete' }, + { label: 'Evident', value: 'evident' }, + ] as { label: string; value: NavColor }[] + ).map((option) => ( + + + ); +} diff --git a/002_source/cms/src/components/core/settings/options-primary-color.tsx b/002_source/cms/src/components/core/settings/options-primary-color.tsx new file mode 100644 index 0000000..4806a63 --- /dev/null +++ b/002_source/cms/src/components/core/settings/options-primary-color.tsx @@ -0,0 +1,47 @@ +'use client'; + +import * as React from 'react'; +import Box from '@mui/material/Box'; +import InputLabel from '@mui/material/InputLabel'; +import Stack from '@mui/material/Stack'; + +import type { PrimaryColor } from '@/styles/theme/types'; + +import { Option } from './option'; + +export interface OptionsPrimaryColorProps { + onChange?: (value: PrimaryColor) => void; + value?: PrimaryColor; +} + +export function OptionsPrimaryColor({ onChange, value }: OptionsPrimaryColorProps): React.JSX.Element { + return ( + + Primary color + + {( + [ + { label: 'Chateau Green', value: 'chateauGreen', color: '#16b364' }, + { label: 'Neon Blue', value: 'neonBlue', color: '#635bff' }, + { label: 'Royal Blue', value: 'royalBlue', color: '#5265ff' }, + { label: 'Tomato Orange', value: 'tomatoOrange', color: '#ff6c47' }, + ] satisfies { label: string; value: PrimaryColor; color: string }[] + ).map((option) => ( + + + ); +} diff --git a/002_source/cms/src/components/core/settings/settings-button.tsx b/002_source/cms/src/components/core/settings/settings-button.tsx new file mode 100644 index 0000000..cc23ee2 --- /dev/null +++ b/002_source/cms/src/components/core/settings/settings-button.tsx @@ -0,0 +1,88 @@ +'use client'; + +import * as React from 'react'; +import { useRouter } from 'next/navigation'; +import Box from '@mui/material/Box'; +import { useColorScheme } from '@mui/material/styles'; +import Tooltip from '@mui/material/Tooltip'; +import { GearSix as GearSixIcon } from '@phosphor-icons/react/dist/ssr/GearSix'; + +import type { Settings } from '@/types/settings'; +import { config } from '@/config'; +import { setSettings as setPersistedSettings } from '@/lib/settings/set-settings'; +import { useSettings } from '@/hooks/use-settings'; + +import { SettingsDrawer } from './settings-drawer'; + +export function SettingsButton(): React.JSX.Element { + const { settings } = useSettings(); + const { setColorScheme } = useColorScheme(); + const router = useRouter(); + + const [openDrawer, setOpenDrawer] = React.useState(false); + + const handleUpdate = async (values: Partial): Promise => { + if (values.colorScheme) { + setColorScheme(values.colorScheme); + } + + const updatedSettings = { ...settings, ...values } satisfies Settings; + + await setPersistedSettings(updatedSettings); + + // Refresh the router to apply the new settings. + router.refresh(); + }; + + const handleReset = async (): Promise => { + setColorScheme(config.site.colorScheme); + + await setPersistedSettings({}); + + // Refresh the router to apply the new settings. + router.refresh(); + }; + + return ( + + + { + setOpenDrawer(true); + }} + sx={{ + animation: 'spin 4s linear infinite', + background: 'var(--mui-palette-neutral-900)', + border: 'none', + borderRadius: '50%', + bottom: 0, + color: 'var(--mui-palette-common-white)', + cursor: 'pointer', + display: 'inline-flex', + height: '40px', + m: 4, + p: '10px', + position: 'fixed', + right: 0, + width: '40px', + zIndex: 'var(--mui-zIndex-speedDial)', + '&:hover': { bgcolor: 'var(--mui-palette-neutral-700)' }, + '@keyframes spin': { '0%': { rotate: '0' }, '100%': { rotate: '360deg' } }, + }} + > + + + + { + setOpenDrawer(false); + }} + onReset={handleReset} + onUpdate={handleUpdate} + open={openDrawer} + values={settings} + /> + + ); +} diff --git a/002_source/cms/src/components/core/settings/settings-drawer.tsx b/002_source/cms/src/components/core/settings/settings-drawer.tsx new file mode 100644 index 0000000..6e67092 --- /dev/null +++ b/002_source/cms/src/components/core/settings/settings-drawer.tsx @@ -0,0 +1,105 @@ +'use client'; + +import * as React from 'react'; +import Badge from '@mui/material/Badge'; +import Drawer from '@mui/material/Drawer'; +import IconButton from '@mui/material/IconButton'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { ArrowCounterClockwise as ArrowCounterClockwiseIcon } from '@phosphor-icons/react/dist/ssr/ArrowCounterClockwise'; +import { X as XIcon } from '@phosphor-icons/react/dist/ssr/X'; + +import type { Settings } from '@/types/settings'; + +import { OptionsColorScheme } from './options-color-scheme'; +import { OptionsDirection } from './options-direction'; +import { OptionsLayout } from './options-layout'; +import { OptionsNavColor } from './options-nav-color'; +import { OptionsPrimaryColor } from './options-primary-color'; + +export interface SettingsDrawerProps { + canReset?: boolean; + onClose?: () => void; + onReset?: () => void; + onUpdate?: (settings: Partial) => void; + open?: boolean; + values?: Partial; +} + +export function SettingsDrawer({ + canReset = true, + onClose, + onUpdate, + onReset, + open, + values = {}, +}: SettingsDrawerProps): React.JSX.Element { + const handleChange = React.useCallback( + (field: keyof Settings, value: unknown) => { + onUpdate?.({ [field]: value }); + }, + [onUpdate] + ); + + return ( + + + App settings + + + + + + + + + + + + + { + handleChange('primaryColor', value); + }} + value={values.primaryColor} + /> + { + handleChange('colorScheme', value); + }} + value={values.colorScheme} + /> + { + handleChange('navColor', value); + }} + value={values.navColor} + /> + { + handleChange('layout', value); + }} + value={values.layout} + /> + { + handleChange('direction', value); + }} + value={values.direction} + /> + + + ); +} diff --git a/002_source/cms/src/components/core/text-editor/text-editor-toolbar.tsx b/002_source/cms/src/components/core/text-editor/text-editor-toolbar.tsx new file mode 100644 index 0000000..bb2b57f --- /dev/null +++ b/002_source/cms/src/components/core/text-editor/text-editor-toolbar.tsx @@ -0,0 +1,228 @@ +'use client'; + +import * as React from 'react'; +import FormControl from '@mui/material/FormControl'; +import IconButton from '@mui/material/IconButton'; +import InputLabel from '@mui/material/InputLabel'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Popover from '@mui/material/Popover'; +import Select from '@mui/material/Select'; +import type { SelectChangeEvent } from '@mui/material/Select'; +import Stack from '@mui/material/Stack'; +import { Code as CodeIcon } from '@phosphor-icons/react/dist/ssr/Code'; +import { Link as LinkIcon } from '@phosphor-icons/react/dist/ssr/Link'; +import { LinkBreak as LinkBreakIcon } from '@phosphor-icons/react/dist/ssr/LinkBreak'; +import { ListDashes as ListDashesIcon } from '@phosphor-icons/react/dist/ssr/ListDashes'; +import { ListNumbers as ListNumbersIcon } from '@phosphor-icons/react/dist/ssr/ListNumbers'; +import { TextB as TextBIcon } from '@phosphor-icons/react/dist/ssr/TextB'; +import { TextItalic as TextItalicIcon } from '@phosphor-icons/react/dist/ssr/TextItalic'; +import { TextStrikethrough as TextStrikethroughIcon } from '@phosphor-icons/react/dist/ssr/TextStrikethrough'; +import type { Editor } from '@tiptap/react'; + +import { usePopover } from '@/hooks/use-popover'; +import { Option } from '@/components/core/option'; + +type HeadlingLevel = 1 | 2 | 3 | 4 | 5 | 6; + +export interface TextEditorToolbarProps { + editor: Editor | null; +} + +export function TextEditorToolbar({ editor }: TextEditorToolbarProps): React.JSX.Element { + const linkPopover = usePopover(); + const [link, setLink] = React.useState(''); + + return ( + + + {editor ? ( + + + { + editor.chain().focus().toggleBold().run(); + }} + > + + + { + editor.chain().focus().toggleItalic().run(); + }} + > + + + { + editor.chain().focus().toggleStrike().run(); + }} + > + + + { + editor.chain().focus().toggleCodeBlock(); + }} + > + + + { + editor.chain().focus().toggleBulletList().run(); + }} + > + + + { + editor.chain().focus().toggleOrderedList().run(); + }} + > + + + { + setLink((editor.getAttributes('link').href as string) ?? ''); + linkPopover.handleOpen(); + }} + ref={linkPopover.anchorRef} + > + + + { + editor.chain().focus().unsetLink().run(); + }} + > + + + + ) : null} + + { + linkPopover.handleClose(); + setLink(''); + }} + open={linkPopover.open} + slotProps={{ paper: { sx: { p: 2 } } }} + > + + URL + ) => { + setLink(event.target.value); + }} + onKeyUp={(event: React.KeyboardEvent) => { + if (event.key !== 'Enter') { + return; + } + + if (link === '') { + editor?.chain().focus().extendMarkRange('link').unsetLink().run(); + return; + } + + editor?.chain().focus().setLink({ href: link }).run(); + linkPopover.handleClose(); + setLink(''); + }} + value={link} + /> + + + + ); +} + +function getFontValue(editor: Editor): string { + return editor.isActive('paragraph') + ? 'p' + : editor.isActive('heading', { level: 1 }) + ? 'h1' + : editor.isActive('heading', { level: 2 }) + ? 'h2' + : editor.isActive('heading', { level: 3 }) + ? 'h3' + : editor.isActive('heading', { level: 4 }) + ? 'h4' + : editor.isActive('heading', { level: 5 }) + ? 'h5' + : editor.isActive('heading', { level: 6 }) + ? 'h6' + : 'p'; +} + +interface ToolbarButtonProps { + active?: boolean; + children: React.ReactNode; + disabled?: boolean; + onClick: () => void; +} + +const ToolbarButton = React.forwardRef(function ToolbarButton( + { active, children, disabled, onClick }, + ref +): React.JSX.Element { + return ( + + {children} + + ); +}); diff --git a/002_source/cms/src/components/core/text-editor/text-editor.tsx b/002_source/cms/src/components/core/text-editor/text-editor.tsx new file mode 100644 index 0000000..f7997ef --- /dev/null +++ b/002_source/cms/src/components/core/text-editor/text-editor.tsx @@ -0,0 +1,83 @@ +'use client'; + +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { Link } from '@tiptap/extension-link'; +import { Placeholder } from '@tiptap/extension-placeholder'; +import { EditorContent, useEditor } from '@tiptap/react'; +import type { EditorOptions, Extension } from '@tiptap/react'; +import { StarterKit } from '@tiptap/starter-kit'; + +import { TextEditorToolbar } from './text-editor-toolbar'; + +export interface TextEditorProps { + content: EditorOptions['content']; + editable?: EditorOptions['editable']; + hideToolbar?: boolean; + onUpdate?: EditorOptions['onUpdate']; + placeholder?: string; +} + +/** + * A thin wrapper around tiptap. + * + * How to get the updated content: + * ```ts + * { + * console.log(editor.getHTML()); + * }} + * /> + * ``` + */ +export function TextEditor({ + content, + editable = true, + hideToolbar, + onUpdate = () => { + // noop + }, + placeholder, +}: TextEditorProps): React.JSX.Element { + const extensions = [ + StarterKit, + Placeholder.configure({ emptyEditorClass: 'is-editor-empty', placeholder }), + Link.configure({ openOnClick: false, autolink: true }), + ] as Extension[]; + + const editor = useEditor({ extensions, content, editable, onUpdate }); + + return ( + + {!hideToolbar ? :
} + + + ); +} diff --git a/002_source/cms/src/components/core/theme-provider/emotion-cache.tsx b/002_source/cms/src/components/core/theme-provider/emotion-cache.tsx new file mode 100644 index 0000000..67b6e4b --- /dev/null +++ b/002_source/cms/src/components/core/theme-provider/emotion-cache.tsx @@ -0,0 +1,89 @@ +'use client'; + +import * as React from 'react'; +import { useServerInsertedHTML } from 'next/navigation'; +import createCache from '@emotion/cache'; +import type { EmotionCache, Options as OptionsOfCreateCache } from '@emotion/cache'; +import { CacheProvider as DefaultCacheProvider } from '@emotion/react'; + +interface Registry { + cache: EmotionCache; + flush: () => { name: string; isGlobal: boolean }[]; +} + +export interface NextAppDirEmotionCacheProviderProps { + options: Omit; + CacheProvider?: (props: { value: EmotionCache; children: React.ReactNode }) => React.JSX.Element | null; + children: React.ReactNode; +} + +// Adapted from https://github.com/garronej/tss-react/blob/main/src/next/appDir.tsx +export default function NextAppDirEmotionCacheProvider(props: NextAppDirEmotionCacheProviderProps): React.JSX.Element { + const { options, CacheProvider = DefaultCacheProvider, children } = props; + + const [registry] = React.useState(() => { + const cache = createCache(options); + cache.compat = true; + // eslint-disable-next-line @typescript-eslint/unbound-method -- Expected + const prevInsert = cache.insert; + let inserted: { name: string; isGlobal: boolean }[] = []; + cache.insert = (...args) => { + const [selector, serialized] = args; + + if (cache.inserted[serialized.name] === undefined) { + inserted.push({ name: serialized.name, isGlobal: !selector }); + } + + return prevInsert(...args); + }; + const flush = (): { name: string; isGlobal: boolean }[] => { + const prevInserted = inserted; + inserted = []; + return prevInserted; + }; + return { cache, flush }; + }); + + useServerInsertedHTML((): React.JSX.Element | null => { + const inserted = registry.flush(); + + if (inserted.length === 0) { + return null; + } + + let styles = ''; + let dataEmotionAttribute = registry.cache.key; + + const globals: { name: string; style: string }[] = []; + + inserted.forEach(({ name, isGlobal }) => { + const style = registry.cache.inserted[name]; + + if (typeof style !== 'boolean') { + if (isGlobal) { + globals.push({ name, style }); + } else { + styles += style; + dataEmotionAttribute += ` ${name}`; + } + } + }); + + return ( + + {globals.map( + ({ name, style }): React.JSX.Element => ( +