aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Mo Tarbin <mhed.t91@gmail.com>2024-06-30 18:55:39 -0400
committerLibravatar Mo Tarbin <mhed.t91@gmail.com>2024-06-30 18:55:39 -0400
commit2657469964e24ffbeb905024532120395f6e797c (patch)
tree2fe9db8a4ecfa92d854ca94f7586d81163c8bd25
downloaddonetick-frontend-2657469964e24ffbeb905024532120395f6e797c.tar.gz
donetick-frontend-2657469964e24ffbeb905024532120395f6e797c.tar.bz2
donetick-frontend-2657469964e24ffbeb905024532120395f6e797c.zip
move to Donetick Org, First commit frontend
Diffstat (limited to '')
-rw-r--r--.env.development3
-rw-r--r--.eslintrc.cjs36
-rw-r--r--.gitignore24
-rwxr-xr-x.husky/pre-commit4
-rw-r--r--.prettierrc13
-rw-r--r--README.md52
-rw-r--r--assets/image.pngbin0 -> 170575 bytes
-rw-r--r--index.html25
-rw-r--r--package-lock.json9481
-rw-r--r--package.json63
-rw-r--r--postcss.config.js6
-rw-r--r--public/android-chrome-192x192.pngbin0 -> 16214 bytes
-rw-r--r--public/android-chrome-512x512.pngbin0 -> 62163 bytes
-rw-r--r--public/apple-touch-icon-180x180.pngbin0 -> 1467 bytes
-rw-r--r--public/apple-touch-icon.pngbin0 -> 14922 bytes
-rw-r--r--public/browserconfig.xml9
-rw-r--r--public/favicon-16x16.pngbin0 -> 1313 bytes
-rw-r--r--public/favicon-32x32.pngbin0 -> 1990 bytes
-rw-r--r--public/favicon.icobin0 -> 1129 bytes
-rw-r--r--public/logo.svg1185
-rw-r--r--public/manifest.webmanifest40
-rw-r--r--public/maskable-icon-512x512.pngbin0 -> 5494 bytes
-rw-r--r--public/mstile-150x150.pngbin0 -> 9531 bytes
-rw-r--r--public/pwa-192x192.pngbin0 -> 2271 bytes
-rw-r--r--public/pwa-512x512.pngbin0 -> 6488 bytes
-rw-r--r--public/pwa-64x64.pngbin0 -> 934 bytes
-rw-r--r--public/safari-pinned-tab.svg81
-rw-r--r--src/App.jsx118
-rw-r--r--src/Config.js5
-rw-r--r--src/Logo.jsx9
-rw-r--r--src/assets/logo.svg1185
-rw-r--r--src/assets/old-screenshot-my-chore.pngbin0 -> 473764 bytes
-rw-r--r--src/assets/screenshot-my-chore.pngbin0 -> 416085 bytes
-rw-r--r--src/constants/theme.js6
-rw-r--r--src/contexts/Contexts.jsx13
-rw-r--r--src/contexts/QueryContext.jsx11
-rw-r--r--src/contexts/RouterContext.jsx116
-rw-r--r--src/contexts/ThemeContext.jsx86
-rw-r--r--src/contexts/UserContext.js8
-rw-r--r--src/hooks/useStickyState.js16
-rw-r--r--src/index.css3
-rw-r--r--src/main.jsx10
-rw-r--r--src/manifest/android-chrome-192x192.pngbin0 -> 16214 bytes
-rw-r--r--src/manifest/android-chrome-512x512.pngbin0 -> 62163 bytes
-rw-r--r--src/manifest/apple-touch-icon.pngbin0 -> 14922 bytes
-rw-r--r--src/manifest/browserconfig.xml9
-rw-r--r--src/manifest/favicon-16x16.pngbin0 -> 1313 bytes
-rw-r--r--src/manifest/favicon-32x32.pngbin0 -> 1990 bytes
-rw-r--r--src/manifest/favicon.icobin0 -> 15086 bytes
-rw-r--r--src/manifest/logo.svg1185
-rw-r--r--src/manifest/mstile-150x150.pngbin0 -> 9531 bytes
-rw-r--r--src/manifest/safari-pinned-tab.svg81
-rw-r--r--src/manifest/site.webmanifest24
-rw-r--r--src/service/AuthenticationService.jsx18
-rw-r--r--src/utils/Fetcher.jsx250
-rw-r--r--src/utils/Helpers.jsx7
-rw-r--r--src/utils/TokenManager.jsx65
-rw-r--r--src/views/Authorization/AuthorizationContainer.jsx45
-rw-r--r--src/views/Authorization/ForgotPasswordView.jsx227
-rw-r--r--src/views/Authorization/LoginView.jsx345
-rw-r--r--src/views/Authorization/Signup.jsx243
-rw-r--r--src/views/Authorization/UpdatePasswordView.jsx194
-rw-r--r--src/views/ChoreEdit/ChoreEdit.jsx744
-rw-r--r--src/views/ChoreEdit/RepeatSection.jsx496
-rw-r--r--src/views/ChoreEdit/ThingTriggerSection.jsx230
-rw-r--r--src/views/Chores/ChoreCard.jsx578
-rw-r--r--src/views/Chores/MyChores.jsx384
-rw-r--r--src/views/ChoresOverview.jsx354
-rw-r--r--src/views/Circles/JoinCircle.jsx154
-rw-r--r--src/views/Error.jsx11
-rw-r--r--src/views/History/BigChip.jsx26
-rw-r--r--src/views/History/ChoreHistory.jsx344
-rw-r--r--src/views/History/InfoCard.jsx26
-rw-r--r--src/views/Home.jsx46
-rw-r--r--src/views/Landing/FeaturesSection.jsx139
-rw-r--r--src/views/Landing/HomeHero.jsx186
-rw-r--r--src/views/Landing/Landing.jsx32
-rw-r--r--src/views/Landing/PricingSection.jsx179
-rw-r--r--src/views/Modals/Inputs/ConfirmationModal.jsx43
-rw-r--r--src/views/Modals/Inputs/CreateThingModal.jsx112
-rw-r--r--src/views/Modals/Inputs/DateModal.jsx45
-rw-r--r--src/views/Modals/Inputs/SelectModal.jsx49
-rw-r--r--src/views/Modals/Inputs/TextModal.jsx46
-rw-r--r--src/views/NotificationTargets/EditNotificationTarget.jsx51
-rw-r--r--src/views/Payments/PaymentFailView.jsx51
-rw-r--r--src/views/Payments/PaymentSuccessView.jsx51
-rw-r--r--src/views/PrivacyPolicy/PrivacyPolicyView.jsx102
-rw-r--r--src/views/Settings/APITokenSettings.jsx130
-rw-r--r--src/views/Settings/NotificationSetting.jsx90
-rw-r--r--src/views/Settings/Settings.jsx384
-rw-r--r--src/views/Settings/Sharing.jsx0
-rw-r--r--src/views/Settings/SharingSettings.jsx0
-rw-r--r--src/views/Settings/ThemeToggle.jsx62
-rw-r--r--src/views/SummaryCard.jsx31
-rw-r--r--src/views/Terms/TermsView.jsx194
-rw-r--r--src/views/TestView/IconPicker.jsx58
-rw-r--r--src/views/TestView/Test.jsx11
-rw-r--r--src/views/Things/ThingsHistory.jsx13
-rw-r--r--src/views/Things/ThingsView.jsx324
-rw-r--r--src/views/components/AutocompleteSelect.jsx87
-rw-r--r--src/views/components/NavBar.jsx177
-rw-r--r--src/views/components/NavBarLink.jsx31
-rw-r--r--src/views/components/NavBarMobile.jsx107
-rw-r--r--tailwind.config.js24
-rw-r--r--vite.config.js69
105 files changed, 21572 insertions, 0 deletions
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..495d100
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,3 @@
+VITE_APP_API_URL=http://localhost:8000
+VITE_APP_REDIRECT_URL=http://localhost:5173
+VITE_APP_GOOGLE_CLIENT_ID=USE_YOUR_OWN_CLIENT_ID \ No newline at end of file
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..c40f08f
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,36 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:react/recommended',
+ 'plugin:react/jsx-runtime',
+ 'plugin:react-hooks/recommended',
+ 'plugin:prettier/recommended',
+ 'plugin:tailwindcss/recommended',
+ ],
+ ignorePatterns: [
+ 'dist',
+ '.eslintrc.cjs',
+ 'tailwind.config.js',
+ 'postcss.config.js',
+ ],
+ parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
+ settings: { react: { version: '18.2' } },
+ plugins: [
+ 'react-refresh',
+ 'simple-import-sort',
+ 'sort-destructure-keys',
+ 'sort-keys-fix',
+ 'prettier',
+
+ 'tailwindcss',
+ ],
+ rules: {
+ 'react-refresh/only-export-components': [
+ 'warn',
+ { allowConstantExport: true },
+ ],
+ 'react/prop-types': 'off',
+ },
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 0000000..d24fdfc
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+npx lint-staged
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..eb53667
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,13 @@
+{
+ "arrowParens": "avoid",
+ "bracketSpacing": true,
+ "endOfLine": "auto",
+ "jsxBracketSameLine": false,
+ "printWidth": 80,
+ "semi": false,
+ "singleQuote": true,
+ "jsxSingleQuote": true,
+ "tabWidth": 2,
+ "trailingComma": "all",
+ "plugins": ["prettier-plugin-tailwindcss"]
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e24c032
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+![Logo](assets/image.png)
+
+## Donetick Frontend
+
+The Donetick Frontend is Frontend piece for Donetick written in javascript with React
+
+## What is Donetick?
+
+An open-source, user-friendly app for managing tasks and chores, featuring customizable options to help you and others stay organized.
+
+## Why I made Donetick?
+
+As an avid for open-source, I was eager to create a solution that could benefit the wider community. Donetick started as a personal project to address my own chore management needs, but it has evolved into bigger tool and decide to open source it for anyone seeking a customizable and privacy-focused task management tool
+
+## Features
+
+- Task and Chore Management: Easily create, edit, and manage tasks and chores for yourself or your group.
+- Shared To-Do Lists: Create "Circles" to collaborate on tasks with family or your group
+- Assignee Assignment: Assign tasks to specific individuals or rotate them automatically using customizable strategies.
+- Recurring Tasks: Schedule tasks to repeat daily, weekly, monthly, or yearly, with flexible customization options.
+- Progress Tracking: Track the completion status of tasks and view historical data.
+
+## Installation
+
+1. Clone the repository:
+2. Navigate to the project directory: `cd frontend`
+3. Download dependency `npm install`
+4. Run locally `npm start`
+
+## Contributing
+
+Contributions are welcome! If you would like to contribute to Donetick, please follow these steps:
+
+1. Fork the repository
+2. Create a new branch: `git checkout -b feature/your-feature-name`
+3. Make your changes and commit them: `git commit -m 'Add some feature'`
+4. Push to the branch: `git push origin feature/your-feature-name`
+5. Submit a pull request
+
+## Need Help:
+
+Donetick is a work in progress and has been a fantastic learning experience for me as I've honed my React skills,I'm looking for collaborators to help improve and refine the Donetick. Feel free to open PR or suggest changes.
+
+## Plans :
+
+My goal is to expand Donetick by offering a hosted infrastructure option. This will make it even easier for users to access and utilize Donetick's features without the need for self-hosting.
+
+While maintaining Donetick's commitment to open source, this hosted option will provide a seamless, out-of-the-box experience for those who prefer a managed solution.
+
+## License
+
+This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. I might consider changing it later to something else
diff --git a/assets/image.png b/assets/image.png
new file mode 100644
index 0000000..e6efed1
--- /dev/null
+++ b/assets/image.png
Binary files differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..7d0b091
--- /dev/null
+++ b/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <script
+ defer
+ data-domain="donetick.com"
+ src="https://collector.wannaknow.link/js/script.js"
+ ></script>
+
+ <meta charset="UTF-8" />
+ <!-- <link rel="icon" type="image/svg+xml" href="/logo.svg" /> -->
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <!-- <title>FE Template</title> -->
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
+ <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
+ <meta name="msapplication-TileColor" content="#da532c" />
+ <meta name="theme-color" content="#ffffff" />
+ </head>
+ <body>
+ <div id="root"></div>
+ <script type="module" src="/src/main.jsx"></script>
+ </body>
+</html>
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..82212bd
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,9481 @@
+{
+ "name": "fe-template",
+ "version": "0.1.59",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "fe-template",
+ "version": "0.1.59",
+ "dependencies": {
+ "@emotion/react": "^11.11.3",
+ "@emotion/styled": "^11.11.0",
+ "@mui/icons-material": "^5.15.2",
+ "@mui/joy": "^5.0.0-beta.20",
+ "@mui/material": "^5.15.2",
+ "@tanstack/react-query": "^5.17.0",
+ "aos": "^2.3.4",
+ "dotenv": "^16.4.5",
+ "js-cookie": "^3.0.5",
+ "moment": "^2.30.1",
+ "prop-types": "^15.8.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.21.1",
+ "reactjs-social-login": "^2.6.3",
+ "vite-plugin-pwa": "^0.20.0"
+ },
+ "devDependencies": {
+ "@tanstack/eslint-plugin-query": "^5.14.6",
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "@vite-pwa/assets-generator": "^0.2.4",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "autoprefixer": "^10.4.16",
+ "eslint": "^8.56.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-prettier": "^5.1.2",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "eslint-plugin-simple-import-sort": "^10.0.0",
+ "eslint-plugin-sort-destructure-keys": "^1.5.0",
+ "eslint-plugin-sort-keys-fix": "^1.1.2",
+ "eslint-plugin-tailwindcss": "^3.13.1",
+ "husky": "^8.0.3",
+ "postcss": "^8.4.32",
+ "prettier": "^3.1.1",
+ "prettier-plugin-tailwindcss": "^0.5.10",
+ "tailwindcss": "^3.4.0",
+ "vite": "^5.2.13"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.8.tgz",
+ "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==",
+ "devOptional": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+ "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+ "dependencies": {
+ "@babel/highlight": "^7.24.7",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz",
+ "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz",
+ "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helpers": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/template": "^7.24.7",
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
+ "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
+ "dependencies": {
+ "@babel/types": "^7.24.7",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+ "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+ "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
+ "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==",
+ "dependencies": {
+ "@babel/compat-data": "^7.24.7",
+ "@babel/helper-validator-option": "^7.24.7",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz",
+ "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-member-expression-to-functions": "^7.24.7",
+ "@babel/helper-optimise-call-expression": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz",
+ "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "regexpu-core": "^5.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+ "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+ "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+ "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
+ "dependencies": {
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+ "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz",
+ "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==",
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+ "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
+ "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+ "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+ "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
+ "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-wrap-function": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
+ "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-member-expression-to-functions": "^7.24.7",
+ "@babel/helper-optimise-call-expression": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+ "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+ "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
+ "dependencies": {
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+ "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz",
+ "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
+ "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
+ "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/template": "^7.24.7",
+ "@babel/traverse": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz",
+ "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==",
+ "dependencies": {
+ "@babel/template": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+ "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
+ "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz",
+ "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
+ "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+ "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
+ "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+ "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+ "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+ "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz",
+ "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+ "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-remap-async-to-generator": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+ "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
+ "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+ "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+ "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
+ "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+ "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/template": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
+ "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+ "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+ "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+ "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+ "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+ "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+ "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
+ "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+ "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
+ "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+ "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+ "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+ "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
+ "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-simple-access": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
+ "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==",
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.24.7",
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+ "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+ "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+ "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+ "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+ "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+ "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+ "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-replace-supers": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+ "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
+ "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+ "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+ "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+ "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.24.7",
+ "@babel/helper-create-class-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+ "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+ "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+ "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+ "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+ "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+ "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+ "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz",
+ "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+ "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+ "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+ "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+ "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz",
+ "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==",
+ "dependencies": {
+ "@babel/compat-data": "^7.24.7",
+ "@babel/helper-compilation-targets": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-validator-option": "^7.24.7",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.24.7",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.24.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.24.7",
+ "@babel/plugin-transform-async-to-generator": "^7.24.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+ "@babel/plugin-transform-block-scoping": "^7.24.7",
+ "@babel/plugin-transform-class-properties": "^7.24.7",
+ "@babel/plugin-transform-class-static-block": "^7.24.7",
+ "@babel/plugin-transform-classes": "^7.24.7",
+ "@babel/plugin-transform-computed-properties": "^7.24.7",
+ "@babel/plugin-transform-destructuring": "^7.24.7",
+ "@babel/plugin-transform-dotall-regex": "^7.24.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+ "@babel/plugin-transform-dynamic-import": "^7.24.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+ "@babel/plugin-transform-for-of": "^7.24.7",
+ "@babel/plugin-transform-function-name": "^7.24.7",
+ "@babel/plugin-transform-json-strings": "^7.24.7",
+ "@babel/plugin-transform-literals": "^7.24.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+ "@babel/plugin-transform-modules-amd": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+ "@babel/plugin-transform-modules-systemjs": "^7.24.7",
+ "@babel/plugin-transform-modules-umd": "^7.24.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+ "@babel/plugin-transform-new-target": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-numeric-separator": "^7.24.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+ "@babel/plugin-transform-object-super": "^7.24.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7",
+ "@babel/plugin-transform-parameters": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.24.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+ "@babel/plugin-transform-property-literals": "^7.24.7",
+ "@babel/plugin-transform-regenerator": "^7.24.7",
+ "@babel/plugin-transform-reserved-words": "^7.24.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+ "@babel/plugin-transform-spread": "^7.24.7",
+ "@babel/plugin-transform-sticky-regex": "^7.24.7",
+ "@babel/plugin-transform-template-literals": "^7.24.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.24.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-regex": "^7.24.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.4",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.31.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.24.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz",
+ "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+ "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
+ "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.24.7",
+ "@babel/helper-environment-visitor": "^7.24.7",
+ "@babel/helper-function-name": "^7.24.7",
+ "@babel/helper-hoist-variables": "^7.24.7",
+ "@babel/helper-split-export-declaration": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
+ "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@canvas/image-data": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz",
+ "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==",
+ "devOptional": true
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
+ "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/serialize": "^1.1.2",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
+ "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "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"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
+ "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
+ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.11.3",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz",
+ "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@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",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz",
+ "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==",
+ "dependencies": {
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/unitless": "^0.8.1",
+ "@emotion/utils": "^1.2.1",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
+ "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
+ "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/is-prop-valid": "^1.2.1",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
+ "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
+ "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
+ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz",
+ "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
+ "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
+ "dependencies": {
+ "@floating-ui/core": "^1.4.2",
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz",
+ "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
+ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
+ "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
+ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mui/base": {
+ "version": "5.0.0-beta.29",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.29.tgz",
+ "integrity": "sha512-OXfUssYrB6ch/xpBVHMKAjThPlI9VyGGKdvQLMXef2j39wXfcxPlUVQlwia/lmE3rxWIGvbwkZsDtNYzLMsDUg==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.6",
+ "@floating-ui/react-dom": "^2.0.4",
+ "@mui/types": "^7.2.11",
+ "@mui/utils": "^5.15.2",
+ "@popperjs/core": "^2.11.8",
+ "clsx": "^2.0.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "5.15.19",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.19.tgz",
+ "integrity": "sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/icons-material": {
+ "version": "5.15.2",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.2.tgz",
+ "integrity": "sha512-Vs0Z6cd6ieTavMjqPvIJJfwsKaCLdRSErk5LjKdZlBqk7r2SR6roDyhVTQuZOeCzjEFj0qZ4iVPp2DJZRwuYbw==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.6"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@mui/material": "^5.0.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/joy": {
+ "version": "5.0.0-beta.20",
+ "resolved": "https://registry.npmjs.org/@mui/joy/-/joy-5.0.0-beta.20.tgz",
+ "integrity": "sha512-w0BjmY8XKdca0s7yRZiURhSlhiqDtSnhNFl6GHixYytNB5u8Al6GMdYH0aLB2w5+QP8ojPueYQ7oXkS/qo0skQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.6",
+ "@mui/base": "5.0.0-beta.29",
+ "@mui/core-downloads-tracker": "^5.15.2",
+ "@mui/system": "^5.15.2",
+ "@mui/types": "^7.2.11",
+ "@mui/utils": "^5.15.2",
+ "clsx": "^2.0.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "5.15.19",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.19.tgz",
+ "integrity": "sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/base": "5.0.0-beta.40",
+ "@mui/core-downloads-tracker": "^5.15.19",
+ "@mui/system": "^5.15.15",
+ "@mui/types": "^7.2.14",
+ "@mui/utils": "^5.15.14",
+ "@types/react-transition-group": "^4.4.10",
+ "clsx": "^2.1.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@mui/material/node_modules/@mui/base": {
+ "version": "5.0.0-beta.40",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
+ "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@floating-ui/react-dom": "^2.0.8",
+ "@mui/types": "^7.2.14",
+ "@mui/utils": "^5.15.14",
+ "@popperjs/core": "^2.11.8",
+ "clsx": "^2.1.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@mui/material/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "node_modules/@mui/private-theming": {
+ "version": "5.15.14",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz",
+ "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/utils": "^5.15.14",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "5.15.14",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz",
+ "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@emotion/cache": "^11.11.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "5.15.15",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz",
+ "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/private-theming": "^5.15.14",
+ "@mui/styled-engine": "^5.15.14",
+ "@mui/types": "^7.2.14",
+ "@mui/utils": "^5.15.14",
+ "clsx": "^2.1.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.2.14",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz",
+ "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==",
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "5.15.14",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz",
+ "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@types/prop-types": "^15.7.11",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.0.tgz",
+ "integrity": "sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz",
+ "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "15.2.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
+ "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
+ "deepmerge": "^4.2.2",
+ "is-builtin-module": "^3.2.1",
+ "is-module": "^1.0.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/@rollup/plugin-terser": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
+ "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
+ "dependencies": {
+ "serialize-javascript": "^6.0.1",
+ "smob": "^1.0.0",
+ "terser": "^5.17.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
+ "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
+ "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
+ "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
+ "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
+ "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
+ "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
+ "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
+ "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
+ "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
+ "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
+ "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
+ "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==",
+ "cpu": [
+ "s390x"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
+ "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
+ "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
+ "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
+ "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
+ "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.102.tgz",
+ "integrity": "sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@swc/counter": "^0.1.1",
+ "@swc/types": "^0.1.5"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.3.102",
+ "@swc/core-darwin-x64": "1.3.102",
+ "@swc/core-linux-arm-gnueabihf": "1.3.102",
+ "@swc/core-linux-arm64-gnu": "1.3.102",
+ "@swc/core-linux-arm64-musl": "1.3.102",
+ "@swc/core-linux-x64-gnu": "1.3.102",
+ "@swc/core-linux-x64-musl": "1.3.102",
+ "@swc/core-win32-arm64-msvc": "1.3.102",
+ "@swc/core-win32-ia32-msvc": "1.3.102",
+ "@swc/core-win32-x64-msvc": "1.3.102"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.102.tgz",
+ "integrity": "sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.102.tgz",
+ "integrity": "sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.102.tgz",
+ "integrity": "sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.102.tgz",
+ "integrity": "sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.102.tgz",
+ "integrity": "sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.102.tgz",
+ "integrity": "sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.102.tgz",
+ "integrity": "sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.102.tgz",
+ "integrity": "sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.102.tgz",
+ "integrity": "sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.3.102",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.102.tgz",
+ "integrity": "sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz",
+ "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==",
+ "dev": true
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz",
+ "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==",
+ "dev": true
+ },
+ "node_modules/@tanstack/eslint-plugin-query": {
+ "version": "5.14.6",
+ "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.14.6.tgz",
+ "integrity": "sha512-vpowwoGoB9JgZy8fljf53ZTW2yYLRQ3Tjx4WQFKxiKugQOctxaTjQk7wlYzuqA/gjzfPL9qHfKW5DTT9CmIpkA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.62.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.17.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.17.0.tgz",
+ "integrity": "sha512-LoBaPtbMY26kRS+ohII4thTsWkJJsXKGitOLikTo2aqPA4yy7cfFJITs8DRnuERT7tLF5xfG9Lnm33Vp/38Vmw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.17.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.17.0.tgz",
+ "integrity": "sha512-iNSn6ZA7mHUjrT0a271eKoa1oR1HznlrGbb475awft1kuP3zrhyUCrI8tlGowOr7zRoAxJholjwxO+gfz1IObw==",
+ "dependencies": {
+ "@tanstack/query-core": "5.17.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.11",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.46",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz",
+ "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.18",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz",
+ "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.10",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
+ "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
+ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "dev": true
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "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.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@vite-pwa/assets-generator": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@vite-pwa/assets-generator/-/assets-generator-0.2.4.tgz",
+ "integrity": "sha512-DXyPLPR/IpbZPSpo1amZEPghY/ziIwpTUKNaz0v1xG+ELzCXmrVQhVzEMqr2JLSqRxjc+UzKfGJA/YdUuaao3w==",
+ "devOptional": true,
+ "dependencies": {
+ "cac": "^6.7.14",
+ "colorette": "^2.0.20",
+ "consola": "^3.2.3",
+ "sharp": "^0.32.6",
+ "sharp-ico": "^0.1.5",
+ "unconfig": "^0.3.11"
+ },
+ "bin": {
+ "pwa-assets-generator": "bin/pwa-assets-generator.mjs"
+ },
+ "engines": {
+ "node": ">=16.14.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.5.0.tgz",
+ "integrity": "sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==",
+ "dev": true,
+ "dependencies": {
+ "@swc/core": "^1.3.96"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/aos": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz",
+ "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==",
+ "dependencies": {
+ "classlist-polyfill": "^1.0.3",
+ "lodash.debounce": "^4.0.6",
+ "lodash.throttle": "^4.0.1"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
+ "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
+ "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+ "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
+ },
+ "node_modules/asynciterator.prototype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
+ "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.16",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
+ "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001538",
+ "fraction.js": "^4.3.6",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz",
+ "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==",
+ "devOptional": true
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.11",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+ "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
+ "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.1",
+ "core-js-compat": "^3.36.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+ "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/bare-events": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz",
+ "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/bare-fs": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz",
+ "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "bare-events": "^2.0.0",
+ "bare-path": "^2.0.0",
+ "bare-stream": "^2.0.0"
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz",
+ "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/bare-path": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz",
+ "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "bare-os": "^2.1.0"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz",
+ "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.18.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "devOptional": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.23.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
+ "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001629",
+ "electron-to-chromium": "^1.4.796",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.16"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001635",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001635.tgz",
+ "integrity": "sha512-34NOwyGFZxFoIOFNoLPP08eHzaCN+3wJFKx4Vph0XpidU1tRxB0p3Q2etIbOj0W8TYeuXkYsMCcyjV1+phBzxQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "devOptional": true
+ },
+ "node_modules/classlist-polyfill": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
+ "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "devOptional": true,
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "devOptional": true,
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "devOptional": true
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "devOptional": true,
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.37.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+ "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
+ "dependencies": {
+ "browserslist": "^4.23.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-bmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz",
+ "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==",
+ "devOptional": true,
+ "dependencies": {
+ "@canvas/image-data": "^1.0.0",
+ "to-data-view": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/decode-ico": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz",
+ "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==",
+ "devOptional": true,
+ "dependencies": {
+ "@canvas/image-data": "^1.0.0",
+ "decode-bmp": "^0.2.0",
+ "to-data-view": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "devOptional": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "devOptional": true
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.803",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.803.tgz",
+ "integrity": "sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "devOptional": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
+ "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
+ "dev": true,
+ "dependencies": {
+ "asynciterator.prototype": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.1",
+ "es-set-tostringtag": "^2.0.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.0.1"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.56.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz",
+ "integrity": "sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.8.6"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": "*",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.33.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
+ "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.12",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz",
+ "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-simple-import-sort": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz",
+ "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=5.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-sort-destructure-keys": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-sort-destructure-keys/-/eslint-plugin-sort-destructure-keys-1.5.0.tgz",
+ "integrity": "sha512-xGLyqHtbFXZNXQSvAiQ4ISBYokrbUywEhmaA50fKtSKgceCv5y3zjoNuZwcnajdM6q29Nxj+oXC9KcqfMsAPrg==",
+ "dev": true,
+ "dependencies": {
+ "natural-compare-lite": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "3 - 8"
+ }
+ },
+ "node_modules/eslint-plugin-sort-keys-fix": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-sort-keys-fix/-/eslint-plugin-sort-keys-fix-1.1.2.tgz",
+ "integrity": "sha512-DNPHFGCA0/hZIsfODbeLZqaGY/+q3vgtshF85r+YWDNCQ2apd9PNs/zL6ttKm0nD1IFwvxyg3YOTI7FHl4unrw==",
+ "dev": true,
+ "dependencies": {
+ "espree": "^6.1.2",
+ "esutils": "^2.0.2",
+ "natural-compare": "^1.4.0",
+ "requireindex": "~1.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-sort-keys-fix/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/eslint-plugin-sort-keys-fix/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-plugin-sort-keys-fix/node_modules/espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-tailwindcss": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.13.1.tgz",
+ "integrity": "sha512-2Nlgr9doO6vFAG9w4iGU0sspWXuzypfng10HTF+dFS2NterhweWtgdRvf/f7aaoOUUxVZM8wMIXzazrZ7CxyeA==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.2.5",
+ "postcss": "^8.4.4"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ },
+ "peerDependencies": {
+ "tailwindcss": "^3.3.2"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "devOptional": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+ "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "devOptional": true
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "devOptional": true
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz",
+ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==",
+ "dev": true,
+ "bin": {
+ "husky": "lib/bin.js"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/ico-endec": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz",
+ "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==",
+ "devOptional": true
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "devOptional": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-builtin-module": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
+ "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
+ "dependencies": {
+ "builtin-modules": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz",
+ "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
+ "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
+ "devOptional": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="
+ },
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+ "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+ "dev": true,
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "devOptional": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "devOptional": true
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/napi-build-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
+ "devOptional": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/node-abi": {
+ "version": "3.65.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz",
+ "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==",
+ "devOptional": true,
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-abi/node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "devOptional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
+ "devOptional": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+ "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
+ "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
+ "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-scurry": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+ "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^9.1.1 || ^10.0.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-import/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
+ "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.15",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
+ "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/prebuild-install": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
+ "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==",
+ "devOptional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/prebuild-install/node_modules/tar-fs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "devOptional": true,
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/prebuild-install/node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "devOptional": true,
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz",
+ "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/prettier-plugin-tailwindcss": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.10.tgz",
+ "integrity": "sha512-9UGSejqFxGG6brYjFfTYlJ8zs4L/lvZg1AngFfaC5Fs1otSskASv5IWKmjPu5MlABQUtTKtMArKyYr/hWpXSUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "@ianvs/prettier-plugin-sort-imports": "*",
+ "@prettier/plugin-pug": "*",
+ "@shopify/prettier-plugin-liquid": "*",
+ "@trivago/prettier-plugin-sort-imports": "*",
+ "prettier": "^3.0",
+ "prettier-plugin-astro": "*",
+ "prettier-plugin-css-order": "*",
+ "prettier-plugin-import-sort": "*",
+ "prettier-plugin-jsdoc": "*",
+ "prettier-plugin-marko": "*",
+ "prettier-plugin-organize-attributes": "*",
+ "prettier-plugin-organize-imports": "*",
+ "prettier-plugin-style-order": "*",
+ "prettier-plugin-svelte": "*"
+ },
+ "peerDependenciesMeta": {
+ "@ianvs/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@prettier/plugin-pug": {
+ "optional": true
+ },
+ "@shopify/prettier-plugin-liquid": {
+ "optional": true
+ },
+ "@trivago/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ },
+ "prettier-plugin-css-order": {
+ "optional": true
+ },
+ "prettier-plugin-import-sort": {
+ "optional": true
+ },
+ "prettier-plugin-jsdoc": {
+ "optional": true
+ },
+ "prettier-plugin-marko": {
+ "optional": true
+ },
+ "prettier-plugin-organize-attributes": {
+ "optional": true
+ },
+ "prettier-plugin-organize-imports": {
+ "optional": true
+ },
+ "prettier-plugin-style-order": {
+ "optional": true
+ },
+ "prettier-plugin-svelte": {
+ "optional": true
+ },
+ "prettier-plugin-twig-melody": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz",
+ "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==",
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "devOptional": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/queue-tick": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
+ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
+ "devOptional": true
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "devOptional": true,
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-router": {
+ "version": "6.21.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz",
+ "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==",
+ "dependencies": {
+ "@remix-run/router": "1.14.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.21.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz",
+ "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==",
+ "dependencies": {
+ "@remix-run/router": "1.14.1",
+ "react-router": "6.21.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/reactjs-social-login": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/reactjs-social-login/-/reactjs-social-login-2.6.3.tgz",
+ "integrity": "sha512-i/pcyJPtlVpHoPRr/j5/KjaP/GNxAInnnHDk0PD2Zo0B3cMdvr0ZiGC/GMjOKAAgKCujyniDf/OiZ7c6MrOLQg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": "^16 || ^17 || ^18",
+ "react-dom": "^16 || ^17 || ^18"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "devOptional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
+ "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
+ "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+ "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "dependencies": {
+ "@babel/regjsgen": "^0.8.0",
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.5"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.18.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz",
+ "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.18.0",
+ "@rollup/rollup-android-arm64": "4.18.0",
+ "@rollup/rollup-darwin-arm64": "4.18.0",
+ "@rollup/rollup-darwin-x64": "4.18.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.18.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.18.0",
+ "@rollup/rollup-linux-arm64-musl": "4.18.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.18.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.18.0",
+ "@rollup/rollup-linux-x64-gnu": "4.18.0",
+ "@rollup/rollup-linux-x64-musl": "4.18.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.18.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.18.0",
+ "@rollup/rollup-win32-x64-msvc": "4.18.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
+ "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.32.6",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
+ "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
+ "devOptional": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.2",
+ "node-addon-api": "^6.1.0",
+ "prebuild-install": "^7.1.1",
+ "semver": "^7.5.4",
+ "simple-get": "^4.0.1",
+ "tar-fs": "^3.0.4",
+ "tunnel-agent": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/sharp-ico": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz",
+ "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==",
+ "devOptional": true,
+ "dependencies": {
+ "decode-ico": "*",
+ "ico-endec": "*",
+ "sharp": "*"
+ }
+ },
+ "node_modules/sharp/node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "devOptional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "devOptional": true,
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "devOptional": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smob": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz",
+ "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+ },
+ "node_modules/streamx": {
+ "version": "2.18.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz",
+ "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==",
+ "devOptional": true,
+ "dependencies": {
+ "fast-fifo": "^1.3.2",
+ "queue-tick": "^1.0.1",
+ "text-decoder": "^1.1.0"
+ },
+ "optionalDependencies": {
+ "bare-events": "^2.2.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "devOptional": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
+ "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "regexp.prototype.flags": "^1.5.0",
+ "set-function-name": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
+ "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
+ "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
+ "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
+ "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/core": "^0.1.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz",
+ "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.19.1",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz",
+ "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==",
+ "devOptional": true,
+ "dependencies": {
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^2.1.1",
+ "bare-path": "^2.1.0"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "devOptional": true,
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.31.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz",
+ "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/text-decoder": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz",
+ "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==",
+ "devOptional": true,
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/to-data-view": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz",
+ "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==",
+ "devOptional": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "dev": true
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "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"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "devOptional": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
+ "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unconfig": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.13.tgz",
+ "integrity": "sha512-N9Ph5NC4+sqtcOjPfHrRcHekBCadCXWTBzp2VYYbySOHW0PfD9XLCeXshTXjkPYwLrBr9AtSeU0CZmkYECJhng==",
+ "devOptional": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.7",
+ "defu": "^6.1.4",
+ "jiti": "^1.21.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+ "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.2",
+ "picocolors": "^1.0.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "devOptional": true
+ },
+ "node_modules/vite": {
+ "version": "5.2.13",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz",
+ "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==",
+ "dependencies": {
+ "esbuild": "^0.20.1",
+ "postcss": "^8.4.38",
+ "rollup": "^4.13.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-pwa": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.0.tgz",
+ "integrity": "sha512-/kDZyqF8KqoXRpMUQtR5Atri/7BWayW8Gp7Kz/4bfstsV6zSFTxjREbXZYL7zSuRL40HGA+o2hvUAFRmC+bL7g==",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "pretty-bytes": "^6.1.1",
+ "workbox-build": "^7.1.0",
+ "workbox-window": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vite-pwa/assets-generator": "^0.2.4",
+ "vite": "^3.1.0 || ^4.0.0 || ^5.0.0",
+ "workbox-build": "^7.1.0",
+ "workbox-window": "^7.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@vite-pwa/assets-generator": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
+ "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+ "dev": true,
+ "dependencies": {
+ "function.prototype.name": "^1.1.5",
+ "has-tostringtag": "^1.0.0",
+ "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.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dev": true,
+ "dependencies": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/workbox-background-sync": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz",
+ "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz",
+ "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz",
+ "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.24.4",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^15.2.3",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@rollup/plugin-terser": "^0.4.3",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "7.1.0",
+ "workbox-broadcast-update": "7.1.0",
+ "workbox-cacheable-response": "7.1.0",
+ "workbox-core": "7.1.0",
+ "workbox-expiration": "7.1.0",
+ "workbox-google-analytics": "7.1.0",
+ "workbox-navigation-preload": "7.1.0",
+ "workbox-precaching": "7.1.0",
+ "workbox-range-requests": "7.1.0",
+ "workbox-recipes": "7.1.0",
+ "workbox-routing": "7.1.0",
+ "workbox-strategies": "7.1.0",
+ "workbox-streams": "7.1.0",
+ "workbox-sw": "7.1.0",
+ "workbox-window": "7.1.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/workbox-build/node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+ },
+ "node_modules/workbox-build/node_modules/ajv": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
+ "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.4.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/workbox-build/node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
+ },
+ "node_modules/workbox-build/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/workbox-build/node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/workbox-build/node_modules/rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/workbox-build/node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz",
+ "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz",
+ "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q=="
+ },
+ "node_modules/workbox-expiration": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz",
+ "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz",
+ "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==",
+ "dependencies": {
+ "workbox-background-sync": "7.1.0",
+ "workbox-core": "7.1.0",
+ "workbox-routing": "7.1.0",
+ "workbox-strategies": "7.1.0"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz",
+ "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz",
+ "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==",
+ "dependencies": {
+ "workbox-core": "7.1.0",
+ "workbox-routing": "7.1.0",
+ "workbox-strategies": "7.1.0"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz",
+ "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz",
+ "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==",
+ "dependencies": {
+ "workbox-cacheable-response": "7.1.0",
+ "workbox-core": "7.1.0",
+ "workbox-expiration": "7.1.0",
+ "workbox-precaching": "7.1.0",
+ "workbox-routing": "7.1.0",
+ "workbox-strategies": "7.1.0"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz",
+ "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz",
+ "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz",
+ "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==",
+ "dependencies": {
+ "workbox-core": "7.1.0",
+ "workbox-routing": "7.1.0"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz",
+ "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA=="
+ },
+ "node_modules/workbox-window": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz",
+ "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+ "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..da9a3a7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "fe-template",
+ "private": true,
+ "version": "0.1.59",
+ "type": "module",
+ "lint-staged": {
+ "*.{js,jsx,ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ]
+ },
+ "scripts": {
+ "start": "vite --host",
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview",
+ "release": "npm version patch && npm run build && git push origin develop --tags",
+ "merge": "git checkout main && git merge develop && git push origin main && git checkout develop"
+ },
+ "dependencies": {
+ "@emotion/react": "^11.11.3",
+ "@emotion/styled": "^11.11.0",
+ "@mui/icons-material": "^5.15.2",
+ "@mui/joy": "^5.0.0-beta.20",
+ "@mui/material": "^5.15.2",
+ "@tanstack/react-query": "^5.17.0",
+ "aos": "^2.3.4",
+ "dotenv": "^16.4.5",
+ "js-cookie": "^3.0.5",
+ "moment": "^2.30.1",
+ "prop-types": "^15.8.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.21.1",
+ "reactjs-social-login": "^2.6.3",
+ "vite-plugin-pwa": "^0.20.0"
+ },
+ "devDependencies": {
+ "@tanstack/eslint-plugin-query": "^5.14.6",
+ "@types/react": "^18.2.43",
+ "@types/react-dom": "^18.2.17",
+ "@vite-pwa/assets-generator": "^0.2.4",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "autoprefixer": "^10.4.16",
+ "eslint": "^8.56.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-prettier": "^5.1.2",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "eslint-plugin-simple-import-sort": "^10.0.0",
+ "eslint-plugin-sort-destructure-keys": "^1.5.0",
+ "eslint-plugin-sort-keys-fix": "^1.1.2",
+ "eslint-plugin-tailwindcss": "^3.13.1",
+ "husky": "^8.0.3",
+ "postcss": "^8.4.32",
+ "prettier": "^3.1.1",
+ "prettier-plugin-tailwindcss": "^0.5.10",
+ "tailwindcss": "^3.4.0",
+ "vite": "^5.2.13"
+ }
+}
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
new file mode 100644
index 0000000..2f74125
--- /dev/null
+++ b/public/android-chrome-192x192.png
Binary files differ
diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png
new file mode 100644
index 0000000..86d6620
--- /dev/null
+++ b/public/android-chrome-512x512.png
Binary files differ
diff --git a/public/apple-touch-icon-180x180.png b/public/apple-touch-icon-180x180.png
new file mode 100644
index 0000000..282daeb
--- /dev/null
+++ b/public/apple-touch-icon-180x180.png
Binary files differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000..ebdd14f
--- /dev/null
+++ b/public/apple-touch-icon.png
Binary files differ
diff --git a/public/browserconfig.xml b/public/browserconfig.xml
new file mode 100644
index 0000000..b3930d0
--- /dev/null
+++ b/public/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square150x150logo src="/mstile-150x150.png"/>
+ <TileColor>#da532c</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
new file mode 100644
index 0000000..83d1748
--- /dev/null
+++ b/public/favicon-16x16.png
Binary files differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
new file mode 100644
index 0000000..8d4788b
--- /dev/null
+++ b/public/favicon-32x32.png
Binary files differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..66dffbd
--- /dev/null
+++ b/public/favicon.ico
Binary files differ
diff --git a/public/logo.svg b/public/logo.svg
new file mode 100644
index 0000000..f205a47
--- /dev/null
+++ b/public/logo.svg
@@ -0,0 +1,1185 @@
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="100%" viewBox="0 0 1024 1024" enable-background="new 0 0 1024 1024" xml:space="preserve">
+
+<path fill="#B5BEFB" opacity="1.000000" stroke="none"
+ d="
+M457.067200,42.686905
+ C459.447144,26.832342 469.528015,16.203293 481.577301,7.055771
+ C484.583862,4.773226 488.270081,3.385903 491.321960,1.293556
+ C503.687561,1.000000 516.375122,1.000000 529.531372,1.000004
+ C532.877991,2.985393 535.601196,5.258084 538.660706,6.906528
+ C552.035889,14.112956 561.123352,24.814444 565.647583,39.326729
+ C566.080750,40.716061 566.044800,42.251637 566.534424,44.416672
+ C566.269714,53.474617 565.697205,61.835217 565.124695,70.195816
+ C562.884399,82.024635 556.006897,90.798393 546.797058,98.042542
+ C545.892578,98.753990 545.048767,99.542503 543.702881,100.681946
+ C542.668823,101.562706 542.108643,102.056770 540.874512,103.145233
+ C543.896545,103.378769 546.007507,103.627136 548.124084,103.692657
+ C579.398621,104.660835 610.777283,101.454941 641.961609,106.044365
+ C641.961609,106.044365 641.997559,106.000000 642.232666,106.281258
+ C643.636841,106.730606 644.805908,106.898689 645.975037,107.066772
+ C645.975037,107.066772 646.399109,107.196709 646.814575,107.547272
+ C648.802185,108.297722 650.374390,108.697617 651.946533,109.097511
+ C651.946533,109.097511 652.334167,109.251457 652.673218,109.635696
+ C655.649536,111.048347 658.286804,112.076759 660.924011,113.105164
+ C660.924011,113.105164 661.338745,113.293716 661.638184,113.612358
+ C662.257812,113.993759 662.577942,114.056519 662.898132,114.119278
+ C662.898132,114.119278 663.313416,114.351051 663.616821,114.670654
+ C663.920227,114.990265 664.358093,115.225540 664.358093,115.225540
+ C664.358093,115.225540 664.843811,115.120506 664.843811,115.120506
+ C664.843811,115.120506 664.924805,115.072365 664.949219,115.443268
+ C665.933105,116.254326 666.892517,116.694481 667.851990,117.134628
+ C667.851990,117.134621 667.947266,117.053314 667.981079,117.440826
+ C669.021606,118.253540 670.028381,118.678749 671.271301,119.170792
+ C671.824585,119.286629 672.140808,119.341209 672.622070,119.696716
+ C679.759644,127.731895 687.501282,134.920029 693.530396,143.335159
+ C703.686951,157.510941 709.115906,173.618210 708.473145,191.277771
+ C681.710510,191.293823 655.410950,191.385529 629.111389,191.401764
+ C529.069275,191.463501 429.027130,191.500854 328.965271,191.124725
+ C330.406860,167.369614 339.520386,147.529587 356.163544,131.138840
+ C359.916351,127.442932 363.727966,123.806702 367.806641,120.045158
+ C369.087769,118.981110 370.074799,118.014900 371.061859,117.048691
+ C371.061859,117.048691 371.013489,116.999557 371.355469,117.107140
+ C371.996918,116.890915 372.296387,116.567116 372.595886,116.243324
+ C372.595886,116.243332 372.563263,116.098564 373.016327,116.232864
+ C373.845886,115.978600 374.222382,115.590034 374.598877,115.201477
+ C374.598877,115.201469 374.529510,115.009590 374.926147,115.148865
+ C375.885895,114.907318 376.448944,114.526497 377.012024,114.145676
+ C383.126526,111.437981 389.241028,108.730270 396.026550,106.213028
+ C424.273346,100.114319 452.383545,104.830887 480.419342,102.608955
+ C479.972687,101.906181 479.796143,101.424187 479.455841,101.134781
+ C478.702362,100.494049 477.866638,99.950081 477.064423,99.366669
+ C472.619659,94.664429 467.385376,90.467857 463.956818,85.114799
+ C460.664032,79.973732 459.242096,73.634453 456.975769,66.983047
+ C456.991394,58.325230 457.029297,50.506069 457.067200,42.686905
+M495.040314,43.670990
+ C486.376251,56.938816 493.815094,72.260345 507.730530,74.933403
+ C517.515564,76.813034 529.649231,68.062172 531.328369,59.447845
+ C532.796204,51.917713 530.302063,46.677364 526.017822,41.704769
+ C518.169128,32.594967 503.036163,33.744705 495.040314,43.670990
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M367.512543,120.143005
+ C363.727966,123.806702 359.916351,127.442932 356.163544,131.138840
+ C339.520386,147.529587 330.406860,167.369614 328.768921,191.520508
+ C328.478699,198.661301 328.300964,204.983322 328.263184,211.306168
+ C328.132141,233.240723 334.086792,239.255035 355.925262,239.252853
+ C463.741425,239.242065 571.557556,239.221786 679.373718,239.197357
+ C683.039307,239.196518 686.712097,239.247787 690.369019,239.046799
+ C700.273621,238.502396 708.806946,230.141632 709.049622,220.303772
+ C709.287842,210.648895 708.995605,200.980957 708.936157,191.318741
+ C709.115906,173.618210 703.686951,157.510941 693.530396,143.335159
+ C687.501282,134.920029 679.759644,127.731895 673.147339,119.643036
+ C691.453796,119.205421 709.400879,119.116837 727.348022,119.028259
+ C743.718384,119.185036 759.522888,122.356789 774.749939,128.267838
+ C786.922852,132.993240 797.822937,139.913391 808.099548,148.875977
+ C808.958862,149.589859 809.502563,149.758560 810.046326,149.927246
+ C810.046326,149.927246 810.021057,149.975540 810.086792,150.276672
+ C810.779724,151.029556 811.406799,151.481308 812.033936,151.933075
+ C812.033936,151.933060 812.019409,151.965164 812.138550,152.173523
+ C812.441711,152.643311 812.684631,152.826950 812.986328,152.932816
+ C812.986328,152.932816 813.059509,152.936432 813.168884,153.175323
+ C813.468811,153.665741 813.713806,153.841400 814.013184,153.941177
+ C814.013184,153.941177 814.051208,153.950363 814.088745,154.311172
+ C818.032654,158.893280 821.994446,163.064835 825.836121,167.344177
+ C846.403625,190.254852 856.329895,217.527451 856.795593,247.912750
+ C857.175781,272.717957 857.808350,297.541016 854.362427,322.368683
+ C852.379761,336.653229 853.979675,351.360748 856.036316,365.862640
+ C857.653748,377.267303 859.067017,388.958374 853.599670,400.041992
+ C852.912598,401.434784 852.977539,403.305450 853.038879,404.941803
+ C853.287476,411.573303 853.994141,418.202515 853.938171,424.827576
+ C853.815247,439.383301 853.345520,453.936340 852.972229,468.489319
+ C852.938599,469.801819 852.610535,471.112061 852.363953,472.412842
+ C850.920166,480.029877 848.397461,487.615387 848.193176,495.263733
+ C847.398071,525.033203 847.340332,554.822327 846.994141,584.603882
+ C846.972412,586.474854 846.830505,588.344421 846.744507,590.214600
+ C846.145996,590.232544 845.547485,590.250549 844.948975,590.268494
+ C844.658142,587.152283 844.109802,584.033447 844.141357,580.920532
+ C844.181458,576.954102 844.996338,572.987915 844.935974,569.029785
+ C844.796814,559.899963 844.151367,550.777222 844.039978,541.647644
+ C843.875366,528.157349 844.023315,514.663452 843.973206,501.171417
+ C843.962769,498.366394 844.243896,495.191406 839.997925,494.538177
+ C839.326233,478.318695 839.758423,462.430847 837.779663,446.849182
+ C834.529297,421.255829 823.151123,398.918518 805.493042,380.181274
+ C793.981995,367.966766 781.588867,356.570251 769.352356,345.060852
+ C765.653015,341.581299 761.155518,338.950317 756.843567,335.649292
+ C743.908691,326.317169 729.995605,319.814392 714.687195,316.457092
+ C713.554565,316.208710 712.242615,316.778168 710.639099,316.950745
+ C698.542175,312.221039 686.391602,309.916016 673.730347,309.923553
+ C565.775574,309.987640 457.820831,309.968811 349.866089,310.059326
+ C344.561615,310.063751 339.193878,310.469238 333.963470,311.337677
+ C280.783264,320.168030 243.279373,364.230225 243.023254,418.147522
+ C242.903763,443.303101 242.982635,468.459686 242.985275,493.615814
+ C242.994949,586.243652 242.955917,678.871582 243.061478,771.499329
+ C243.088242,794.982666 249.616028,816.593689 263.836487,835.442505
+ C268.606262,841.764709 274.585938,847.174133 279.898254,853.120605
+ C279.604553,853.562805 279.704010,853.814636 280.044067,853.997742
+ C280.005829,853.999634 280.002563,853.923096 280.186279,854.166626
+ C280.937561,854.595703 281.505157,854.781189 282.037994,854.970215
+ C282.003235,854.973633 282.046844,854.919006 282.027588,855.286072
+ C283.158875,857.410828 284.116425,859.338989 285.492432,860.897583
+ C292.535645,868.875305 299.851685,876.616882 306.761627,884.706421
+ C317.245636,896.980347 329.179504,907.451233 343.404388,915.154358
+ C365.429352,927.081238 388.899506,932.710754 413.902679,931.339478
+ C408.122437,933.121399 402.442688,934.550720 396.761139,935.972961
+ C390.791687,937.467468 385.126617,937.440063 379.376343,934.430664
+ C374.882202,932.078674 369.887848,929.649963 364.994995,929.370667
+ C359.659149,929.066101 355.466064,927.296631 351.280640,924.582336
+ C350.536652,924.099854 349.671295,923.804443 347.977051,923.005249
+ C349.180267,925.916565 350.009216,927.922302 350.923737,930.135132
+ C345.875610,932.306213 339.497589,930.720032 336.486237,936.514343
+ C336.331818,936.811401 335.562317,936.919800 335.088043,936.900391
+ C324.405731,936.462463 313.717834,936.111389 303.045990,935.486938
+ C296.836243,935.123596 290.664795,934.695129 285.914490,939.670166
+ C283.610229,942.083435 281.634979,942.063660 278.927979,940.412354
+ C276.570862,938.974487 273.935120,937.459961 271.281799,937.137634
+ C262.104797,936.022888 253.458191,933.694641 245.492767,928.815491
+ C238.599548,924.593079 231.271408,921.058594 224.521591,916.631348
+ C219.204956,913.144165 214.256332,909.001465 209.550766,904.704773
+ C205.226151,900.755737 201.842072,895.720215 197.316742,892.062683
+ C192.335907,888.036987 190.979248,882.060059 187.697311,877.163818
+ C185.246872,873.508179 183.672867,869.253052 181.818619,865.214294
+ C180.663101,862.697388 178.861938,860.101013 178.817535,857.515076
+ C178.628326,846.496338 173.810349,837.184875 168.344193,827.855835
+ C167.921219,832.154236 167.309845,836.566223 168.032440,840.747681
+ C170.493652,854.990051 175.235184,868.571350 181.171188,881.728210
+ C182.196503,884.000732 182.235214,885.558777 179.185074,885.971924
+ C174.280182,873.505493 169.628265,861.253113 164.956284,848.705566
+ C164.636017,848.262268 164.335815,848.114014 164.035629,847.965759
+ C164.035629,847.965759 164.018539,847.998840 164.312347,847.753601
+ C164.076660,845.324341 163.547180,843.140381 163.017685,840.956360
+ C163.017685,840.956360 163.043472,840.974731 163.221771,840.560669
+ C163.123734,837.398071 162.847382,834.649475 162.610870,831.475159
+ C162.540268,823.223755 162.330643,815.398010 162.334015,807.572449
+ C162.415344,619.038269 162.519424,430.504120 162.764160,241.573059
+ C164.396896,224.044144 169.042175,207.829910 176.951843,192.546234
+ C177.533127,191.422989 177.651611,190.060211 177.985229,188.808792
+ C180.320938,185.255600 182.656647,181.702408 185.368835,177.754288
+ C188.851440,173.245544 191.957565,169.131729 195.063690,165.017914
+ C195.063675,165.017914 195.003845,165.003922 195.364883,165.080093
+ C199.946686,161.225510 204.181549,157.309738 208.382980,153.358398
+ C210.961136,150.933762 213.488052,148.454681 216.037979,146.000031
+ C216.037979,146.000031 216.029800,146.033829 216.361084,146.145721
+ C217.813522,145.179688 218.934677,144.101730 220.055832,143.023773
+ C220.055832,143.023773 220.000656,143.001984 220.359589,143.120880
+ C222.158813,142.152878 223.599106,141.065979 225.039383,139.979095
+ C225.039383,139.979095 225.032379,140.038437 225.349579,140.081543
+ C226.460587,139.416077 227.254410,138.707520 228.048218,137.998962
+ C228.048218,137.998962 228.037643,138.048889 228.387024,138.114716
+ C233.485779,135.763092 238.235138,133.345642 243.359009,130.899567
+ C250.604446,128.297592 257.475372,125.724258 264.346283,123.150917
+ C264.346283,123.150917 264.479218,123.093704 264.901001,123.138603
+ C265.551697,123.137711 265.780579,123.091919 266.430298,123.052216
+ C274.237335,121.799263 281.623535,120.540222 289.476929,119.317017
+ C314.376343,119.306656 338.808563,119.244797 363.240784,119.254318
+ C364.664825,119.254875 366.088623,119.833435 367.512543,120.143005
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M840.018799,495.007324
+ C844.243896,495.191406 843.962769,498.366394 843.973206,501.171417
+ C844.023315,514.663452 843.875366,528.157349 844.039978,541.647644
+ C844.151367,550.777222 844.796814,559.899963 844.935974,569.029785
+ C844.996338,572.987915 844.181458,576.954102 844.141357,580.920532
+ C844.109802,584.033447 844.658142,587.152283 844.948975,590.268494
+ C845.547485,590.250549 846.145996,590.232544 846.744507,590.214600
+ C846.830505,588.344421 846.972412,586.474854 846.994141,584.603882
+ C847.340332,554.822327 847.398071,525.033203 848.193176,495.263733
+ C848.397461,487.615387 850.920166,480.029877 852.363953,472.412842
+ C852.610535,471.112061 852.938599,469.801819 852.972229,468.489319
+ C853.345520,453.936340 853.815247,439.383301 853.938171,424.827576
+ C853.994141,418.202515 853.287476,411.573303 853.038879,404.941803
+ C852.977539,403.305450 852.912598,401.434784 853.599670,400.041992
+ C859.067017,388.958374 857.653748,377.267303 856.036316,365.862640
+ C853.979675,351.360748 852.379761,336.653229 854.362427,322.368683
+ C857.808350,297.541016 857.175781,272.717957 856.795593,247.912750
+ C856.329895,217.527451 846.403625,190.254852 825.836121,167.344177
+ C821.994446,163.064835 818.032654,158.893280 814.095337,154.329620
+ C820.264893,160.224182 826.899231,166.093796 832.564697,172.783936
+ C841.113281,182.878738 846.997009,194.774704 851.359863,207.113754
+ C854.489685,215.965591 855.696167,225.527374 857.407471,234.837357
+ C858.177551,239.026825 858.343750,243.374557 858.346741,247.650787
+ C858.401428,326.463135 858.385925,405.275482 858.399048,484.087860
+ C858.400269,491.249817 858.513855,498.411652 858.543823,505.573700
+ C858.844360,577.417786 859.186035,649.261780 859.413391,721.106079
+ C859.523010,755.761902 859.915344,790.429138 859.178833,825.069885
+ C858.842896,840.865723 855.393066,856.446045 849.288391,871.254150
+ C839.527588,894.930969 823.921387,914.099121 803.508240,929.201782
+ C795.927734,934.810120 787.249023,939.034180 778.781982,943.318115
+ C768.792419,948.372375 758.154053,951.665405 746.162720,952.788208
+ C744.932739,952.769287 744.469482,952.730286 744.004517,952.517944
+ C744.002747,952.344543 744.002441,951.997559 744.390686,951.930542
+ C770.306152,947.103455 792.922974,936.492004 812.617310,919.343201
+ C829.715393,904.455261 841.866272,886.435974 849.380493,865.190491
+ C851.441040,859.364441 854.719177,853.565063 851.139221,847.075500
+ C850.650146,846.188904 850.874817,844.733948 851.141113,843.632019
+ C854.427124,830.033813 850.615173,817.046753 847.751892,803.987915
+ C847.554016,803.085510 846.639954,802.340088 845.998352,801.436340
+ C843.891052,803.736511 845.286621,809.205322 839.863281,806.469971
+ C839.903625,797.339233 839.957275,788.672791 839.959473,780.006409
+ C839.983948,685.006714 840.000244,590.007019 840.018799,495.007324
+M856.997559,549.500000
+ C856.997559,536.177307 856.997559,522.854614 856.997559,509.531891
+ C856.742004,509.535126 856.486450,509.538391 856.230896,509.541626
+ C856.230896,577.883972 856.230896,646.226257 856.230896,714.568542
+ C856.486450,714.569092 856.742004,714.569580 856.997559,714.570068
+ C856.997559,659.880066 856.997559,605.190002 856.997559,549.500000
+M855.997559,445.500366
+ C855.997559,459.519104 855.997559,473.537842 855.997559,487.556549
+ C856.213379,487.553558 856.429199,487.550537 856.645020,487.547516
+ C856.645020,467.245667 856.645020,446.943817 856.645020,426.641968
+ C856.429199,426.641449 856.213379,426.640930 855.997559,426.640411
+ C855.997559,432.593872 855.997559,438.547302 855.997559,445.500366
+M855.997498,808.994690
+ C856.085205,810.154968 856.172852,811.315247 856.260498,812.475464
+ C856.419250,812.461060 856.578003,812.446655 856.736755,812.432251
+ C856.736755,793.093262 856.736755,773.754272 856.736755,754.415222
+ C856.490356,754.414307 856.243958,754.413391 855.997559,754.412415
+ C855.997559,772.313599 855.997559,790.214783 855.997498,808.994690
+M844.997559,602.588379
+ C844.997559,604.428589 844.997559,606.268738 844.997559,608.108948
+ C845.444946,608.083740 845.892334,608.058594 846.339722,608.033386
+ C846.339722,604.664795 846.339722,601.296143 846.339722,597.927551
+ C846.011902,597.922180 845.684021,597.916809 845.356201,597.911438
+ C845.236633,599.185974 845.117126,600.460510 844.997559,602.588379
+M856.030396,420.843170
+ C856.155884,421.118500 856.281372,421.393799 856.406860,421.669098
+ C856.518494,421.615692 856.726440,421.564087 856.727539,421.508575
+ C856.747070,420.487610 856.741760,419.466217 856.741760,418.444885
+ C856.542786,418.444489 856.343811,418.444092 856.144897,418.443726
+ C856.098877,419.054138 856.052856,419.664551 856.030396,420.843170
+z"/>
+<path fill="#637E63" opacity="1.000000" stroke="none"
+ d="
+M744.006287,952.691284
+ C744.469482,952.730286 744.932739,952.769287 745.739624,952.877441
+ C741.887573,953.948425 737.692993,955.819275 733.495789,955.825012
+ C622.607300,955.977966 511.718536,955.925293 400.829803,955.938599
+ C362.204681,955.943237 323.579346,956.101257 284.954834,955.969238
+ C280.997284,955.955750 277.044922,954.428162 273.326263,953.260864
+ C297.713715,953.297180 321.865051,953.675781 346.479370,954.119751
+ C381.235168,954.164368 415.527924,954.122131 449.820709,954.126892
+ C540.214294,954.139587 630.607910,954.192749 721.001465,954.150757
+ C726.779480,954.148071 732.557312,953.471008 738.494019,953.152161
+ C738.652832,953.196716 738.962341,953.082825 739.385437,953.109375
+ C741.207764,952.987732 742.607056,952.839539 744.006287,952.691284
+z"/>
+<path fill="#06b6d4" opacity="1.000000" stroke="none"
+ d="
+M162.619415,241.969971
+ C162.519424,430.504120 162.415344,619.038269 162.334015,807.572449
+ C162.330643,815.398010 162.540268,823.223755 162.438629,831.472839
+ C162.226593,831.896301 161.889160,831.966003 161.889160,831.966003
+ C161.592010,826.450500 161.246964,820.936951 161.017670,815.418579
+ C160.900940,812.609009 160.992310,809.790710 160.987473,806.040527
+ C160.990158,722.842468 161.000259,640.580322 160.964508,558.318115
+ C160.963745,556.565186 160.435410,554.812500 160.153198,553.059692
+ C160.112396,550.988770 160.071609,548.917847 160.337311,546.068665
+ C160.760559,544.471375 160.978836,543.652466 160.979370,542.833374
+ C160.997757,514.500916 161.006149,486.168457 160.961838,457.836121
+ C160.959839,456.563782 160.453461,455.292236 160.182007,454.020325
+ C160.112488,423.247040 160.009888,392.473785 159.981750,361.700470
+ C159.945847,322.438934 159.951889,283.177307 160.025192,243.915878
+ C160.028671,242.056046 160.859131,240.197739 161.656052,238.478958
+ C162.211578,239.736115 162.415497,240.853043 162.619415,241.969971
+z"/>
+<path fill="#00FFFF" opacity="1.000000" stroke="none"
+ d="
+M160.084442,553.520630
+ C160.435410,554.812500 160.963745,556.565186 160.964508,558.318115
+ C161.000259,640.580322 160.990158,722.842468 160.966766,805.575073
+ C160.632248,804.539062 160.040527,803.032654 160.039810,801.526062
+ C160.000397,719.011230 160.010559,636.496460 160.084442,553.520630
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M346.016357,954.054382
+ C321.865051,953.675781 297.713715,953.297180 273.080811,952.937500
+ C272.599182,952.956421 272.260376,952.915649 271.814270,952.691528
+ C270.052246,952.081604 268.736267,951.695740 267.846802,951.220337
+ C273.580353,948.060608 279.073853,950.637390 284.459656,950.717957
+ C290.397705,950.806763 296.328369,951.926453 302.258606,951.895813
+ C315.678070,951.826538 329.094482,951.260254 342.514587,951.093689
+ C344.001587,951.075256 345.504486,952.336853 346.796021,953.139404
+ C346.335419,953.486328 346.143494,953.746460 346.016357,954.054382
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M641.746216,105.740341
+ C610.777283,101.454941 579.398621,104.660835 548.124084,103.692657
+ C546.007507,103.627136 543.896545,103.378769 540.874512,103.145233
+ C542.108643,102.056770 542.668823,101.562706 543.529297,100.978439
+ C545.653198,101.292381 547.475647,102.042229 549.300537,102.048439
+ C573.962708,102.132462 598.628418,101.899818 623.285339,102.270638
+ C629.381653,102.362328 635.449768,104.330650 641.746216,105.740341
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M164.976349,849.000671
+ C169.628265,861.253113 174.280182,873.505493 179.244354,886.247498
+ C179.853500,887.211243 180.150436,887.685425 180.564713,888.501587
+ C182.407700,891.398071 184.133316,893.952515 185.871307,896.666260
+ C185.883682,896.825439 186.124237,897.035461 186.173950,897.272583
+ C186.368225,897.833008 186.614944,898.025513 186.973724,898.053894
+ C186.983658,898.020691 186.914673,898.026978 186.989227,898.323853
+ C187.348221,898.908630 187.632660,899.196533 187.921509,899.647583
+ C187.925919,899.810669 188.155853,900.042297 188.202271,900.269287
+ C188.407745,900.791992 188.653412,900.964111 188.992844,901.006348
+ C189.000000,901.000000 188.987137,901.013733 189.072021,901.271606
+ C189.416840,901.776672 189.676758,902.023987 189.986023,902.537720
+ C190.376892,903.208923 190.718445,903.613770 191.132080,904.248657
+ C191.392334,904.765930 191.655960,904.936646 191.995972,904.996582
+ C191.996902,905.002441 192.008835,905.005249 192.088135,905.246460
+ C192.436050,905.677795 192.704681,905.867920 192.985931,906.030884
+ C192.998520,906.003723 192.942551,906.024902 193.026917,906.286377
+ C193.386230,906.783020 193.661179,907.018188 194.038177,907.552002
+ C195.422150,909.231506 196.704071,910.612366 198.065399,912.238525
+ C198.424850,912.666321 198.704941,912.848755 198.991333,913.014404
+ C198.997620,912.997559 198.971634,913.023621 199.109039,913.318115
+ C200.837189,915.060181 202.427948,916.507690 204.009216,917.979614
+ C203.999710,918.003967 204.050385,917.991028 204.131653,918.220581
+ C204.393250,918.747742 204.654968,918.925659 204.996948,918.994019
+ C204.995773,919.004211 205.016068,919.001587 205.102859,919.234253
+ C205.384537,919.757385 205.652847,919.940186 206.087311,920.246948
+ C206.609146,920.700745 207.038300,920.922852 207.658997,921.424683
+ C209.107803,922.913208 210.365097,924.121948 211.452667,925.513550
+ C211.282928,925.696411 210.943954,926.062683 210.943939,926.062683
+ C206.682892,922.596985 201.948410,919.565918 198.273193,915.562439
+ C192.928619,909.740662 187.658661,903.631897 183.609131,896.893005
+ C178.115723,887.751404 173.389374,878.078918 169.146606,868.282227
+ C166.637726,862.489136 165.696335,856.017273 164.316650,849.426147
+ C164.583221,849.001587 164.976349,849.000671 164.976349,849.000671
+z"/>
+<path fill="#2CC4AC" opacity="1.000000" stroke="none"
+ d="
+M477.001221,99.704071
+ C477.866638,99.950081 478.702362,100.494049 479.455841,101.134781
+ C479.796143,101.424187 479.972687,101.906181 480.419342,102.608955
+ C452.383545,104.830887 424.273346,100.114319 396.427979,106.251633
+ C398.961578,105.079697 401.693359,103.568764 404.583801,103.148270
+ C409.605164,102.417793 414.722748,102.103699 419.803162,102.068298
+ C437.947723,101.941887 456.093781,102.035713 474.238251,101.903366
+ C475.076782,101.897263 478.206116,103.684158 477.001221,99.704071
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M162.764160,241.573059
+ C162.415497,240.853043 162.211578,239.736115 162.000977,238.265656
+ C163.086914,225.607986 164.658722,213.449402 170.869873,202.393097
+ C173.269608,198.121384 175.208389,193.590683 177.671204,188.993378
+ C177.651611,190.060211 177.533127,191.422989 176.951843,192.546234
+ C169.042175,207.829910 164.396896,224.044144 162.764160,241.573059
+z"/>
+<path fill="#00FF99" opacity="1.000000" stroke="none"
+ d="
+M160.113678,454.484558
+ C160.453461,455.292236 160.959839,456.563782 160.961838,457.836121
+ C161.006149,486.168457 160.997757,514.500916 160.979370,542.833374
+ C160.978836,543.652466 160.760559,544.471375 160.412903,545.630859
+ C160.136429,515.630432 160.090897,485.289642 160.113678,454.484558
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M367.806641,120.045166
+ C366.088623,119.833435 364.664825,119.254875 363.240784,119.254318
+ C338.808563,119.244797 314.376343,119.306656 289.466949,119.043747
+ C288.965912,118.554092 288.942047,118.373535 288.918152,118.192978
+ C310.462250,118.128761 332.006836,118.127151 353.550110,117.957306
+ C359.096130,117.913589 364.637970,117.340462 370.621796,117.029617
+ C370.074799,118.014900 369.087769,118.981110 367.806641,120.045166
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M215.668030,145.999268
+ C213.488052,148.454681 210.961136,150.933762 208.382980,153.358398
+ C204.181549,157.309738 199.946686,161.225510 195.377960,165.107895
+ C197.868362,161.645493 200.404190,157.906754 203.626160,154.904373
+ C207.189178,151.584167 211.380432,148.938141 215.668030,145.999268
+z"/>
+<path fill="#449678" opacity="1.000000" stroke="none"
+ d="
+M727.067993,118.662300
+ C709.400879,119.116837 691.453796,119.205421 672.981384,119.347687
+ C672.140808,119.341209 671.824585,119.286629 671.263428,118.966019
+ C671.019348,118.694420 671.004333,118.285271 671.004333,118.285271
+ C689.598877,118.288956 708.193420,118.292648 727.067993,118.662300
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M267.420319,951.309875
+ C268.736267,951.695740 270.052246,952.081604 271.647125,952.657349
+ C261.184357,952.121094 250.886978,949.728455 241.210999,944.257202
+ C241.124313,943.833984 241.302032,943.614014 241.673523,943.691711
+ C247.645523,945.586548 253.246033,947.403687 258.878174,949.201233
+ C258.909851,949.181641 258.859283,949.126953 259.050751,949.351562
+ C259.811005,949.668213 260.379791,949.760193 261.184509,949.979858
+ C261.770721,950.109863 262.120941,950.112305 262.725647,950.340088
+ C263.635315,950.658508 264.290497,950.751526 265.240295,950.977417
+ C266.163361,951.176880 266.791840,951.243347 267.420319,951.309875
+z"/>
+<path fill="#4CD298" opacity="1.000000" stroke="none"
+ d="
+M263.904022,123.090408
+ C257.475372,125.724258 250.604446,128.297592 243.360748,130.718353
+ C242.987946,130.565765 242.990158,130.203278 242.990158,130.203278
+ C249.814026,127.812149 256.637878,125.421021 263.904022,123.090408
+z"/>
+<path fill="#5CCD95" opacity="1.000000" stroke="none"
+ d="
+M288.503784,118.129204
+ C288.942047,118.373535 288.965912,118.554092 288.999756,119.007919
+ C281.623535,120.540222 274.237335,121.799263 266.433289,122.843079
+ C266.015411,122.627853 266.037292,122.210213 266.037292,122.210220
+ C273.388000,120.828621 280.738739,119.447021 288.503784,118.129204
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M242.617218,130.138428
+ C242.990158,130.203278 242.987946,130.565765 242.986221,130.746979
+ C238.235138,133.345642 233.485779,135.763092 228.361542,138.113708
+ C232.739182,135.389130 237.491730,132.731339 242.617218,130.138428
+z"/>
+<path fill="#31C5B1" opacity="1.000000" stroke="none"
+ d="
+M456.722168,42.940254
+ C457.029297,50.506069 456.991394,58.325230 456.912781,66.575485
+ C456.267456,65.588051 455.105225,64.150276 455.153412,62.754272
+ C455.378571,56.227737 455.937469,49.712730 456.722168,42.940254
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M194.731934,165.100403
+ C191.957565,169.131729 188.851440,173.245544 185.454941,177.380219
+ C188.243088,173.328354 191.321625,169.255615 194.731934,165.100403
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M241.034378,943.943115
+ C236.364349,941.944641 231.784271,939.837036 227.207275,937.247192
+ C227.210373,936.764832 227.489731,936.456482 227.820953,936.574585
+ C232.535446,938.999817 236.918732,941.306946 241.302032,943.614014
+ C241.302032,943.614014 241.124313,943.833984 241.034378,943.943115
+z"/>
+<path fill="#7F9DA3" opacity="1.000000" stroke="none"
+ d="
+M565.498962,70.090500
+ C565.697205,61.835217 566.269714,53.474617 566.854797,44.657387
+ C568.783508,52.882217 569.156189,61.504173 565.498962,70.090500
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M222.393082,934.758179
+ C218.668427,932.067688 214.943787,929.377136 211.081543,926.374634
+ C210.943954,926.062683 211.282928,925.696411 211.678467,925.610718
+ C212.354584,925.720764 212.665527,925.807068 213.145172,925.999390
+ C213.684586,926.524109 214.085602,926.833435 214.705933,927.427551
+ C217.654785,929.761658 220.384354,931.811035 222.928955,934.081055
+ C222.627045,934.453796 222.510071,934.606018 222.393082,934.758179
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M660.805725,112.763794
+ C658.286804,112.076759 655.649536,111.048347 652.868408,109.709381
+ C655.378784,110.406677 658.033081,111.414543 660.805725,112.763794
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M161.939117,832.409668
+ C161.889160,831.966003 162.226593,831.896301 162.398819,831.898621
+ C162.847382,834.649475 163.123734,837.398071 163.225769,840.575989
+ C162.697311,838.288025 162.343185,835.570740 161.939117,832.409668
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M163.015701,841.388062
+ C163.547180,843.140381 164.076660,845.324341 164.330139,847.747437
+ C163.707321,845.930847 163.360519,843.875305 163.015701,841.388062
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M224.683655,140.010986
+ C223.599106,141.065979 222.158813,142.152878 220.364136,143.150177
+ C221.449112,142.054703 222.888519,141.048782 224.683655,140.010986
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M227.070450,936.918762
+ C225.548859,936.480225 224.167191,935.887756 222.589325,935.026733
+ C222.510071,934.606018 222.627045,934.453796 223.249023,934.136841
+ C224.999268,934.800171 226.244507,935.628296 227.489746,936.456421
+ C227.489731,936.456482 227.210373,936.764832 227.070450,936.918762
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M219.701996,143.018097
+ C218.934677,144.101730 217.813522,145.179688 216.344193,146.149841
+ C217.113388,145.032181 218.230759,144.022293 219.701996,143.018097
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M651.792419,108.764847
+ C650.374390,108.697617 648.802185,108.297722 647.027466,107.609283
+ C648.429382,107.691216 650.033813,108.061699 651.792419,108.764847
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M670.700195,118.123581
+ C671.004333,118.285271 671.019348,118.694420 671.027222,118.899185
+ C670.028381,118.678749 669.021606,118.253540 667.947815,117.493896
+ C668.719177,117.426941 669.557617,117.694420 670.700195,118.123581
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M227.711273,138.013611
+ C227.254410,138.707520 226.460587,139.416077 225.319763,140.079605
+ C225.773285,139.365799 226.573792,138.697021 227.711273,138.013611
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M645.786377,106.748795
+ C644.805908,106.898689 643.636841,106.730606 642.216980,106.304337
+ C643.176697,106.174377 644.387207,106.302605 645.786377,106.748795
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M667.772827,116.825638
+ C666.892517,116.694481 665.933105,116.254326 664.925537,115.483963
+ C665.816101,115.608055 666.754883,116.062347 667.772827,116.825638
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M811.957642,151.649704
+ C811.406799,151.481308 810.779724,151.029556 810.111206,150.264404
+ C810.673645,150.422791 811.277527,150.894562 811.957642,151.649704
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M809.940186,149.637283
+ C809.502563,149.758560 808.958862,149.589859 808.242065,149.189255
+ C808.657410,149.087341 809.245667,149.217331 809.940186,149.637283
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M376.637695,114.066193
+ C376.448944,114.526497 375.885895,114.907318 374.968872,115.242020
+ C375.164398,114.792831 375.713898,114.389771 376.637695,114.066193
+z"/>
+<path fill="#4CD298" opacity="1.000000" stroke="none"
+ d="
+M265.734436,122.203903
+ C266.037292,122.210213 266.015411,122.627853 266.012451,122.836990
+ C265.780579,123.091919 265.551697,123.137711 264.973267,123.142502
+ C264.893005,122.800194 265.162262,122.498901 265.734436,122.203903
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M164.956284,848.705566
+ C164.976349,849.000671 164.583221,849.001587 164.386658,849.000122
+ C164.141586,848.829895 164.093094,848.661194 164.040100,848.229126
+ C164.335815,848.114014 164.636017,848.262268 164.956284,848.705566
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M664.806885,114.837517
+ C664.843811,115.120506 664.358093,115.225540 664.358093,115.225540
+ C664.358093,115.225540 663.920227,114.990265 663.839233,114.754814
+ C664.095459,114.531090 664.432678,114.542809 664.806885,114.837517
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M374.187561,115.149109
+ C374.222382,115.590034 373.845886,115.978600 373.052734,116.297516
+ C373.016144,115.850822 373.396210,115.473778 374.187561,115.149109
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M662.845642,113.837112
+ C662.577942,114.056519 662.257812,113.993759 661.853149,113.687759
+ C662.110168,113.481331 662.451660,113.518135 662.845642,113.837112
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M372.250732,116.187820
+ C372.296387,116.567116 371.996918,116.890915 371.363922,117.140533
+ C371.322144,116.754997 371.613892,116.443657 372.250732,116.187820
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M813.953918,153.702118
+ C813.713806,153.841400 813.468811,153.665741 813.172302,153.211761
+ C813.431458,152.998047 813.707520,153.149307 813.953918,153.702118
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M812.928528,152.694763
+ C812.684631,152.826950 812.441711,152.643311 812.156128,152.173676
+ C812.407043,151.995728 812.679077,152.159485 812.928528,152.694763
+z"/>
+<path fill="#2E2B2B" opacity="1.000000" stroke="none"
+ d="
+M708.473145,191.277771
+ C708.995605,200.980957 709.287842,210.648895 709.049622,220.303772
+ C708.806946,230.141632 700.273621,238.502396 690.369019,239.046799
+ C686.712097,239.247787 683.039307,239.196518 679.373718,239.197357
+ C571.557556,239.221786 463.741425,239.242065 355.925262,239.252853
+ C334.086792,239.255035 328.132141,233.240723 328.263184,211.306168
+ C328.300964,204.983322 328.478699,198.661301 328.788635,191.943115
+ C429.027130,191.500854 529.069275,191.463501 629.111389,191.401764
+ C655.410950,191.385529 681.710510,191.293823 708.473145,191.277771
+z"/>
+<path fill="#000100" opacity="1.000000" stroke="none"
+ d="
+M495.262878,43.353783
+ C503.036163,33.744705 518.169128,32.594967 526.017822,41.704769
+ C530.302063,46.677364 532.796204,51.917713 531.328369,59.447845
+ C529.649231,68.062172 517.515564,76.813034 507.730530,74.933403
+ C493.815094,72.260345 486.376251,56.938816 495.262878,43.353783
+z"/>
+<path fill="#FFFEFD" opacity="1.000000" stroke="none"
+ d="
+M280.012543,853.000793
+ C274.585938,847.174133 268.606262,841.764709 263.836487,835.442505
+ C249.616028,816.593689 243.088242,794.982666 243.061478,771.499329
+ C242.955917,678.871582 242.994949,586.243652 242.985275,493.615814
+ C242.982635,468.459686 242.903763,443.303101 243.023254,418.147522
+ C243.279373,364.230225 280.783264,320.168030 333.963470,311.337677
+ C339.193878,310.469238 344.561615,310.063751 349.866089,310.059326
+ C457.820831,309.968811 565.775574,309.987640 673.730347,309.923553
+ C686.391602,309.916016 698.542175,312.221039 710.956421,317.110474
+ C714.208862,318.461761 716.783264,319.606689 719.326721,320.816620
+ C732.237610,326.958344 742.848145,336.165771 752.962769,346.053680
+ C752.996033,346.032593 752.917358,346.035553 752.991760,346.306854
+ C753.349854,346.813904 753.633545,347.049652 753.956970,347.473633
+ C754.117798,347.913452 754.315796,348.063599 754.728271,348.381989
+ C755.205383,348.844452 755.544861,349.037262 755.866516,349.161255
+ C755.848633,349.092407 755.716675,349.145508 755.767639,349.434631
+ C756.215515,350.133972 756.612427,350.544189 756.999573,350.978455
+ C756.989746,351.002502 757.041687,351.004028 757.097778,351.261414
+ C757.417908,351.740967 757.682007,351.963135 758.055969,352.502197
+ C772.532837,372.286804 778.836487,394.112030 778.797241,418.299408
+ C778.605347,536.619324 778.744690,654.939697 778.686584,773.259949
+ C778.683960,778.568298 778.346191,783.955933 777.413147,789.172180
+ C768.127808,841.082336 724.888916,878.058533 672.145813,878.212402
+ C564.658691,878.525879 457.169952,878.385803 349.682343,878.192505
+ C341.100525,878.177063 332.413483,876.854980 323.965576,875.180359
+ C308.323730,872.079590 294.769073,864.267273 282.046844,854.919006
+ C282.046844,854.919006 282.003235,854.973633 281.885376,854.674683
+ C281.179199,854.224792 280.590881,854.073914 280.002563,853.923096
+ C280.002563,853.923096 280.005829,853.999634 280.167297,853.738770
+ C280.223358,853.318909 280.117950,853.159851 280.012543,853.000793
+M478.595825,743.095276
+ C498.663422,722.884033 518.741638,702.683411 538.781982,682.445190
+ C540.766357,680.441223 542.776978,678.379089 544.325562,676.045410
+ C547.541199,671.199585 547.714111,666.002258 544.815735,660.940613
+ C541.907532,655.862061 537.212158,652.817749 531.551514,654.052673
+ C527.463562,654.944580 523.108032,657.281982 520.144531,660.246765
+ C487.175385,693.229980 454.484741,726.491394 421.647522,759.606934
+ C412.187042,769.147583 402.497681,778.461243 392.887909,787.903931
+ C381.134491,779.257324 369.358521,770.583130 357.570435,761.925415
+ C347.914215,754.833557 338.425537,747.493896 328.527679,740.756042
+ C318.782501,734.122070 306.343109,739.964172 305.405609,751.358704
+ C304.857025,758.026367 308.485413,762.622070 313.634674,766.348206
+ C336.016266,782.544189 358.390045,798.751282 380.711761,815.029541
+ C392.577515,823.682678 398.964447,823.247986 409.428772,812.720459
+ C432.325043,789.685913 455.210907,766.641052 478.595825,743.095276
+M593.593506,547.724487
+ C598.709778,558.279968 607.850586,563.773560 618.538757,566.947998
+ C634.203430,571.600586 650.300415,572.348877 666.527588,571.451294
+ C678.396240,570.794800 690.086609,569.317322 700.942017,564.045959
+ C716.867798,556.312317 724.129761,539.352295 717.625061,524.607910
+ C713.404175,515.040283 705.594299,509.210144 695.949158,505.874756
+ C675.140747,498.679108 653.758911,498.761261 632.282715,501.611450
+ C622.493408,502.910583 613.009094,505.576569 604.713928,511.268127
+ C591.945801,520.028687 587.876953,532.894287 593.593506,547.724487
+M430.311920,521.333984
+ C424.412872,511.494080 414.973907,506.780029 404.435089,504.045685
+ C385.820618,499.216125 366.927155,498.851624 347.966248,501.604187
+ C337.681488,503.097290 327.736176,505.745728 319.125580,511.965790
+ C300.820587,525.188904 301.548828,549.719604 320.819763,561.451599
+ C325.442627,564.265930 330.658661,566.447205 335.888275,567.858521
+ C350.641968,571.840271 365.764771,572.477539 380.966400,571.480652
+ C392.799683,570.704712 404.512909,569.291504 415.380096,564.060608
+ C432.444458,555.846741 438.867523,538.172668 430.311920,521.333984
+M683.201294,745.417236
+ C678.875183,745.513611 674.549194,745.691833 670.223022,745.693970
+ C622.578979,745.717346 574.934998,745.689270 527.290955,745.732788
+ C514.636780,745.744324 506.119385,753.155151 506.035461,763.984863
+ C505.949615,775.067200 514.631836,783.022522 527.076965,783.090088
+ C542.236023,783.172302 557.395813,783.141663 572.555237,783.141907
+ C609.371033,783.142639 646.186951,783.094604 683.002625,783.160950
+ C690.032715,783.173584 695.674194,780.708801 699.725586,774.944824
+ C707.980652,763.200256 700.328857,746.028748 683.201294,745.417236
+M573.435547,517.796875
+ C563.290527,513.203308 554.096924,517.702332 552.040833,528.681213
+ C550.224304,538.380920 545.466309,546.021118 537.482544,551.629333
+ C513.555176,568.437317 474.801666,556.611938 472.075714,527.791504
+ C471.571320,522.458679 468.217896,518.713257 463.056824,516.828613
+ C451.910858,512.758362 441.973785,522.234802 444.109802,535.145996
+ C445.820068,545.483887 449.907104,554.909119 456.439301,563.146667
+ C473.917084,585.187134 505.757721,594.419189 534.178406,585.122131
+ C558.985962,577.006897 575.193726,560.573547 580.340332,534.374939
+ C581.639832,527.759460 579.713318,522.207764 573.435547,517.796875
+M339.474243,431.979828
+ C335.828156,437.661072 331.469757,443.023926 328.746185,449.117493
+ C326.267822,454.662567 327.625061,460.599701 331.880798,465.395721
+ C338.238922,472.561127 348.371613,472.942932 355.360992,466.202850
+ C360.625397,461.126282 365.369873,455.432312 371.034668,450.868103
+ C378.804321,444.608063 383.656525,444.462585 391.265015,450.512360
+ C396.940247,455.024902 401.674011,460.736115 406.737183,465.999939
+ C412.669189,472.167053 420.260956,473.669586 427.099426,469.884247
+ C434.161804,465.975098 437.887146,457.635101 435.282349,449.818817
+ C433.785217,445.326324 431.594604,440.831604 428.760559,437.055054
+ C407.427307,408.627106 366.645386,406.159454 339.474243,431.979828
+M628.154541,452.611237
+ C639.186340,444.087555 644.515686,444.122406 654.848511,453.421021
+ C659.164978,457.305450 662.849915,461.882324 666.995239,465.968567
+ C672.520691,471.415222 679.697083,472.468719 686.240051,469.049805
+ C692.859985,465.590668 696.739807,458.505768 695.058716,451.151093
+ C694.083984,446.886444 692.195496,442.593872 689.778137,438.934937
+ C676.143799,418.297729 649.069153,409.031464 624.522034,416.614532
+ C608.181335,421.662506 595.618164,431.562134 588.567383,447.426849
+ C584.819092,455.860718 587.804260,464.808380 595.025513,469.367218
+ C602.081177,473.821533 609.730530,472.273621 616.356384,465.097839
+ C620.080261,461.064819 623.856323,457.079926 628.154541,452.611237
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M282.027588,855.286072
+ C294.769073,864.267273 308.323730,872.079590 323.965576,875.180359
+ C332.413483,876.854980 341.100525,878.177063 349.682343,878.192505
+ C457.169952,878.385803 564.658691,878.525879 672.145813,878.212402
+ C724.888916,878.058533 768.127808,841.082336 777.413147,789.172180
+ C778.346191,783.955933 778.683960,778.568298 778.686584,773.259949
+ C778.744690,654.939697 778.605347,536.619324 778.797241,418.299408
+ C778.836487,394.112030 772.532837,372.286804 757.967163,352.262115
+ C757.526184,351.471436 757.283936,351.237732 757.041687,351.004028
+ C757.041687,351.004028 756.989746,351.002502 756.955811,350.682068
+ C756.520142,349.956268 756.118408,349.550903 755.716675,349.145508
+ C755.716675,349.145508 755.848633,349.092407 755.727051,348.896423
+ C755.267212,348.504425 754.928955,348.308350 754.590698,348.112305
+ C754.315796,348.063599 754.117798,347.913452 753.862549,347.213348
+ C753.458069,346.521759 753.187683,346.278656 752.917358,346.035553
+ C752.917358,346.035553 752.996033,346.032593 752.997681,345.679779
+ C754.340759,342.194855 755.682190,339.062775 757.023621,335.930664
+ C761.155518,338.950317 765.653015,341.581299 769.352356,345.060852
+ C781.588867,356.570251 793.981995,367.966766 805.493042,380.181274
+ C823.151123,398.918518 834.529297,421.255829 837.779663,446.849182
+ C839.758423,462.430847 839.326233,478.318695 839.997925,494.538177
+ C840.000244,590.007019 839.983948,685.006714 839.959473,780.006409
+ C839.957275,788.672791 839.903625,797.339233 839.643494,806.797852
+ C838.941223,811.062500 838.469360,814.534912 837.971436,818.370667
+ C837.888306,819.458557 837.831360,820.183167 837.563110,821.188965
+ C836.904236,823.315308 836.456665,825.160400 835.979858,827.381470
+ C835.922607,828.512756 835.894592,829.267944 835.624756,830.283691
+ C833.067017,836.462341 830.934265,842.460083 828.401245,848.283752
+ C820.399475,866.680786 808.950439,882.542114 793.806335,895.831482
+ C767.704224,918.736694 737.199402,930.656067 702.717712,930.805969
+ C606.480835,931.224121 510.241028,930.971497 414.002380,930.983704
+ C388.899506,932.710754 365.429352,927.081238 343.404388,915.154358
+ C329.179504,907.451233 317.245636,896.980347 306.761627,884.706421
+ C299.851685,876.616882 292.535645,868.875305 285.492432,860.897583
+ C284.116425,859.338989 283.158875,857.410828 282.027588,855.286072
+z"/>
+<path fill="#FDBD73" opacity="1.000000" stroke="none"
+ d="
+M413.902679,931.339478
+ C510.241028,930.971497 606.480835,931.224121 702.717712,930.805969
+ C737.199402,930.656067 767.704224,918.736694 793.806335,895.831482
+ C808.950439,882.542114 820.399475,866.680786 828.401245,848.283752
+ C830.934265,842.460083 833.067017,836.462341 835.950623,830.211914
+ C836.348572,828.921509 836.178833,827.963501 836.009033,827.005432
+ C836.456665,825.160400 836.904236,823.315308 837.901245,821.156677
+ C838.299622,819.897827 838.148560,818.952576 837.997559,818.007324
+ C838.469360,814.534912 838.941223,811.062500 839.632812,807.262207
+ C845.286621,809.205322 843.891052,803.736511 845.998352,801.436340
+ C846.639954,802.340088 847.554016,803.085510 847.751892,803.987915
+ C850.615173,817.046753 854.427124,830.033813 851.141113,843.632019
+ C850.874817,844.733948 850.650146,846.188904 851.139221,847.075500
+ C854.719177,853.565063 851.441040,859.364441 849.380493,865.190491
+ C841.866272,886.435974 829.715393,904.455261 812.617310,919.343201
+ C792.922974,936.492004 770.306152,947.103455 744.003479,951.930786
+ C741.806152,952.359619 740.384216,952.721252 738.962341,953.082825
+ C738.962341,953.082825 738.652832,953.196716 737.993591,953.117432
+ C607.222900,953.027039 477.111450,953.015930 347.000000,953.004822
+ C345.504486,952.336853 344.001587,951.075256 342.514587,951.093689
+ C329.094482,951.260254 315.678070,951.826538 302.258606,951.895813
+ C296.328369,951.926453 290.397705,950.806763 284.459656,950.717957
+ C279.073853,950.637390 273.580353,948.060608 267.846802,951.220337
+ C266.791840,951.243347 266.163361,951.176880 264.981812,950.771851
+ C263.776215,950.327087 263.123688,950.220886 262.471191,950.114746
+ C262.120941,950.112305 261.770721,950.109863 260.973389,949.785278
+ C259.970612,949.351013 259.414948,949.238953 258.859283,949.126953
+ C258.859283,949.126953 258.909851,949.181641 258.909607,948.798828
+ C257.638184,947.219116 256.554169,945.360046 255.063782,944.938782
+ C248.240509,943.010132 241.385727,941.520691 235.749908,936.607056
+ C232.829391,934.060791 229.235718,932.111450 225.661499,930.539734
+ C222.122910,928.983582 218.226273,928.241699 214.486649,927.142700
+ C214.085602,926.833435 213.684586,926.524109 213.126999,925.637329
+ C212.488144,921.854431 210.445160,920.842712 207.467438,921.144897
+ C207.038300,920.922852 206.609146,920.700745 205.964981,920.041443
+ C205.551910,919.346619 205.307281,919.145752 205.016068,919.001587
+ C205.016068,919.001587 204.995773,919.004211 204.876251,918.795471
+ C204.563873,918.337646 204.328430,918.139038 204.050385,917.991028
+ C204.050385,917.991028 203.999710,918.003967 203.992035,917.612488
+ C202.313446,915.821899 200.642563,914.422729 198.971649,913.023560
+ C198.971634,913.023621 198.997620,912.997559 198.868042,912.803101
+ C198.535645,912.344788 198.284836,912.139648 197.986023,911.993164
+ C196.704071,910.612366 195.422150,909.231506 193.936340,907.299805
+ C193.469131,906.507568 193.205826,906.266235 192.942535,906.024902
+ C192.942551,906.024902 192.998520,906.003723 192.870880,905.816528
+ C192.550140,905.360535 192.305328,905.152527 192.008835,905.005249
+ C192.008835,905.005249 191.996902,905.002441 191.878357,904.800293
+ C191.570862,904.351379 191.337585,904.158203 191.059998,904.018555
+ C190.718445,903.613770 190.376892,903.208923 189.890594,902.283875
+ C189.492950,901.513672 189.240036,901.263672 188.987137,901.013733
+ C188.987137,901.013733 189.000000,901.000000 188.892502,900.814087
+ C188.620224,900.384644 188.410507,900.189331 188.155853,900.042297
+ C188.155853,900.042297 187.925919,899.810669 187.829956,899.354736
+ C187.460892,898.608215 187.187790,898.317566 186.914673,898.026978
+ C186.914673,898.026978 186.983658,898.020691 186.878143,897.845154
+ C186.609207,897.404358 186.393066,897.192993 186.124237,897.035461
+ C186.124237,897.035461 185.883682,896.825439 185.903168,896.223083
+ C186.232300,891.567139 185.097229,888.573730 180.447357,888.159607
+ C180.150436,887.685425 179.853500,887.211243 179.497314,886.461426
+ C182.235214,885.558777 182.196503,884.000732 181.171188,881.728210
+ C175.235184,868.571350 170.493652,854.990051 168.032440,840.747681
+ C167.309845,836.566223 167.921219,832.154236 168.344193,827.855835
+ C173.810349,837.184875 178.628326,846.496338 178.817535,857.515076
+ C178.861938,860.101013 180.663101,862.697388 181.818619,865.214294
+ C183.672867,869.253052 185.246872,873.508179 187.697311,877.163818
+ C190.979248,882.060059 192.335907,888.036987 197.316742,892.062683
+ C201.842072,895.720215 205.226151,900.755737 209.550766,904.704773
+ C214.256332,909.001465 219.204956,913.144165 224.521591,916.631348
+ C231.271408,921.058594 238.599548,924.593079 245.492767,928.815491
+ C253.458191,933.694641 262.104797,936.022888 271.281799,937.137634
+ C273.935120,937.459961 276.570862,938.974487 278.927979,940.412354
+ C281.634979,942.063660 283.610229,942.083435 285.914490,939.670166
+ C290.664795,934.695129 296.836243,935.123596 303.045990,935.486938
+ C313.717834,936.111389 324.405731,936.462463 335.088043,936.900391
+ C335.562317,936.919800 336.331818,936.811401 336.486237,936.514343
+ C339.497589,930.720032 345.875610,932.306213 350.923737,930.135132
+ C350.009216,927.922302 349.180267,925.916565 347.977051,923.005249
+ C349.671295,923.804443 350.536652,924.099854 351.280640,924.582336
+ C355.466064,927.296631 359.659149,929.066101 364.994995,929.370667
+ C369.887848,929.649963 374.882202,932.078674 379.376343,934.430664
+ C385.126617,937.440063 390.791687,937.467468 396.761139,935.972961
+ C402.442688,934.550720 408.122437,933.121399 413.902679,931.339478
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M756.843567,335.649292
+ C755.682190,339.062775 754.340759,342.194855 752.964478,345.700867
+ C742.848145,336.165771 732.237610,326.958344 719.326721,320.816620
+ C716.783264,319.606689 714.208862,318.461761 711.331421,317.127136
+ C712.242615,316.778168 713.554565,316.208710 714.687195,316.457092
+ C729.995605,319.814392 743.908691,326.317169 756.843567,335.649292
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M280.186279,854.166626
+ C280.590881,854.073914 281.179199,854.224792 281.920135,854.671204
+ C281.505157,854.781189 280.937561,854.595703 280.186279,854.166626
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M279.898254,853.120605
+ C280.117950,853.159851 280.223358,853.318909 280.205566,853.736877
+ C279.704010,853.814636 279.604553,853.562805 279.898254,853.120605
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M856.997559,550.000000
+ C856.997559,605.190002 856.997559,659.880066 856.997559,714.570068
+ C856.742004,714.569580 856.486450,714.569092 856.230896,714.568542
+ C856.230896,646.226257 856.230896,577.883972 856.230896,509.541626
+ C856.486450,509.538391 856.742004,509.535126 856.997559,509.531891
+ C856.997559,522.854614 856.997559,536.177307 856.997559,550.000000
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M855.997559,445.000549
+ C855.997559,438.547302 855.997559,432.593872 855.997559,426.640411
+ C856.213379,426.640930 856.429199,426.641449 856.645020,426.641968
+ C856.645020,446.943817 856.645020,467.245667 856.645020,487.547516
+ C856.429199,487.550537 856.213379,487.553558 855.997559,487.556549
+ C855.997559,473.537842 855.997559,459.519104 855.997559,445.000549
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M855.997559,808.555298
+ C855.997559,790.214783 855.997559,772.313599 855.997559,754.412415
+ C856.243958,754.413391 856.490356,754.414307 856.736755,754.415222
+ C856.736755,773.754272 856.736755,793.093262 856.736755,812.432251
+ C856.578003,812.446655 856.419250,812.461060 856.260498,812.475464
+ C856.172852,811.315247 856.085205,810.154968 855.997559,808.555298
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M844.997559,602.161743
+ C845.117126,600.460510 845.236633,599.185974 845.356201,597.911438
+ C845.684021,597.916809 846.011902,597.922180 846.339722,597.927551
+ C846.339722,601.296143 846.339722,604.664795 846.339722,608.033386
+ C845.892334,608.058594 845.444946,608.083740 844.997559,608.108948
+ C844.997559,606.268738 844.997559,604.428589 844.997559,602.161743
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M856.018616,420.559082
+ C856.052856,419.664551 856.098877,419.054138 856.144897,418.443726
+ C856.343811,418.444092 856.542786,418.444489 856.741760,418.444885
+ C856.741760,419.466217 856.747070,420.487610 856.727539,421.508575
+ C856.726440,421.564087 856.518494,421.615692 856.406860,421.669098
+ C856.281372,421.393799 856.155884,421.118500 856.018616,420.559082
+z"/>
+<path fill="#EFC381" opacity="1.000000" stroke="none"
+ d="
+M739.385437,953.109375
+ C740.384216,952.721252 741.806152,952.359619 743.615234,951.997803
+ C744.002441,951.997559 744.002747,952.344543 744.004517,952.517944
+ C742.607056,952.839539 741.207764,952.987732 739.385437,953.109375
+z"/>
+<path fill="#EFC381" opacity="1.000000" stroke="none"
+ d="
+M346.796021,953.139404
+ C477.111450,953.015930 607.222900,953.027039 737.834778,953.072876
+ C732.557312,953.471008 726.779480,954.148071 721.001465,954.150757
+ C630.607910,954.192749 540.214294,954.139587 449.820709,954.126892
+ C415.527924,954.122131 381.235168,954.164368 346.479370,954.119751
+ C346.143494,953.746460 346.335419,953.486328 346.796021,953.139404
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M180.564713,888.501587
+ C185.097229,888.573730 186.232300,891.567139 185.890808,896.063843
+ C184.133316,893.952515 182.407700,891.398071 180.564713,888.501587
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M207.658966,921.424744
+ C210.445160,920.842712 212.488144,921.854431 212.988617,925.421936
+ C212.665527,925.807068 212.354584,925.720764 211.848190,925.427856
+ C210.365097,924.121948 209.107803,922.913208 207.658966,921.424744
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M199.109039,913.318115
+ C200.642563,914.422729 202.313446,915.821899 204.001526,917.588135
+ C202.427948,916.507690 200.837189,915.060181 199.109039,913.318115
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M205.102859,919.234253
+ C205.307281,919.145752 205.551910,919.346619 205.872284,919.809692
+ C205.652847,919.940186 205.384537,919.757385 205.102859,919.234253
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M204.131653,918.220581
+ C204.328430,918.139038 204.563873,918.337646 204.877426,918.785278
+ C204.654968,918.925659 204.393250,918.747742 204.131653,918.220581
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M198.065399,912.238525
+ C198.284836,912.139648 198.535645,912.344788 198.861755,912.819946
+ C198.704941,912.848755 198.424850,912.666321 198.065399,912.238525
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M193.026886,906.286377
+ C193.205826,906.266235 193.469131,906.507568 193.834290,907.001099
+ C193.661179,907.018188 193.386230,906.783020 193.026886,906.286377
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M186.173950,897.272583
+ C186.393066,897.192993 186.609207,897.404358 186.868210,897.878357
+ C186.614944,898.025513 186.368225,897.833008 186.173950,897.272583
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M186.989243,898.323853
+ C187.187790,898.317566 187.460892,898.608215 187.825546,899.191650
+ C187.632660,899.196533 187.348221,898.908630 186.989243,898.323853
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M188.202271,900.269287
+ C188.410507,900.189331 188.620224,900.384644 188.885345,900.820435
+ C188.653412,900.964111 188.407745,900.791992 188.202271,900.269287
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M189.072021,901.271606
+ C189.240036,901.263672 189.492950,901.513672 189.841278,902.017456
+ C189.676758,902.023987 189.416840,901.776672 189.072021,901.271606
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M191.132080,904.248657
+ C191.337585,904.158203 191.570862,904.351379 191.877441,904.794434
+ C191.655960,904.936646 191.392334,904.765930 191.132080,904.248657
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M192.088135,905.246460
+ C192.305328,905.152527 192.550140,905.360535 192.858292,905.843689
+ C192.704681,905.867920 192.436050,905.677795 192.088135,905.246460
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M214.705933,927.427490
+ C218.226273,928.241699 222.122910,928.983582 225.661499,930.539734
+ C229.235718,932.111450 232.829391,934.060791 235.749908,936.607056
+ C241.385727,941.520691 248.240509,943.010132 255.063782,944.938782
+ C256.554169,945.360046 257.638184,947.219116 258.877930,948.818420
+ C253.246033,947.403687 247.645523,945.586548 241.673523,943.691772
+ C236.918732,941.306946 232.535446,938.999817 227.820953,936.574585
+ C226.244507,935.628296 224.999268,934.800171 223.433960,933.916199
+ C220.384354,931.811035 217.654785,929.761658 214.705933,927.427490
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M259.050751,949.351562
+ C259.414948,949.238953 259.970612,949.351013 260.737427,949.657593
+ C260.379791,949.760193 259.811005,949.668213 259.050751,949.351562
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M262.725647,950.340088
+ C263.123688,950.220886 263.776215,950.327087 264.687195,950.638916
+ C264.290497,950.751526 263.635315,950.658508 262.725647,950.340088
+z"/>
+<path fill="#2E2C2A" opacity="1.000000" stroke="none"
+ d="
+M478.348419,743.347900
+ C455.210907,766.641052 432.325043,789.685913 409.428772,812.720459
+ C398.964447,823.247986 392.577515,823.682678 380.711761,815.029541
+ C358.390045,798.751282 336.016266,782.544189 313.634674,766.348206
+ C308.485413,762.622070 304.857025,758.026367 305.405609,751.358704
+ C306.343109,739.964172 318.782501,734.122070 328.527679,740.756042
+ C338.425537,747.493896 347.914215,754.833557 357.570435,761.925415
+ C369.358521,770.583130 381.134491,779.257324 392.887909,787.903931
+ C402.497681,778.461243 412.187042,769.147583 421.647522,759.606934
+ C454.484741,726.491394 487.175385,693.229980 520.144531,660.246765
+ C523.108032,657.281982 527.463562,654.944580 531.551514,654.052673
+ C537.212158,652.817749 541.907532,655.862061 544.815735,660.940613
+ C547.714111,666.002258 547.541199,671.199585 544.325562,676.045410
+ C542.776978,678.379089 540.766357,680.441223 538.781982,682.445190
+ C518.741638,702.683411 498.663422,722.884033 478.348419,743.347900
+z"/>
+<path fill="#FA6874" opacity="1.000000" stroke="none"
+ d="
+M593.420898,547.380493
+ C587.876953,532.894287 591.945801,520.028687 604.713928,511.268127
+ C613.009094,505.576569 622.493408,502.910583 632.282715,501.611450
+ C653.758911,498.761261 675.140747,498.679108 695.949158,505.874756
+ C705.594299,509.210144 713.404175,515.040283 717.625061,524.607910
+ C724.129761,539.352295 716.867798,556.312317 700.942017,564.045959
+ C690.086609,569.317322 678.396240,570.794800 666.527588,571.451294
+ C650.300415,572.348877 634.203430,571.600586 618.538757,566.947998
+ C607.850586,563.773560 598.709778,558.279968 593.420898,547.380493
+z"/>
+<path fill="#FA6874" opacity="1.000000" stroke="none"
+ d="
+M430.520630,521.645142
+ C438.867523,538.172668 432.444458,555.846741 415.380096,564.060608
+ C404.512909,569.291504 392.799683,570.704712 380.966400,571.480652
+ C365.764771,572.477539 350.641968,571.840271 335.888275,567.858521
+ C330.658661,566.447205 325.442627,564.265930 320.819763,561.451599
+ C301.548828,549.719604 300.820587,525.188904 319.125580,511.965790
+ C327.736176,505.745728 337.681488,503.097290 347.966248,501.604187
+ C366.927155,498.851624 385.820618,499.216125 404.435089,504.045685
+ C414.973907,506.780029 424.412872,511.494080 430.520630,521.645142
+z"/>
+<path fill="#54E6DD" opacity="1.000000" stroke="none"
+ d="
+M683.619385,745.466919
+ C700.328857,746.028748 707.980652,763.200256 699.725586,774.944824
+ C695.674194,780.708801 690.032715,783.173584 683.002625,783.160950
+ C646.186951,783.094604 609.371033,783.142639 572.555237,783.141907
+ C557.395813,783.141663 542.236023,783.172302 527.076965,783.090088
+ C514.631836,783.022522 505.949615,775.067200 506.035461,763.984863
+ C506.119385,753.155151 514.636780,745.744324 527.290955,745.732788
+ C574.934998,745.689270 622.578979,745.717346 670.223022,745.693970
+ C674.549194,745.691833 678.875183,745.513611 683.619385,745.466919
+z"/>
+<path fill="#2E2C2B" opacity="1.000000" stroke="none"
+ d="
+M573.774963,517.974915
+ C579.713318,522.207764 581.639832,527.759460 580.340332,534.374939
+ C575.193726,560.573547 558.985962,577.006897 534.178406,585.122131
+ C505.757721,594.419189 473.917084,585.187134 456.439301,563.146667
+ C449.907104,554.909119 445.820068,545.483887 444.109802,535.145996
+ C441.973785,522.234802 451.910858,512.758362 463.056824,516.828613
+ C468.217896,518.713257 471.571320,522.458679 472.075714,527.791504
+ C474.801666,556.611938 513.555176,568.437317 537.482544,551.629333
+ C545.466309,546.021118 550.224304,538.380920 552.040833,528.681213
+ C554.096924,517.702332 563.290527,513.203308 573.774963,517.974915
+z"/>
+<path fill="#2E2B2B" opacity="1.000000" stroke="none"
+ d="
+M339.727905,431.729614
+ C366.645386,406.159454 407.427307,408.627106 428.760559,437.055054
+ C431.594604,440.831604 433.785217,445.326324 435.282349,449.818817
+ C437.887146,457.635101 434.161804,465.975098 427.099426,469.884247
+ C420.260956,473.669586 412.669189,472.167053 406.737183,465.999939
+ C401.674011,460.736115 396.940247,455.024902 391.265015,450.512360
+ C383.656525,444.462585 378.804321,444.608063 371.034668,450.868103
+ C365.369873,455.432312 360.625397,461.126282 355.360992,466.202850
+ C348.371613,472.942932 338.238922,472.561127 331.880798,465.395721
+ C327.625061,460.599701 326.267822,454.662567 328.746185,449.117493
+ C331.469757,443.023926 335.828156,437.661072 339.727905,431.729614
+z"/>
+<path fill="#2E2C2B" opacity="1.000000" stroke="none"
+ d="
+M627.881714,452.842285
+ C623.856323,457.079926 620.080261,461.064819 616.356384,465.097839
+ C609.730530,472.273621 602.081177,473.821533 595.025513,469.367218
+ C587.804260,464.808380 584.819092,455.860718 588.567383,447.426849
+ C595.618164,431.562134 608.181335,421.662506 624.522034,416.614532
+ C649.069153,409.031464 676.143799,418.297729 689.778137,438.934937
+ C692.195496,442.593872 694.083984,446.886444 695.058716,451.151093
+ C696.739807,458.505768 692.859985,465.590668 686.240051,469.049805
+ C679.697083,472.468719 672.520691,471.415222 666.995239,465.968567
+ C662.849915,461.882324 659.164978,457.305450 654.848511,453.421021
+ C644.515686,444.122406 639.186340,444.087555 627.881714,452.842285
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M755.767639,349.434631
+ C756.118408,349.550903 756.520142,349.956268 756.965637,350.658020
+ C756.612427,350.544189 756.215515,350.133972 755.767639,349.434631
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M754.728271,348.381989
+ C754.928955,348.308350 755.267212,348.504425 755.744934,348.965271
+ C755.544861,349.037262 755.205383,348.844452 754.728271,348.381989
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M757.097778,351.261414
+ C757.283936,351.237732 757.526184,351.471436 757.857178,351.945251
+ C757.682007,351.963135 757.417908,351.740967 757.097778,351.261414
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M752.991760,346.306854
+ C753.187683,346.278656 753.458069,346.521759 753.822815,347.025085
+ C753.633545,347.049652 753.349854,346.813904 752.991760,346.306854
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M835.979858,827.381470
+ C836.178833,827.963501 836.348572,828.921509 836.192383,829.951416
+ C835.894592,829.267944 835.922607,828.512756 835.979858,827.381470
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M837.971436,818.370667
+ C838.148560,818.952576 838.299622,819.897827 838.112549,820.875366
+ C837.831360,820.183167 837.888306,819.458557 837.971436,818.370667
+z"/>
+</svg> \ No newline at end of file
diff --git a/public/manifest.webmanifest b/public/manifest.webmanifest
new file mode 100644
index 0000000..9869002
--- /dev/null
+++ b/public/manifest.webmanifest
@@ -0,0 +1,40 @@
+{
+ "name": "Donetick: Simplify Tasks & Chores, Together.",
+ "short_name": "Donetick",
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "pwa-64x64.png",
+ "sizes": "64x64",
+ "type": "image/png"
+ },
+ {
+ "src": "pwa-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "pwa-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "maskable-icon-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/public/maskable-icon-512x512.png b/public/maskable-icon-512x512.png
new file mode 100644
index 0000000..beaa6ee
--- /dev/null
+++ b/public/maskable-icon-512x512.png
Binary files differ
diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png
new file mode 100644
index 0000000..6fec85c
--- /dev/null
+++ b/public/mstile-150x150.png
Binary files differ
diff --git a/public/pwa-192x192.png b/public/pwa-192x192.png
new file mode 100644
index 0000000..0e3d8f8
--- /dev/null
+++ b/public/pwa-192x192.png
Binary files differ
diff --git a/public/pwa-512x512.png b/public/pwa-512x512.png
new file mode 100644
index 0000000..8fe823b
--- /dev/null
+++ b/public/pwa-512x512.png
Binary files differ
diff --git a/public/pwa-64x64.png b/public/pwa-64x64.png
new file mode 100644
index 0000000..60c0646
--- /dev/null
+++ b/public/pwa-64x64.png
Binary files differ
diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg
new file mode 100644
index 0000000..e4096f0
--- /dev/null
+++ b/public/safari-pinned-tab.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="1024.000000pt" height="1024.000000pt" viewBox="0 0 1024.000000 1024.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+</metadata>
+<g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M4925 10226 c-11 -7 -24 -15 -30 -16 -5 -2 -18 -5 -27 -8 -10 -2 -18
+-7 -18 -11 0 -3 -13 -12 -30 -19 -40 -18 -160 -140 -185 -188 -11 -22 -24 -42
+-30 -46 -5 -4 -6 -8 -1 -8 5 0 4 -6 -1 -12 -8 -11 -22 -49 -27 -78 -1 -3 -5
+-11 -9 -17 -4 -7 -10 -50 -14 -95 -5 -83 9 -165 42 -246 8 -18 14 -35 14 -37
+0 -3 10 -15 21 -27 11 -12 20 -28 20 -35 0 -7 3 -13 8 -13 4 0 16 -14 27 -30
+11 -16 23 -30 27 -30 4 0 26 -19 49 -42 41 -41 42 -43 18 -45 -13 -1 -184 -4
+-379 -6 -331 -4 -386 -8 -450 -34 -8 -4 -18 -7 -22 -8 -5 -2 -9 -3 -10 -5 -2
+-1 -11 -3 -20 -5 -32 -6 -168 -77 -168 -88 0 -6 -3 -7 -6 -4 -4 3 -16 1 -27
+-5 -13 -7 -166 -11 -451 -13 -237 -1 -440 -5 -451 -7 -11 -3 -41 -9 -67 -12
+-26 -4 -50 -11 -53 -17 -4 -5 -10 -7 -15 -4 -6 4 -72 -12 -105 -25 -3 -1 -14
+-4 -25 -7 -11 -3 -20 -10 -20 -15 0 -5 -4 -7 -9 -4 -5 4 -30 -3 -55 -14 -26
+-11 -49 -19 -53 -19 -3 0 -9 -3 -12 -8 -3 -4 -31 -20 -61 -35 -70 -35 -93 -50
+-103 -65 -4 -7 -13 -13 -18 -13 -38 0 -261 -210 -330 -310 -13 -19 -27 -37
+-30 -40 -13 -11 -89 -145 -89 -157 0 -7 -4 -13 -10 -13 -5 0 -10 -6 -10 -14 0
+-8 -13 -43 -30 -78 -32 -71 -58 -164 -62 -225 -1 -13 -5 -23 -9 -23 -4 0 -6
+-15 -5 -34 1 -19 -2 -32 -6 -30 -11 7 -11 -1 -13 -773 0 -474 3 -703 10 -703
+7 0 7 -3 0 -8 -14 -10 -16 -112 -1 -112 7 0 7 -3 1 -8 -14 -10 -14 -105 -1
+-114 7 -5 7 -8 1 -8 -11 0 -13 -109 -2 -126 3 -6 4 -14 0 -17 -10 -11 -9
+-1086 1 -1080 5 4 6 0 1 -8 -13 -19 -12 -668 0 -673 7 -3 7 -5 0 -5 -11 -1
+-11 -113 -1 -130 4 -6 4 -11 -1 -11 -10 0 -8 -163 1 -179 4 -6 4 -11 -1 -11
+-9 0 -8 -154 2 -170 3 -5 3 -10 -2 -10 -4 0 -6 -81 -3 -181 3 -99 2 -189 -2
+-199 -4 -11 -4 -21 0 -24 8 -5 6 -80 -2 -102 -2 -6 -2 -15 1 -18 5 -5 5 -35 2
+-151 0 -5 1 -52 2 -103 1 -51 -1 -95 -4 -98 -3 -3 -2 -18 3 -32 4 -15 3 -37
+-1 -50 -5 -14 -5 -22 3 -22 7 0 7 -4 -1 -13 -6 -8 -9 -16 -6 -18 9 -9 12 -79
+3 -79 -5 0 -6 -5 -3 -10 4 -6 7 -101 7 -213 0 -135 4 -207 12 -216 8 -12 8
+-13 -2 -7 -10 6 -12 -2 -11 -33 2 -23 8 -41 13 -41 6 0 5 -4 -3 -9 -13 -8 -13
+-12 0 -27 8 -10 9 -15 2 -11 -8 5 -11 -4 -10 -33 1 -22 5 -40 10 -40 4 0 5 -5
+1 -12 -10 -15 -13 -68 -4 -68 3 0 6 -9 7 -20 1 -12 -3 -18 -9 -14 -6 4 -6 -1
+1 -14 6 -11 11 -37 11 -56 0 -20 3 -36 8 -36 4 0 8 -10 8 -22 1 -25 11 -91 15
+-95 1 -2 2 -6 3 -10 7 -37 51 -153 58 -153 4 0 8 -11 8 -25 0 -14 5 -25 10
+-25 6 0 10 -9 10 -20 0 -11 5 -20 10 -20 6 0 10 -7 10 -17 0 -9 11 -31 26 -50
+14 -18 21 -33 17 -33 -4 0 -3 -4 2 -8 6 -4 23 -26 39 -49 16 -24 50 -65 76
+-93 26 -27 45 -50 43 -50 -2 0 11 -15 29 -34 18 -18 36 -31 40 -29 5 2 8 -3 8
+-11 0 -9 5 -16 10 -16 6 0 22 -11 35 -25 14 -13 25 -22 25 -20 0 3 9 -3 19
+-12 38 -35 50 -43 65 -43 7 0 17 -7 20 -16 4 -9 9 -14 12 -11 4 3 13 -1 21 -9
+9 -8 22 -13 29 -10 8 3 11 0 7 -10 -3 -9 1 -14 13 -14 9 0 25 -7 34 -15 9 -8
+29 -16 43 -17 15 -1 27 -5 27 -8 0 -3 15 -11 33 -18 17 -8 41 -18 52 -23 11
+-6 30 -11 43 -12 12 0 22 -6 22 -11 0 -5 3 -7 6 -4 3 3 31 -1 62 -10 31 -8 68
+-16 82 -16 14 -1 32 -6 40 -12 22 -13 4543 -18 4635 -4 109 16 124 19 195 39
+104 29 180 59 192 76 4 5 8 7 8 2 0 -4 11 0 25 9 14 9 25 13 25 9 0 -4 7 -1
+16 6 17 14 49 34 74 45 19 9 147 102 178 129 58 50 112 108 112 117 0 6 3 9 6
+5 7 -7 60 54 56 65 -1 4 4 8 11 8 7 0 31 27 52 61 22 33 48 72 57 87 10 15 23
+39 29 55 6 15 15 27 20 27 4 0 6 7 3 15 -4 8 -1 15 5 15 6 0 11 6 11 13 0 6 6
+24 14 38 13 25 45 116 47 131 0 4 5 22 10 40 13 42 19 67 23 98 28 185 29 234
+22 2430 -11 3831 -10 3729 -33 3780 -3 8 -7 22 -8 30 -1 8 -5 22 -8 30 -4 8
+-8 26 -11 40 -2 14 -10 39 -16 55 -33 79 -44 104 -68 155 -36 76 -110 190
+-123 190 -6 0 -9 5 -7 11 5 14 -54 78 -65 72 -4 -3 -7 -1 -6 4 3 16 -1 36 -6
+31 -3 -3 -36 24 -73 58 -37 35 -71 64 -75 64 -5 0 -21 12 -36 28 -15 15 -41
+34 -57 42 -16 8 -38 23 -48 33 -11 9 -25 17 -32 17 -6 0 -17 7 -24 15 -7 8
+-16 12 -21 9 -5 -3 -9 0 -9 5 0 6 -9 11 -20 11 -11 0 -20 5 -20 10 0 6 -9 10
+-20 10 -11 0 -20 4 -20 8 0 9 -119 52 -144 52 -9 0 -16 4 -16 8 0 7 -24 12
+-67 15 -7 0 -13 3 -13 7 0 4 -6 7 -12 7 -7 1 -39 5 -70 10 -40 7 -61 7 -69 -1
+-9 -8 -10 -8 -5 2 5 8 0 12 -13 12 -12 0 -21 -6 -21 -12 0 -10 -2 -10 -9 0 -5
+9 -31 13 -77 13 -38 0 -181 2 -319 5 -236 5 -252 7 -285 28 -59 38 -205 100
+-230 99 -3 0 -16 3 -29 8 -69 27 -260 34 -788 29 -100 -1 -187 1 -193 5 -11 7
+11 35 27 35 15 0 143 141 137 151 -3 5 -1 9 4 9 11 0 52 81 52 103 0 9 5 19
+11 22 6 4 8 13 5 20 -2 7 -2 16 2 19 16 16 24 183 10 202 -5 7 -8 16 -7 20 1
+5 0 12 -1 17 -3 9 -4 13 -15 52 -15 58 -107 200 -138 213 -4 2 -22 17 -40 33
+-17 16 -37 29 -44 29 -7 0 -13 4 -13 8 0 5 -10 13 -22 19 -13 6 -36 17 -53 24
+-16 8 -36 20 -43 27 -20 18 -330 17 -357 -2z m245 -329 c34 -7 60 -19 60 -27
+0 -5 9 -12 21 -15 11 -4 18 -9 15 -12 -3 -3 0 -11 7 -19 32 -35 37 -45 39 -69
+1 -14 5 -25 8 -25 3 0 5 -13 5 -30 1 -16 -2 -30 -6 -30 -4 0 -6 -11 -4 -25 1
+-14 -1 -25 -6 -25 -4 0 -10 -8 -14 -19 -6 -21 -55 -77 -55 -64 0 4 -4 3 -8 -3
+-12 -19 -70 -44 -102 -44 -22 0 -29 -4 -24 -12 6 -10 5 -10 -8 -1 -8 7 -27 14
+-42 15 -14 1 -26 6 -26 10 0 4 -6 8 -13 8 -7 0 -23 9 -34 19 -12 11 -24 17
+-27 14 -3 -4 -6 1 -6 10 0 10 -4 17 -9 17 -26 0 -60 164 -38 181 4 3 10 16 12
+30 3 13 9 25 15 27 6 2 9 7 7 10 -2 4 10 19 25 34 15 15 28 24 28 21 0 -3 7 0
+16 8 25 21 103 28 164 16z"/>
+</g>
+</svg>
diff --git a/src/App.jsx b/src/App.jsx
new file mode 100644
index 0000000..e436ecc
--- /dev/null
+++ b/src/App.jsx
@@ -0,0 +1,118 @@
+import NavBar from '@/views/components/NavBar'
+import { Button, Snackbar, Typography, useColorScheme } from '@mui/joy'
+import { useEffect, useState } from 'react'
+import { Outlet } from 'react-router-dom'
+import { useRegisterSW } from 'virtual:pwa-register/react'
+import { UserContext } from './contexts/UserContext'
+import { AuthenticationProvider } from './service/AuthenticationService'
+import { GetUserProfile } from './utils/Fetcher'
+import { isTokenValid } from './utils/TokenManager'
+
+const add = className => {
+ document.getElementById('root').classList.add(className)
+}
+
+const remove = className => {
+ document.getElementById('root').classList.remove(className)
+}
+// TODO: Update the interval to at 60 minutes
+const intervalMS = 5 * 60 * 1000 // 5 minutes
+
+function App() {
+ const { mode, systemMode } = useColorScheme()
+ const [userProfile, setUserProfile] = useState(null)
+ const [showUpdateSnackbar, setShowUpdateSnackbar] = useState(true)
+
+ const {
+ offlineReady: [offlineReady, setOfflineReady],
+ needRefresh: [needRefresh, setNeedRefresh],
+ updateServiceWorker,
+ } = useRegisterSW({
+ onRegistered(r) {
+ // eslint-disable-next-line prefer-template
+ console.log('SW Registered: ' + r)
+ r &&
+ setInterval(() => {
+ r.update()
+ }, intervalMS)
+ },
+ onRegisterError(error) {
+ console.log('SW registration error', error)
+ },
+ })
+ const close = () => {
+ setOfflineReady(false)
+ setNeedRefresh(false)
+ }
+
+ // const updateServiceWorker = useRegisterSW({
+ // onRegistered(r) {
+ // r &&
+ // setInterval(() => {
+ // r.update()
+ // }, intervalMS)
+ // },
+ // })
+ const setThemeClass = () => {
+ const value = JSON.parse(localStorage.getItem('themeMode')) || mode
+
+ if (value === 'system') {
+ if (systemMode === 'dark') {
+ return add('dark')
+ }
+ return remove('dark')
+ }
+
+ if (value === 'dark') {
+ return add('dark')
+ }
+
+ return remove('dark')
+ }
+ const getUserProfile = () => {
+ GetUserProfile()
+ .then(res => {
+ res.json().then(data => {
+ setUserProfile(data.res)
+ })
+ })
+ .catch(error => {})
+ }
+ useEffect(() => {
+ setThemeClass()
+ }, [mode, systemMode])
+ useEffect(() => {
+ if (isTokenValid()) {
+ if (!userProfile) getUserProfile()
+ }
+ }, [])
+
+ return (
+ <div className='min-h-screen'>
+ <AuthenticationProvider />
+ <UserContext.Provider value={{ userProfile, setUserProfile }}>
+ <NavBar />
+ <Outlet />
+ </UserContext.Provider>
+ {needRefresh && (
+ <Snackbar open={showUpdateSnackbar}>
+ <Typography level='body-md'>
+ A new version is now available.Click on reload button to update.
+ </Typography>
+ <Button
+ color='secondary'
+ size='small'
+ onClick={() => {
+ updateServiceWorker(true)
+ setShowUpdateSnackbar(false)
+ }}
+ >
+ Refresh
+ </Button>
+ </Snackbar>
+ )}
+ </div>
+ )
+}
+
+export default App
diff --git a/src/Config.js b/src/Config.js
new file mode 100644
index 0000000..19a896b
--- /dev/null
+++ b/src/Config.js
@@ -0,0 +1,5 @@
+/* eslint-env node */
+export const API_URL = import.meta.env.VITE_APP_API_URL //|| 'http://localhost:8000'
+export const REDIRECT_URL = import.meta.env.VITE_APP_REDIRECT_URL //|| 'http://localhost:3000'
+export const GOOGLE_CLIENT_ID = import.meta.env.VITE_APP_GOOGLE_CLIENT_ID
+export const ENVIROMENT = import.meta.env.VITE_APP_ENVIROMENT
diff --git a/src/Logo.jsx b/src/Logo.jsx
new file mode 100644
index 0000000..664c607
--- /dev/null
+++ b/src/Logo.jsx
@@ -0,0 +1,9 @@
+import LogoSVG from '@/assets/logo.svg'
+const Logo = () => {
+ return (
+ <div className='logo'>
+ <img src={LogoSVG} alt='logo' width='128px' height='128px' />
+ </div>
+ )
+}
+export default Logo
diff --git a/src/assets/logo.svg b/src/assets/logo.svg
new file mode 100644
index 0000000..f205a47
--- /dev/null
+++ b/src/assets/logo.svg
@@ -0,0 +1,1185 @@
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="100%" viewBox="0 0 1024 1024" enable-background="new 0 0 1024 1024" xml:space="preserve">
+
+<path fill="#B5BEFB" opacity="1.000000" stroke="none"
+ d="
+M457.067200,42.686905
+ C459.447144,26.832342 469.528015,16.203293 481.577301,7.055771
+ C484.583862,4.773226 488.270081,3.385903 491.321960,1.293556
+ C503.687561,1.000000 516.375122,1.000000 529.531372,1.000004
+ C532.877991,2.985393 535.601196,5.258084 538.660706,6.906528
+ C552.035889,14.112956 561.123352,24.814444 565.647583,39.326729
+ C566.080750,40.716061 566.044800,42.251637 566.534424,44.416672
+ C566.269714,53.474617 565.697205,61.835217 565.124695,70.195816
+ C562.884399,82.024635 556.006897,90.798393 546.797058,98.042542
+ C545.892578,98.753990 545.048767,99.542503 543.702881,100.681946
+ C542.668823,101.562706 542.108643,102.056770 540.874512,103.145233
+ C543.896545,103.378769 546.007507,103.627136 548.124084,103.692657
+ C579.398621,104.660835 610.777283,101.454941 641.961609,106.044365
+ C641.961609,106.044365 641.997559,106.000000 642.232666,106.281258
+ C643.636841,106.730606 644.805908,106.898689 645.975037,107.066772
+ C645.975037,107.066772 646.399109,107.196709 646.814575,107.547272
+ C648.802185,108.297722 650.374390,108.697617 651.946533,109.097511
+ C651.946533,109.097511 652.334167,109.251457 652.673218,109.635696
+ C655.649536,111.048347 658.286804,112.076759 660.924011,113.105164
+ C660.924011,113.105164 661.338745,113.293716 661.638184,113.612358
+ C662.257812,113.993759 662.577942,114.056519 662.898132,114.119278
+ C662.898132,114.119278 663.313416,114.351051 663.616821,114.670654
+ C663.920227,114.990265 664.358093,115.225540 664.358093,115.225540
+ C664.358093,115.225540 664.843811,115.120506 664.843811,115.120506
+ C664.843811,115.120506 664.924805,115.072365 664.949219,115.443268
+ C665.933105,116.254326 666.892517,116.694481 667.851990,117.134628
+ C667.851990,117.134621 667.947266,117.053314 667.981079,117.440826
+ C669.021606,118.253540 670.028381,118.678749 671.271301,119.170792
+ C671.824585,119.286629 672.140808,119.341209 672.622070,119.696716
+ C679.759644,127.731895 687.501282,134.920029 693.530396,143.335159
+ C703.686951,157.510941 709.115906,173.618210 708.473145,191.277771
+ C681.710510,191.293823 655.410950,191.385529 629.111389,191.401764
+ C529.069275,191.463501 429.027130,191.500854 328.965271,191.124725
+ C330.406860,167.369614 339.520386,147.529587 356.163544,131.138840
+ C359.916351,127.442932 363.727966,123.806702 367.806641,120.045158
+ C369.087769,118.981110 370.074799,118.014900 371.061859,117.048691
+ C371.061859,117.048691 371.013489,116.999557 371.355469,117.107140
+ C371.996918,116.890915 372.296387,116.567116 372.595886,116.243324
+ C372.595886,116.243332 372.563263,116.098564 373.016327,116.232864
+ C373.845886,115.978600 374.222382,115.590034 374.598877,115.201477
+ C374.598877,115.201469 374.529510,115.009590 374.926147,115.148865
+ C375.885895,114.907318 376.448944,114.526497 377.012024,114.145676
+ C383.126526,111.437981 389.241028,108.730270 396.026550,106.213028
+ C424.273346,100.114319 452.383545,104.830887 480.419342,102.608955
+ C479.972687,101.906181 479.796143,101.424187 479.455841,101.134781
+ C478.702362,100.494049 477.866638,99.950081 477.064423,99.366669
+ C472.619659,94.664429 467.385376,90.467857 463.956818,85.114799
+ C460.664032,79.973732 459.242096,73.634453 456.975769,66.983047
+ C456.991394,58.325230 457.029297,50.506069 457.067200,42.686905
+M495.040314,43.670990
+ C486.376251,56.938816 493.815094,72.260345 507.730530,74.933403
+ C517.515564,76.813034 529.649231,68.062172 531.328369,59.447845
+ C532.796204,51.917713 530.302063,46.677364 526.017822,41.704769
+ C518.169128,32.594967 503.036163,33.744705 495.040314,43.670990
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M367.512543,120.143005
+ C363.727966,123.806702 359.916351,127.442932 356.163544,131.138840
+ C339.520386,147.529587 330.406860,167.369614 328.768921,191.520508
+ C328.478699,198.661301 328.300964,204.983322 328.263184,211.306168
+ C328.132141,233.240723 334.086792,239.255035 355.925262,239.252853
+ C463.741425,239.242065 571.557556,239.221786 679.373718,239.197357
+ C683.039307,239.196518 686.712097,239.247787 690.369019,239.046799
+ C700.273621,238.502396 708.806946,230.141632 709.049622,220.303772
+ C709.287842,210.648895 708.995605,200.980957 708.936157,191.318741
+ C709.115906,173.618210 703.686951,157.510941 693.530396,143.335159
+ C687.501282,134.920029 679.759644,127.731895 673.147339,119.643036
+ C691.453796,119.205421 709.400879,119.116837 727.348022,119.028259
+ C743.718384,119.185036 759.522888,122.356789 774.749939,128.267838
+ C786.922852,132.993240 797.822937,139.913391 808.099548,148.875977
+ C808.958862,149.589859 809.502563,149.758560 810.046326,149.927246
+ C810.046326,149.927246 810.021057,149.975540 810.086792,150.276672
+ C810.779724,151.029556 811.406799,151.481308 812.033936,151.933075
+ C812.033936,151.933060 812.019409,151.965164 812.138550,152.173523
+ C812.441711,152.643311 812.684631,152.826950 812.986328,152.932816
+ C812.986328,152.932816 813.059509,152.936432 813.168884,153.175323
+ C813.468811,153.665741 813.713806,153.841400 814.013184,153.941177
+ C814.013184,153.941177 814.051208,153.950363 814.088745,154.311172
+ C818.032654,158.893280 821.994446,163.064835 825.836121,167.344177
+ C846.403625,190.254852 856.329895,217.527451 856.795593,247.912750
+ C857.175781,272.717957 857.808350,297.541016 854.362427,322.368683
+ C852.379761,336.653229 853.979675,351.360748 856.036316,365.862640
+ C857.653748,377.267303 859.067017,388.958374 853.599670,400.041992
+ C852.912598,401.434784 852.977539,403.305450 853.038879,404.941803
+ C853.287476,411.573303 853.994141,418.202515 853.938171,424.827576
+ C853.815247,439.383301 853.345520,453.936340 852.972229,468.489319
+ C852.938599,469.801819 852.610535,471.112061 852.363953,472.412842
+ C850.920166,480.029877 848.397461,487.615387 848.193176,495.263733
+ C847.398071,525.033203 847.340332,554.822327 846.994141,584.603882
+ C846.972412,586.474854 846.830505,588.344421 846.744507,590.214600
+ C846.145996,590.232544 845.547485,590.250549 844.948975,590.268494
+ C844.658142,587.152283 844.109802,584.033447 844.141357,580.920532
+ C844.181458,576.954102 844.996338,572.987915 844.935974,569.029785
+ C844.796814,559.899963 844.151367,550.777222 844.039978,541.647644
+ C843.875366,528.157349 844.023315,514.663452 843.973206,501.171417
+ C843.962769,498.366394 844.243896,495.191406 839.997925,494.538177
+ C839.326233,478.318695 839.758423,462.430847 837.779663,446.849182
+ C834.529297,421.255829 823.151123,398.918518 805.493042,380.181274
+ C793.981995,367.966766 781.588867,356.570251 769.352356,345.060852
+ C765.653015,341.581299 761.155518,338.950317 756.843567,335.649292
+ C743.908691,326.317169 729.995605,319.814392 714.687195,316.457092
+ C713.554565,316.208710 712.242615,316.778168 710.639099,316.950745
+ C698.542175,312.221039 686.391602,309.916016 673.730347,309.923553
+ C565.775574,309.987640 457.820831,309.968811 349.866089,310.059326
+ C344.561615,310.063751 339.193878,310.469238 333.963470,311.337677
+ C280.783264,320.168030 243.279373,364.230225 243.023254,418.147522
+ C242.903763,443.303101 242.982635,468.459686 242.985275,493.615814
+ C242.994949,586.243652 242.955917,678.871582 243.061478,771.499329
+ C243.088242,794.982666 249.616028,816.593689 263.836487,835.442505
+ C268.606262,841.764709 274.585938,847.174133 279.898254,853.120605
+ C279.604553,853.562805 279.704010,853.814636 280.044067,853.997742
+ C280.005829,853.999634 280.002563,853.923096 280.186279,854.166626
+ C280.937561,854.595703 281.505157,854.781189 282.037994,854.970215
+ C282.003235,854.973633 282.046844,854.919006 282.027588,855.286072
+ C283.158875,857.410828 284.116425,859.338989 285.492432,860.897583
+ C292.535645,868.875305 299.851685,876.616882 306.761627,884.706421
+ C317.245636,896.980347 329.179504,907.451233 343.404388,915.154358
+ C365.429352,927.081238 388.899506,932.710754 413.902679,931.339478
+ C408.122437,933.121399 402.442688,934.550720 396.761139,935.972961
+ C390.791687,937.467468 385.126617,937.440063 379.376343,934.430664
+ C374.882202,932.078674 369.887848,929.649963 364.994995,929.370667
+ C359.659149,929.066101 355.466064,927.296631 351.280640,924.582336
+ C350.536652,924.099854 349.671295,923.804443 347.977051,923.005249
+ C349.180267,925.916565 350.009216,927.922302 350.923737,930.135132
+ C345.875610,932.306213 339.497589,930.720032 336.486237,936.514343
+ C336.331818,936.811401 335.562317,936.919800 335.088043,936.900391
+ C324.405731,936.462463 313.717834,936.111389 303.045990,935.486938
+ C296.836243,935.123596 290.664795,934.695129 285.914490,939.670166
+ C283.610229,942.083435 281.634979,942.063660 278.927979,940.412354
+ C276.570862,938.974487 273.935120,937.459961 271.281799,937.137634
+ C262.104797,936.022888 253.458191,933.694641 245.492767,928.815491
+ C238.599548,924.593079 231.271408,921.058594 224.521591,916.631348
+ C219.204956,913.144165 214.256332,909.001465 209.550766,904.704773
+ C205.226151,900.755737 201.842072,895.720215 197.316742,892.062683
+ C192.335907,888.036987 190.979248,882.060059 187.697311,877.163818
+ C185.246872,873.508179 183.672867,869.253052 181.818619,865.214294
+ C180.663101,862.697388 178.861938,860.101013 178.817535,857.515076
+ C178.628326,846.496338 173.810349,837.184875 168.344193,827.855835
+ C167.921219,832.154236 167.309845,836.566223 168.032440,840.747681
+ C170.493652,854.990051 175.235184,868.571350 181.171188,881.728210
+ C182.196503,884.000732 182.235214,885.558777 179.185074,885.971924
+ C174.280182,873.505493 169.628265,861.253113 164.956284,848.705566
+ C164.636017,848.262268 164.335815,848.114014 164.035629,847.965759
+ C164.035629,847.965759 164.018539,847.998840 164.312347,847.753601
+ C164.076660,845.324341 163.547180,843.140381 163.017685,840.956360
+ C163.017685,840.956360 163.043472,840.974731 163.221771,840.560669
+ C163.123734,837.398071 162.847382,834.649475 162.610870,831.475159
+ C162.540268,823.223755 162.330643,815.398010 162.334015,807.572449
+ C162.415344,619.038269 162.519424,430.504120 162.764160,241.573059
+ C164.396896,224.044144 169.042175,207.829910 176.951843,192.546234
+ C177.533127,191.422989 177.651611,190.060211 177.985229,188.808792
+ C180.320938,185.255600 182.656647,181.702408 185.368835,177.754288
+ C188.851440,173.245544 191.957565,169.131729 195.063690,165.017914
+ C195.063675,165.017914 195.003845,165.003922 195.364883,165.080093
+ C199.946686,161.225510 204.181549,157.309738 208.382980,153.358398
+ C210.961136,150.933762 213.488052,148.454681 216.037979,146.000031
+ C216.037979,146.000031 216.029800,146.033829 216.361084,146.145721
+ C217.813522,145.179688 218.934677,144.101730 220.055832,143.023773
+ C220.055832,143.023773 220.000656,143.001984 220.359589,143.120880
+ C222.158813,142.152878 223.599106,141.065979 225.039383,139.979095
+ C225.039383,139.979095 225.032379,140.038437 225.349579,140.081543
+ C226.460587,139.416077 227.254410,138.707520 228.048218,137.998962
+ C228.048218,137.998962 228.037643,138.048889 228.387024,138.114716
+ C233.485779,135.763092 238.235138,133.345642 243.359009,130.899567
+ C250.604446,128.297592 257.475372,125.724258 264.346283,123.150917
+ C264.346283,123.150917 264.479218,123.093704 264.901001,123.138603
+ C265.551697,123.137711 265.780579,123.091919 266.430298,123.052216
+ C274.237335,121.799263 281.623535,120.540222 289.476929,119.317017
+ C314.376343,119.306656 338.808563,119.244797 363.240784,119.254318
+ C364.664825,119.254875 366.088623,119.833435 367.512543,120.143005
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M840.018799,495.007324
+ C844.243896,495.191406 843.962769,498.366394 843.973206,501.171417
+ C844.023315,514.663452 843.875366,528.157349 844.039978,541.647644
+ C844.151367,550.777222 844.796814,559.899963 844.935974,569.029785
+ C844.996338,572.987915 844.181458,576.954102 844.141357,580.920532
+ C844.109802,584.033447 844.658142,587.152283 844.948975,590.268494
+ C845.547485,590.250549 846.145996,590.232544 846.744507,590.214600
+ C846.830505,588.344421 846.972412,586.474854 846.994141,584.603882
+ C847.340332,554.822327 847.398071,525.033203 848.193176,495.263733
+ C848.397461,487.615387 850.920166,480.029877 852.363953,472.412842
+ C852.610535,471.112061 852.938599,469.801819 852.972229,468.489319
+ C853.345520,453.936340 853.815247,439.383301 853.938171,424.827576
+ C853.994141,418.202515 853.287476,411.573303 853.038879,404.941803
+ C852.977539,403.305450 852.912598,401.434784 853.599670,400.041992
+ C859.067017,388.958374 857.653748,377.267303 856.036316,365.862640
+ C853.979675,351.360748 852.379761,336.653229 854.362427,322.368683
+ C857.808350,297.541016 857.175781,272.717957 856.795593,247.912750
+ C856.329895,217.527451 846.403625,190.254852 825.836121,167.344177
+ C821.994446,163.064835 818.032654,158.893280 814.095337,154.329620
+ C820.264893,160.224182 826.899231,166.093796 832.564697,172.783936
+ C841.113281,182.878738 846.997009,194.774704 851.359863,207.113754
+ C854.489685,215.965591 855.696167,225.527374 857.407471,234.837357
+ C858.177551,239.026825 858.343750,243.374557 858.346741,247.650787
+ C858.401428,326.463135 858.385925,405.275482 858.399048,484.087860
+ C858.400269,491.249817 858.513855,498.411652 858.543823,505.573700
+ C858.844360,577.417786 859.186035,649.261780 859.413391,721.106079
+ C859.523010,755.761902 859.915344,790.429138 859.178833,825.069885
+ C858.842896,840.865723 855.393066,856.446045 849.288391,871.254150
+ C839.527588,894.930969 823.921387,914.099121 803.508240,929.201782
+ C795.927734,934.810120 787.249023,939.034180 778.781982,943.318115
+ C768.792419,948.372375 758.154053,951.665405 746.162720,952.788208
+ C744.932739,952.769287 744.469482,952.730286 744.004517,952.517944
+ C744.002747,952.344543 744.002441,951.997559 744.390686,951.930542
+ C770.306152,947.103455 792.922974,936.492004 812.617310,919.343201
+ C829.715393,904.455261 841.866272,886.435974 849.380493,865.190491
+ C851.441040,859.364441 854.719177,853.565063 851.139221,847.075500
+ C850.650146,846.188904 850.874817,844.733948 851.141113,843.632019
+ C854.427124,830.033813 850.615173,817.046753 847.751892,803.987915
+ C847.554016,803.085510 846.639954,802.340088 845.998352,801.436340
+ C843.891052,803.736511 845.286621,809.205322 839.863281,806.469971
+ C839.903625,797.339233 839.957275,788.672791 839.959473,780.006409
+ C839.983948,685.006714 840.000244,590.007019 840.018799,495.007324
+M856.997559,549.500000
+ C856.997559,536.177307 856.997559,522.854614 856.997559,509.531891
+ C856.742004,509.535126 856.486450,509.538391 856.230896,509.541626
+ C856.230896,577.883972 856.230896,646.226257 856.230896,714.568542
+ C856.486450,714.569092 856.742004,714.569580 856.997559,714.570068
+ C856.997559,659.880066 856.997559,605.190002 856.997559,549.500000
+M855.997559,445.500366
+ C855.997559,459.519104 855.997559,473.537842 855.997559,487.556549
+ C856.213379,487.553558 856.429199,487.550537 856.645020,487.547516
+ C856.645020,467.245667 856.645020,446.943817 856.645020,426.641968
+ C856.429199,426.641449 856.213379,426.640930 855.997559,426.640411
+ C855.997559,432.593872 855.997559,438.547302 855.997559,445.500366
+M855.997498,808.994690
+ C856.085205,810.154968 856.172852,811.315247 856.260498,812.475464
+ C856.419250,812.461060 856.578003,812.446655 856.736755,812.432251
+ C856.736755,793.093262 856.736755,773.754272 856.736755,754.415222
+ C856.490356,754.414307 856.243958,754.413391 855.997559,754.412415
+ C855.997559,772.313599 855.997559,790.214783 855.997498,808.994690
+M844.997559,602.588379
+ C844.997559,604.428589 844.997559,606.268738 844.997559,608.108948
+ C845.444946,608.083740 845.892334,608.058594 846.339722,608.033386
+ C846.339722,604.664795 846.339722,601.296143 846.339722,597.927551
+ C846.011902,597.922180 845.684021,597.916809 845.356201,597.911438
+ C845.236633,599.185974 845.117126,600.460510 844.997559,602.588379
+M856.030396,420.843170
+ C856.155884,421.118500 856.281372,421.393799 856.406860,421.669098
+ C856.518494,421.615692 856.726440,421.564087 856.727539,421.508575
+ C856.747070,420.487610 856.741760,419.466217 856.741760,418.444885
+ C856.542786,418.444489 856.343811,418.444092 856.144897,418.443726
+ C856.098877,419.054138 856.052856,419.664551 856.030396,420.843170
+z"/>
+<path fill="#637E63" opacity="1.000000" stroke="none"
+ d="
+M744.006287,952.691284
+ C744.469482,952.730286 744.932739,952.769287 745.739624,952.877441
+ C741.887573,953.948425 737.692993,955.819275 733.495789,955.825012
+ C622.607300,955.977966 511.718536,955.925293 400.829803,955.938599
+ C362.204681,955.943237 323.579346,956.101257 284.954834,955.969238
+ C280.997284,955.955750 277.044922,954.428162 273.326263,953.260864
+ C297.713715,953.297180 321.865051,953.675781 346.479370,954.119751
+ C381.235168,954.164368 415.527924,954.122131 449.820709,954.126892
+ C540.214294,954.139587 630.607910,954.192749 721.001465,954.150757
+ C726.779480,954.148071 732.557312,953.471008 738.494019,953.152161
+ C738.652832,953.196716 738.962341,953.082825 739.385437,953.109375
+ C741.207764,952.987732 742.607056,952.839539 744.006287,952.691284
+z"/>
+<path fill="#06b6d4" opacity="1.000000" stroke="none"
+ d="
+M162.619415,241.969971
+ C162.519424,430.504120 162.415344,619.038269 162.334015,807.572449
+ C162.330643,815.398010 162.540268,823.223755 162.438629,831.472839
+ C162.226593,831.896301 161.889160,831.966003 161.889160,831.966003
+ C161.592010,826.450500 161.246964,820.936951 161.017670,815.418579
+ C160.900940,812.609009 160.992310,809.790710 160.987473,806.040527
+ C160.990158,722.842468 161.000259,640.580322 160.964508,558.318115
+ C160.963745,556.565186 160.435410,554.812500 160.153198,553.059692
+ C160.112396,550.988770 160.071609,548.917847 160.337311,546.068665
+ C160.760559,544.471375 160.978836,543.652466 160.979370,542.833374
+ C160.997757,514.500916 161.006149,486.168457 160.961838,457.836121
+ C160.959839,456.563782 160.453461,455.292236 160.182007,454.020325
+ C160.112488,423.247040 160.009888,392.473785 159.981750,361.700470
+ C159.945847,322.438934 159.951889,283.177307 160.025192,243.915878
+ C160.028671,242.056046 160.859131,240.197739 161.656052,238.478958
+ C162.211578,239.736115 162.415497,240.853043 162.619415,241.969971
+z"/>
+<path fill="#00FFFF" opacity="1.000000" stroke="none"
+ d="
+M160.084442,553.520630
+ C160.435410,554.812500 160.963745,556.565186 160.964508,558.318115
+ C161.000259,640.580322 160.990158,722.842468 160.966766,805.575073
+ C160.632248,804.539062 160.040527,803.032654 160.039810,801.526062
+ C160.000397,719.011230 160.010559,636.496460 160.084442,553.520630
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M346.016357,954.054382
+ C321.865051,953.675781 297.713715,953.297180 273.080811,952.937500
+ C272.599182,952.956421 272.260376,952.915649 271.814270,952.691528
+ C270.052246,952.081604 268.736267,951.695740 267.846802,951.220337
+ C273.580353,948.060608 279.073853,950.637390 284.459656,950.717957
+ C290.397705,950.806763 296.328369,951.926453 302.258606,951.895813
+ C315.678070,951.826538 329.094482,951.260254 342.514587,951.093689
+ C344.001587,951.075256 345.504486,952.336853 346.796021,953.139404
+ C346.335419,953.486328 346.143494,953.746460 346.016357,954.054382
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M641.746216,105.740341
+ C610.777283,101.454941 579.398621,104.660835 548.124084,103.692657
+ C546.007507,103.627136 543.896545,103.378769 540.874512,103.145233
+ C542.108643,102.056770 542.668823,101.562706 543.529297,100.978439
+ C545.653198,101.292381 547.475647,102.042229 549.300537,102.048439
+ C573.962708,102.132462 598.628418,101.899818 623.285339,102.270638
+ C629.381653,102.362328 635.449768,104.330650 641.746216,105.740341
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M164.976349,849.000671
+ C169.628265,861.253113 174.280182,873.505493 179.244354,886.247498
+ C179.853500,887.211243 180.150436,887.685425 180.564713,888.501587
+ C182.407700,891.398071 184.133316,893.952515 185.871307,896.666260
+ C185.883682,896.825439 186.124237,897.035461 186.173950,897.272583
+ C186.368225,897.833008 186.614944,898.025513 186.973724,898.053894
+ C186.983658,898.020691 186.914673,898.026978 186.989227,898.323853
+ C187.348221,898.908630 187.632660,899.196533 187.921509,899.647583
+ C187.925919,899.810669 188.155853,900.042297 188.202271,900.269287
+ C188.407745,900.791992 188.653412,900.964111 188.992844,901.006348
+ C189.000000,901.000000 188.987137,901.013733 189.072021,901.271606
+ C189.416840,901.776672 189.676758,902.023987 189.986023,902.537720
+ C190.376892,903.208923 190.718445,903.613770 191.132080,904.248657
+ C191.392334,904.765930 191.655960,904.936646 191.995972,904.996582
+ C191.996902,905.002441 192.008835,905.005249 192.088135,905.246460
+ C192.436050,905.677795 192.704681,905.867920 192.985931,906.030884
+ C192.998520,906.003723 192.942551,906.024902 193.026917,906.286377
+ C193.386230,906.783020 193.661179,907.018188 194.038177,907.552002
+ C195.422150,909.231506 196.704071,910.612366 198.065399,912.238525
+ C198.424850,912.666321 198.704941,912.848755 198.991333,913.014404
+ C198.997620,912.997559 198.971634,913.023621 199.109039,913.318115
+ C200.837189,915.060181 202.427948,916.507690 204.009216,917.979614
+ C203.999710,918.003967 204.050385,917.991028 204.131653,918.220581
+ C204.393250,918.747742 204.654968,918.925659 204.996948,918.994019
+ C204.995773,919.004211 205.016068,919.001587 205.102859,919.234253
+ C205.384537,919.757385 205.652847,919.940186 206.087311,920.246948
+ C206.609146,920.700745 207.038300,920.922852 207.658997,921.424683
+ C209.107803,922.913208 210.365097,924.121948 211.452667,925.513550
+ C211.282928,925.696411 210.943954,926.062683 210.943939,926.062683
+ C206.682892,922.596985 201.948410,919.565918 198.273193,915.562439
+ C192.928619,909.740662 187.658661,903.631897 183.609131,896.893005
+ C178.115723,887.751404 173.389374,878.078918 169.146606,868.282227
+ C166.637726,862.489136 165.696335,856.017273 164.316650,849.426147
+ C164.583221,849.001587 164.976349,849.000671 164.976349,849.000671
+z"/>
+<path fill="#2CC4AC" opacity="1.000000" stroke="none"
+ d="
+M477.001221,99.704071
+ C477.866638,99.950081 478.702362,100.494049 479.455841,101.134781
+ C479.796143,101.424187 479.972687,101.906181 480.419342,102.608955
+ C452.383545,104.830887 424.273346,100.114319 396.427979,106.251633
+ C398.961578,105.079697 401.693359,103.568764 404.583801,103.148270
+ C409.605164,102.417793 414.722748,102.103699 419.803162,102.068298
+ C437.947723,101.941887 456.093781,102.035713 474.238251,101.903366
+ C475.076782,101.897263 478.206116,103.684158 477.001221,99.704071
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M162.764160,241.573059
+ C162.415497,240.853043 162.211578,239.736115 162.000977,238.265656
+ C163.086914,225.607986 164.658722,213.449402 170.869873,202.393097
+ C173.269608,198.121384 175.208389,193.590683 177.671204,188.993378
+ C177.651611,190.060211 177.533127,191.422989 176.951843,192.546234
+ C169.042175,207.829910 164.396896,224.044144 162.764160,241.573059
+z"/>
+<path fill="#00FF99" opacity="1.000000" stroke="none"
+ d="
+M160.113678,454.484558
+ C160.453461,455.292236 160.959839,456.563782 160.961838,457.836121
+ C161.006149,486.168457 160.997757,514.500916 160.979370,542.833374
+ C160.978836,543.652466 160.760559,544.471375 160.412903,545.630859
+ C160.136429,515.630432 160.090897,485.289642 160.113678,454.484558
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M367.806641,120.045166
+ C366.088623,119.833435 364.664825,119.254875 363.240784,119.254318
+ C338.808563,119.244797 314.376343,119.306656 289.466949,119.043747
+ C288.965912,118.554092 288.942047,118.373535 288.918152,118.192978
+ C310.462250,118.128761 332.006836,118.127151 353.550110,117.957306
+ C359.096130,117.913589 364.637970,117.340462 370.621796,117.029617
+ C370.074799,118.014900 369.087769,118.981110 367.806641,120.045166
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M215.668030,145.999268
+ C213.488052,148.454681 210.961136,150.933762 208.382980,153.358398
+ C204.181549,157.309738 199.946686,161.225510 195.377960,165.107895
+ C197.868362,161.645493 200.404190,157.906754 203.626160,154.904373
+ C207.189178,151.584167 211.380432,148.938141 215.668030,145.999268
+z"/>
+<path fill="#449678" opacity="1.000000" stroke="none"
+ d="
+M727.067993,118.662300
+ C709.400879,119.116837 691.453796,119.205421 672.981384,119.347687
+ C672.140808,119.341209 671.824585,119.286629 671.263428,118.966019
+ C671.019348,118.694420 671.004333,118.285271 671.004333,118.285271
+ C689.598877,118.288956 708.193420,118.292648 727.067993,118.662300
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M267.420319,951.309875
+ C268.736267,951.695740 270.052246,952.081604 271.647125,952.657349
+ C261.184357,952.121094 250.886978,949.728455 241.210999,944.257202
+ C241.124313,943.833984 241.302032,943.614014 241.673523,943.691711
+ C247.645523,945.586548 253.246033,947.403687 258.878174,949.201233
+ C258.909851,949.181641 258.859283,949.126953 259.050751,949.351562
+ C259.811005,949.668213 260.379791,949.760193 261.184509,949.979858
+ C261.770721,950.109863 262.120941,950.112305 262.725647,950.340088
+ C263.635315,950.658508 264.290497,950.751526 265.240295,950.977417
+ C266.163361,951.176880 266.791840,951.243347 267.420319,951.309875
+z"/>
+<path fill="#4CD298" opacity="1.000000" stroke="none"
+ d="
+M263.904022,123.090408
+ C257.475372,125.724258 250.604446,128.297592 243.360748,130.718353
+ C242.987946,130.565765 242.990158,130.203278 242.990158,130.203278
+ C249.814026,127.812149 256.637878,125.421021 263.904022,123.090408
+z"/>
+<path fill="#5CCD95" opacity="1.000000" stroke="none"
+ d="
+M288.503784,118.129204
+ C288.942047,118.373535 288.965912,118.554092 288.999756,119.007919
+ C281.623535,120.540222 274.237335,121.799263 266.433289,122.843079
+ C266.015411,122.627853 266.037292,122.210213 266.037292,122.210220
+ C273.388000,120.828621 280.738739,119.447021 288.503784,118.129204
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M242.617218,130.138428
+ C242.990158,130.203278 242.987946,130.565765 242.986221,130.746979
+ C238.235138,133.345642 233.485779,135.763092 228.361542,138.113708
+ C232.739182,135.389130 237.491730,132.731339 242.617218,130.138428
+z"/>
+<path fill="#31C5B1" opacity="1.000000" stroke="none"
+ d="
+M456.722168,42.940254
+ C457.029297,50.506069 456.991394,58.325230 456.912781,66.575485
+ C456.267456,65.588051 455.105225,64.150276 455.153412,62.754272
+ C455.378571,56.227737 455.937469,49.712730 456.722168,42.940254
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M194.731934,165.100403
+ C191.957565,169.131729 188.851440,173.245544 185.454941,177.380219
+ C188.243088,173.328354 191.321625,169.255615 194.731934,165.100403
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M241.034378,943.943115
+ C236.364349,941.944641 231.784271,939.837036 227.207275,937.247192
+ C227.210373,936.764832 227.489731,936.456482 227.820953,936.574585
+ C232.535446,938.999817 236.918732,941.306946 241.302032,943.614014
+ C241.302032,943.614014 241.124313,943.833984 241.034378,943.943115
+z"/>
+<path fill="#7F9DA3" opacity="1.000000" stroke="none"
+ d="
+M565.498962,70.090500
+ C565.697205,61.835217 566.269714,53.474617 566.854797,44.657387
+ C568.783508,52.882217 569.156189,61.504173 565.498962,70.090500
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M222.393082,934.758179
+ C218.668427,932.067688 214.943787,929.377136 211.081543,926.374634
+ C210.943954,926.062683 211.282928,925.696411 211.678467,925.610718
+ C212.354584,925.720764 212.665527,925.807068 213.145172,925.999390
+ C213.684586,926.524109 214.085602,926.833435 214.705933,927.427551
+ C217.654785,929.761658 220.384354,931.811035 222.928955,934.081055
+ C222.627045,934.453796 222.510071,934.606018 222.393082,934.758179
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M660.805725,112.763794
+ C658.286804,112.076759 655.649536,111.048347 652.868408,109.709381
+ C655.378784,110.406677 658.033081,111.414543 660.805725,112.763794
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M161.939117,832.409668
+ C161.889160,831.966003 162.226593,831.896301 162.398819,831.898621
+ C162.847382,834.649475 163.123734,837.398071 163.225769,840.575989
+ C162.697311,838.288025 162.343185,835.570740 161.939117,832.409668
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M163.015701,841.388062
+ C163.547180,843.140381 164.076660,845.324341 164.330139,847.747437
+ C163.707321,845.930847 163.360519,843.875305 163.015701,841.388062
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M224.683655,140.010986
+ C223.599106,141.065979 222.158813,142.152878 220.364136,143.150177
+ C221.449112,142.054703 222.888519,141.048782 224.683655,140.010986
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M227.070450,936.918762
+ C225.548859,936.480225 224.167191,935.887756 222.589325,935.026733
+ C222.510071,934.606018 222.627045,934.453796 223.249023,934.136841
+ C224.999268,934.800171 226.244507,935.628296 227.489746,936.456421
+ C227.489731,936.456482 227.210373,936.764832 227.070450,936.918762
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M219.701996,143.018097
+ C218.934677,144.101730 217.813522,145.179688 216.344193,146.149841
+ C217.113388,145.032181 218.230759,144.022293 219.701996,143.018097
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M651.792419,108.764847
+ C650.374390,108.697617 648.802185,108.297722 647.027466,107.609283
+ C648.429382,107.691216 650.033813,108.061699 651.792419,108.764847
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M670.700195,118.123581
+ C671.004333,118.285271 671.019348,118.694420 671.027222,118.899185
+ C670.028381,118.678749 669.021606,118.253540 667.947815,117.493896
+ C668.719177,117.426941 669.557617,117.694420 670.700195,118.123581
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M227.711273,138.013611
+ C227.254410,138.707520 226.460587,139.416077 225.319763,140.079605
+ C225.773285,139.365799 226.573792,138.697021 227.711273,138.013611
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M645.786377,106.748795
+ C644.805908,106.898689 643.636841,106.730606 642.216980,106.304337
+ C643.176697,106.174377 644.387207,106.302605 645.786377,106.748795
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M667.772827,116.825638
+ C666.892517,116.694481 665.933105,116.254326 664.925537,115.483963
+ C665.816101,115.608055 666.754883,116.062347 667.772827,116.825638
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M811.957642,151.649704
+ C811.406799,151.481308 810.779724,151.029556 810.111206,150.264404
+ C810.673645,150.422791 811.277527,150.894562 811.957642,151.649704
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M809.940186,149.637283
+ C809.502563,149.758560 808.958862,149.589859 808.242065,149.189255
+ C808.657410,149.087341 809.245667,149.217331 809.940186,149.637283
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M376.637695,114.066193
+ C376.448944,114.526497 375.885895,114.907318 374.968872,115.242020
+ C375.164398,114.792831 375.713898,114.389771 376.637695,114.066193
+z"/>
+<path fill="#4CD298" opacity="1.000000" stroke="none"
+ d="
+M265.734436,122.203903
+ C266.037292,122.210213 266.015411,122.627853 266.012451,122.836990
+ C265.780579,123.091919 265.551697,123.137711 264.973267,123.142502
+ C264.893005,122.800194 265.162262,122.498901 265.734436,122.203903
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M164.956284,848.705566
+ C164.976349,849.000671 164.583221,849.001587 164.386658,849.000122
+ C164.141586,848.829895 164.093094,848.661194 164.040100,848.229126
+ C164.335815,848.114014 164.636017,848.262268 164.956284,848.705566
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M664.806885,114.837517
+ C664.843811,115.120506 664.358093,115.225540 664.358093,115.225540
+ C664.358093,115.225540 663.920227,114.990265 663.839233,114.754814
+ C664.095459,114.531090 664.432678,114.542809 664.806885,114.837517
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M374.187561,115.149109
+ C374.222382,115.590034 373.845886,115.978600 373.052734,116.297516
+ C373.016144,115.850822 373.396210,115.473778 374.187561,115.149109
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M662.845642,113.837112
+ C662.577942,114.056519 662.257812,113.993759 661.853149,113.687759
+ C662.110168,113.481331 662.451660,113.518135 662.845642,113.837112
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M372.250732,116.187820
+ C372.296387,116.567116 371.996918,116.890915 371.363922,117.140533
+ C371.322144,116.754997 371.613892,116.443657 372.250732,116.187820
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M813.953918,153.702118
+ C813.713806,153.841400 813.468811,153.665741 813.172302,153.211761
+ C813.431458,152.998047 813.707520,153.149307 813.953918,153.702118
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M812.928528,152.694763
+ C812.684631,152.826950 812.441711,152.643311 812.156128,152.173676
+ C812.407043,151.995728 812.679077,152.159485 812.928528,152.694763
+z"/>
+<path fill="#2E2B2B" opacity="1.000000" stroke="none"
+ d="
+M708.473145,191.277771
+ C708.995605,200.980957 709.287842,210.648895 709.049622,220.303772
+ C708.806946,230.141632 700.273621,238.502396 690.369019,239.046799
+ C686.712097,239.247787 683.039307,239.196518 679.373718,239.197357
+ C571.557556,239.221786 463.741425,239.242065 355.925262,239.252853
+ C334.086792,239.255035 328.132141,233.240723 328.263184,211.306168
+ C328.300964,204.983322 328.478699,198.661301 328.788635,191.943115
+ C429.027130,191.500854 529.069275,191.463501 629.111389,191.401764
+ C655.410950,191.385529 681.710510,191.293823 708.473145,191.277771
+z"/>
+<path fill="#000100" opacity="1.000000" stroke="none"
+ d="
+M495.262878,43.353783
+ C503.036163,33.744705 518.169128,32.594967 526.017822,41.704769
+ C530.302063,46.677364 532.796204,51.917713 531.328369,59.447845
+ C529.649231,68.062172 517.515564,76.813034 507.730530,74.933403
+ C493.815094,72.260345 486.376251,56.938816 495.262878,43.353783
+z"/>
+<path fill="#FFFEFD" opacity="1.000000" stroke="none"
+ d="
+M280.012543,853.000793
+ C274.585938,847.174133 268.606262,841.764709 263.836487,835.442505
+ C249.616028,816.593689 243.088242,794.982666 243.061478,771.499329
+ C242.955917,678.871582 242.994949,586.243652 242.985275,493.615814
+ C242.982635,468.459686 242.903763,443.303101 243.023254,418.147522
+ C243.279373,364.230225 280.783264,320.168030 333.963470,311.337677
+ C339.193878,310.469238 344.561615,310.063751 349.866089,310.059326
+ C457.820831,309.968811 565.775574,309.987640 673.730347,309.923553
+ C686.391602,309.916016 698.542175,312.221039 710.956421,317.110474
+ C714.208862,318.461761 716.783264,319.606689 719.326721,320.816620
+ C732.237610,326.958344 742.848145,336.165771 752.962769,346.053680
+ C752.996033,346.032593 752.917358,346.035553 752.991760,346.306854
+ C753.349854,346.813904 753.633545,347.049652 753.956970,347.473633
+ C754.117798,347.913452 754.315796,348.063599 754.728271,348.381989
+ C755.205383,348.844452 755.544861,349.037262 755.866516,349.161255
+ C755.848633,349.092407 755.716675,349.145508 755.767639,349.434631
+ C756.215515,350.133972 756.612427,350.544189 756.999573,350.978455
+ C756.989746,351.002502 757.041687,351.004028 757.097778,351.261414
+ C757.417908,351.740967 757.682007,351.963135 758.055969,352.502197
+ C772.532837,372.286804 778.836487,394.112030 778.797241,418.299408
+ C778.605347,536.619324 778.744690,654.939697 778.686584,773.259949
+ C778.683960,778.568298 778.346191,783.955933 777.413147,789.172180
+ C768.127808,841.082336 724.888916,878.058533 672.145813,878.212402
+ C564.658691,878.525879 457.169952,878.385803 349.682343,878.192505
+ C341.100525,878.177063 332.413483,876.854980 323.965576,875.180359
+ C308.323730,872.079590 294.769073,864.267273 282.046844,854.919006
+ C282.046844,854.919006 282.003235,854.973633 281.885376,854.674683
+ C281.179199,854.224792 280.590881,854.073914 280.002563,853.923096
+ C280.002563,853.923096 280.005829,853.999634 280.167297,853.738770
+ C280.223358,853.318909 280.117950,853.159851 280.012543,853.000793
+M478.595825,743.095276
+ C498.663422,722.884033 518.741638,702.683411 538.781982,682.445190
+ C540.766357,680.441223 542.776978,678.379089 544.325562,676.045410
+ C547.541199,671.199585 547.714111,666.002258 544.815735,660.940613
+ C541.907532,655.862061 537.212158,652.817749 531.551514,654.052673
+ C527.463562,654.944580 523.108032,657.281982 520.144531,660.246765
+ C487.175385,693.229980 454.484741,726.491394 421.647522,759.606934
+ C412.187042,769.147583 402.497681,778.461243 392.887909,787.903931
+ C381.134491,779.257324 369.358521,770.583130 357.570435,761.925415
+ C347.914215,754.833557 338.425537,747.493896 328.527679,740.756042
+ C318.782501,734.122070 306.343109,739.964172 305.405609,751.358704
+ C304.857025,758.026367 308.485413,762.622070 313.634674,766.348206
+ C336.016266,782.544189 358.390045,798.751282 380.711761,815.029541
+ C392.577515,823.682678 398.964447,823.247986 409.428772,812.720459
+ C432.325043,789.685913 455.210907,766.641052 478.595825,743.095276
+M593.593506,547.724487
+ C598.709778,558.279968 607.850586,563.773560 618.538757,566.947998
+ C634.203430,571.600586 650.300415,572.348877 666.527588,571.451294
+ C678.396240,570.794800 690.086609,569.317322 700.942017,564.045959
+ C716.867798,556.312317 724.129761,539.352295 717.625061,524.607910
+ C713.404175,515.040283 705.594299,509.210144 695.949158,505.874756
+ C675.140747,498.679108 653.758911,498.761261 632.282715,501.611450
+ C622.493408,502.910583 613.009094,505.576569 604.713928,511.268127
+ C591.945801,520.028687 587.876953,532.894287 593.593506,547.724487
+M430.311920,521.333984
+ C424.412872,511.494080 414.973907,506.780029 404.435089,504.045685
+ C385.820618,499.216125 366.927155,498.851624 347.966248,501.604187
+ C337.681488,503.097290 327.736176,505.745728 319.125580,511.965790
+ C300.820587,525.188904 301.548828,549.719604 320.819763,561.451599
+ C325.442627,564.265930 330.658661,566.447205 335.888275,567.858521
+ C350.641968,571.840271 365.764771,572.477539 380.966400,571.480652
+ C392.799683,570.704712 404.512909,569.291504 415.380096,564.060608
+ C432.444458,555.846741 438.867523,538.172668 430.311920,521.333984
+M683.201294,745.417236
+ C678.875183,745.513611 674.549194,745.691833 670.223022,745.693970
+ C622.578979,745.717346 574.934998,745.689270 527.290955,745.732788
+ C514.636780,745.744324 506.119385,753.155151 506.035461,763.984863
+ C505.949615,775.067200 514.631836,783.022522 527.076965,783.090088
+ C542.236023,783.172302 557.395813,783.141663 572.555237,783.141907
+ C609.371033,783.142639 646.186951,783.094604 683.002625,783.160950
+ C690.032715,783.173584 695.674194,780.708801 699.725586,774.944824
+ C707.980652,763.200256 700.328857,746.028748 683.201294,745.417236
+M573.435547,517.796875
+ C563.290527,513.203308 554.096924,517.702332 552.040833,528.681213
+ C550.224304,538.380920 545.466309,546.021118 537.482544,551.629333
+ C513.555176,568.437317 474.801666,556.611938 472.075714,527.791504
+ C471.571320,522.458679 468.217896,518.713257 463.056824,516.828613
+ C451.910858,512.758362 441.973785,522.234802 444.109802,535.145996
+ C445.820068,545.483887 449.907104,554.909119 456.439301,563.146667
+ C473.917084,585.187134 505.757721,594.419189 534.178406,585.122131
+ C558.985962,577.006897 575.193726,560.573547 580.340332,534.374939
+ C581.639832,527.759460 579.713318,522.207764 573.435547,517.796875
+M339.474243,431.979828
+ C335.828156,437.661072 331.469757,443.023926 328.746185,449.117493
+ C326.267822,454.662567 327.625061,460.599701 331.880798,465.395721
+ C338.238922,472.561127 348.371613,472.942932 355.360992,466.202850
+ C360.625397,461.126282 365.369873,455.432312 371.034668,450.868103
+ C378.804321,444.608063 383.656525,444.462585 391.265015,450.512360
+ C396.940247,455.024902 401.674011,460.736115 406.737183,465.999939
+ C412.669189,472.167053 420.260956,473.669586 427.099426,469.884247
+ C434.161804,465.975098 437.887146,457.635101 435.282349,449.818817
+ C433.785217,445.326324 431.594604,440.831604 428.760559,437.055054
+ C407.427307,408.627106 366.645386,406.159454 339.474243,431.979828
+M628.154541,452.611237
+ C639.186340,444.087555 644.515686,444.122406 654.848511,453.421021
+ C659.164978,457.305450 662.849915,461.882324 666.995239,465.968567
+ C672.520691,471.415222 679.697083,472.468719 686.240051,469.049805
+ C692.859985,465.590668 696.739807,458.505768 695.058716,451.151093
+ C694.083984,446.886444 692.195496,442.593872 689.778137,438.934937
+ C676.143799,418.297729 649.069153,409.031464 624.522034,416.614532
+ C608.181335,421.662506 595.618164,431.562134 588.567383,447.426849
+ C584.819092,455.860718 587.804260,464.808380 595.025513,469.367218
+ C602.081177,473.821533 609.730530,472.273621 616.356384,465.097839
+ C620.080261,461.064819 623.856323,457.079926 628.154541,452.611237
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M282.027588,855.286072
+ C294.769073,864.267273 308.323730,872.079590 323.965576,875.180359
+ C332.413483,876.854980 341.100525,878.177063 349.682343,878.192505
+ C457.169952,878.385803 564.658691,878.525879 672.145813,878.212402
+ C724.888916,878.058533 768.127808,841.082336 777.413147,789.172180
+ C778.346191,783.955933 778.683960,778.568298 778.686584,773.259949
+ C778.744690,654.939697 778.605347,536.619324 778.797241,418.299408
+ C778.836487,394.112030 772.532837,372.286804 757.967163,352.262115
+ C757.526184,351.471436 757.283936,351.237732 757.041687,351.004028
+ C757.041687,351.004028 756.989746,351.002502 756.955811,350.682068
+ C756.520142,349.956268 756.118408,349.550903 755.716675,349.145508
+ C755.716675,349.145508 755.848633,349.092407 755.727051,348.896423
+ C755.267212,348.504425 754.928955,348.308350 754.590698,348.112305
+ C754.315796,348.063599 754.117798,347.913452 753.862549,347.213348
+ C753.458069,346.521759 753.187683,346.278656 752.917358,346.035553
+ C752.917358,346.035553 752.996033,346.032593 752.997681,345.679779
+ C754.340759,342.194855 755.682190,339.062775 757.023621,335.930664
+ C761.155518,338.950317 765.653015,341.581299 769.352356,345.060852
+ C781.588867,356.570251 793.981995,367.966766 805.493042,380.181274
+ C823.151123,398.918518 834.529297,421.255829 837.779663,446.849182
+ C839.758423,462.430847 839.326233,478.318695 839.997925,494.538177
+ C840.000244,590.007019 839.983948,685.006714 839.959473,780.006409
+ C839.957275,788.672791 839.903625,797.339233 839.643494,806.797852
+ C838.941223,811.062500 838.469360,814.534912 837.971436,818.370667
+ C837.888306,819.458557 837.831360,820.183167 837.563110,821.188965
+ C836.904236,823.315308 836.456665,825.160400 835.979858,827.381470
+ C835.922607,828.512756 835.894592,829.267944 835.624756,830.283691
+ C833.067017,836.462341 830.934265,842.460083 828.401245,848.283752
+ C820.399475,866.680786 808.950439,882.542114 793.806335,895.831482
+ C767.704224,918.736694 737.199402,930.656067 702.717712,930.805969
+ C606.480835,931.224121 510.241028,930.971497 414.002380,930.983704
+ C388.899506,932.710754 365.429352,927.081238 343.404388,915.154358
+ C329.179504,907.451233 317.245636,896.980347 306.761627,884.706421
+ C299.851685,876.616882 292.535645,868.875305 285.492432,860.897583
+ C284.116425,859.338989 283.158875,857.410828 282.027588,855.286072
+z"/>
+<path fill="#FDBD73" opacity="1.000000" stroke="none"
+ d="
+M413.902679,931.339478
+ C510.241028,930.971497 606.480835,931.224121 702.717712,930.805969
+ C737.199402,930.656067 767.704224,918.736694 793.806335,895.831482
+ C808.950439,882.542114 820.399475,866.680786 828.401245,848.283752
+ C830.934265,842.460083 833.067017,836.462341 835.950623,830.211914
+ C836.348572,828.921509 836.178833,827.963501 836.009033,827.005432
+ C836.456665,825.160400 836.904236,823.315308 837.901245,821.156677
+ C838.299622,819.897827 838.148560,818.952576 837.997559,818.007324
+ C838.469360,814.534912 838.941223,811.062500 839.632812,807.262207
+ C845.286621,809.205322 843.891052,803.736511 845.998352,801.436340
+ C846.639954,802.340088 847.554016,803.085510 847.751892,803.987915
+ C850.615173,817.046753 854.427124,830.033813 851.141113,843.632019
+ C850.874817,844.733948 850.650146,846.188904 851.139221,847.075500
+ C854.719177,853.565063 851.441040,859.364441 849.380493,865.190491
+ C841.866272,886.435974 829.715393,904.455261 812.617310,919.343201
+ C792.922974,936.492004 770.306152,947.103455 744.003479,951.930786
+ C741.806152,952.359619 740.384216,952.721252 738.962341,953.082825
+ C738.962341,953.082825 738.652832,953.196716 737.993591,953.117432
+ C607.222900,953.027039 477.111450,953.015930 347.000000,953.004822
+ C345.504486,952.336853 344.001587,951.075256 342.514587,951.093689
+ C329.094482,951.260254 315.678070,951.826538 302.258606,951.895813
+ C296.328369,951.926453 290.397705,950.806763 284.459656,950.717957
+ C279.073853,950.637390 273.580353,948.060608 267.846802,951.220337
+ C266.791840,951.243347 266.163361,951.176880 264.981812,950.771851
+ C263.776215,950.327087 263.123688,950.220886 262.471191,950.114746
+ C262.120941,950.112305 261.770721,950.109863 260.973389,949.785278
+ C259.970612,949.351013 259.414948,949.238953 258.859283,949.126953
+ C258.859283,949.126953 258.909851,949.181641 258.909607,948.798828
+ C257.638184,947.219116 256.554169,945.360046 255.063782,944.938782
+ C248.240509,943.010132 241.385727,941.520691 235.749908,936.607056
+ C232.829391,934.060791 229.235718,932.111450 225.661499,930.539734
+ C222.122910,928.983582 218.226273,928.241699 214.486649,927.142700
+ C214.085602,926.833435 213.684586,926.524109 213.126999,925.637329
+ C212.488144,921.854431 210.445160,920.842712 207.467438,921.144897
+ C207.038300,920.922852 206.609146,920.700745 205.964981,920.041443
+ C205.551910,919.346619 205.307281,919.145752 205.016068,919.001587
+ C205.016068,919.001587 204.995773,919.004211 204.876251,918.795471
+ C204.563873,918.337646 204.328430,918.139038 204.050385,917.991028
+ C204.050385,917.991028 203.999710,918.003967 203.992035,917.612488
+ C202.313446,915.821899 200.642563,914.422729 198.971649,913.023560
+ C198.971634,913.023621 198.997620,912.997559 198.868042,912.803101
+ C198.535645,912.344788 198.284836,912.139648 197.986023,911.993164
+ C196.704071,910.612366 195.422150,909.231506 193.936340,907.299805
+ C193.469131,906.507568 193.205826,906.266235 192.942535,906.024902
+ C192.942551,906.024902 192.998520,906.003723 192.870880,905.816528
+ C192.550140,905.360535 192.305328,905.152527 192.008835,905.005249
+ C192.008835,905.005249 191.996902,905.002441 191.878357,904.800293
+ C191.570862,904.351379 191.337585,904.158203 191.059998,904.018555
+ C190.718445,903.613770 190.376892,903.208923 189.890594,902.283875
+ C189.492950,901.513672 189.240036,901.263672 188.987137,901.013733
+ C188.987137,901.013733 189.000000,901.000000 188.892502,900.814087
+ C188.620224,900.384644 188.410507,900.189331 188.155853,900.042297
+ C188.155853,900.042297 187.925919,899.810669 187.829956,899.354736
+ C187.460892,898.608215 187.187790,898.317566 186.914673,898.026978
+ C186.914673,898.026978 186.983658,898.020691 186.878143,897.845154
+ C186.609207,897.404358 186.393066,897.192993 186.124237,897.035461
+ C186.124237,897.035461 185.883682,896.825439 185.903168,896.223083
+ C186.232300,891.567139 185.097229,888.573730 180.447357,888.159607
+ C180.150436,887.685425 179.853500,887.211243 179.497314,886.461426
+ C182.235214,885.558777 182.196503,884.000732 181.171188,881.728210
+ C175.235184,868.571350 170.493652,854.990051 168.032440,840.747681
+ C167.309845,836.566223 167.921219,832.154236 168.344193,827.855835
+ C173.810349,837.184875 178.628326,846.496338 178.817535,857.515076
+ C178.861938,860.101013 180.663101,862.697388 181.818619,865.214294
+ C183.672867,869.253052 185.246872,873.508179 187.697311,877.163818
+ C190.979248,882.060059 192.335907,888.036987 197.316742,892.062683
+ C201.842072,895.720215 205.226151,900.755737 209.550766,904.704773
+ C214.256332,909.001465 219.204956,913.144165 224.521591,916.631348
+ C231.271408,921.058594 238.599548,924.593079 245.492767,928.815491
+ C253.458191,933.694641 262.104797,936.022888 271.281799,937.137634
+ C273.935120,937.459961 276.570862,938.974487 278.927979,940.412354
+ C281.634979,942.063660 283.610229,942.083435 285.914490,939.670166
+ C290.664795,934.695129 296.836243,935.123596 303.045990,935.486938
+ C313.717834,936.111389 324.405731,936.462463 335.088043,936.900391
+ C335.562317,936.919800 336.331818,936.811401 336.486237,936.514343
+ C339.497589,930.720032 345.875610,932.306213 350.923737,930.135132
+ C350.009216,927.922302 349.180267,925.916565 347.977051,923.005249
+ C349.671295,923.804443 350.536652,924.099854 351.280640,924.582336
+ C355.466064,927.296631 359.659149,929.066101 364.994995,929.370667
+ C369.887848,929.649963 374.882202,932.078674 379.376343,934.430664
+ C385.126617,937.440063 390.791687,937.467468 396.761139,935.972961
+ C402.442688,934.550720 408.122437,933.121399 413.902679,931.339478
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M756.843567,335.649292
+ C755.682190,339.062775 754.340759,342.194855 752.964478,345.700867
+ C742.848145,336.165771 732.237610,326.958344 719.326721,320.816620
+ C716.783264,319.606689 714.208862,318.461761 711.331421,317.127136
+ C712.242615,316.778168 713.554565,316.208710 714.687195,316.457092
+ C729.995605,319.814392 743.908691,326.317169 756.843567,335.649292
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M280.186279,854.166626
+ C280.590881,854.073914 281.179199,854.224792 281.920135,854.671204
+ C281.505157,854.781189 280.937561,854.595703 280.186279,854.166626
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M279.898254,853.120605
+ C280.117950,853.159851 280.223358,853.318909 280.205566,853.736877
+ C279.704010,853.814636 279.604553,853.562805 279.898254,853.120605
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M856.997559,550.000000
+ C856.997559,605.190002 856.997559,659.880066 856.997559,714.570068
+ C856.742004,714.569580 856.486450,714.569092 856.230896,714.568542
+ C856.230896,646.226257 856.230896,577.883972 856.230896,509.541626
+ C856.486450,509.538391 856.742004,509.535126 856.997559,509.531891
+ C856.997559,522.854614 856.997559,536.177307 856.997559,550.000000
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M855.997559,445.000549
+ C855.997559,438.547302 855.997559,432.593872 855.997559,426.640411
+ C856.213379,426.640930 856.429199,426.641449 856.645020,426.641968
+ C856.645020,446.943817 856.645020,467.245667 856.645020,487.547516
+ C856.429199,487.550537 856.213379,487.553558 855.997559,487.556549
+ C855.997559,473.537842 855.997559,459.519104 855.997559,445.000549
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M855.997559,808.555298
+ C855.997559,790.214783 855.997559,772.313599 855.997559,754.412415
+ C856.243958,754.413391 856.490356,754.414307 856.736755,754.415222
+ C856.736755,773.754272 856.736755,793.093262 856.736755,812.432251
+ C856.578003,812.446655 856.419250,812.461060 856.260498,812.475464
+ C856.172852,811.315247 856.085205,810.154968 855.997559,808.555298
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M844.997559,602.161743
+ C845.117126,600.460510 845.236633,599.185974 845.356201,597.911438
+ C845.684021,597.916809 846.011902,597.922180 846.339722,597.927551
+ C846.339722,601.296143 846.339722,604.664795 846.339722,608.033386
+ C845.892334,608.058594 845.444946,608.083740 844.997559,608.108948
+ C844.997559,606.268738 844.997559,604.428589 844.997559,602.161743
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M856.018616,420.559082
+ C856.052856,419.664551 856.098877,419.054138 856.144897,418.443726
+ C856.343811,418.444092 856.542786,418.444489 856.741760,418.444885
+ C856.741760,419.466217 856.747070,420.487610 856.727539,421.508575
+ C856.726440,421.564087 856.518494,421.615692 856.406860,421.669098
+ C856.281372,421.393799 856.155884,421.118500 856.018616,420.559082
+z"/>
+<path fill="#EFC381" opacity="1.000000" stroke="none"
+ d="
+M739.385437,953.109375
+ C740.384216,952.721252 741.806152,952.359619 743.615234,951.997803
+ C744.002441,951.997559 744.002747,952.344543 744.004517,952.517944
+ C742.607056,952.839539 741.207764,952.987732 739.385437,953.109375
+z"/>
+<path fill="#EFC381" opacity="1.000000" stroke="none"
+ d="
+M346.796021,953.139404
+ C477.111450,953.015930 607.222900,953.027039 737.834778,953.072876
+ C732.557312,953.471008 726.779480,954.148071 721.001465,954.150757
+ C630.607910,954.192749 540.214294,954.139587 449.820709,954.126892
+ C415.527924,954.122131 381.235168,954.164368 346.479370,954.119751
+ C346.143494,953.746460 346.335419,953.486328 346.796021,953.139404
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M180.564713,888.501587
+ C185.097229,888.573730 186.232300,891.567139 185.890808,896.063843
+ C184.133316,893.952515 182.407700,891.398071 180.564713,888.501587
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M207.658966,921.424744
+ C210.445160,920.842712 212.488144,921.854431 212.988617,925.421936
+ C212.665527,925.807068 212.354584,925.720764 211.848190,925.427856
+ C210.365097,924.121948 209.107803,922.913208 207.658966,921.424744
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M199.109039,913.318115
+ C200.642563,914.422729 202.313446,915.821899 204.001526,917.588135
+ C202.427948,916.507690 200.837189,915.060181 199.109039,913.318115
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M205.102859,919.234253
+ C205.307281,919.145752 205.551910,919.346619 205.872284,919.809692
+ C205.652847,919.940186 205.384537,919.757385 205.102859,919.234253
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M204.131653,918.220581
+ C204.328430,918.139038 204.563873,918.337646 204.877426,918.785278
+ C204.654968,918.925659 204.393250,918.747742 204.131653,918.220581
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M198.065399,912.238525
+ C198.284836,912.139648 198.535645,912.344788 198.861755,912.819946
+ C198.704941,912.848755 198.424850,912.666321 198.065399,912.238525
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M193.026886,906.286377
+ C193.205826,906.266235 193.469131,906.507568 193.834290,907.001099
+ C193.661179,907.018188 193.386230,906.783020 193.026886,906.286377
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M186.173950,897.272583
+ C186.393066,897.192993 186.609207,897.404358 186.868210,897.878357
+ C186.614944,898.025513 186.368225,897.833008 186.173950,897.272583
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M186.989243,898.323853
+ C187.187790,898.317566 187.460892,898.608215 187.825546,899.191650
+ C187.632660,899.196533 187.348221,898.908630 186.989243,898.323853
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M188.202271,900.269287
+ C188.410507,900.189331 188.620224,900.384644 188.885345,900.820435
+ C188.653412,900.964111 188.407745,900.791992 188.202271,900.269287
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M189.072021,901.271606
+ C189.240036,901.263672 189.492950,901.513672 189.841278,902.017456
+ C189.676758,902.023987 189.416840,901.776672 189.072021,901.271606
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M191.132080,904.248657
+ C191.337585,904.158203 191.570862,904.351379 191.877441,904.794434
+ C191.655960,904.936646 191.392334,904.765930 191.132080,904.248657
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M192.088135,905.246460
+ C192.305328,905.152527 192.550140,905.360535 192.858292,905.843689
+ C192.704681,905.867920 192.436050,905.677795 192.088135,905.246460
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M214.705933,927.427490
+ C218.226273,928.241699 222.122910,928.983582 225.661499,930.539734
+ C229.235718,932.111450 232.829391,934.060791 235.749908,936.607056
+ C241.385727,941.520691 248.240509,943.010132 255.063782,944.938782
+ C256.554169,945.360046 257.638184,947.219116 258.877930,948.818420
+ C253.246033,947.403687 247.645523,945.586548 241.673523,943.691772
+ C236.918732,941.306946 232.535446,938.999817 227.820953,936.574585
+ C226.244507,935.628296 224.999268,934.800171 223.433960,933.916199
+ C220.384354,931.811035 217.654785,929.761658 214.705933,927.427490
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M259.050751,949.351562
+ C259.414948,949.238953 259.970612,949.351013 260.737427,949.657593
+ C260.379791,949.760193 259.811005,949.668213 259.050751,949.351562
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M262.725647,950.340088
+ C263.123688,950.220886 263.776215,950.327087 264.687195,950.638916
+ C264.290497,950.751526 263.635315,950.658508 262.725647,950.340088
+z"/>
+<path fill="#2E2C2A" opacity="1.000000" stroke="none"
+ d="
+M478.348419,743.347900
+ C455.210907,766.641052 432.325043,789.685913 409.428772,812.720459
+ C398.964447,823.247986 392.577515,823.682678 380.711761,815.029541
+ C358.390045,798.751282 336.016266,782.544189 313.634674,766.348206
+ C308.485413,762.622070 304.857025,758.026367 305.405609,751.358704
+ C306.343109,739.964172 318.782501,734.122070 328.527679,740.756042
+ C338.425537,747.493896 347.914215,754.833557 357.570435,761.925415
+ C369.358521,770.583130 381.134491,779.257324 392.887909,787.903931
+ C402.497681,778.461243 412.187042,769.147583 421.647522,759.606934
+ C454.484741,726.491394 487.175385,693.229980 520.144531,660.246765
+ C523.108032,657.281982 527.463562,654.944580 531.551514,654.052673
+ C537.212158,652.817749 541.907532,655.862061 544.815735,660.940613
+ C547.714111,666.002258 547.541199,671.199585 544.325562,676.045410
+ C542.776978,678.379089 540.766357,680.441223 538.781982,682.445190
+ C518.741638,702.683411 498.663422,722.884033 478.348419,743.347900
+z"/>
+<path fill="#FA6874" opacity="1.000000" stroke="none"
+ d="
+M593.420898,547.380493
+ C587.876953,532.894287 591.945801,520.028687 604.713928,511.268127
+ C613.009094,505.576569 622.493408,502.910583 632.282715,501.611450
+ C653.758911,498.761261 675.140747,498.679108 695.949158,505.874756
+ C705.594299,509.210144 713.404175,515.040283 717.625061,524.607910
+ C724.129761,539.352295 716.867798,556.312317 700.942017,564.045959
+ C690.086609,569.317322 678.396240,570.794800 666.527588,571.451294
+ C650.300415,572.348877 634.203430,571.600586 618.538757,566.947998
+ C607.850586,563.773560 598.709778,558.279968 593.420898,547.380493
+z"/>
+<path fill="#FA6874" opacity="1.000000" stroke="none"
+ d="
+M430.520630,521.645142
+ C438.867523,538.172668 432.444458,555.846741 415.380096,564.060608
+ C404.512909,569.291504 392.799683,570.704712 380.966400,571.480652
+ C365.764771,572.477539 350.641968,571.840271 335.888275,567.858521
+ C330.658661,566.447205 325.442627,564.265930 320.819763,561.451599
+ C301.548828,549.719604 300.820587,525.188904 319.125580,511.965790
+ C327.736176,505.745728 337.681488,503.097290 347.966248,501.604187
+ C366.927155,498.851624 385.820618,499.216125 404.435089,504.045685
+ C414.973907,506.780029 424.412872,511.494080 430.520630,521.645142
+z"/>
+<path fill="#54E6DD" opacity="1.000000" stroke="none"
+ d="
+M683.619385,745.466919
+ C700.328857,746.028748 707.980652,763.200256 699.725586,774.944824
+ C695.674194,780.708801 690.032715,783.173584 683.002625,783.160950
+ C646.186951,783.094604 609.371033,783.142639 572.555237,783.141907
+ C557.395813,783.141663 542.236023,783.172302 527.076965,783.090088
+ C514.631836,783.022522 505.949615,775.067200 506.035461,763.984863
+ C506.119385,753.155151 514.636780,745.744324 527.290955,745.732788
+ C574.934998,745.689270 622.578979,745.717346 670.223022,745.693970
+ C674.549194,745.691833 678.875183,745.513611 683.619385,745.466919
+z"/>
+<path fill="#2E2C2B" opacity="1.000000" stroke="none"
+ d="
+M573.774963,517.974915
+ C579.713318,522.207764 581.639832,527.759460 580.340332,534.374939
+ C575.193726,560.573547 558.985962,577.006897 534.178406,585.122131
+ C505.757721,594.419189 473.917084,585.187134 456.439301,563.146667
+ C449.907104,554.909119 445.820068,545.483887 444.109802,535.145996
+ C441.973785,522.234802 451.910858,512.758362 463.056824,516.828613
+ C468.217896,518.713257 471.571320,522.458679 472.075714,527.791504
+ C474.801666,556.611938 513.555176,568.437317 537.482544,551.629333
+ C545.466309,546.021118 550.224304,538.380920 552.040833,528.681213
+ C554.096924,517.702332 563.290527,513.203308 573.774963,517.974915
+z"/>
+<path fill="#2E2B2B" opacity="1.000000" stroke="none"
+ d="
+M339.727905,431.729614
+ C366.645386,406.159454 407.427307,408.627106 428.760559,437.055054
+ C431.594604,440.831604 433.785217,445.326324 435.282349,449.818817
+ C437.887146,457.635101 434.161804,465.975098 427.099426,469.884247
+ C420.260956,473.669586 412.669189,472.167053 406.737183,465.999939
+ C401.674011,460.736115 396.940247,455.024902 391.265015,450.512360
+ C383.656525,444.462585 378.804321,444.608063 371.034668,450.868103
+ C365.369873,455.432312 360.625397,461.126282 355.360992,466.202850
+ C348.371613,472.942932 338.238922,472.561127 331.880798,465.395721
+ C327.625061,460.599701 326.267822,454.662567 328.746185,449.117493
+ C331.469757,443.023926 335.828156,437.661072 339.727905,431.729614
+z"/>
+<path fill="#2E2C2B" opacity="1.000000" stroke="none"
+ d="
+M627.881714,452.842285
+ C623.856323,457.079926 620.080261,461.064819 616.356384,465.097839
+ C609.730530,472.273621 602.081177,473.821533 595.025513,469.367218
+ C587.804260,464.808380 584.819092,455.860718 588.567383,447.426849
+ C595.618164,431.562134 608.181335,421.662506 624.522034,416.614532
+ C649.069153,409.031464 676.143799,418.297729 689.778137,438.934937
+ C692.195496,442.593872 694.083984,446.886444 695.058716,451.151093
+ C696.739807,458.505768 692.859985,465.590668 686.240051,469.049805
+ C679.697083,472.468719 672.520691,471.415222 666.995239,465.968567
+ C662.849915,461.882324 659.164978,457.305450 654.848511,453.421021
+ C644.515686,444.122406 639.186340,444.087555 627.881714,452.842285
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M755.767639,349.434631
+ C756.118408,349.550903 756.520142,349.956268 756.965637,350.658020
+ C756.612427,350.544189 756.215515,350.133972 755.767639,349.434631
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M754.728271,348.381989
+ C754.928955,348.308350 755.267212,348.504425 755.744934,348.965271
+ C755.544861,349.037262 755.205383,348.844452 754.728271,348.381989
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M757.097778,351.261414
+ C757.283936,351.237732 757.526184,351.471436 757.857178,351.945251
+ C757.682007,351.963135 757.417908,351.740967 757.097778,351.261414
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M752.991760,346.306854
+ C753.187683,346.278656 753.458069,346.521759 753.822815,347.025085
+ C753.633545,347.049652 753.349854,346.813904 752.991760,346.306854
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M835.979858,827.381470
+ C836.178833,827.963501 836.348572,828.921509 836.192383,829.951416
+ C835.894592,829.267944 835.922607,828.512756 835.979858,827.381470
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M837.971436,818.370667
+ C838.148560,818.952576 838.299622,819.897827 838.112549,820.875366
+ C837.831360,820.183167 837.888306,819.458557 837.971436,818.370667
+z"/>
+</svg> \ No newline at end of file
diff --git a/src/assets/old-screenshot-my-chore.png b/src/assets/old-screenshot-my-chore.png
new file mode 100644
index 0000000..92a3a2d
--- /dev/null
+++ b/src/assets/old-screenshot-my-chore.png
Binary files differ
diff --git a/src/assets/screenshot-my-chore.png b/src/assets/screenshot-my-chore.png
new file mode 100644
index 0000000..62880cb
--- /dev/null
+++ b/src/assets/screenshot-my-chore.png
Binary files differ
diff --git a/src/constants/theme.js b/src/constants/theme.js
new file mode 100644
index 0000000..29b60a0
--- /dev/null
+++ b/src/constants/theme.js
@@ -0,0 +1,6 @@
+import resolveConfig from 'tailwindcss/resolveConfig'
+import tailwindConfig from '/tailwind.config.js'
+
+export const { theme: THEME } = resolveConfig(tailwindConfig)
+
+export const COLORS = THEME.colors
diff --git a/src/contexts/Contexts.jsx b/src/contexts/Contexts.jsx
new file mode 100644
index 0000000..1269154
--- /dev/null
+++ b/src/contexts/Contexts.jsx
@@ -0,0 +1,13 @@
+import QueryContext from './QueryContext'
+import RouterContext from './RouterContext'
+import ThemeContext from './ThemeContext'
+
+const Contexts = () => {
+ const contexts = [ThemeContext, QueryContext, RouterContext]
+
+ return contexts.reduceRight((acc, Context) => {
+ return <Context>{acc}</Context>
+ }, {})
+}
+
+export default Contexts
diff --git a/src/contexts/QueryContext.jsx b/src/contexts/QueryContext.jsx
new file mode 100644
index 0000000..3087d65
--- /dev/null
+++ b/src/contexts/QueryContext.jsx
@@ -0,0 +1,11 @@
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+
+const QueryContext = ({ children }) => {
+ const queryClient = new QueryClient()
+
+ return (
+ <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
+ )
+}
+
+export default QueryContext
diff --git a/src/contexts/RouterContext.jsx b/src/contexts/RouterContext.jsx
new file mode 100644
index 0000000..6077092
--- /dev/null
+++ b/src/contexts/RouterContext.jsx
@@ -0,0 +1,116 @@
+import App from '@/App'
+import ChoreEdit from '@/views/ChoreEdit/ChoreEdit'
+import ChoresOverview from '@/views/ChoresOverview'
+import Error from '@/views/Error'
+import Settings from '@/views/Settings/Settings'
+import { RouterProvider, createBrowserRouter } from 'react-router-dom'
+import ForgotPasswordView from '../views/Authorization/ForgotPasswordView'
+import LoginView from '../views/Authorization/LoginView'
+import SignupView from '../views/Authorization/Signup'
+import UpdatePasswordView from '../views/Authorization/UpdatePasswordView'
+import MyChores from '../views/Chores/MyChores'
+import JoinCircleView from '../views/Circles/JoinCircle'
+import ChoreHistory from '../views/History/ChoreHistory'
+import Landing from '../views/Landing/Landing'
+import PaymentCancelledView from '../views/Payments/PaymentFailView'
+import PaymentSuccessView from '../views/Payments/PaymentSuccessView'
+import PrivacyPolicyView from '../views/PrivacyPolicy/PrivacyPolicyView'
+import TermsView from '../views/Terms/TermsView'
+import TestView from '../views/TestView/Test'
+import ThingsHistory from '../views/Things/ThingsHistory'
+import ThingsView from '../views/Things/ThingsView'
+const Router = createBrowserRouter([
+ {
+ path: '/',
+ element: <App />,
+ errorElement: <Error />,
+ children: [
+ {
+ path: '/',
+ element: <Landing />,
+ },
+ {
+ path: '/settings',
+ element: <Settings />,
+ },
+ {
+ path: '/chores',
+ element: <ChoresOverview />,
+ },
+ {
+ path: '/chores/:choreId/edit',
+ element: <ChoreEdit />,
+ },
+ {
+ path: '/chores/create',
+ element: <ChoreEdit />,
+ },
+ {
+ path: '/chores/:choreId/history',
+ element: <ChoreHistory />,
+ },
+ {
+ path: '/my/chores',
+ element: <MyChores />,
+ },
+ {
+ path: '/login',
+ element: <LoginView />,
+ },
+ {
+ path: '/signup',
+ element: <SignupView />,
+ },
+ {
+ path: '/landing',
+ element: <Landing />,
+ },
+ {
+ path: '/test',
+ element: <TestView />,
+ },
+ {
+ path: '/forgot-password',
+ element: <ForgotPasswordView />,
+ },
+ {
+ path: '/password/update',
+ element: <UpdatePasswordView />,
+ },
+ {
+ path: '/privacy',
+ element: <PrivacyPolicyView />,
+ },
+ {
+ path: '/terms',
+ element: <TermsView />,
+ },
+ {
+ path: 'circle/join',
+ element: <JoinCircleView />,
+ },
+ {
+ path: 'payments/success',
+ element: <PaymentSuccessView />,
+ },
+ {
+ path: 'payments/cancel',
+ element: <PaymentCancelledView />,
+ },
+ {
+ path: 'things',
+ element: <ThingsView />,
+ },
+ {
+ path: 'things/:id',
+ element: <ThingsHistory />,
+ },
+ ],
+ },
+])
+
+const RouterContext = ({ children }) => {
+ return <RouterProvider router={Router} />
+}
+
+export default RouterContext
diff --git a/src/contexts/ThemeContext.jsx b/src/contexts/ThemeContext.jsx
new file mode 100644
index 0000000..45e91b5
--- /dev/null
+++ b/src/contexts/ThemeContext.jsx
@@ -0,0 +1,86 @@
+import { COLORS } from '@/constants/theme'
+import { CssBaseline } from '@mui/joy'
+import { CssVarsProvider, extendTheme } from '@mui/joy/styles'
+import PropType from 'prop-types'
+
+const primaryColor = 'cyan'
+
+const shades = [
+ '50',
+ ...Array.from({ length: 9 }, (_, i) => String((i + 1) * 100)),
+]
+
+const getPallete = (key = primaryColor) => {
+ return shades.reduce((acc, shade) => {
+ acc[shade] = COLORS[key][shade]
+ return acc
+ }, {})
+}
+
+const primaryPalette = getPallete(primaryColor)
+
+const theme = extendTheme({
+ colorSchemes: {
+ light: {
+ palette: {
+ primary: primaryPalette,
+ success: {
+ 50: '#f3faf7',
+ 100: '#def5eb',
+ 200: '#b7e7d5',
+ 300: '#8ed9be',
+ 400: '#6ecdb0',
+ 500: '#4ec1a2',
+ 600: '#46b89a',
+ 700: '#3cae91',
+ 800: '#32a487',
+ 900: '#229d76',
+ },
+ danger: {
+ 50: '#fef2f2',
+ 100: '#fde8e8',
+ 200: '#fbd5d5',
+ 300: '#f9c1c1',
+ 400: '#f6a8a8',
+ 500: '',
+ 600: '#f47272',
+ 700: '#e33434',
+ 800: '#cc1f1a',
+ 900: '#b91c1c',
+ },
+ },
+ warning: {
+ 50: '#fffdf7',
+ 100: '#fef8e1',
+ 200: '#fdecb2',
+ 300: '#fcd982',
+ 400: '#fbcf52',
+ 500: '#f9c222',
+ 600: '#f6b81e',
+ 700: '#f3ae1a',
+ 800: '#f0a416',
+ 900: '#e99b0e',
+ },
+ },
+ },
+ dark: {
+ palette: {
+ primary: primaryPalette,
+ },
+ },
+})
+
+const ThemeContext = ({ children }) => {
+ return (
+ <CssVarsProvider theme={theme}>
+ <CssBaseline />
+ {children}
+ </CssVarsProvider>
+ )
+}
+
+ThemeContext.propTypes = {
+ children: PropType.node,
+}
+
+export default ThemeContext
diff --git a/src/contexts/UserContext.js b/src/contexts/UserContext.js
new file mode 100644
index 0000000..7d2527e
--- /dev/null
+++ b/src/contexts/UserContext.js
@@ -0,0 +1,8 @@
+import { createContext } from 'react'
+
+const UserContext = createContext({
+ userProfile: null,
+ setUserProfile: () => {},
+})
+
+export { UserContext }
diff --git a/src/hooks/useStickyState.js b/src/hooks/useStickyState.js
new file mode 100644
index 0000000..237362a
--- /dev/null
+++ b/src/hooks/useStickyState.js
@@ -0,0 +1,16 @@
+import { useEffect, useState } from 'react'
+
+const useStickyState = (defaultValue, key) => {
+ const [value, setValue] = useState(() => {
+ const stickyValue = window.localStorage.getItem(key)
+ return stickyValue !== null ? JSON.parse(stickyValue) : defaultValue
+ })
+
+ useEffect(() => {
+ window.localStorage.setItem(key, JSON.stringify(value))
+ }, [key, value])
+
+ return [value, setValue]
+}
+
+export default useStickyState
diff --git a/src/index.css b/src/index.css
new file mode 100644
index 0000000..b5c61c9
--- /dev/null
+++ b/src/index.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/src/main.jsx b/src/main.jsx
new file mode 100644
index 0000000..4e6fcdd
--- /dev/null
+++ b/src/main.jsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import ReactDOM from 'react-dom/client'
+import Contexts from './contexts/Contexts.jsx'
+import './index.css'
+
+ReactDOM.createRoot(document.getElementById('root')).render(
+ <React.StrictMode>
+ <Contexts />
+ </React.StrictMode>,
+)
diff --git a/src/manifest/android-chrome-192x192.png b/src/manifest/android-chrome-192x192.png
new file mode 100644
index 0000000..2f74125
--- /dev/null
+++ b/src/manifest/android-chrome-192x192.png
Binary files differ
diff --git a/src/manifest/android-chrome-512x512.png b/src/manifest/android-chrome-512x512.png
new file mode 100644
index 0000000..86d6620
--- /dev/null
+++ b/src/manifest/android-chrome-512x512.png
Binary files differ
diff --git a/src/manifest/apple-touch-icon.png b/src/manifest/apple-touch-icon.png
new file mode 100644
index 0000000..ebdd14f
--- /dev/null
+++ b/src/manifest/apple-touch-icon.png
Binary files differ
diff --git a/src/manifest/browserconfig.xml b/src/manifest/browserconfig.xml
new file mode 100644
index 0000000..b3930d0
--- /dev/null
+++ b/src/manifest/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square150x150logo src="/mstile-150x150.png"/>
+ <TileColor>#da532c</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/src/manifest/favicon-16x16.png b/src/manifest/favicon-16x16.png
new file mode 100644
index 0000000..83d1748
--- /dev/null
+++ b/src/manifest/favicon-16x16.png
Binary files differ
diff --git a/src/manifest/favicon-32x32.png b/src/manifest/favicon-32x32.png
new file mode 100644
index 0000000..8d4788b
--- /dev/null
+++ b/src/manifest/favicon-32x32.png
Binary files differ
diff --git a/src/manifest/favicon.ico b/src/manifest/favicon.ico
new file mode 100644
index 0000000..eb40bda
--- /dev/null
+++ b/src/manifest/favicon.ico
Binary files differ
diff --git a/src/manifest/logo.svg b/src/manifest/logo.svg
new file mode 100644
index 0000000..f205a47
--- /dev/null
+++ b/src/manifest/logo.svg
@@ -0,0 +1,1185 @@
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="100%" viewBox="0 0 1024 1024" enable-background="new 0 0 1024 1024" xml:space="preserve">
+
+<path fill="#B5BEFB" opacity="1.000000" stroke="none"
+ d="
+M457.067200,42.686905
+ C459.447144,26.832342 469.528015,16.203293 481.577301,7.055771
+ C484.583862,4.773226 488.270081,3.385903 491.321960,1.293556
+ C503.687561,1.000000 516.375122,1.000000 529.531372,1.000004
+ C532.877991,2.985393 535.601196,5.258084 538.660706,6.906528
+ C552.035889,14.112956 561.123352,24.814444 565.647583,39.326729
+ C566.080750,40.716061 566.044800,42.251637 566.534424,44.416672
+ C566.269714,53.474617 565.697205,61.835217 565.124695,70.195816
+ C562.884399,82.024635 556.006897,90.798393 546.797058,98.042542
+ C545.892578,98.753990 545.048767,99.542503 543.702881,100.681946
+ C542.668823,101.562706 542.108643,102.056770 540.874512,103.145233
+ C543.896545,103.378769 546.007507,103.627136 548.124084,103.692657
+ C579.398621,104.660835 610.777283,101.454941 641.961609,106.044365
+ C641.961609,106.044365 641.997559,106.000000 642.232666,106.281258
+ C643.636841,106.730606 644.805908,106.898689 645.975037,107.066772
+ C645.975037,107.066772 646.399109,107.196709 646.814575,107.547272
+ C648.802185,108.297722 650.374390,108.697617 651.946533,109.097511
+ C651.946533,109.097511 652.334167,109.251457 652.673218,109.635696
+ C655.649536,111.048347 658.286804,112.076759 660.924011,113.105164
+ C660.924011,113.105164 661.338745,113.293716 661.638184,113.612358
+ C662.257812,113.993759 662.577942,114.056519 662.898132,114.119278
+ C662.898132,114.119278 663.313416,114.351051 663.616821,114.670654
+ C663.920227,114.990265 664.358093,115.225540 664.358093,115.225540
+ C664.358093,115.225540 664.843811,115.120506 664.843811,115.120506
+ C664.843811,115.120506 664.924805,115.072365 664.949219,115.443268
+ C665.933105,116.254326 666.892517,116.694481 667.851990,117.134628
+ C667.851990,117.134621 667.947266,117.053314 667.981079,117.440826
+ C669.021606,118.253540 670.028381,118.678749 671.271301,119.170792
+ C671.824585,119.286629 672.140808,119.341209 672.622070,119.696716
+ C679.759644,127.731895 687.501282,134.920029 693.530396,143.335159
+ C703.686951,157.510941 709.115906,173.618210 708.473145,191.277771
+ C681.710510,191.293823 655.410950,191.385529 629.111389,191.401764
+ C529.069275,191.463501 429.027130,191.500854 328.965271,191.124725
+ C330.406860,167.369614 339.520386,147.529587 356.163544,131.138840
+ C359.916351,127.442932 363.727966,123.806702 367.806641,120.045158
+ C369.087769,118.981110 370.074799,118.014900 371.061859,117.048691
+ C371.061859,117.048691 371.013489,116.999557 371.355469,117.107140
+ C371.996918,116.890915 372.296387,116.567116 372.595886,116.243324
+ C372.595886,116.243332 372.563263,116.098564 373.016327,116.232864
+ C373.845886,115.978600 374.222382,115.590034 374.598877,115.201477
+ C374.598877,115.201469 374.529510,115.009590 374.926147,115.148865
+ C375.885895,114.907318 376.448944,114.526497 377.012024,114.145676
+ C383.126526,111.437981 389.241028,108.730270 396.026550,106.213028
+ C424.273346,100.114319 452.383545,104.830887 480.419342,102.608955
+ C479.972687,101.906181 479.796143,101.424187 479.455841,101.134781
+ C478.702362,100.494049 477.866638,99.950081 477.064423,99.366669
+ C472.619659,94.664429 467.385376,90.467857 463.956818,85.114799
+ C460.664032,79.973732 459.242096,73.634453 456.975769,66.983047
+ C456.991394,58.325230 457.029297,50.506069 457.067200,42.686905
+M495.040314,43.670990
+ C486.376251,56.938816 493.815094,72.260345 507.730530,74.933403
+ C517.515564,76.813034 529.649231,68.062172 531.328369,59.447845
+ C532.796204,51.917713 530.302063,46.677364 526.017822,41.704769
+ C518.169128,32.594967 503.036163,33.744705 495.040314,43.670990
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M367.512543,120.143005
+ C363.727966,123.806702 359.916351,127.442932 356.163544,131.138840
+ C339.520386,147.529587 330.406860,167.369614 328.768921,191.520508
+ C328.478699,198.661301 328.300964,204.983322 328.263184,211.306168
+ C328.132141,233.240723 334.086792,239.255035 355.925262,239.252853
+ C463.741425,239.242065 571.557556,239.221786 679.373718,239.197357
+ C683.039307,239.196518 686.712097,239.247787 690.369019,239.046799
+ C700.273621,238.502396 708.806946,230.141632 709.049622,220.303772
+ C709.287842,210.648895 708.995605,200.980957 708.936157,191.318741
+ C709.115906,173.618210 703.686951,157.510941 693.530396,143.335159
+ C687.501282,134.920029 679.759644,127.731895 673.147339,119.643036
+ C691.453796,119.205421 709.400879,119.116837 727.348022,119.028259
+ C743.718384,119.185036 759.522888,122.356789 774.749939,128.267838
+ C786.922852,132.993240 797.822937,139.913391 808.099548,148.875977
+ C808.958862,149.589859 809.502563,149.758560 810.046326,149.927246
+ C810.046326,149.927246 810.021057,149.975540 810.086792,150.276672
+ C810.779724,151.029556 811.406799,151.481308 812.033936,151.933075
+ C812.033936,151.933060 812.019409,151.965164 812.138550,152.173523
+ C812.441711,152.643311 812.684631,152.826950 812.986328,152.932816
+ C812.986328,152.932816 813.059509,152.936432 813.168884,153.175323
+ C813.468811,153.665741 813.713806,153.841400 814.013184,153.941177
+ C814.013184,153.941177 814.051208,153.950363 814.088745,154.311172
+ C818.032654,158.893280 821.994446,163.064835 825.836121,167.344177
+ C846.403625,190.254852 856.329895,217.527451 856.795593,247.912750
+ C857.175781,272.717957 857.808350,297.541016 854.362427,322.368683
+ C852.379761,336.653229 853.979675,351.360748 856.036316,365.862640
+ C857.653748,377.267303 859.067017,388.958374 853.599670,400.041992
+ C852.912598,401.434784 852.977539,403.305450 853.038879,404.941803
+ C853.287476,411.573303 853.994141,418.202515 853.938171,424.827576
+ C853.815247,439.383301 853.345520,453.936340 852.972229,468.489319
+ C852.938599,469.801819 852.610535,471.112061 852.363953,472.412842
+ C850.920166,480.029877 848.397461,487.615387 848.193176,495.263733
+ C847.398071,525.033203 847.340332,554.822327 846.994141,584.603882
+ C846.972412,586.474854 846.830505,588.344421 846.744507,590.214600
+ C846.145996,590.232544 845.547485,590.250549 844.948975,590.268494
+ C844.658142,587.152283 844.109802,584.033447 844.141357,580.920532
+ C844.181458,576.954102 844.996338,572.987915 844.935974,569.029785
+ C844.796814,559.899963 844.151367,550.777222 844.039978,541.647644
+ C843.875366,528.157349 844.023315,514.663452 843.973206,501.171417
+ C843.962769,498.366394 844.243896,495.191406 839.997925,494.538177
+ C839.326233,478.318695 839.758423,462.430847 837.779663,446.849182
+ C834.529297,421.255829 823.151123,398.918518 805.493042,380.181274
+ C793.981995,367.966766 781.588867,356.570251 769.352356,345.060852
+ C765.653015,341.581299 761.155518,338.950317 756.843567,335.649292
+ C743.908691,326.317169 729.995605,319.814392 714.687195,316.457092
+ C713.554565,316.208710 712.242615,316.778168 710.639099,316.950745
+ C698.542175,312.221039 686.391602,309.916016 673.730347,309.923553
+ C565.775574,309.987640 457.820831,309.968811 349.866089,310.059326
+ C344.561615,310.063751 339.193878,310.469238 333.963470,311.337677
+ C280.783264,320.168030 243.279373,364.230225 243.023254,418.147522
+ C242.903763,443.303101 242.982635,468.459686 242.985275,493.615814
+ C242.994949,586.243652 242.955917,678.871582 243.061478,771.499329
+ C243.088242,794.982666 249.616028,816.593689 263.836487,835.442505
+ C268.606262,841.764709 274.585938,847.174133 279.898254,853.120605
+ C279.604553,853.562805 279.704010,853.814636 280.044067,853.997742
+ C280.005829,853.999634 280.002563,853.923096 280.186279,854.166626
+ C280.937561,854.595703 281.505157,854.781189 282.037994,854.970215
+ C282.003235,854.973633 282.046844,854.919006 282.027588,855.286072
+ C283.158875,857.410828 284.116425,859.338989 285.492432,860.897583
+ C292.535645,868.875305 299.851685,876.616882 306.761627,884.706421
+ C317.245636,896.980347 329.179504,907.451233 343.404388,915.154358
+ C365.429352,927.081238 388.899506,932.710754 413.902679,931.339478
+ C408.122437,933.121399 402.442688,934.550720 396.761139,935.972961
+ C390.791687,937.467468 385.126617,937.440063 379.376343,934.430664
+ C374.882202,932.078674 369.887848,929.649963 364.994995,929.370667
+ C359.659149,929.066101 355.466064,927.296631 351.280640,924.582336
+ C350.536652,924.099854 349.671295,923.804443 347.977051,923.005249
+ C349.180267,925.916565 350.009216,927.922302 350.923737,930.135132
+ C345.875610,932.306213 339.497589,930.720032 336.486237,936.514343
+ C336.331818,936.811401 335.562317,936.919800 335.088043,936.900391
+ C324.405731,936.462463 313.717834,936.111389 303.045990,935.486938
+ C296.836243,935.123596 290.664795,934.695129 285.914490,939.670166
+ C283.610229,942.083435 281.634979,942.063660 278.927979,940.412354
+ C276.570862,938.974487 273.935120,937.459961 271.281799,937.137634
+ C262.104797,936.022888 253.458191,933.694641 245.492767,928.815491
+ C238.599548,924.593079 231.271408,921.058594 224.521591,916.631348
+ C219.204956,913.144165 214.256332,909.001465 209.550766,904.704773
+ C205.226151,900.755737 201.842072,895.720215 197.316742,892.062683
+ C192.335907,888.036987 190.979248,882.060059 187.697311,877.163818
+ C185.246872,873.508179 183.672867,869.253052 181.818619,865.214294
+ C180.663101,862.697388 178.861938,860.101013 178.817535,857.515076
+ C178.628326,846.496338 173.810349,837.184875 168.344193,827.855835
+ C167.921219,832.154236 167.309845,836.566223 168.032440,840.747681
+ C170.493652,854.990051 175.235184,868.571350 181.171188,881.728210
+ C182.196503,884.000732 182.235214,885.558777 179.185074,885.971924
+ C174.280182,873.505493 169.628265,861.253113 164.956284,848.705566
+ C164.636017,848.262268 164.335815,848.114014 164.035629,847.965759
+ C164.035629,847.965759 164.018539,847.998840 164.312347,847.753601
+ C164.076660,845.324341 163.547180,843.140381 163.017685,840.956360
+ C163.017685,840.956360 163.043472,840.974731 163.221771,840.560669
+ C163.123734,837.398071 162.847382,834.649475 162.610870,831.475159
+ C162.540268,823.223755 162.330643,815.398010 162.334015,807.572449
+ C162.415344,619.038269 162.519424,430.504120 162.764160,241.573059
+ C164.396896,224.044144 169.042175,207.829910 176.951843,192.546234
+ C177.533127,191.422989 177.651611,190.060211 177.985229,188.808792
+ C180.320938,185.255600 182.656647,181.702408 185.368835,177.754288
+ C188.851440,173.245544 191.957565,169.131729 195.063690,165.017914
+ C195.063675,165.017914 195.003845,165.003922 195.364883,165.080093
+ C199.946686,161.225510 204.181549,157.309738 208.382980,153.358398
+ C210.961136,150.933762 213.488052,148.454681 216.037979,146.000031
+ C216.037979,146.000031 216.029800,146.033829 216.361084,146.145721
+ C217.813522,145.179688 218.934677,144.101730 220.055832,143.023773
+ C220.055832,143.023773 220.000656,143.001984 220.359589,143.120880
+ C222.158813,142.152878 223.599106,141.065979 225.039383,139.979095
+ C225.039383,139.979095 225.032379,140.038437 225.349579,140.081543
+ C226.460587,139.416077 227.254410,138.707520 228.048218,137.998962
+ C228.048218,137.998962 228.037643,138.048889 228.387024,138.114716
+ C233.485779,135.763092 238.235138,133.345642 243.359009,130.899567
+ C250.604446,128.297592 257.475372,125.724258 264.346283,123.150917
+ C264.346283,123.150917 264.479218,123.093704 264.901001,123.138603
+ C265.551697,123.137711 265.780579,123.091919 266.430298,123.052216
+ C274.237335,121.799263 281.623535,120.540222 289.476929,119.317017
+ C314.376343,119.306656 338.808563,119.244797 363.240784,119.254318
+ C364.664825,119.254875 366.088623,119.833435 367.512543,120.143005
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M840.018799,495.007324
+ C844.243896,495.191406 843.962769,498.366394 843.973206,501.171417
+ C844.023315,514.663452 843.875366,528.157349 844.039978,541.647644
+ C844.151367,550.777222 844.796814,559.899963 844.935974,569.029785
+ C844.996338,572.987915 844.181458,576.954102 844.141357,580.920532
+ C844.109802,584.033447 844.658142,587.152283 844.948975,590.268494
+ C845.547485,590.250549 846.145996,590.232544 846.744507,590.214600
+ C846.830505,588.344421 846.972412,586.474854 846.994141,584.603882
+ C847.340332,554.822327 847.398071,525.033203 848.193176,495.263733
+ C848.397461,487.615387 850.920166,480.029877 852.363953,472.412842
+ C852.610535,471.112061 852.938599,469.801819 852.972229,468.489319
+ C853.345520,453.936340 853.815247,439.383301 853.938171,424.827576
+ C853.994141,418.202515 853.287476,411.573303 853.038879,404.941803
+ C852.977539,403.305450 852.912598,401.434784 853.599670,400.041992
+ C859.067017,388.958374 857.653748,377.267303 856.036316,365.862640
+ C853.979675,351.360748 852.379761,336.653229 854.362427,322.368683
+ C857.808350,297.541016 857.175781,272.717957 856.795593,247.912750
+ C856.329895,217.527451 846.403625,190.254852 825.836121,167.344177
+ C821.994446,163.064835 818.032654,158.893280 814.095337,154.329620
+ C820.264893,160.224182 826.899231,166.093796 832.564697,172.783936
+ C841.113281,182.878738 846.997009,194.774704 851.359863,207.113754
+ C854.489685,215.965591 855.696167,225.527374 857.407471,234.837357
+ C858.177551,239.026825 858.343750,243.374557 858.346741,247.650787
+ C858.401428,326.463135 858.385925,405.275482 858.399048,484.087860
+ C858.400269,491.249817 858.513855,498.411652 858.543823,505.573700
+ C858.844360,577.417786 859.186035,649.261780 859.413391,721.106079
+ C859.523010,755.761902 859.915344,790.429138 859.178833,825.069885
+ C858.842896,840.865723 855.393066,856.446045 849.288391,871.254150
+ C839.527588,894.930969 823.921387,914.099121 803.508240,929.201782
+ C795.927734,934.810120 787.249023,939.034180 778.781982,943.318115
+ C768.792419,948.372375 758.154053,951.665405 746.162720,952.788208
+ C744.932739,952.769287 744.469482,952.730286 744.004517,952.517944
+ C744.002747,952.344543 744.002441,951.997559 744.390686,951.930542
+ C770.306152,947.103455 792.922974,936.492004 812.617310,919.343201
+ C829.715393,904.455261 841.866272,886.435974 849.380493,865.190491
+ C851.441040,859.364441 854.719177,853.565063 851.139221,847.075500
+ C850.650146,846.188904 850.874817,844.733948 851.141113,843.632019
+ C854.427124,830.033813 850.615173,817.046753 847.751892,803.987915
+ C847.554016,803.085510 846.639954,802.340088 845.998352,801.436340
+ C843.891052,803.736511 845.286621,809.205322 839.863281,806.469971
+ C839.903625,797.339233 839.957275,788.672791 839.959473,780.006409
+ C839.983948,685.006714 840.000244,590.007019 840.018799,495.007324
+M856.997559,549.500000
+ C856.997559,536.177307 856.997559,522.854614 856.997559,509.531891
+ C856.742004,509.535126 856.486450,509.538391 856.230896,509.541626
+ C856.230896,577.883972 856.230896,646.226257 856.230896,714.568542
+ C856.486450,714.569092 856.742004,714.569580 856.997559,714.570068
+ C856.997559,659.880066 856.997559,605.190002 856.997559,549.500000
+M855.997559,445.500366
+ C855.997559,459.519104 855.997559,473.537842 855.997559,487.556549
+ C856.213379,487.553558 856.429199,487.550537 856.645020,487.547516
+ C856.645020,467.245667 856.645020,446.943817 856.645020,426.641968
+ C856.429199,426.641449 856.213379,426.640930 855.997559,426.640411
+ C855.997559,432.593872 855.997559,438.547302 855.997559,445.500366
+M855.997498,808.994690
+ C856.085205,810.154968 856.172852,811.315247 856.260498,812.475464
+ C856.419250,812.461060 856.578003,812.446655 856.736755,812.432251
+ C856.736755,793.093262 856.736755,773.754272 856.736755,754.415222
+ C856.490356,754.414307 856.243958,754.413391 855.997559,754.412415
+ C855.997559,772.313599 855.997559,790.214783 855.997498,808.994690
+M844.997559,602.588379
+ C844.997559,604.428589 844.997559,606.268738 844.997559,608.108948
+ C845.444946,608.083740 845.892334,608.058594 846.339722,608.033386
+ C846.339722,604.664795 846.339722,601.296143 846.339722,597.927551
+ C846.011902,597.922180 845.684021,597.916809 845.356201,597.911438
+ C845.236633,599.185974 845.117126,600.460510 844.997559,602.588379
+M856.030396,420.843170
+ C856.155884,421.118500 856.281372,421.393799 856.406860,421.669098
+ C856.518494,421.615692 856.726440,421.564087 856.727539,421.508575
+ C856.747070,420.487610 856.741760,419.466217 856.741760,418.444885
+ C856.542786,418.444489 856.343811,418.444092 856.144897,418.443726
+ C856.098877,419.054138 856.052856,419.664551 856.030396,420.843170
+z"/>
+<path fill="#637E63" opacity="1.000000" stroke="none"
+ d="
+M744.006287,952.691284
+ C744.469482,952.730286 744.932739,952.769287 745.739624,952.877441
+ C741.887573,953.948425 737.692993,955.819275 733.495789,955.825012
+ C622.607300,955.977966 511.718536,955.925293 400.829803,955.938599
+ C362.204681,955.943237 323.579346,956.101257 284.954834,955.969238
+ C280.997284,955.955750 277.044922,954.428162 273.326263,953.260864
+ C297.713715,953.297180 321.865051,953.675781 346.479370,954.119751
+ C381.235168,954.164368 415.527924,954.122131 449.820709,954.126892
+ C540.214294,954.139587 630.607910,954.192749 721.001465,954.150757
+ C726.779480,954.148071 732.557312,953.471008 738.494019,953.152161
+ C738.652832,953.196716 738.962341,953.082825 739.385437,953.109375
+ C741.207764,952.987732 742.607056,952.839539 744.006287,952.691284
+z"/>
+<path fill="#06b6d4" opacity="1.000000" stroke="none"
+ d="
+M162.619415,241.969971
+ C162.519424,430.504120 162.415344,619.038269 162.334015,807.572449
+ C162.330643,815.398010 162.540268,823.223755 162.438629,831.472839
+ C162.226593,831.896301 161.889160,831.966003 161.889160,831.966003
+ C161.592010,826.450500 161.246964,820.936951 161.017670,815.418579
+ C160.900940,812.609009 160.992310,809.790710 160.987473,806.040527
+ C160.990158,722.842468 161.000259,640.580322 160.964508,558.318115
+ C160.963745,556.565186 160.435410,554.812500 160.153198,553.059692
+ C160.112396,550.988770 160.071609,548.917847 160.337311,546.068665
+ C160.760559,544.471375 160.978836,543.652466 160.979370,542.833374
+ C160.997757,514.500916 161.006149,486.168457 160.961838,457.836121
+ C160.959839,456.563782 160.453461,455.292236 160.182007,454.020325
+ C160.112488,423.247040 160.009888,392.473785 159.981750,361.700470
+ C159.945847,322.438934 159.951889,283.177307 160.025192,243.915878
+ C160.028671,242.056046 160.859131,240.197739 161.656052,238.478958
+ C162.211578,239.736115 162.415497,240.853043 162.619415,241.969971
+z"/>
+<path fill="#00FFFF" opacity="1.000000" stroke="none"
+ d="
+M160.084442,553.520630
+ C160.435410,554.812500 160.963745,556.565186 160.964508,558.318115
+ C161.000259,640.580322 160.990158,722.842468 160.966766,805.575073
+ C160.632248,804.539062 160.040527,803.032654 160.039810,801.526062
+ C160.000397,719.011230 160.010559,636.496460 160.084442,553.520630
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M346.016357,954.054382
+ C321.865051,953.675781 297.713715,953.297180 273.080811,952.937500
+ C272.599182,952.956421 272.260376,952.915649 271.814270,952.691528
+ C270.052246,952.081604 268.736267,951.695740 267.846802,951.220337
+ C273.580353,948.060608 279.073853,950.637390 284.459656,950.717957
+ C290.397705,950.806763 296.328369,951.926453 302.258606,951.895813
+ C315.678070,951.826538 329.094482,951.260254 342.514587,951.093689
+ C344.001587,951.075256 345.504486,952.336853 346.796021,953.139404
+ C346.335419,953.486328 346.143494,953.746460 346.016357,954.054382
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M641.746216,105.740341
+ C610.777283,101.454941 579.398621,104.660835 548.124084,103.692657
+ C546.007507,103.627136 543.896545,103.378769 540.874512,103.145233
+ C542.108643,102.056770 542.668823,101.562706 543.529297,100.978439
+ C545.653198,101.292381 547.475647,102.042229 549.300537,102.048439
+ C573.962708,102.132462 598.628418,101.899818 623.285339,102.270638
+ C629.381653,102.362328 635.449768,104.330650 641.746216,105.740341
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M164.976349,849.000671
+ C169.628265,861.253113 174.280182,873.505493 179.244354,886.247498
+ C179.853500,887.211243 180.150436,887.685425 180.564713,888.501587
+ C182.407700,891.398071 184.133316,893.952515 185.871307,896.666260
+ C185.883682,896.825439 186.124237,897.035461 186.173950,897.272583
+ C186.368225,897.833008 186.614944,898.025513 186.973724,898.053894
+ C186.983658,898.020691 186.914673,898.026978 186.989227,898.323853
+ C187.348221,898.908630 187.632660,899.196533 187.921509,899.647583
+ C187.925919,899.810669 188.155853,900.042297 188.202271,900.269287
+ C188.407745,900.791992 188.653412,900.964111 188.992844,901.006348
+ C189.000000,901.000000 188.987137,901.013733 189.072021,901.271606
+ C189.416840,901.776672 189.676758,902.023987 189.986023,902.537720
+ C190.376892,903.208923 190.718445,903.613770 191.132080,904.248657
+ C191.392334,904.765930 191.655960,904.936646 191.995972,904.996582
+ C191.996902,905.002441 192.008835,905.005249 192.088135,905.246460
+ C192.436050,905.677795 192.704681,905.867920 192.985931,906.030884
+ C192.998520,906.003723 192.942551,906.024902 193.026917,906.286377
+ C193.386230,906.783020 193.661179,907.018188 194.038177,907.552002
+ C195.422150,909.231506 196.704071,910.612366 198.065399,912.238525
+ C198.424850,912.666321 198.704941,912.848755 198.991333,913.014404
+ C198.997620,912.997559 198.971634,913.023621 199.109039,913.318115
+ C200.837189,915.060181 202.427948,916.507690 204.009216,917.979614
+ C203.999710,918.003967 204.050385,917.991028 204.131653,918.220581
+ C204.393250,918.747742 204.654968,918.925659 204.996948,918.994019
+ C204.995773,919.004211 205.016068,919.001587 205.102859,919.234253
+ C205.384537,919.757385 205.652847,919.940186 206.087311,920.246948
+ C206.609146,920.700745 207.038300,920.922852 207.658997,921.424683
+ C209.107803,922.913208 210.365097,924.121948 211.452667,925.513550
+ C211.282928,925.696411 210.943954,926.062683 210.943939,926.062683
+ C206.682892,922.596985 201.948410,919.565918 198.273193,915.562439
+ C192.928619,909.740662 187.658661,903.631897 183.609131,896.893005
+ C178.115723,887.751404 173.389374,878.078918 169.146606,868.282227
+ C166.637726,862.489136 165.696335,856.017273 164.316650,849.426147
+ C164.583221,849.001587 164.976349,849.000671 164.976349,849.000671
+z"/>
+<path fill="#2CC4AC" opacity="1.000000" stroke="none"
+ d="
+M477.001221,99.704071
+ C477.866638,99.950081 478.702362,100.494049 479.455841,101.134781
+ C479.796143,101.424187 479.972687,101.906181 480.419342,102.608955
+ C452.383545,104.830887 424.273346,100.114319 396.427979,106.251633
+ C398.961578,105.079697 401.693359,103.568764 404.583801,103.148270
+ C409.605164,102.417793 414.722748,102.103699 419.803162,102.068298
+ C437.947723,101.941887 456.093781,102.035713 474.238251,101.903366
+ C475.076782,101.897263 478.206116,103.684158 477.001221,99.704071
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M162.764160,241.573059
+ C162.415497,240.853043 162.211578,239.736115 162.000977,238.265656
+ C163.086914,225.607986 164.658722,213.449402 170.869873,202.393097
+ C173.269608,198.121384 175.208389,193.590683 177.671204,188.993378
+ C177.651611,190.060211 177.533127,191.422989 176.951843,192.546234
+ C169.042175,207.829910 164.396896,224.044144 162.764160,241.573059
+z"/>
+<path fill="#00FF99" opacity="1.000000" stroke="none"
+ d="
+M160.113678,454.484558
+ C160.453461,455.292236 160.959839,456.563782 160.961838,457.836121
+ C161.006149,486.168457 160.997757,514.500916 160.979370,542.833374
+ C160.978836,543.652466 160.760559,544.471375 160.412903,545.630859
+ C160.136429,515.630432 160.090897,485.289642 160.113678,454.484558
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M367.806641,120.045166
+ C366.088623,119.833435 364.664825,119.254875 363.240784,119.254318
+ C338.808563,119.244797 314.376343,119.306656 289.466949,119.043747
+ C288.965912,118.554092 288.942047,118.373535 288.918152,118.192978
+ C310.462250,118.128761 332.006836,118.127151 353.550110,117.957306
+ C359.096130,117.913589 364.637970,117.340462 370.621796,117.029617
+ C370.074799,118.014900 369.087769,118.981110 367.806641,120.045166
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M215.668030,145.999268
+ C213.488052,148.454681 210.961136,150.933762 208.382980,153.358398
+ C204.181549,157.309738 199.946686,161.225510 195.377960,165.107895
+ C197.868362,161.645493 200.404190,157.906754 203.626160,154.904373
+ C207.189178,151.584167 211.380432,148.938141 215.668030,145.999268
+z"/>
+<path fill="#449678" opacity="1.000000" stroke="none"
+ d="
+M727.067993,118.662300
+ C709.400879,119.116837 691.453796,119.205421 672.981384,119.347687
+ C672.140808,119.341209 671.824585,119.286629 671.263428,118.966019
+ C671.019348,118.694420 671.004333,118.285271 671.004333,118.285271
+ C689.598877,118.288956 708.193420,118.292648 727.067993,118.662300
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M267.420319,951.309875
+ C268.736267,951.695740 270.052246,952.081604 271.647125,952.657349
+ C261.184357,952.121094 250.886978,949.728455 241.210999,944.257202
+ C241.124313,943.833984 241.302032,943.614014 241.673523,943.691711
+ C247.645523,945.586548 253.246033,947.403687 258.878174,949.201233
+ C258.909851,949.181641 258.859283,949.126953 259.050751,949.351562
+ C259.811005,949.668213 260.379791,949.760193 261.184509,949.979858
+ C261.770721,950.109863 262.120941,950.112305 262.725647,950.340088
+ C263.635315,950.658508 264.290497,950.751526 265.240295,950.977417
+ C266.163361,951.176880 266.791840,951.243347 267.420319,951.309875
+z"/>
+<path fill="#4CD298" opacity="1.000000" stroke="none"
+ d="
+M263.904022,123.090408
+ C257.475372,125.724258 250.604446,128.297592 243.360748,130.718353
+ C242.987946,130.565765 242.990158,130.203278 242.990158,130.203278
+ C249.814026,127.812149 256.637878,125.421021 263.904022,123.090408
+z"/>
+<path fill="#5CCD95" opacity="1.000000" stroke="none"
+ d="
+M288.503784,118.129204
+ C288.942047,118.373535 288.965912,118.554092 288.999756,119.007919
+ C281.623535,120.540222 274.237335,121.799263 266.433289,122.843079
+ C266.015411,122.627853 266.037292,122.210213 266.037292,122.210220
+ C273.388000,120.828621 280.738739,119.447021 288.503784,118.129204
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M242.617218,130.138428
+ C242.990158,130.203278 242.987946,130.565765 242.986221,130.746979
+ C238.235138,133.345642 233.485779,135.763092 228.361542,138.113708
+ C232.739182,135.389130 237.491730,132.731339 242.617218,130.138428
+z"/>
+<path fill="#31C5B1" opacity="1.000000" stroke="none"
+ d="
+M456.722168,42.940254
+ C457.029297,50.506069 456.991394,58.325230 456.912781,66.575485
+ C456.267456,65.588051 455.105225,64.150276 455.153412,62.754272
+ C455.378571,56.227737 455.937469,49.712730 456.722168,42.940254
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M194.731934,165.100403
+ C191.957565,169.131729 188.851440,173.245544 185.454941,177.380219
+ C188.243088,173.328354 191.321625,169.255615 194.731934,165.100403
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M241.034378,943.943115
+ C236.364349,941.944641 231.784271,939.837036 227.207275,937.247192
+ C227.210373,936.764832 227.489731,936.456482 227.820953,936.574585
+ C232.535446,938.999817 236.918732,941.306946 241.302032,943.614014
+ C241.302032,943.614014 241.124313,943.833984 241.034378,943.943115
+z"/>
+<path fill="#7F9DA3" opacity="1.000000" stroke="none"
+ d="
+M565.498962,70.090500
+ C565.697205,61.835217 566.269714,53.474617 566.854797,44.657387
+ C568.783508,52.882217 569.156189,61.504173 565.498962,70.090500
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M222.393082,934.758179
+ C218.668427,932.067688 214.943787,929.377136 211.081543,926.374634
+ C210.943954,926.062683 211.282928,925.696411 211.678467,925.610718
+ C212.354584,925.720764 212.665527,925.807068 213.145172,925.999390
+ C213.684586,926.524109 214.085602,926.833435 214.705933,927.427551
+ C217.654785,929.761658 220.384354,931.811035 222.928955,934.081055
+ C222.627045,934.453796 222.510071,934.606018 222.393082,934.758179
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M660.805725,112.763794
+ C658.286804,112.076759 655.649536,111.048347 652.868408,109.709381
+ C655.378784,110.406677 658.033081,111.414543 660.805725,112.763794
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M161.939117,832.409668
+ C161.889160,831.966003 162.226593,831.896301 162.398819,831.898621
+ C162.847382,834.649475 163.123734,837.398071 163.225769,840.575989
+ C162.697311,838.288025 162.343185,835.570740 161.939117,832.409668
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M163.015701,841.388062
+ C163.547180,843.140381 164.076660,845.324341 164.330139,847.747437
+ C163.707321,845.930847 163.360519,843.875305 163.015701,841.388062
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M224.683655,140.010986
+ C223.599106,141.065979 222.158813,142.152878 220.364136,143.150177
+ C221.449112,142.054703 222.888519,141.048782 224.683655,140.010986
+z"/>
+<path fill="#41C99D" opacity="1.000000" stroke="none"
+ d="
+M227.070450,936.918762
+ C225.548859,936.480225 224.167191,935.887756 222.589325,935.026733
+ C222.510071,934.606018 222.627045,934.453796 223.249023,934.136841
+ C224.999268,934.800171 226.244507,935.628296 227.489746,936.456421
+ C227.489731,936.456482 227.210373,936.764832 227.070450,936.918762
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M219.701996,143.018097
+ C218.934677,144.101730 217.813522,145.179688 216.344193,146.149841
+ C217.113388,145.032181 218.230759,144.022293 219.701996,143.018097
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M651.792419,108.764847
+ C650.374390,108.697617 648.802185,108.297722 647.027466,107.609283
+ C648.429382,107.691216 650.033813,108.061699 651.792419,108.764847
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M670.700195,118.123581
+ C671.004333,118.285271 671.019348,118.694420 671.027222,118.899185
+ C670.028381,118.678749 669.021606,118.253540 667.947815,117.493896
+ C668.719177,117.426941 669.557617,117.694420 670.700195,118.123581
+z"/>
+<path fill="#48D09A" opacity="1.000000" stroke="none"
+ d="
+M227.711273,138.013611
+ C227.254410,138.707520 226.460587,139.416077 225.319763,140.079605
+ C225.773285,139.365799 226.573792,138.697021 227.711273,138.013611
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M645.786377,106.748795
+ C644.805908,106.898689 643.636841,106.730606 642.216980,106.304337
+ C643.176697,106.174377 644.387207,106.302605 645.786377,106.748795
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M667.772827,116.825638
+ C666.892517,116.694481 665.933105,116.254326 664.925537,115.483963
+ C665.816101,115.608055 666.754883,116.062347 667.772827,116.825638
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M811.957642,151.649704
+ C811.406799,151.481308 810.779724,151.029556 810.111206,150.264404
+ C810.673645,150.422791 811.277527,150.894562 811.957642,151.649704
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M809.940186,149.637283
+ C809.502563,149.758560 808.958862,149.589859 808.242065,149.189255
+ C808.657410,149.087341 809.245667,149.217331 809.940186,149.637283
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M376.637695,114.066193
+ C376.448944,114.526497 375.885895,114.907318 374.968872,115.242020
+ C375.164398,114.792831 375.713898,114.389771 376.637695,114.066193
+z"/>
+<path fill="#4CD298" opacity="1.000000" stroke="none"
+ d="
+M265.734436,122.203903
+ C266.037292,122.210213 266.015411,122.627853 266.012451,122.836990
+ C265.780579,123.091919 265.551697,123.137711 264.973267,123.142502
+ C264.893005,122.800194 265.162262,122.498901 265.734436,122.203903
+z"/>
+<path fill="#47C698" opacity="1.000000" stroke="none"
+ d="
+M164.956284,848.705566
+ C164.976349,849.000671 164.583221,849.001587 164.386658,849.000122
+ C164.141586,848.829895 164.093094,848.661194 164.040100,848.229126
+ C164.335815,848.114014 164.636017,848.262268 164.956284,848.705566
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M664.806885,114.837517
+ C664.843811,115.120506 664.358093,115.225540 664.358093,115.225540
+ C664.358093,115.225540 663.920227,114.990265 663.839233,114.754814
+ C664.095459,114.531090 664.432678,114.542809 664.806885,114.837517
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M374.187561,115.149109
+ C374.222382,115.590034 373.845886,115.978600 373.052734,116.297516
+ C373.016144,115.850822 373.396210,115.473778 374.187561,115.149109
+z"/>
+<path fill="#5C818F" opacity="1.000000" stroke="none"
+ d="
+M662.845642,113.837112
+ C662.577942,114.056519 662.257812,113.993759 661.853149,113.687759
+ C662.110168,113.481331 662.451660,113.518135 662.845642,113.837112
+z"/>
+<path fill="#2CC79F" opacity="1.000000" stroke="none"
+ d="
+M372.250732,116.187820
+ C372.296387,116.567116 371.996918,116.890915 371.363922,117.140533
+ C371.322144,116.754997 371.613892,116.443657 372.250732,116.187820
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M813.953918,153.702118
+ C813.713806,153.841400 813.468811,153.665741 813.172302,153.211761
+ C813.431458,152.998047 813.707520,153.149307 813.953918,153.702118
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M812.928528,152.694763
+ C812.684631,152.826950 812.441711,152.643311 812.156128,152.173676
+ C812.407043,151.995728 812.679077,152.159485 812.928528,152.694763
+z"/>
+<path fill="#2E2B2B" opacity="1.000000" stroke="none"
+ d="
+M708.473145,191.277771
+ C708.995605,200.980957 709.287842,210.648895 709.049622,220.303772
+ C708.806946,230.141632 700.273621,238.502396 690.369019,239.046799
+ C686.712097,239.247787 683.039307,239.196518 679.373718,239.197357
+ C571.557556,239.221786 463.741425,239.242065 355.925262,239.252853
+ C334.086792,239.255035 328.132141,233.240723 328.263184,211.306168
+ C328.300964,204.983322 328.478699,198.661301 328.788635,191.943115
+ C429.027130,191.500854 529.069275,191.463501 629.111389,191.401764
+ C655.410950,191.385529 681.710510,191.293823 708.473145,191.277771
+z"/>
+<path fill="#000100" opacity="1.000000" stroke="none"
+ d="
+M495.262878,43.353783
+ C503.036163,33.744705 518.169128,32.594967 526.017822,41.704769
+ C530.302063,46.677364 532.796204,51.917713 531.328369,59.447845
+ C529.649231,68.062172 517.515564,76.813034 507.730530,74.933403
+ C493.815094,72.260345 486.376251,56.938816 495.262878,43.353783
+z"/>
+<path fill="#FFFEFD" opacity="1.000000" stroke="none"
+ d="
+M280.012543,853.000793
+ C274.585938,847.174133 268.606262,841.764709 263.836487,835.442505
+ C249.616028,816.593689 243.088242,794.982666 243.061478,771.499329
+ C242.955917,678.871582 242.994949,586.243652 242.985275,493.615814
+ C242.982635,468.459686 242.903763,443.303101 243.023254,418.147522
+ C243.279373,364.230225 280.783264,320.168030 333.963470,311.337677
+ C339.193878,310.469238 344.561615,310.063751 349.866089,310.059326
+ C457.820831,309.968811 565.775574,309.987640 673.730347,309.923553
+ C686.391602,309.916016 698.542175,312.221039 710.956421,317.110474
+ C714.208862,318.461761 716.783264,319.606689 719.326721,320.816620
+ C732.237610,326.958344 742.848145,336.165771 752.962769,346.053680
+ C752.996033,346.032593 752.917358,346.035553 752.991760,346.306854
+ C753.349854,346.813904 753.633545,347.049652 753.956970,347.473633
+ C754.117798,347.913452 754.315796,348.063599 754.728271,348.381989
+ C755.205383,348.844452 755.544861,349.037262 755.866516,349.161255
+ C755.848633,349.092407 755.716675,349.145508 755.767639,349.434631
+ C756.215515,350.133972 756.612427,350.544189 756.999573,350.978455
+ C756.989746,351.002502 757.041687,351.004028 757.097778,351.261414
+ C757.417908,351.740967 757.682007,351.963135 758.055969,352.502197
+ C772.532837,372.286804 778.836487,394.112030 778.797241,418.299408
+ C778.605347,536.619324 778.744690,654.939697 778.686584,773.259949
+ C778.683960,778.568298 778.346191,783.955933 777.413147,789.172180
+ C768.127808,841.082336 724.888916,878.058533 672.145813,878.212402
+ C564.658691,878.525879 457.169952,878.385803 349.682343,878.192505
+ C341.100525,878.177063 332.413483,876.854980 323.965576,875.180359
+ C308.323730,872.079590 294.769073,864.267273 282.046844,854.919006
+ C282.046844,854.919006 282.003235,854.973633 281.885376,854.674683
+ C281.179199,854.224792 280.590881,854.073914 280.002563,853.923096
+ C280.002563,853.923096 280.005829,853.999634 280.167297,853.738770
+ C280.223358,853.318909 280.117950,853.159851 280.012543,853.000793
+M478.595825,743.095276
+ C498.663422,722.884033 518.741638,702.683411 538.781982,682.445190
+ C540.766357,680.441223 542.776978,678.379089 544.325562,676.045410
+ C547.541199,671.199585 547.714111,666.002258 544.815735,660.940613
+ C541.907532,655.862061 537.212158,652.817749 531.551514,654.052673
+ C527.463562,654.944580 523.108032,657.281982 520.144531,660.246765
+ C487.175385,693.229980 454.484741,726.491394 421.647522,759.606934
+ C412.187042,769.147583 402.497681,778.461243 392.887909,787.903931
+ C381.134491,779.257324 369.358521,770.583130 357.570435,761.925415
+ C347.914215,754.833557 338.425537,747.493896 328.527679,740.756042
+ C318.782501,734.122070 306.343109,739.964172 305.405609,751.358704
+ C304.857025,758.026367 308.485413,762.622070 313.634674,766.348206
+ C336.016266,782.544189 358.390045,798.751282 380.711761,815.029541
+ C392.577515,823.682678 398.964447,823.247986 409.428772,812.720459
+ C432.325043,789.685913 455.210907,766.641052 478.595825,743.095276
+M593.593506,547.724487
+ C598.709778,558.279968 607.850586,563.773560 618.538757,566.947998
+ C634.203430,571.600586 650.300415,572.348877 666.527588,571.451294
+ C678.396240,570.794800 690.086609,569.317322 700.942017,564.045959
+ C716.867798,556.312317 724.129761,539.352295 717.625061,524.607910
+ C713.404175,515.040283 705.594299,509.210144 695.949158,505.874756
+ C675.140747,498.679108 653.758911,498.761261 632.282715,501.611450
+ C622.493408,502.910583 613.009094,505.576569 604.713928,511.268127
+ C591.945801,520.028687 587.876953,532.894287 593.593506,547.724487
+M430.311920,521.333984
+ C424.412872,511.494080 414.973907,506.780029 404.435089,504.045685
+ C385.820618,499.216125 366.927155,498.851624 347.966248,501.604187
+ C337.681488,503.097290 327.736176,505.745728 319.125580,511.965790
+ C300.820587,525.188904 301.548828,549.719604 320.819763,561.451599
+ C325.442627,564.265930 330.658661,566.447205 335.888275,567.858521
+ C350.641968,571.840271 365.764771,572.477539 380.966400,571.480652
+ C392.799683,570.704712 404.512909,569.291504 415.380096,564.060608
+ C432.444458,555.846741 438.867523,538.172668 430.311920,521.333984
+M683.201294,745.417236
+ C678.875183,745.513611 674.549194,745.691833 670.223022,745.693970
+ C622.578979,745.717346 574.934998,745.689270 527.290955,745.732788
+ C514.636780,745.744324 506.119385,753.155151 506.035461,763.984863
+ C505.949615,775.067200 514.631836,783.022522 527.076965,783.090088
+ C542.236023,783.172302 557.395813,783.141663 572.555237,783.141907
+ C609.371033,783.142639 646.186951,783.094604 683.002625,783.160950
+ C690.032715,783.173584 695.674194,780.708801 699.725586,774.944824
+ C707.980652,763.200256 700.328857,746.028748 683.201294,745.417236
+M573.435547,517.796875
+ C563.290527,513.203308 554.096924,517.702332 552.040833,528.681213
+ C550.224304,538.380920 545.466309,546.021118 537.482544,551.629333
+ C513.555176,568.437317 474.801666,556.611938 472.075714,527.791504
+ C471.571320,522.458679 468.217896,518.713257 463.056824,516.828613
+ C451.910858,512.758362 441.973785,522.234802 444.109802,535.145996
+ C445.820068,545.483887 449.907104,554.909119 456.439301,563.146667
+ C473.917084,585.187134 505.757721,594.419189 534.178406,585.122131
+ C558.985962,577.006897 575.193726,560.573547 580.340332,534.374939
+ C581.639832,527.759460 579.713318,522.207764 573.435547,517.796875
+M339.474243,431.979828
+ C335.828156,437.661072 331.469757,443.023926 328.746185,449.117493
+ C326.267822,454.662567 327.625061,460.599701 331.880798,465.395721
+ C338.238922,472.561127 348.371613,472.942932 355.360992,466.202850
+ C360.625397,461.126282 365.369873,455.432312 371.034668,450.868103
+ C378.804321,444.608063 383.656525,444.462585 391.265015,450.512360
+ C396.940247,455.024902 401.674011,460.736115 406.737183,465.999939
+ C412.669189,472.167053 420.260956,473.669586 427.099426,469.884247
+ C434.161804,465.975098 437.887146,457.635101 435.282349,449.818817
+ C433.785217,445.326324 431.594604,440.831604 428.760559,437.055054
+ C407.427307,408.627106 366.645386,406.159454 339.474243,431.979828
+M628.154541,452.611237
+ C639.186340,444.087555 644.515686,444.122406 654.848511,453.421021
+ C659.164978,457.305450 662.849915,461.882324 666.995239,465.968567
+ C672.520691,471.415222 679.697083,472.468719 686.240051,469.049805
+ C692.859985,465.590668 696.739807,458.505768 695.058716,451.151093
+ C694.083984,446.886444 692.195496,442.593872 689.778137,438.934937
+ C676.143799,418.297729 649.069153,409.031464 624.522034,416.614532
+ C608.181335,421.662506 595.618164,431.562134 588.567383,447.426849
+ C584.819092,455.860718 587.804260,464.808380 595.025513,469.367218
+ C602.081177,473.821533 609.730530,472.273621 616.356384,465.097839
+ C620.080261,461.064819 623.856323,457.079926 628.154541,452.611237
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M282.027588,855.286072
+ C294.769073,864.267273 308.323730,872.079590 323.965576,875.180359
+ C332.413483,876.854980 341.100525,878.177063 349.682343,878.192505
+ C457.169952,878.385803 564.658691,878.525879 672.145813,878.212402
+ C724.888916,878.058533 768.127808,841.082336 777.413147,789.172180
+ C778.346191,783.955933 778.683960,778.568298 778.686584,773.259949
+ C778.744690,654.939697 778.605347,536.619324 778.797241,418.299408
+ C778.836487,394.112030 772.532837,372.286804 757.967163,352.262115
+ C757.526184,351.471436 757.283936,351.237732 757.041687,351.004028
+ C757.041687,351.004028 756.989746,351.002502 756.955811,350.682068
+ C756.520142,349.956268 756.118408,349.550903 755.716675,349.145508
+ C755.716675,349.145508 755.848633,349.092407 755.727051,348.896423
+ C755.267212,348.504425 754.928955,348.308350 754.590698,348.112305
+ C754.315796,348.063599 754.117798,347.913452 753.862549,347.213348
+ C753.458069,346.521759 753.187683,346.278656 752.917358,346.035553
+ C752.917358,346.035553 752.996033,346.032593 752.997681,345.679779
+ C754.340759,342.194855 755.682190,339.062775 757.023621,335.930664
+ C761.155518,338.950317 765.653015,341.581299 769.352356,345.060852
+ C781.588867,356.570251 793.981995,367.966766 805.493042,380.181274
+ C823.151123,398.918518 834.529297,421.255829 837.779663,446.849182
+ C839.758423,462.430847 839.326233,478.318695 839.997925,494.538177
+ C840.000244,590.007019 839.983948,685.006714 839.959473,780.006409
+ C839.957275,788.672791 839.903625,797.339233 839.643494,806.797852
+ C838.941223,811.062500 838.469360,814.534912 837.971436,818.370667
+ C837.888306,819.458557 837.831360,820.183167 837.563110,821.188965
+ C836.904236,823.315308 836.456665,825.160400 835.979858,827.381470
+ C835.922607,828.512756 835.894592,829.267944 835.624756,830.283691
+ C833.067017,836.462341 830.934265,842.460083 828.401245,848.283752
+ C820.399475,866.680786 808.950439,882.542114 793.806335,895.831482
+ C767.704224,918.736694 737.199402,930.656067 702.717712,930.805969
+ C606.480835,931.224121 510.241028,930.971497 414.002380,930.983704
+ C388.899506,932.710754 365.429352,927.081238 343.404388,915.154358
+ C329.179504,907.451233 317.245636,896.980347 306.761627,884.706421
+ C299.851685,876.616882 292.535645,868.875305 285.492432,860.897583
+ C284.116425,859.338989 283.158875,857.410828 282.027588,855.286072
+z"/>
+<path fill="#FDBD73" opacity="1.000000" stroke="none"
+ d="
+M413.902679,931.339478
+ C510.241028,930.971497 606.480835,931.224121 702.717712,930.805969
+ C737.199402,930.656067 767.704224,918.736694 793.806335,895.831482
+ C808.950439,882.542114 820.399475,866.680786 828.401245,848.283752
+ C830.934265,842.460083 833.067017,836.462341 835.950623,830.211914
+ C836.348572,828.921509 836.178833,827.963501 836.009033,827.005432
+ C836.456665,825.160400 836.904236,823.315308 837.901245,821.156677
+ C838.299622,819.897827 838.148560,818.952576 837.997559,818.007324
+ C838.469360,814.534912 838.941223,811.062500 839.632812,807.262207
+ C845.286621,809.205322 843.891052,803.736511 845.998352,801.436340
+ C846.639954,802.340088 847.554016,803.085510 847.751892,803.987915
+ C850.615173,817.046753 854.427124,830.033813 851.141113,843.632019
+ C850.874817,844.733948 850.650146,846.188904 851.139221,847.075500
+ C854.719177,853.565063 851.441040,859.364441 849.380493,865.190491
+ C841.866272,886.435974 829.715393,904.455261 812.617310,919.343201
+ C792.922974,936.492004 770.306152,947.103455 744.003479,951.930786
+ C741.806152,952.359619 740.384216,952.721252 738.962341,953.082825
+ C738.962341,953.082825 738.652832,953.196716 737.993591,953.117432
+ C607.222900,953.027039 477.111450,953.015930 347.000000,953.004822
+ C345.504486,952.336853 344.001587,951.075256 342.514587,951.093689
+ C329.094482,951.260254 315.678070,951.826538 302.258606,951.895813
+ C296.328369,951.926453 290.397705,950.806763 284.459656,950.717957
+ C279.073853,950.637390 273.580353,948.060608 267.846802,951.220337
+ C266.791840,951.243347 266.163361,951.176880 264.981812,950.771851
+ C263.776215,950.327087 263.123688,950.220886 262.471191,950.114746
+ C262.120941,950.112305 261.770721,950.109863 260.973389,949.785278
+ C259.970612,949.351013 259.414948,949.238953 258.859283,949.126953
+ C258.859283,949.126953 258.909851,949.181641 258.909607,948.798828
+ C257.638184,947.219116 256.554169,945.360046 255.063782,944.938782
+ C248.240509,943.010132 241.385727,941.520691 235.749908,936.607056
+ C232.829391,934.060791 229.235718,932.111450 225.661499,930.539734
+ C222.122910,928.983582 218.226273,928.241699 214.486649,927.142700
+ C214.085602,926.833435 213.684586,926.524109 213.126999,925.637329
+ C212.488144,921.854431 210.445160,920.842712 207.467438,921.144897
+ C207.038300,920.922852 206.609146,920.700745 205.964981,920.041443
+ C205.551910,919.346619 205.307281,919.145752 205.016068,919.001587
+ C205.016068,919.001587 204.995773,919.004211 204.876251,918.795471
+ C204.563873,918.337646 204.328430,918.139038 204.050385,917.991028
+ C204.050385,917.991028 203.999710,918.003967 203.992035,917.612488
+ C202.313446,915.821899 200.642563,914.422729 198.971649,913.023560
+ C198.971634,913.023621 198.997620,912.997559 198.868042,912.803101
+ C198.535645,912.344788 198.284836,912.139648 197.986023,911.993164
+ C196.704071,910.612366 195.422150,909.231506 193.936340,907.299805
+ C193.469131,906.507568 193.205826,906.266235 192.942535,906.024902
+ C192.942551,906.024902 192.998520,906.003723 192.870880,905.816528
+ C192.550140,905.360535 192.305328,905.152527 192.008835,905.005249
+ C192.008835,905.005249 191.996902,905.002441 191.878357,904.800293
+ C191.570862,904.351379 191.337585,904.158203 191.059998,904.018555
+ C190.718445,903.613770 190.376892,903.208923 189.890594,902.283875
+ C189.492950,901.513672 189.240036,901.263672 188.987137,901.013733
+ C188.987137,901.013733 189.000000,901.000000 188.892502,900.814087
+ C188.620224,900.384644 188.410507,900.189331 188.155853,900.042297
+ C188.155853,900.042297 187.925919,899.810669 187.829956,899.354736
+ C187.460892,898.608215 187.187790,898.317566 186.914673,898.026978
+ C186.914673,898.026978 186.983658,898.020691 186.878143,897.845154
+ C186.609207,897.404358 186.393066,897.192993 186.124237,897.035461
+ C186.124237,897.035461 185.883682,896.825439 185.903168,896.223083
+ C186.232300,891.567139 185.097229,888.573730 180.447357,888.159607
+ C180.150436,887.685425 179.853500,887.211243 179.497314,886.461426
+ C182.235214,885.558777 182.196503,884.000732 181.171188,881.728210
+ C175.235184,868.571350 170.493652,854.990051 168.032440,840.747681
+ C167.309845,836.566223 167.921219,832.154236 168.344193,827.855835
+ C173.810349,837.184875 178.628326,846.496338 178.817535,857.515076
+ C178.861938,860.101013 180.663101,862.697388 181.818619,865.214294
+ C183.672867,869.253052 185.246872,873.508179 187.697311,877.163818
+ C190.979248,882.060059 192.335907,888.036987 197.316742,892.062683
+ C201.842072,895.720215 205.226151,900.755737 209.550766,904.704773
+ C214.256332,909.001465 219.204956,913.144165 224.521591,916.631348
+ C231.271408,921.058594 238.599548,924.593079 245.492767,928.815491
+ C253.458191,933.694641 262.104797,936.022888 271.281799,937.137634
+ C273.935120,937.459961 276.570862,938.974487 278.927979,940.412354
+ C281.634979,942.063660 283.610229,942.083435 285.914490,939.670166
+ C290.664795,934.695129 296.836243,935.123596 303.045990,935.486938
+ C313.717834,936.111389 324.405731,936.462463 335.088043,936.900391
+ C335.562317,936.919800 336.331818,936.811401 336.486237,936.514343
+ C339.497589,930.720032 345.875610,932.306213 350.923737,930.135132
+ C350.009216,927.922302 349.180267,925.916565 347.977051,923.005249
+ C349.671295,923.804443 350.536652,924.099854 351.280640,924.582336
+ C355.466064,927.296631 359.659149,929.066101 364.994995,929.370667
+ C369.887848,929.649963 374.882202,932.078674 379.376343,934.430664
+ C385.126617,937.440063 390.791687,937.467468 396.761139,935.972961
+ C402.442688,934.550720 408.122437,933.121399 413.902679,931.339478
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M756.843567,335.649292
+ C755.682190,339.062775 754.340759,342.194855 752.964478,345.700867
+ C742.848145,336.165771 732.237610,326.958344 719.326721,320.816620
+ C716.783264,319.606689 714.208862,318.461761 711.331421,317.127136
+ C712.242615,316.778168 713.554565,316.208710 714.687195,316.457092
+ C729.995605,319.814392 743.908691,326.317169 756.843567,335.649292
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M280.186279,854.166626
+ C280.590881,854.073914 281.179199,854.224792 281.920135,854.671204
+ C281.505157,854.781189 280.937561,854.595703 280.186279,854.166626
+z"/>
+<path fill="#FDA836" opacity="1.000000" stroke="none"
+ d="
+M279.898254,853.120605
+ C280.117950,853.159851 280.223358,853.318909 280.205566,853.736877
+ C279.704010,853.814636 279.604553,853.562805 279.898254,853.120605
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M856.997559,550.000000
+ C856.997559,605.190002 856.997559,659.880066 856.997559,714.570068
+ C856.742004,714.569580 856.486450,714.569092 856.230896,714.568542
+ C856.230896,646.226257 856.230896,577.883972 856.230896,509.541626
+ C856.486450,509.538391 856.742004,509.535126 856.997559,509.531891
+ C856.997559,522.854614 856.997559,536.177307 856.997559,550.000000
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M855.997559,445.000549
+ C855.997559,438.547302 855.997559,432.593872 855.997559,426.640411
+ C856.213379,426.640930 856.429199,426.641449 856.645020,426.641968
+ C856.645020,446.943817 856.645020,467.245667 856.645020,487.547516
+ C856.429199,487.550537 856.213379,487.553558 855.997559,487.556549
+ C855.997559,473.537842 855.997559,459.519104 855.997559,445.000549
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M855.997559,808.555298
+ C855.997559,790.214783 855.997559,772.313599 855.997559,754.412415
+ C856.243958,754.413391 856.490356,754.414307 856.736755,754.415222
+ C856.736755,773.754272 856.736755,793.093262 856.736755,812.432251
+ C856.578003,812.446655 856.419250,812.461060 856.260498,812.475464
+ C856.172852,811.315247 856.085205,810.154968 855.997559,808.555298
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M844.997559,602.161743
+ C845.117126,600.460510 845.236633,599.185974 845.356201,597.911438
+ C845.684021,597.916809 846.011902,597.922180 846.339722,597.927551
+ C846.339722,601.296143 846.339722,604.664795 846.339722,608.033386
+ C845.892334,608.058594 845.444946,608.083740 844.997559,608.108948
+ C844.997559,606.268738 844.997559,604.428589 844.997559,602.161743
+z"/>
+<path fill="#FFBD76" opacity="1.000000" stroke="none"
+ d="
+M856.018616,420.559082
+ C856.052856,419.664551 856.098877,419.054138 856.144897,418.443726
+ C856.343811,418.444092 856.542786,418.444489 856.741760,418.444885
+ C856.741760,419.466217 856.747070,420.487610 856.727539,421.508575
+ C856.726440,421.564087 856.518494,421.615692 856.406860,421.669098
+ C856.281372,421.393799 856.155884,421.118500 856.018616,420.559082
+z"/>
+<path fill="#EFC381" opacity="1.000000" stroke="none"
+ d="
+M739.385437,953.109375
+ C740.384216,952.721252 741.806152,952.359619 743.615234,951.997803
+ C744.002441,951.997559 744.002747,952.344543 744.004517,952.517944
+ C742.607056,952.839539 741.207764,952.987732 739.385437,953.109375
+z"/>
+<path fill="#EFC381" opacity="1.000000" stroke="none"
+ d="
+M346.796021,953.139404
+ C477.111450,953.015930 607.222900,953.027039 737.834778,953.072876
+ C732.557312,953.471008 726.779480,954.148071 721.001465,954.150757
+ C630.607910,954.192749 540.214294,954.139587 449.820709,954.126892
+ C415.527924,954.122131 381.235168,954.164368 346.479370,954.119751
+ C346.143494,953.746460 346.335419,953.486328 346.796021,953.139404
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M180.564713,888.501587
+ C185.097229,888.573730 186.232300,891.567139 185.890808,896.063843
+ C184.133316,893.952515 182.407700,891.398071 180.564713,888.501587
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M207.658966,921.424744
+ C210.445160,920.842712 212.488144,921.854431 212.988617,925.421936
+ C212.665527,925.807068 212.354584,925.720764 211.848190,925.427856
+ C210.365097,924.121948 209.107803,922.913208 207.658966,921.424744
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M199.109039,913.318115
+ C200.642563,914.422729 202.313446,915.821899 204.001526,917.588135
+ C202.427948,916.507690 200.837189,915.060181 199.109039,913.318115
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M205.102859,919.234253
+ C205.307281,919.145752 205.551910,919.346619 205.872284,919.809692
+ C205.652847,919.940186 205.384537,919.757385 205.102859,919.234253
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M204.131653,918.220581
+ C204.328430,918.139038 204.563873,918.337646 204.877426,918.785278
+ C204.654968,918.925659 204.393250,918.747742 204.131653,918.220581
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M198.065399,912.238525
+ C198.284836,912.139648 198.535645,912.344788 198.861755,912.819946
+ C198.704941,912.848755 198.424850,912.666321 198.065399,912.238525
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M193.026886,906.286377
+ C193.205826,906.266235 193.469131,906.507568 193.834290,907.001099
+ C193.661179,907.018188 193.386230,906.783020 193.026886,906.286377
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M186.173950,897.272583
+ C186.393066,897.192993 186.609207,897.404358 186.868210,897.878357
+ C186.614944,898.025513 186.368225,897.833008 186.173950,897.272583
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M186.989243,898.323853
+ C187.187790,898.317566 187.460892,898.608215 187.825546,899.191650
+ C187.632660,899.196533 187.348221,898.908630 186.989243,898.323853
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M188.202271,900.269287
+ C188.410507,900.189331 188.620224,900.384644 188.885345,900.820435
+ C188.653412,900.964111 188.407745,900.791992 188.202271,900.269287
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M189.072021,901.271606
+ C189.240036,901.263672 189.492950,901.513672 189.841278,902.017456
+ C189.676758,902.023987 189.416840,901.776672 189.072021,901.271606
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M191.132080,904.248657
+ C191.337585,904.158203 191.570862,904.351379 191.877441,904.794434
+ C191.655960,904.936646 191.392334,904.765930 191.132080,904.248657
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M192.088135,905.246460
+ C192.305328,905.152527 192.550140,905.360535 192.858292,905.843689
+ C192.704681,905.867920 192.436050,905.677795 192.088135,905.246460
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M214.705933,927.427490
+ C218.226273,928.241699 222.122910,928.983582 225.661499,930.539734
+ C229.235718,932.111450 232.829391,934.060791 235.749908,936.607056
+ C241.385727,941.520691 248.240509,943.010132 255.063782,944.938782
+ C256.554169,945.360046 257.638184,947.219116 258.877930,948.818420
+ C253.246033,947.403687 247.645523,945.586548 241.673523,943.691772
+ C236.918732,941.306946 232.535446,938.999817 227.820953,936.574585
+ C226.244507,935.628296 224.999268,934.800171 223.433960,933.916199
+ C220.384354,931.811035 217.654785,929.761658 214.705933,927.427490
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M259.050751,949.351562
+ C259.414948,949.238953 259.970612,949.351013 260.737427,949.657593
+ C260.379791,949.760193 259.811005,949.668213 259.050751,949.351562
+z"/>
+<path fill="#FBBF74" opacity="1.000000" stroke="none"
+ d="
+M262.725647,950.340088
+ C263.123688,950.220886 263.776215,950.327087 264.687195,950.638916
+ C264.290497,950.751526 263.635315,950.658508 262.725647,950.340088
+z"/>
+<path fill="#2E2C2A" opacity="1.000000" stroke="none"
+ d="
+M478.348419,743.347900
+ C455.210907,766.641052 432.325043,789.685913 409.428772,812.720459
+ C398.964447,823.247986 392.577515,823.682678 380.711761,815.029541
+ C358.390045,798.751282 336.016266,782.544189 313.634674,766.348206
+ C308.485413,762.622070 304.857025,758.026367 305.405609,751.358704
+ C306.343109,739.964172 318.782501,734.122070 328.527679,740.756042
+ C338.425537,747.493896 347.914215,754.833557 357.570435,761.925415
+ C369.358521,770.583130 381.134491,779.257324 392.887909,787.903931
+ C402.497681,778.461243 412.187042,769.147583 421.647522,759.606934
+ C454.484741,726.491394 487.175385,693.229980 520.144531,660.246765
+ C523.108032,657.281982 527.463562,654.944580 531.551514,654.052673
+ C537.212158,652.817749 541.907532,655.862061 544.815735,660.940613
+ C547.714111,666.002258 547.541199,671.199585 544.325562,676.045410
+ C542.776978,678.379089 540.766357,680.441223 538.781982,682.445190
+ C518.741638,702.683411 498.663422,722.884033 478.348419,743.347900
+z"/>
+<path fill="#FA6874" opacity="1.000000" stroke="none"
+ d="
+M593.420898,547.380493
+ C587.876953,532.894287 591.945801,520.028687 604.713928,511.268127
+ C613.009094,505.576569 622.493408,502.910583 632.282715,501.611450
+ C653.758911,498.761261 675.140747,498.679108 695.949158,505.874756
+ C705.594299,509.210144 713.404175,515.040283 717.625061,524.607910
+ C724.129761,539.352295 716.867798,556.312317 700.942017,564.045959
+ C690.086609,569.317322 678.396240,570.794800 666.527588,571.451294
+ C650.300415,572.348877 634.203430,571.600586 618.538757,566.947998
+ C607.850586,563.773560 598.709778,558.279968 593.420898,547.380493
+z"/>
+<path fill="#FA6874" opacity="1.000000" stroke="none"
+ d="
+M430.520630,521.645142
+ C438.867523,538.172668 432.444458,555.846741 415.380096,564.060608
+ C404.512909,569.291504 392.799683,570.704712 380.966400,571.480652
+ C365.764771,572.477539 350.641968,571.840271 335.888275,567.858521
+ C330.658661,566.447205 325.442627,564.265930 320.819763,561.451599
+ C301.548828,549.719604 300.820587,525.188904 319.125580,511.965790
+ C327.736176,505.745728 337.681488,503.097290 347.966248,501.604187
+ C366.927155,498.851624 385.820618,499.216125 404.435089,504.045685
+ C414.973907,506.780029 424.412872,511.494080 430.520630,521.645142
+z"/>
+<path fill="#54E6DD" opacity="1.000000" stroke="none"
+ d="
+M683.619385,745.466919
+ C700.328857,746.028748 707.980652,763.200256 699.725586,774.944824
+ C695.674194,780.708801 690.032715,783.173584 683.002625,783.160950
+ C646.186951,783.094604 609.371033,783.142639 572.555237,783.141907
+ C557.395813,783.141663 542.236023,783.172302 527.076965,783.090088
+ C514.631836,783.022522 505.949615,775.067200 506.035461,763.984863
+ C506.119385,753.155151 514.636780,745.744324 527.290955,745.732788
+ C574.934998,745.689270 622.578979,745.717346 670.223022,745.693970
+ C674.549194,745.691833 678.875183,745.513611 683.619385,745.466919
+z"/>
+<path fill="#2E2C2B" opacity="1.000000" stroke="none"
+ d="
+M573.774963,517.974915
+ C579.713318,522.207764 581.639832,527.759460 580.340332,534.374939
+ C575.193726,560.573547 558.985962,577.006897 534.178406,585.122131
+ C505.757721,594.419189 473.917084,585.187134 456.439301,563.146667
+ C449.907104,554.909119 445.820068,545.483887 444.109802,535.145996
+ C441.973785,522.234802 451.910858,512.758362 463.056824,516.828613
+ C468.217896,518.713257 471.571320,522.458679 472.075714,527.791504
+ C474.801666,556.611938 513.555176,568.437317 537.482544,551.629333
+ C545.466309,546.021118 550.224304,538.380920 552.040833,528.681213
+ C554.096924,517.702332 563.290527,513.203308 573.774963,517.974915
+z"/>
+<path fill="#2E2B2B" opacity="1.000000" stroke="none"
+ d="
+M339.727905,431.729614
+ C366.645386,406.159454 407.427307,408.627106 428.760559,437.055054
+ C431.594604,440.831604 433.785217,445.326324 435.282349,449.818817
+ C437.887146,457.635101 434.161804,465.975098 427.099426,469.884247
+ C420.260956,473.669586 412.669189,472.167053 406.737183,465.999939
+ C401.674011,460.736115 396.940247,455.024902 391.265015,450.512360
+ C383.656525,444.462585 378.804321,444.608063 371.034668,450.868103
+ C365.369873,455.432312 360.625397,461.126282 355.360992,466.202850
+ C348.371613,472.942932 338.238922,472.561127 331.880798,465.395721
+ C327.625061,460.599701 326.267822,454.662567 328.746185,449.117493
+ C331.469757,443.023926 335.828156,437.661072 339.727905,431.729614
+z"/>
+<path fill="#2E2C2B" opacity="1.000000" stroke="none"
+ d="
+M627.881714,452.842285
+ C623.856323,457.079926 620.080261,461.064819 616.356384,465.097839
+ C609.730530,472.273621 602.081177,473.821533 595.025513,469.367218
+ C587.804260,464.808380 584.819092,455.860718 588.567383,447.426849
+ C595.618164,431.562134 608.181335,421.662506 624.522034,416.614532
+ C649.069153,409.031464 676.143799,418.297729 689.778137,438.934937
+ C692.195496,442.593872 694.083984,446.886444 695.058716,451.151093
+ C696.739807,458.505768 692.859985,465.590668 686.240051,469.049805
+ C679.697083,472.468719 672.520691,471.415222 666.995239,465.968567
+ C662.849915,461.882324 659.164978,457.305450 654.848511,453.421021
+ C644.515686,444.122406 639.186340,444.087555 627.881714,452.842285
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M755.767639,349.434631
+ C756.118408,349.550903 756.520142,349.956268 756.965637,350.658020
+ C756.612427,350.544189 756.215515,350.133972 755.767639,349.434631
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M754.728271,348.381989
+ C754.928955,348.308350 755.267212,348.504425 755.744934,348.965271
+ C755.544861,349.037262 755.205383,348.844452 754.728271,348.381989
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M757.097778,351.261414
+ C757.283936,351.237732 757.526184,351.471436 757.857178,351.945251
+ C757.682007,351.963135 757.417908,351.740967 757.097778,351.261414
+z"/>
+<path fill="#F7A543" opacity="1.000000" stroke="none"
+ d="
+M752.991760,346.306854
+ C753.187683,346.278656 753.458069,346.521759 753.822815,347.025085
+ C753.633545,347.049652 753.349854,346.813904 752.991760,346.306854
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M835.979858,827.381470
+ C836.178833,827.963501 836.348572,828.921509 836.192383,829.951416
+ C835.894592,829.267944 835.922607,828.512756 835.979858,827.381470
+z"/>
+<path fill="#F2BB78" opacity="1.000000" stroke="none"
+ d="
+M837.971436,818.370667
+ C838.148560,818.952576 838.299622,819.897827 838.112549,820.875366
+ C837.831360,820.183167 837.888306,819.458557 837.971436,818.370667
+z"/>
+</svg> \ No newline at end of file
diff --git a/src/manifest/mstile-150x150.png b/src/manifest/mstile-150x150.png
new file mode 100644
index 0000000..6fec85c
--- /dev/null
+++ b/src/manifest/mstile-150x150.png
Binary files differ
diff --git a/src/manifest/safari-pinned-tab.svg b/src/manifest/safari-pinned-tab.svg
new file mode 100644
index 0000000..e4096f0
--- /dev/null
+++ b/src/manifest/safari-pinned-tab.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="1024.000000pt" height="1024.000000pt" viewBox="0 0 1024.000000 1024.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+</metadata>
+<g transform="translate(0.000000,1024.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M4925 10226 c-11 -7 -24 -15 -30 -16 -5 -2 -18 -5 -27 -8 -10 -2 -18
+-7 -18 -11 0 -3 -13 -12 -30 -19 -40 -18 -160 -140 -185 -188 -11 -22 -24 -42
+-30 -46 -5 -4 -6 -8 -1 -8 5 0 4 -6 -1 -12 -8 -11 -22 -49 -27 -78 -1 -3 -5
+-11 -9 -17 -4 -7 -10 -50 -14 -95 -5 -83 9 -165 42 -246 8 -18 14 -35 14 -37
+0 -3 10 -15 21 -27 11 -12 20 -28 20 -35 0 -7 3 -13 8 -13 4 0 16 -14 27 -30
+11 -16 23 -30 27 -30 4 0 26 -19 49 -42 41 -41 42 -43 18 -45 -13 -1 -184 -4
+-379 -6 -331 -4 -386 -8 -450 -34 -8 -4 -18 -7 -22 -8 -5 -2 -9 -3 -10 -5 -2
+-1 -11 -3 -20 -5 -32 -6 -168 -77 -168 -88 0 -6 -3 -7 -6 -4 -4 3 -16 1 -27
+-5 -13 -7 -166 -11 -451 -13 -237 -1 -440 -5 -451 -7 -11 -3 -41 -9 -67 -12
+-26 -4 -50 -11 -53 -17 -4 -5 -10 -7 -15 -4 -6 4 -72 -12 -105 -25 -3 -1 -14
+-4 -25 -7 -11 -3 -20 -10 -20 -15 0 -5 -4 -7 -9 -4 -5 4 -30 -3 -55 -14 -26
+-11 -49 -19 -53 -19 -3 0 -9 -3 -12 -8 -3 -4 -31 -20 -61 -35 -70 -35 -93 -50
+-103 -65 -4 -7 -13 -13 -18 -13 -38 0 -261 -210 -330 -310 -13 -19 -27 -37
+-30 -40 -13 -11 -89 -145 -89 -157 0 -7 -4 -13 -10 -13 -5 0 -10 -6 -10 -14 0
+-8 -13 -43 -30 -78 -32 -71 -58 -164 -62 -225 -1 -13 -5 -23 -9 -23 -4 0 -6
+-15 -5 -34 1 -19 -2 -32 -6 -30 -11 7 -11 -1 -13 -773 0 -474 3 -703 10 -703
+7 0 7 -3 0 -8 -14 -10 -16 -112 -1 -112 7 0 7 -3 1 -8 -14 -10 -14 -105 -1
+-114 7 -5 7 -8 1 -8 -11 0 -13 -109 -2 -126 3 -6 4 -14 0 -17 -10 -11 -9
+-1086 1 -1080 5 4 6 0 1 -8 -13 -19 -12 -668 0 -673 7 -3 7 -5 0 -5 -11 -1
+-11 -113 -1 -130 4 -6 4 -11 -1 -11 -10 0 -8 -163 1 -179 4 -6 4 -11 -1 -11
+-9 0 -8 -154 2 -170 3 -5 3 -10 -2 -10 -4 0 -6 -81 -3 -181 3 -99 2 -189 -2
+-199 -4 -11 -4 -21 0 -24 8 -5 6 -80 -2 -102 -2 -6 -2 -15 1 -18 5 -5 5 -35 2
+-151 0 -5 1 -52 2 -103 1 -51 -1 -95 -4 -98 -3 -3 -2 -18 3 -32 4 -15 3 -37
+-1 -50 -5 -14 -5 -22 3 -22 7 0 7 -4 -1 -13 -6 -8 -9 -16 -6 -18 9 -9 12 -79
+3 -79 -5 0 -6 -5 -3 -10 4 -6 7 -101 7 -213 0 -135 4 -207 12 -216 8 -12 8
+-13 -2 -7 -10 6 -12 -2 -11 -33 2 -23 8 -41 13 -41 6 0 5 -4 -3 -9 -13 -8 -13
+-12 0 -27 8 -10 9 -15 2 -11 -8 5 -11 -4 -10 -33 1 -22 5 -40 10 -40 4 0 5 -5
+1 -12 -10 -15 -13 -68 -4 -68 3 0 6 -9 7 -20 1 -12 -3 -18 -9 -14 -6 4 -6 -1
+1 -14 6 -11 11 -37 11 -56 0 -20 3 -36 8 -36 4 0 8 -10 8 -22 1 -25 11 -91 15
+-95 1 -2 2 -6 3 -10 7 -37 51 -153 58 -153 4 0 8 -11 8 -25 0 -14 5 -25 10
+-25 6 0 10 -9 10 -20 0 -11 5 -20 10 -20 6 0 10 -7 10 -17 0 -9 11 -31 26 -50
+14 -18 21 -33 17 -33 -4 0 -3 -4 2 -8 6 -4 23 -26 39 -49 16 -24 50 -65 76
+-93 26 -27 45 -50 43 -50 -2 0 11 -15 29 -34 18 -18 36 -31 40 -29 5 2 8 -3 8
+-11 0 -9 5 -16 10 -16 6 0 22 -11 35 -25 14 -13 25 -22 25 -20 0 3 9 -3 19
+-12 38 -35 50 -43 65 -43 7 0 17 -7 20 -16 4 -9 9 -14 12 -11 4 3 13 -1 21 -9
+9 -8 22 -13 29 -10 8 3 11 0 7 -10 -3 -9 1 -14 13 -14 9 0 25 -7 34 -15 9 -8
+29 -16 43 -17 15 -1 27 -5 27 -8 0 -3 15 -11 33 -18 17 -8 41 -18 52 -23 11
+-6 30 -11 43 -12 12 0 22 -6 22 -11 0 -5 3 -7 6 -4 3 3 31 -1 62 -10 31 -8 68
+-16 82 -16 14 -1 32 -6 40 -12 22 -13 4543 -18 4635 -4 109 16 124 19 195 39
+104 29 180 59 192 76 4 5 8 7 8 2 0 -4 11 0 25 9 14 9 25 13 25 9 0 -4 7 -1
+16 6 17 14 49 34 74 45 19 9 147 102 178 129 58 50 112 108 112 117 0 6 3 9 6
+5 7 -7 60 54 56 65 -1 4 4 8 11 8 7 0 31 27 52 61 22 33 48 72 57 87 10 15 23
+39 29 55 6 15 15 27 20 27 4 0 6 7 3 15 -4 8 -1 15 5 15 6 0 11 6 11 13 0 6 6
+24 14 38 13 25 45 116 47 131 0 4 5 22 10 40 13 42 19 67 23 98 28 185 29 234
+22 2430 -11 3831 -10 3729 -33 3780 -3 8 -7 22 -8 30 -1 8 -5 22 -8 30 -4 8
+-8 26 -11 40 -2 14 -10 39 -16 55 -33 79 -44 104 -68 155 -36 76 -110 190
+-123 190 -6 0 -9 5 -7 11 5 14 -54 78 -65 72 -4 -3 -7 -1 -6 4 3 16 -1 36 -6
+31 -3 -3 -36 24 -73 58 -37 35 -71 64 -75 64 -5 0 -21 12 -36 28 -15 15 -41
+34 -57 42 -16 8 -38 23 -48 33 -11 9 -25 17 -32 17 -6 0 -17 7 -24 15 -7 8
+-16 12 -21 9 -5 -3 -9 0 -9 5 0 6 -9 11 -20 11 -11 0 -20 5 -20 10 0 6 -9 10
+-20 10 -11 0 -20 4 -20 8 0 9 -119 52 -144 52 -9 0 -16 4 -16 8 0 7 -24 12
+-67 15 -7 0 -13 3 -13 7 0 4 -6 7 -12 7 -7 1 -39 5 -70 10 -40 7 -61 7 -69 -1
+-9 -8 -10 -8 -5 2 5 8 0 12 -13 12 -12 0 -21 -6 -21 -12 0 -10 -2 -10 -9 0 -5
+9 -31 13 -77 13 -38 0 -181 2 -319 5 -236 5 -252 7 -285 28 -59 38 -205 100
+-230 99 -3 0 -16 3 -29 8 -69 27 -260 34 -788 29 -100 -1 -187 1 -193 5 -11 7
+11 35 27 35 15 0 143 141 137 151 -3 5 -1 9 4 9 11 0 52 81 52 103 0 9 5 19
+11 22 6 4 8 13 5 20 -2 7 -2 16 2 19 16 16 24 183 10 202 -5 7 -8 16 -7 20 1
+5 0 12 -1 17 -3 9 -4 13 -15 52 -15 58 -107 200 -138 213 -4 2 -22 17 -40 33
+-17 16 -37 29 -44 29 -7 0 -13 4 -13 8 0 5 -10 13 -22 19 -13 6 -36 17 -53 24
+-16 8 -36 20 -43 27 -20 18 -330 17 -357 -2z m245 -329 c34 -7 60 -19 60 -27
+0 -5 9 -12 21 -15 11 -4 18 -9 15 -12 -3 -3 0 -11 7 -19 32 -35 37 -45 39 -69
+1 -14 5 -25 8 -25 3 0 5 -13 5 -30 1 -16 -2 -30 -6 -30 -4 0 -6 -11 -4 -25 1
+-14 -1 -25 -6 -25 -4 0 -10 -8 -14 -19 -6 -21 -55 -77 -55 -64 0 4 -4 3 -8 -3
+-12 -19 -70 -44 -102 -44 -22 0 -29 -4 -24 -12 6 -10 5 -10 -8 -1 -8 7 -27 14
+-42 15 -14 1 -26 6 -26 10 0 4 -6 8 -13 8 -7 0 -23 9 -34 19 -12 11 -24 17
+-27 14 -3 -4 -6 1 -6 10 0 10 -4 17 -9 17 -26 0 -60 164 -38 181 4 3 10 16 12
+30 3 13 9 25 15 27 6 2 9 7 7 10 -2 4 10 19 25 34 15 15 28 24 28 21 0 -3 7 0
+16 8 25 21 103 28 164 16z"/>
+</g>
+</svg>
diff --git a/src/manifest/site.webmanifest b/src/manifest/site.webmanifest
new file mode 100644
index 0000000..ada3b78
--- /dev/null
+++ b/src/manifest/site.webmanifest
@@ -0,0 +1,24 @@
+{
+ "name": "Donetick: Simplify Tasks & Chores, Together.",
+ "short_name": "Donetick",
+ "description": "An open-source, user-friendly app for managing tasks and chores, featuring customizable options to help you and others stay organized",
+ "start_url": "/index.html",
+ "scope": "/",
+ "lang": "en",
+
+ "icons": [
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/src/service/AuthenticationService.jsx b/src/service/AuthenticationService.jsx
new file mode 100644
index 0000000..924de11
--- /dev/null
+++ b/src/service/AuthenticationService.jsx
@@ -0,0 +1,18 @@
+import React, { createContext, useState } from 'react'
+
+const AuthenticationContext = createContext({})
+
+const AuthenticationProvider = ({ children }) => {
+ const [isLoggedIn, setIsLoggedIn] = useState(false)
+ const [userProfile, setUserProfile] = useState({})
+ return (
+ <AuthenticationContext.Provider
+ value={{ isLoggedIn, setIsLoggedIn, userProfile, setUserProfile }}
+ >
+ {children}
+ </AuthenticationContext.Provider>
+ )
+}
+export { AuthenticationContext, AuthenticationProvider }
+
+// export default AuthenticationProvider;
diff --git a/src/utils/Fetcher.jsx b/src/utils/Fetcher.jsx
new file mode 100644
index 0000000..6444b34
--- /dev/null
+++ b/src/utils/Fetcher.jsx
@@ -0,0 +1,250 @@
+import { API_URL } from '../Config'
+import { Fetch, HEADERS } from './TokenManager'
+
+const createChore = userID => {
+ return Fetch(`${API_URL}/chores/`, {
+ method: 'POST',
+ headers: HEADERS(),
+ body: JSON.stringify({
+ createdBy: Number(userID),
+ }),
+ }).then(response => response.json())
+}
+
+const signUp = (username, password, displayName, email) => {
+ return fetch(`${API_URL}/auth/`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ username, password, displayName, email }),
+ })
+}
+
+const login = (username, password) => {
+ return fetch(`${API_URL}/auth/login`, {
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ method: 'POST',
+ body: JSON.stringify({ username, password }),
+ })
+}
+
+const GetAllUsers = () => {
+ return fetch(`${API_URL}/users/`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const GetChores = () => {
+ return Fetch(`${API_URL}/chores/`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const GetChoreByID = id => {
+ return Fetch(`${API_URL}/chores/${id}`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+const CreateChore = chore => {
+ return Fetch(`${API_URL}/chores/`, {
+ method: 'POST',
+ headers: HEADERS(),
+ body: JSON.stringify(chore),
+ })
+}
+
+const DeleteChore = id => {
+ return Fetch(`${API_URL}/chores/${id}`, {
+ method: 'DELETE',
+ headers: HEADERS(),
+ })
+}
+
+const SaveChore = chore => {
+ console.log('chore', chore)
+ return Fetch(`${API_URL}/chores/`, {
+ method: 'PUT',
+ headers: HEADERS(),
+ body: JSON.stringify(chore),
+ })
+}
+const GetChoreHistory = choreId => {
+ return Fetch(`${API_URL}/chores/${choreId}/history`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const GetAllCircleMembers = () => {
+ return Fetch(`${API_URL}/circles/members`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const GetUserProfile = () => {
+ return Fetch(`${API_URL}/users/profile`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const GetUserCircle = () => {
+ return Fetch(`${API_URL}/circles/`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const JoinCircle = inviteCode => {
+ return Fetch(`${API_URL}/circles/join?invite_code=${inviteCode}`, {
+ method: 'POST',
+ headers: HEADERS(),
+ })
+}
+
+const GetCircleMemberRequests = () => {
+ return Fetch(`${API_URL}/circles/members/requests`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const AcceptCircleMemberRequest = id => {
+ return Fetch(`${API_URL}/circles/members/requests/accept?requestId=${id}`, {
+ method: 'PUT',
+ headers: HEADERS(),
+ })
+}
+
+const LeaveCircle = id => {
+ return Fetch(`${API_URL}/circles/leave?circle_id=${id}`, {
+ method: 'DELETE',
+ headers: HEADERS(),
+ })
+}
+
+const DeleteCircleMember = (circleID, memberID) => {
+ return Fetch(
+ `${API_URL}/circles/${circleID}/members/delete?member_id=${memberID}`,
+ {
+ method: 'DELETE',
+ headers: HEADERS(),
+ },
+ )
+}
+
+const UpdateUserDetails = userDetails => {
+ return Fetch(`${API_URL}/users`, {
+ method: 'PUT',
+ headers: HEADERS(),
+ body: JSON.stringify(userDetails),
+ })
+}
+
+const GetSubscriptionSession = () => {
+ return Fetch(API_URL + `/payments/create-subscription`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+
+const CancelSubscription = () => {
+ return Fetch(API_URL + `/payments/cancel-subscription`, {
+ method: 'POST',
+ headers: HEADERS(),
+ })
+}
+
+const GetThings = () => {
+ return Fetch(`${API_URL}/things`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+const CreateThing = thing => {
+ return Fetch(`${API_URL}/things`, {
+ method: 'POST',
+ headers: HEADERS(),
+ body: JSON.stringify(thing),
+ })
+}
+
+const SaveThing = thing => {
+ return Fetch(`${API_URL}/things`, {
+ method: 'PUT',
+ headers: HEADERS(),
+ body: JSON.stringify(thing),
+ })
+}
+
+const UpdateThingState = thing => {
+ return Fetch(`${API_URL}/things/${thing.id}/state?value=${thing.state}`, {
+ method: 'PUT',
+ headers: HEADERS(),
+ })
+}
+const DeleteThing = id => {
+ return Fetch(`${API_URL}/things/${id}`, {
+ method: 'DELETE',
+ headers: HEADERS(),
+ })
+}
+
+const CreateLongLiveToken = name => {
+ return Fetch(`${API_URL}/users/tokens`, {
+ method: 'POST',
+ headers: HEADERS(),
+ body: JSON.stringify({ name }),
+ })
+}
+const DeleteLongLiveToken = id => {
+ return Fetch(`${API_URL}/users/tokens/${id}`, {
+ method: 'DELETE',
+ headers: HEADERS(),
+ })
+}
+
+const GetLongLiveTokens = () => {
+ return Fetch(`${API_URL}/users/tokens`, {
+ method: 'GET',
+ headers: HEADERS(),
+ })
+}
+export {
+ AcceptCircleMemberRequest,
+ CancelSubscription,
+ createChore,
+ CreateChore,
+ CreateLongLiveToken,
+ CreateThing,
+ DeleteChore,
+ DeleteCircleMember,
+ DeleteLongLiveToken,
+ DeleteThing,
+ GetAllCircleMembers,
+ GetAllUsers,
+ GetChoreByID,
+ GetChoreHistory,
+ GetChores,
+ GetCircleMemberRequests,
+ GetLongLiveTokens,
+ GetSubscriptionSession,
+ GetThings,
+ GetUserCircle,
+ GetUserProfile,
+ JoinCircle,
+ LeaveCircle,
+ login,
+ SaveChore,
+ SaveThing,
+ signUp,
+ UpdateThingState,
+ UpdateUserDetails,
+}
diff --git a/src/utils/Helpers.jsx b/src/utils/Helpers.jsx
new file mode 100644
index 0000000..17c0351
--- /dev/null
+++ b/src/utils/Helpers.jsx
@@ -0,0 +1,7 @@
+import moment from 'moment'
+
+const isPlusAccount = userProfile => {
+ return userProfile?.expiration && moment(userProfile?.expiration).isAfter()
+}
+
+export { isPlusAccount }
diff --git a/src/utils/TokenManager.jsx b/src/utils/TokenManager.jsx
new file mode 100644
index 0000000..35472e4
--- /dev/null
+++ b/src/utils/TokenManager.jsx
@@ -0,0 +1,65 @@
+import Cookies from 'js-cookie'
+import { API_URL } from '../Config'
+export function Fetch(url, options) {
+ if (!isTokenValid()) {
+ console.log('FETCH: Token is not valid')
+ console.log(localStorage.getItem('ca_token'))
+ // store current location in cookie
+ Cookies.set('ca_redirect', window.location.pathname)
+ // Assuming you have a function isTokenValid() that checks token validity
+ window.location.href = '/login' // Redirect to login page
+ // return Promise.reject("Token is not valid");
+ }
+ if (!options) {
+ options = {}
+ }
+ options.headers = { ...options.headers, ...HEADERS() }
+
+ return fetch(url, options)
+}
+
+export const HEADERS = () => {
+ return {
+ 'Content-Type': 'application/json',
+ Authorization: 'Bearer ' + localStorage.getItem('ca_token'),
+ }
+}
+
+export const isTokenValid = () => {
+ const expiration = localStorage.getItem('ca_expiration')
+ const token = localStorage.getItem('ca_token')
+
+ if (localStorage.getItem('ca_token')) {
+ const now = new Date()
+ const expire = new Date(expiration)
+ if (now < expire) {
+ if (now.getTime() + 24 * 60 * 60 * 1000 > expire.getTime()) {
+ refreshAccessToken()
+ }
+
+ return true
+ } else {
+ localStorage.removeItem('ca_token')
+ localStorage.removeItem('ca_expiration')
+ }
+ return false
+ }
+}
+
+export const refreshAccessToken = () => {
+ fetch(API_URL + '/auth/refresh', {
+ method: 'GET',
+ headers: HEADERS(),
+ }).then(res => {
+ if (res.status === 200) {
+ res.json().then(data => {
+ localStorage.setItem('ca_token', data.token)
+ localStorage.setItem('ca_expiration', data.expire)
+ })
+ } else {
+ return res.json().then(error => {
+ console.log(error)
+ })
+ }
+ })
+}
diff --git a/src/views/Authorization/AuthorizationContainer.jsx b/src/views/Authorization/AuthorizationContainer.jsx
new file mode 100644
index 0000000..3bfc622
--- /dev/null
+++ b/src/views/Authorization/AuthorizationContainer.jsx
@@ -0,0 +1,45 @@
+// import Logo from 'Components/Logo'
+import { Box, Paper } from '@mui/material'
+import { styled } from '@mui/material/styles'
+
+const Container = styled('div')(({ theme }) => ({
+ minHeight: '100vh',
+ padding: '24px',
+ display: 'grid',
+ placeItems: 'start center',
+ [theme.breakpoints.up('sm')]: {
+ // center children
+ placeItems: 'center',
+ },
+}))
+
+const AuthCard = styled(Paper)(({ theme }) => ({
+ // border: "1px solid #c4c4c4",
+ padding: 24,
+ paddingTop: 32,
+ borderRadius: 24,
+ width: '100%',
+ maxWidth: '400px',
+ [theme.breakpoints.down('sm')]: {
+ maxWidth: 'unset',
+ },
+}))
+
+export default function AuthCardContainer({ children, ...props }) {
+ return (
+ <Container>
+ <AuthCard elevation={0}>
+ <Box
+ sx={{
+ display: 'grid',
+ placeItems: 'center',
+ paddingBottom: 4,
+ }}
+ >
+ {/* <Logo size='96px' /> */}
+ </Box>
+ {children}
+ </AuthCard>
+ </Container>
+ )
+}
diff --git a/src/views/Authorization/ForgotPasswordView.jsx b/src/views/Authorization/ForgotPasswordView.jsx
new file mode 100644
index 0000000..44601eb
--- /dev/null
+++ b/src/views/Authorization/ForgotPasswordView.jsx
@@ -0,0 +1,227 @@
+// create boilerplate for ResetPasswordView:
+import {
+ Box,
+ Button,
+ Container,
+ FormControl,
+ FormHelperText,
+ Input,
+ Sheet,
+ Snackbar,
+ Typography,
+} from '@mui/joy'
+import { useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+
+import { API_URL } from './../../Config'
+
+const ForgotPasswordView = () => {
+ const navigate = useNavigate()
+ // const [showLoginSnackbar, setShowLoginSnackbar] = useState(false)
+ // const [snackbarMessage, setSnackbarMessage] = useState('')
+ const [resetStatusOk, setResetStatusOk] = useState(null)
+ const [email, setEmail] = useState('')
+ const [emailError, setEmailError] = useState(null)
+
+ const validateEmail = email => {
+ return !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(email)
+ }
+
+ const handleSubmit = async () => {
+ if (!email) {
+ return setEmailError('Email is required')
+ }
+
+ // validate email:
+ if (validateEmail(email)) {
+ setEmailError('Please enter a valid email address')
+ return
+ }
+
+ if (emailError) {
+ return
+ }
+
+ try {
+ const response = await fetch(`${API_URL}/auth/reset`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ email: email }),
+ })
+
+ if (response.ok) {
+ setResetStatusOk(true)
+ // wait 3 seconds and then redirect to login:
+ } else {
+ setResetStatusOk(false)
+ }
+ } catch (error) {
+ setResetStatusOk(false)
+ }
+ }
+
+ const handleEmailChange = e => {
+ setEmail(e.target.value)
+ if (validateEmail(e.target.value)) {
+ setEmailError('Please enter a valid email address')
+ } else {
+ setEmailError(null)
+ }
+ }
+
+ return (
+ <Container
+ component='main'
+ maxWidth='xs'
+
+ // make content center in the middle of the page:
+ >
+ <Box
+ sx={{
+ marginTop: 4,
+ display: 'flex',
+ flexDirection: 'column',
+
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ }}
+ >
+ <Sheet
+ component='form'
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ minHeight: '70vh',
+ justifyContent: 'space-between',
+ justifyItems: 'center',
+ }}
+ >
+ <Box>
+ <img
+ src='/src/assets/logo.svg'
+ alt='logo'
+ width='128px'
+ height='128px'
+ />
+ {/* <Logo /> */}
+ <Typography level='h2'>
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+ </Box>
+ {/* HERE */}
+ <Box sx={{ textAlign: 'center' }}></Box>
+ {resetStatusOk === null && (
+ <form onSubmit={handleSubmit}>
+ <div className='grid gap-6'>
+ <Typography level='body2' gutterBottom>
+ Enter your email, and we'll send you a link to get into your
+ account.
+ </Typography>
+ <FormControl error={emailError !== null}>
+ <Input
+ placeholder='Email'
+ type='email'
+ variant='soft'
+ fullWidth
+ size='lg'
+ value={email}
+ onChange={handleEmailChange}
+ error={emailError !== null}
+ onKeyDown={e => {
+ if (e.key === 'Enter') {
+ e.preventDefault()
+ handleSubmit()
+ }
+ }}
+ />
+ <FormHelperText>{emailError}</FormHelperText>
+ </FormControl>
+ <Box>
+ <Button
+ variant='solid'
+ size='lg'
+ fullWidth
+ sx={{
+ mb: 1,
+ }}
+ onClick={handleSubmit}
+ >
+ Reset Password
+ </Button>
+ <Button
+ fullWidth
+ size='lg'
+ variant='soft'
+ sx={{
+ width: '100%',
+ border: 'moccasin',
+ borderRadius: '8px',
+ }}
+ onClick={() => {
+ navigate('/login')
+ }}
+ color='neutral'
+ >
+ Back to Login
+ </Button>
+ </Box>
+ </div>
+ </form>
+ )}
+ {resetStatusOk != null && (
+ <>
+ <Box mt={-30}>
+ <Typography level='body-md'>
+ if there is an account associated with the email you entered,
+ you will receive an email with instructions on how to reset
+ your
+ </Typography>
+ </Box>
+ <Button
+ variant='soft'
+ size='lg'
+ sx={{ position: 'relative', bottom: '0' }}
+ onClick={() => {
+ navigate('/login')
+ }}
+ fullWidth
+ >
+ Go to Login
+ </Button>
+ </>
+ )}
+ <Snackbar
+ open={resetStatusOk ? resetStatusOk : resetStatusOk === false}
+ autoHideDuration={5000}
+ onClose={() => {
+ if (resetStatusOk) {
+ navigate('/login')
+ }
+ }}
+ >
+ {resetStatusOk
+ ? 'Reset email sent, check your email'
+ : 'Reset email failed, try again later'}
+ </Snackbar>
+ </Sheet>
+ </Box>
+ </Container>
+ )
+}
+
+export default ForgotPasswordView
diff --git a/src/views/Authorization/LoginView.jsx b/src/views/Authorization/LoginView.jsx
new file mode 100644
index 0000000..2ffcef4
--- /dev/null
+++ b/src/views/Authorization/LoginView.jsx
@@ -0,0 +1,345 @@
+import GoogleIcon from '@mui/icons-material/Google'
+import {
+ Avatar,
+ Box,
+ Button,
+ Container,
+ Divider,
+ Input,
+ Sheet,
+ Snackbar,
+ Typography,
+} from '@mui/joy'
+import Cookies from 'js-cookie'
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { LoginSocialGoogle } from 'reactjs-social-login'
+import { API_URL, GOOGLE_CLIENT_ID, REDIRECT_URL } from '../../Config'
+import { UserContext } from '../../contexts/UserContext'
+import Logo from '../../Logo'
+import { GetUserProfile } from '../../utils/Fetcher'
+const LoginView = () => {
+ const { userProfile, setUserProfile } = React.useContext(UserContext)
+ const [username, setUsername] = React.useState('')
+ const [password, setPassword] = React.useState('')
+ const [error, setError] = React.useState(null)
+ const Navigate = useNavigate()
+ const handleSubmit = async e => {
+ e.preventDefault()
+
+ fetch(`${API_URL}/auth/login`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ username, password }),
+ })
+ .then(response => {
+ if (response.status === 200) {
+ return response.json().then(data => {
+ localStorage.setItem('ca_token', data.token)
+ localStorage.setItem('ca_expiration', data.expire)
+ const redirectUrl = Cookies.get('ca_redirect')
+ // console.log('redirectUrl', redirectUrl)
+ if (redirectUrl) {
+ Cookies.remove('ca_redirect')
+ Navigate(redirectUrl)
+ } else {
+ Navigate('/my/chores')
+ }
+ })
+ } else if (response.status === 401) {
+ setError('Wrong username or password')
+ } else {
+ setError('An error occurred, please try again')
+ console.log('Login failed')
+ }
+ })
+ .catch(err => {
+ setError('Unable to communicate with server, please try again')
+ console.log('Login failed', err)
+ })
+ }
+
+ const loggedWithProvider = function (provider, data) {
+ console.log(provider, data)
+ return fetch(API_URL + `/auth/${provider}/callback`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ provider: provider,
+ token:
+ data['access_token'] || // data["access_token"] is for Google
+ data['accessToken'], // data["accessToken"] is for Facebook
+ data: data,
+ }),
+ }).then(response => {
+ if (response.status === 200) {
+ return response.json().then(data => {
+ localStorage.setItem('ca_token', data.token)
+ localStorage.setItem('ca_expiration', data.expire)
+ // setIsLoggedIn(true);
+ getUserProfileAndNavigateToHome()
+ })
+ }
+ return response.json().then(error => {
+ setError("Couldn't log in with Google, please try again")
+ })
+ })
+ }
+ const getUserProfileAndNavigateToHome = () => {
+ GetUserProfile().then(data => {
+ data.json().then(data => {
+ setUserProfile(data.res)
+ // check if redirect url is set in cookie:
+ const redirectUrl = Cookies.get('ca_redirect')
+ if (redirectUrl) {
+ Cookies.remove('ca_redirect')
+ Navigate(redirectUrl)
+ } else {
+ Navigate('/my/chores')
+ }
+ })
+ })
+ }
+ const handleForgotPassword = () => {
+ Navigate('/forgot-password')
+ }
+ return (
+ <Container
+ component='main'
+ maxWidth='xs'
+
+ // make content center in the middle of the page:
+ >
+ <Box
+ sx={{
+ marginTop: 4,
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ }}
+ >
+ <Sheet
+ component='form'
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ }}
+ >
+ {/* <img
+ src='/src/assets/logo.svg'
+ alt='logo'
+ width='128px'
+ height='128px'
+ /> */}
+ <Logo />
+
+ <Typography level='h2'>
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+
+ {userProfile && (
+ <>
+ <Avatar
+ src={userProfile?.image}
+ alt={userProfile?.username}
+ size='lg'
+ sx={{
+ mt: 2,
+ width: '96px',
+ height: '96px',
+ mb: 1,
+ }}
+ />
+ <Typography level='body-md' alignSelf={'center'}>
+ Welcome back,{' '}
+ {userProfile?.displayName || userProfile?.username}
+ </Typography>
+
+ <Button
+ fullWidth
+ size='lg'
+ sx={{ mt: 3, mb: 2 }}
+ onClick={() => {
+ getUserProfileAndNavigateToHome()
+ }}
+ >
+ Continue as {userProfile.displayName || userProfile.username}
+ </Button>
+ <Button
+ type='submit'
+ fullWidth
+ size='lg'
+ q
+ variant='plain'
+ sx={{
+ width: '100%',
+ mb: 2,
+ border: 'moccasin',
+ borderRadius: '8px',
+ }}
+ onClick={() => {
+ setUserProfile(null)
+ localStorage.removeItem('ca_token')
+ localStorage.removeItem('ca_expiration')
+ // go to login page:
+ window.location.href = '/login'
+ }}
+ >
+ Logout
+ </Button>
+ </>
+ )}
+ {!userProfile && (
+ <>
+ <Typography level='body2'>
+ Sign in to your account to continue
+ </Typography>
+ <Typography level='body2' alignSelf={'start'} mt={4}>
+ Username
+ </Typography>
+ <Input
+ margin='normal'
+ required
+ fullWidth
+ id='email'
+ label='Email Address'
+ name='email'
+ autoComplete='email'
+ autoFocus
+ value={username}
+ onChange={e => {
+ setUsername(e.target.value)
+ }}
+ />
+ <Typography level='body2' alignSelf={'start'}>
+ Password:
+ </Typography>
+ <Input
+ margin='normal'
+ required
+ fullWidth
+ name='password'
+ label='Password'
+ type='password'
+ id='password'
+ value={password}
+ onChange={e => {
+ setPassword(e.target.value)
+ }}
+ />
+
+ <Button
+ type='submit'
+ fullWidth
+ size='lg'
+ variant='solid'
+ sx={{
+ width: '100%',
+ mt: 3,
+ mb: 2,
+ border: 'moccasin',
+ borderRadius: '8px',
+ }}
+ onClick={handleSubmit}
+ >
+ Sign In
+ </Button>
+ <Button
+ type='submit'
+ fullWidth
+ size='lg'
+ q
+ variant='plain'
+ sx={{
+ width: '100%',
+ mb: 2,
+ border: 'moccasin',
+ borderRadius: '8px',
+ }}
+ onClick={handleForgotPassword}
+ >
+ Forgot password?
+ </Button>
+ </>
+ )}
+ <Divider> or </Divider>
+
+ <Box sx={{ width: '100%' }}>
+ <LoginSocialGoogle
+ client_id={GOOGLE_CLIENT_ID}
+ redirect_uri={REDIRECT_URL}
+ scope='openid profile email'
+ discoveryDocs='claims_supported'
+ access_type='online'
+ isOnlyGetToken={true}
+ onResolve={({ provider, data }) => {
+ loggedWithProvider(provider, data)
+ }}
+ onReject={err => {
+ setError("Couldn't log in with Google, please try again")
+ }}
+ >
+ <Button
+ variant='soft'
+ color='neutral'
+ size='lg'
+ fullWidth
+ sx={{
+ width: '100%',
+ mt: 1,
+ mb: 1,
+ border: 'moccasin',
+ borderRadius: '8px',
+ }}
+ >
+ <div className='flex gap-2'>
+ <GoogleIcon />
+ Continue with Google
+ </div>
+ </Button>
+ </LoginSocialGoogle>
+ </Box>
+
+ <Button
+ onClick={() => {
+ Navigate('/signup')
+ }}
+ fullWidth
+ variant='soft'
+ size='lg'
+ // sx={{ mt: 3, mb: 2 }}
+ >
+ Create new account
+ </Button>
+ </Sheet>
+ </Box>
+ <Snackbar
+ open={error !== null}
+ onClose={() => setError(null)}
+ autoHideDuration={3000}
+ message={error}
+ >
+ {error}
+ </Snackbar>
+ </Container>
+ )
+}
+
+export default LoginView
diff --git a/src/views/Authorization/Signup.jsx b/src/views/Authorization/Signup.jsx
new file mode 100644
index 0000000..d83411f
--- /dev/null
+++ b/src/views/Authorization/Signup.jsx
@@ -0,0 +1,243 @@
+import {
+ Box,
+ Button,
+ Container,
+ Divider,
+ FormControl,
+ FormHelperText,
+ Input,
+ Sheet,
+ Typography,
+} from '@mui/joy'
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import Logo from '../../Logo'
+import { login, signUp } from '../../utils/Fetcher'
+
+const SignupView = () => {
+ const [username, setUsername] = React.useState('')
+ const [password, setPassword] = React.useState('')
+ const Navigate = useNavigate()
+ const [displayName, setDisplayName] = React.useState('')
+ const [email, setEmail] = React.useState('')
+ const [usernameError, setUsernameError] = React.useState('')
+ const [passwordError, setPasswordError] = React.useState('')
+ const [emailError, setEmailError] = React.useState('')
+ const [displayNameError, setDisplayNameError] = React.useState('')
+ const [error, setError] = React.useState(null)
+ const handleLogin = (username, password) => {
+ login(username, password).then(response => {
+ if (response.status === 200) {
+ response.json().then(res => {
+ localStorage.setItem('ca_token', res.token)
+ localStorage.setItem('ca_expiration', res.expire)
+ setTimeout(() => {
+ // TODO: not sure if there is a race condition here
+ // but on first sign up it renavigates to login.
+ Navigate('/my/chores')
+ }, 500)
+ })
+ } else {
+ console.log('Login failed', response)
+ // Navigate('/login')
+ }
+ })
+ }
+ const handleSignUpValidation = () => {
+ // Reset errors before validation
+ setUsernameError(null)
+ setPasswordError(null)
+ setDisplayNameError(null)
+ setEmailError(null)
+
+ let isValid = true
+
+ if (!username.trim()) {
+ setUsernameError('Username is required')
+ isValid = false
+ }
+ if (username.length < 4) {
+ setUsernameError('Username must be at least 4 characters')
+ isValid = false
+ }
+ // if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
+ // setEmailError('Invalid email address')
+ // isValid = false
+ // }
+
+ if (password.length < 8) {
+ setPasswordError('Password must be at least 8 characters')
+ isValid = false
+ }
+
+ if (!displayName.trim()) {
+ setDisplayNameError('Display name is required')
+ isValid = false
+ }
+
+ // display name should only contain letters and spaces and numbers:
+ if (!/^[a-zA-Z0-9 ]+$/.test(displayName)) {
+ setDisplayNameError('Display name can only contain letters and numbers')
+ isValid = false
+ }
+
+ // username should only contain letters , numbers , dot and dash:
+ if (!/^[a-zA-Z0-9.-]+$/.test(username)) {
+ setUsernameError(
+ 'Username can only contain letters, numbers, dot and dash',
+ )
+ isValid = false
+ }
+
+ return isValid
+ }
+ const handleSubmit = async e => {
+ e.preventDefault()
+ if (!handleSignUpValidation()) {
+ return
+ }
+ signUp(username, password, displayName, email).then(response => {
+ if (response.status === 201) {
+ handleLogin(username, password)
+ } else {
+ console.log('Signup failed')
+ setError('Signup failed')
+ }
+ })
+ }
+
+ return (
+ <Container component='main' maxWidth='xs'>
+ <Box
+ sx={{
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ marginTop: 4,
+ }}
+ >
+ <Sheet
+ component='form'
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ // alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ }}
+ >
+ <Box
+ sx={{
+ display: 'flex',
+ alignItems: 'center',
+ flexDirection: 'column',
+ }}
+ >
+ <Logo />
+ <Typography level='h2'>
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+ <Typography level='body2'>
+ Create an account to get started!
+ </Typography>
+ </Box>
+ <Typography level='body2' alignSelf={'start'} mt={4}>
+ Username
+ </Typography>
+ <Input
+ margin='normal'
+ required
+ fullWidth
+ id='email'
+ label='Email Address'
+ name='email'
+ autoComplete='email'
+ autoFocus
+ value={username}
+ onChange={e => {
+ setUsernameError(null)
+ setUsername(e.target.value.trim())
+ }}
+ />
+ <FormControl error={usernameError}>
+ <FormHelperText c>{usernameError}</FormHelperText>
+ </FormControl>
+ {/* Error message display */}
+ <Typography level='body2' alignSelf={'start'}>
+ Password:
+ </Typography>
+ <Input
+ margin='normal'
+ required
+ fullWidth
+ name='password'
+ label='Password'
+ type='password'
+ id='password'
+ value={password}
+ onChange={e => {
+ setPasswordError(null)
+ setPassword(e.target.value)
+ }}
+ />
+ <FormControl error={passwordError}>
+ <FormHelperText>{passwordError}</FormHelperText>
+ </FormControl>
+ <Typography level='body2' alignSelf={'start'}>
+ Display Name:
+ </Typography>
+ <Input
+ margin='normal'
+ required
+ fullWidth
+ name='displayName'
+ label='Display Name'
+ id='displayName'
+ value={displayName}
+ onChange={e => {
+ setDisplayNameError(null)
+ setDisplayName(e.target.value)
+ }}
+ />
+ <FormControl error={displayNameError}>
+ <FormHelperText>{displayNameError}</FormHelperText>
+ </FormControl>
+ <Button
+ // type='submit'
+ size='lg'
+ fullWidth
+ variant='solid'
+ sx={{ mt: 3, mb: 1 }}
+ onClick={handleSubmit}
+ >
+ Sign Up
+ </Button>
+ <Divider> or </Divider>
+ <Button
+ size='lg'
+ onClick={() => {
+ Navigate('/login')
+ }}
+ fullWidth
+ variant='soft'
+ // sx={{ mt: 3, mb: 2 }}
+ >
+ Login
+ </Button>
+ </Sheet>
+ </Box>
+ </Container>
+ )
+}
+
+export default SignupView
diff --git a/src/views/Authorization/UpdatePasswordView.jsx b/src/views/Authorization/UpdatePasswordView.jsx
new file mode 100644
index 0000000..7177f2f
--- /dev/null
+++ b/src/views/Authorization/UpdatePasswordView.jsx
@@ -0,0 +1,194 @@
+// create boilerplate for ResetPasswordView:
+import {
+ Box,
+ Button,
+ Container,
+ FormControl,
+ FormHelperText,
+ Input,
+ Sheet,
+ Snackbar,
+ Typography,
+} from '@mui/joy'
+import { useState } from 'react'
+import { useNavigate, useSearchParams } from 'react-router-dom'
+
+import { API_URL } from '../../Config'
+import Logo from '../../Logo'
+
+const UpdatePasswordView = () => {
+ const navigate = useNavigate()
+ const [password, setPassword] = useState('')
+ const [passwordConfirm, setPasswordConfirm] = useState('')
+ const [passwordError, setPasswordError] = useState(null)
+ const [passworConfirmationError, setPasswordConfirmationError] =
+ useState(null)
+ const [searchParams] = useSearchParams()
+
+ const [updateStatusOk, setUpdateStatusOk] = useState(null)
+
+ const verifiticationCode = searchParams.get('c')
+
+ const handlePasswordChange = e => {
+ const password = e.target.value
+ setPassword(password)
+ if (password.length < 8) {
+ setPasswordError('Password must be at least 8 characters')
+ } else {
+ setPasswordError(null)
+ }
+ }
+ const handlePasswordConfirmChange = e => {
+ setPasswordConfirm(e.target.value)
+ if (e.target.value !== password) {
+ setPasswordConfirmationError('Passwords do not match')
+ } else {
+ setPasswordConfirmationError(null)
+ }
+ }
+
+ const handleSubmit = async () => {
+ if (passwordError != null || passworConfirmationError != null) {
+ return
+ }
+ try {
+ const response = await fetch(
+ `${API_URL}/auth/password?c=${verifiticationCode}`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ password: password }),
+ },
+ )
+
+ if (response.ok) {
+ setUpdateStatusOk(true)
+ // wait 3 seconds and then redirect to login:
+ setTimeout(() => {
+ navigate('/login')
+ }, 3000)
+ } else {
+ setUpdateStatusOk(false)
+ }
+ } catch (error) {
+ setUpdateStatusOk(false)
+ }
+ }
+ return (
+ <Container component='main' maxWidth='xs'>
+ <Box
+ sx={{
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ marginTop: 4,
+ }}
+ >
+ <Sheet
+ component='form'
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ // alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ }}
+ >
+ <Box
+ sx={{
+ display: 'flex',
+ alignItems: 'center',
+ flexDirection: 'column',
+ }}
+ >
+ <Logo />
+ <Typography level='h2'>
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+ <Typography level='body2' mb={4}>
+ Please enter your new password below
+ </Typography>
+ </Box>
+
+ <FormControl error>
+ <Input
+ placeholder='Password'
+ type='password'
+ value={password}
+ onChange={handlePasswordChange}
+ error={passwordError !== null}
+ // onKeyDown={e => {
+ // if (e.key === 'Enter' && validateForm(validateFormInput)) {
+ // handleSubmit(e)
+ // }
+ // }}
+ />
+ <FormHelperText>{passwordError}</FormHelperText>
+ </FormControl>
+
+ <FormControl error>
+ <Input
+ placeholder='Confirm Password'
+ type='password'
+ value={passwordConfirm}
+ onChange={handlePasswordConfirmChange}
+ error={passworConfirmationError !== null}
+ // onKeyDown={e => {
+ // if (e.key === 'Enter' && validateForm(validateFormInput)) {
+ // handleSubmit(e)
+ // }
+ // }}
+ />
+ <FormHelperText>{passworConfirmationError}</FormHelperText>
+ </FormControl>
+ {/* helper to show password not matching : */}
+
+ <Button
+ fullWidth
+ size='lg'
+ sx={{
+ mt: 5,
+ mb: 1,
+ }}
+ onClick={handleSubmit}
+ >
+ Save Password
+ </Button>
+ <Button
+ fullWidth
+ size='lg'
+ variant='soft'
+ onClick={() => {
+ navigate('/login')
+ }}
+ >
+ Cancel
+ </Button>
+ </Sheet>
+ </Box>
+ <Snackbar
+ open={updateStatusOk !== true}
+ autoHideDuration={6000}
+ onClose={() => {
+ setUpdateStatusOk(null)
+ }}
+ >
+ Password update failed, try again later
+ </Snackbar>
+ </Container>
+ )
+}
+
+export default UpdatePasswordView
diff --git a/src/views/ChoreEdit/ChoreEdit.jsx b/src/views/ChoreEdit/ChoreEdit.jsx
new file mode 100644
index 0000000..e8eb17d
--- /dev/null
+++ b/src/views/ChoreEdit/ChoreEdit.jsx
@@ -0,0 +1,744 @@
+import {
+ Box,
+ Button,
+ Card,
+ Checkbox,
+ Chip,
+ Container,
+ Divider,
+ FormControl,
+ FormHelperText,
+ Input,
+ List,
+ ListItem,
+ Option,
+ Radio,
+ RadioGroup,
+ Select,
+ Sheet,
+ Typography,
+} from '@mui/joy'
+import moment from 'moment'
+import { useContext, useEffect, useState } from 'react'
+import { useNavigate, useParams } from 'react-router-dom'
+import { UserContext } from '../../contexts/UserContext'
+import {
+ CreateChore,
+ DeleteChore,
+ GetAllCircleMembers,
+ GetChoreByID,
+ GetChoreHistory,
+ GetThings,
+ SaveChore,
+} from '../../utils/Fetcher'
+import { isPlusAccount } from '../../utils/Helpers'
+import FreeSoloCreateOption from '../components/AutocompleteSelect'
+import ConfirmationModal from '../Modals/Inputs/ConfirmationModal'
+import RepeatSection from './RepeatSection'
+const ASSIGN_STRATEGIES = [
+ 'random',
+ 'least_assigned',
+ 'least_completed',
+ 'keep_last_assigned',
+]
+const REPEAT_ON_TYPE = ['interval', 'days_of_the_week', 'day_of_the_month']
+
+const NO_DUE_DATE_REQUIRED_TYPE = ['no_repeat', 'once']
+const NO_DUE_DATE_ALLOWED_TYPE = ['trigger']
+const ChoreEdit = () => {
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ const [chore, setChore] = useState([])
+ const [choresHistory, setChoresHistory] = useState([])
+ const [userHistory, setUserHistory] = useState({})
+ const { choreId } = useParams()
+ const [name, setName] = useState('')
+ const [confirmModelConfig, setConfirmModelConfig] = useState({})
+ const [assignees, setAssignees] = useState([])
+ const [performers, setPerformers] = useState([])
+ const [assignStrategy, setAssignStrategy] = useState(ASSIGN_STRATEGIES[2])
+ const [dueDate, setDueDate] = useState(null)
+ const [completed, setCompleted] = useState(false)
+ const [completedDate, setCompletedDate] = useState('')
+ const [assignedTo, setAssignedTo] = useState(-1)
+ const [frequencyType, setFrequencyType] = useState('once')
+ const [frequency, setFrequency] = useState(1)
+ const [frequencyMetadata, setFrequencyMetadata] = useState({})
+ const [labels, setLabels] = useState([])
+ const [allUserThings, setAllUserThings] = useState([])
+ const [thingTrigger, setThingTrigger] = useState({})
+ const [isThingValid, setIsThingValid] = useState(false)
+
+ const [notificationMetadata, setNotificationMetadata] = useState({})
+
+ const [isRolling, setIsRolling] = useState(false)
+ const [isNotificable, setIsNotificable] = useState(false)
+ const [isActive, setIsActive] = useState(true)
+ const [updatedBy, setUpdatedBy] = useState(0)
+ const [createdBy, setCreatedBy] = useState(0)
+ const [errors, setErrors] = useState({})
+ const [attemptToSave, setAttemptToSave] = useState(false)
+
+ const Navigate = useNavigate()
+
+ const HandleValidateChore = () => {
+ const errors = {}
+
+ if (name.trim() === '') {
+ errors.name = 'Name is required'
+ }
+ if (assignees.length === 0) {
+ errors.assignees = 'At least 1 assignees is required'
+ }
+ if (assignedTo < 0) {
+ errors.assignedTo = 'Assigned to is required'
+ }
+ if (frequencyType === 'interval' && frequency < 1) {
+ errors.frequency = 'Frequency is required'
+ }
+ if (
+ frequencyType === 'days_of_the_week' &&
+ frequencyMetadata['days']?.length === 0
+ ) {
+ errors.frequency = 'At least 1 day is required'
+ }
+ if (
+ frequencyType === 'day_of_the_month' &&
+ frequencyMetadata['months']?.length === 0
+ ) {
+ errors.frequency = 'At least 1 month is required'
+ }
+ if (
+ dueDate === null &&
+ !NO_DUE_DATE_REQUIRED_TYPE.includes(frequencyType) &&
+ !NO_DUE_DATE_ALLOWED_TYPE.includes(frequencyType)
+ ) {
+ if (REPEAT_ON_TYPE.includes(frequencyType)) {
+ errors.dueDate = 'Start date is required'
+ } else {
+ errors.dueDate = 'Due date is required'
+ }
+ }
+ if (frequencyType === 'trigger') {
+ if (!isThingValid) {
+ errors.thingTrigger = 'Thing trigger is invalid'
+ }
+ }
+
+ // if there is any error then return false:
+ setErrors(errors)
+ if (Object.keys(errors).length > 0) {
+ return false
+ }
+ return true
+ }
+
+ const HandleSaveChore = () => {
+ setAttemptToSave(true)
+ if (!HandleValidateChore()) {
+ console.log('validation failed')
+ console.log(errors)
+ return
+ }
+ const chore = {
+ id: Number(choreId),
+ name: name,
+ assignees: assignees,
+ dueDate: dueDate ? new Date(dueDate).toISOString() : null,
+ frequencyType: frequencyType,
+ frequency: Number(frequency),
+ frequencyMetadata: frequencyMetadata,
+ assignedTo: assignedTo,
+ assignStrategy: assignStrategy,
+ isRolling: isRolling,
+ isActive: isActive,
+ notification: isNotificable,
+ labels: labels,
+ notificationMetadata: notificationMetadata,
+ thingTrigger: thingTrigger,
+ }
+ let SaveFunction = CreateChore
+ if (choreId > 0) {
+ SaveFunction = SaveChore
+ }
+
+ SaveFunction(chore).then(response => {
+ if (response.status === 200) {
+ Navigate(`/my/chores`)
+ } else {
+ alert('Failed to save chore')
+ }
+ })
+ }
+ useEffect(() => {
+ //fetch performers:
+ GetAllCircleMembers()
+ .then(response => response.json())
+ .then(data => {
+ setPerformers(data.res)
+ })
+ GetThings().then(response => {
+ response.json().then(data => {
+ setAllUserThings(data.res)
+ })
+ })
+ // fetch chores:
+ if (choreId > 0) {
+ GetChoreByID(choreId)
+ .then(response => {
+ if (response.status !== 200) {
+ alert('You are not authorized to view this chore.')
+ Navigate('/my/chores')
+ return null
+ } else {
+ return response.json()
+ }
+ })
+ .then(data => {
+ setChore(data.res)
+ setName(data.res.name ? data.res.name : '')
+ setAssignees(data.res.assignees ? data.res.assignees : [])
+ setAssignedTo(data.res.assignedTo)
+ setFrequencyType(
+ data.res.frequencyType ? data.res.frequencyType : 'once',
+ )
+
+ setFrequencyMetadata(JSON.parse(data.res.frequencyMetadata))
+ setFrequency(data.res.frequency)
+
+ setNotificationMetadata(JSON.parse(data.res.notificationMetadata))
+ setLabels(data.res.labels ? data.res.labels.split(',') : [])
+
+ setAssignStrategy(
+ data.res.assignStrategy
+ ? data.res.assignStrategy
+ : ASSIGN_STRATEGIES[2],
+ )
+ setIsRolling(data.res.isRolling)
+ setIsActive(data.res.isActive)
+ // parse the due date to a string from this format "2021-10-10T00:00:00.000Z"
+ // use moment.js or date-fns to format the date for to be usable in the input field:
+ setDueDate(
+ data.res.nextDueDate
+ ? moment(data.res.nextDueDate).format('YYYY-MM-DDTHH:mm:ss')
+ : null,
+ )
+ setUpdatedBy(data.res.updatedBy)
+ setCreatedBy(data.res.createdBy)
+ setIsNotificable(data.res.notification)
+ setThingTrigger(data.res.thingChore)
+ // setDueDate(data.res.dueDate)
+ // setCompleted(data.res.completed)
+ // setCompletedDate(data.res.completedDate)
+ })
+
+ // fetch chores history:
+ GetChoreHistory(choreId)
+ .then(response => response.json())
+ .then(data => {
+ setChoresHistory(data.res)
+ const newUserChoreHistory = {}
+ data.res.forEach(choreHistory => {
+ if (newUserChoreHistory[choreHistory.completedBy]) {
+ newUserChoreHistory[choreHistory.completedBy] += 1
+ } else {
+ newUserChoreHistory[choreHistory.completedBy] = 1
+ }
+ })
+
+ setUserHistory(newUserChoreHistory)
+ })
+ }
+ // set focus on the first input field:
+ else {
+ // new task/ chore set focus on the first input field:
+ document.querySelector('input').focus()
+ }
+ }, [])
+
+ useEffect(() => {
+ // if frequancy type change to somthing need a due date then set it to the current date:
+ if (!NO_DUE_DATE_REQUIRED_TYPE.includes(frequencyType) && !dueDate) {
+ setDueDate(moment(new Date()).format('YYYY-MM-DDTHH:mm:00'))
+ }
+ if (NO_DUE_DATE_ALLOWED_TYPE.includes(frequencyType)) {
+ setDueDate(null)
+ }
+ }, [frequencyType])
+
+ useEffect(() => {
+ if (assignees.length === 1) {
+ setAssignedTo(assignees[0].userId)
+ }
+ }, [assignees])
+
+ useEffect(() => {
+ if (performers.length > 0 && assignees.length === 0) {
+ setAssignees([
+ {
+ userId: userProfile.id,
+ },
+ ])
+ }
+ }, [performers])
+
+ // if user resolve the error trigger validation to remove the error message from the respective field
+ useEffect(() => {
+ if (attemptToSave) {
+ HandleValidateChore()
+ }
+ }, [assignees, name, frequencyMetadata, attemptToSave, dueDate])
+
+ const handleDelete = () => {
+ setConfirmModelConfig({
+ isOpen: true,
+ title: 'Delete Chore',
+ confirmText: 'Delete',
+ cancelText: 'Cancel',
+ message: 'Are you sure you want to delete this chore?',
+ onClose: isConfirmed => {
+ if (isConfirmed === true) {
+ DeleteChore(choreId).then(response => {
+ if (response.status === 200) {
+ Navigate('/my/chores')
+ } else {
+ alert('Failed to delete chore')
+ }
+ })
+ }
+ setConfirmModelConfig({})
+ },
+ })
+ }
+ return (
+ <Container maxWidth='md'>
+ {/* <Typography level='h3' mb={1.5}>
+ Edit Chore
+ </Typography> */}
+ <Box>
+ <FormControl error={errors.name}>
+ <Typography level='h4'>Descritpion :</Typography>
+ <Typography level='h5'>What is this chore about?</Typography>
+ <Input value={name} onChange={e => setName(e.target.value)} />
+ <FormHelperText error>{errors.name}</FormHelperText>
+ </FormControl>
+ </Box>
+ <Box mt={2}>
+ <Typography level='h4'>Assignees :</Typography>
+ <Typography level='h5'>Who can do this chore?</Typography>
+ <Card>
+ <List
+ orientation='horizontal'
+ wrap
+ sx={{
+ '--List-gap': '8px',
+ '--ListItem-radius': '20px',
+ }}
+ >
+ {performers?.map((item, index) => (
+ <ListItem key={item.id}>
+ <Checkbox
+ // disabled={index === 0}
+ checked={assignees.find(a => a.userId == item.id) != null}
+ onClick={() => {
+ if (assignees.find(a => a.userId == item.id)) {
+ setAssignees(assignees.filter(i => i.userId !== item.id))
+ } else {
+ setAssignees([...assignees, { userId: item.id }])
+ }
+ }}
+ overlay
+ disableIcon
+ variant='soft'
+ label={item.displayName}
+ />
+ </ListItem>
+ ))}
+ </List>
+ </Card>
+ <FormControl error={Boolean(errors.assignee)}>
+ <FormHelperText error>{Boolean(errors.assignee)}</FormHelperText>
+ </FormControl>
+ </Box>
+ {assignees.length > 1 && (
+ // this wrap the details that needed if we have more than one assingee
+ // we need to pick the next assignedTo and also the strategy to pick the next assignee.
+ // if we have only one then no need to display this section
+ <>
+ <Box mt={2}>
+ <Typography level='h4'>Assigned :</Typography>
+ <Typography level='h5'>
+ Who is assigned the next due chore?
+ </Typography>
+
+ <Select
+ placeholder={
+ assignees.length === 0
+ ? 'No Assignees yet can perform this chore'
+ : 'Select an assignee for this chore'
+ }
+ disabled={assignees.length === 0}
+ value={assignedTo > -1 ? assignedTo : null}
+ >
+ {performers
+ ?.filter(p => assignees.find(a => a.userId == p.userId))
+ .map((item, index) => (
+ <Option
+ value={item.id}
+ key={item.displayName}
+ onClick={() => {
+ setAssignedTo(item.id)
+ }}
+ >
+ {item.displayName}
+ {/* <Chip size='sm' color='neutral' variant='soft'>
+ </Chip> */}
+ </Option>
+ ))}
+ </Select>
+ </Box>
+ <Box mt={2}>
+ <Typography level='h4'>Picking Mode :</Typography>
+ <Typography level='h5'>
+ How to pick the next assignee for the following chore?
+ </Typography>
+
+ <Card>
+ <List
+ orientation='horizontal'
+ wrap
+ sx={{
+ '--List-gap': '8px',
+ '--ListItem-radius': '20px',
+ }}
+ >
+ {ASSIGN_STRATEGIES.map((item, idx) => (
+ <ListItem key={item}>
+ <Checkbox
+ // disabled={index === 0}
+ checked={assignStrategy === item}
+ onClick={() => setAssignStrategy(item)}
+ overlay
+ disableIcon
+ variant='soft'
+ label={item
+ .split('_')
+ .map(x => x.charAt(0).toUpperCase() + x.slice(1))
+ .join(' ')}
+ />
+ </ListItem>
+ ))}
+ </List>
+ </Card>
+ </Box>
+ </>
+ )}
+ <RepeatSection
+ frequency={frequency}
+ onFrequencyUpdate={setFrequency}
+ frequencyType={frequencyType}
+ onFrequencyTypeUpdate={setFrequencyType}
+ frequencyMetadata={frequencyMetadata}
+ onFrequencyMetadataUpdate={setFrequencyMetadata}
+ frequencyError={errors?.frequency}
+ allUserThings={allUserThings}
+ onTriggerUpdate={thingUpdate => {
+ if (thingUpdate === null) {
+ setThingTrigger(null)
+ return
+ }
+ setThingTrigger({
+ triggerState: thingUpdate.triggerState,
+ condition: thingUpdate.condition,
+ thingID: thingUpdate.thing.id,
+ })
+ }}
+ OnTriggerValidate={setIsThingValid}
+ isAttemptToSave={attemptToSave}
+ selectedThing={thingTrigger}
+ />
+
+ <Box mt={2}>
+ <Typography level='h4'>
+ {REPEAT_ON_TYPE.includes(frequencyType) ? 'Start date' : 'Due date'} :
+ </Typography>
+ {frequencyType === 'trigger' && !dueDate && (
+ <Typography level='body-sm'>
+ Due Date will be set when the trigger of the thing is met
+ </Typography>
+ )}
+
+ {NO_DUE_DATE_REQUIRED_TYPE.includes(frequencyType) && (
+ <FormControl sx={{ mt: 1 }}>
+ <Checkbox
+ onChange={e => {
+ if (e.target.checked) {
+ setDueDate(moment(new Date()).format('YYYY-MM-DDTHH:mm:00'))
+ } else {
+ setDueDate(null)
+ }
+ }}
+ defaultChecked={dueDate !== null}
+ checked={dueDate !== null}
+ value={dueDate !== null}
+ overlay
+ label='Give this task a due date'
+ />
+ <FormHelperText>
+ task needs to be completed by a specific time.
+ </FormHelperText>
+ </FormControl>
+ )}
+ {dueDate && (
+ <FormControl error={Boolean(errors.dueDate)}>
+ <Typography level='h5'>
+ {REPEAT_ON_TYPE.includes(frequencyType)
+ ? 'When does this chore start?'
+ : 'When is the next first time this chore is due?'}
+ </Typography>
+ <Input
+ type='datetime-local'
+ value={dueDate}
+ onChange={e => {
+ setDueDate(e.target.value)
+ }}
+ />
+ <FormHelperText>{errors.dueDate}</FormHelperText>
+ </FormControl>
+ )}
+ </Box>
+ {!['once', 'no_repeat'].includes(frequencyType) && (
+ <Box mt={2}>
+ <Typography level='h4'>Scheduling Preferences: </Typography>
+ <Typography level='h5'>
+ How to reschedule the next due date?
+ </Typography>
+
+ <RadioGroup name='tiers' sx={{ gap: 1, '& > div': { p: 1 } }}>
+ <FormControl>
+ <Radio
+ overlay
+ checked={!isRolling}
+ onClick={() => setIsRolling(false)}
+ label='Reschedule from due date'
+ />
+ <FormHelperText>
+ the next task will be scheduled from the original due date, even
+ if the previous task was completed late
+ </FormHelperText>
+ </FormControl>
+ <FormControl>
+ <Radio
+ overlay
+ checked={isRolling}
+ onClick={() => setIsRolling(true)}
+ label='Reschedule from completion date'
+ />
+ <FormHelperText>
+ the next task will be scheduled from the actual completion date
+ of the previous task
+ </FormHelperText>
+ </FormControl>
+ </RadioGroup>
+ </Box>
+ )}
+ <Box mt={2}>
+ <Typography level='h4'>Notifications : </Typography>
+ <Typography level='h5'>
+ Get Reminders when this task is due or completed
+ {!isPlusAccount(userProfile) && (
+ <Chip variant='soft' color='warning'>
+ Not available in Basic Plan
+ </Chip>
+ )}
+ </Typography>
+
+ <FormControl sx={{ mt: 1 }}>
+ <Checkbox
+ onChange={e => {
+ setIsNotificable(e.target.checked)
+ }}
+ defaultChecked={isNotificable}
+ checked={isNotificable}
+ value={isNotificable}
+ disabled={!isPlusAccount(userProfile)}
+ overlay
+ label='Notify for this task'
+ />
+ <FormHelperText
+ sx={{
+ opacity: !isPlusAccount(userProfile) ? 0.5 : 1,
+ }}
+ >
+ Receive notifications for this task
+ </FormHelperText>
+ </FormControl>
+ </Box>
+ {isNotificable && (
+ <Box
+ ml={4}
+ sx={{
+ display: 'flex',
+ flexDirection: 'column',
+ gap: 2,
+
+ '& > div': { p: 2, borderRadius: 'md', display: 'flex' },
+ }}
+ >
+ <Card variant='outlined'>
+ <Typography level='h5'>
+ What things should trigger the notification?
+ </Typography>
+ {[
+ {
+ title: 'Due Date/Time',
+ description: 'A simple reminder that a task is due',
+ id: 'dueDate',
+ },
+ // {
+ // title: 'Upon Completion',
+ // description: 'A notification when a task is completed',
+ // id: 'completion',
+ // },
+ {
+ title: 'Predued',
+ description: 'before a task is due in few hours',
+ id: 'predue',
+ },
+ {
+ title: 'Overdue',
+ description: 'A notification when a task is overdue',
+ },
+ {
+ title: 'Nagging',
+ description: 'Daily reminders until the task is completed',
+ id: 'nagging',
+ },
+ ].map(item => (
+ <FormControl sx={{ mb: 1 }} key={item.id}>
+ <Checkbox
+ overlay
+ onClick={() => {
+ setNotificationMetadata({
+ ...notificationMetadata,
+ [item.id]: !notificationMetadata[item.id],
+ })
+ }}
+ checked={
+ notificationMetadata ? notificationMetadata[item.id] : false
+ }
+ label={item.title}
+ key={item.title}
+ />
+ <FormHelperText>{item.description}</FormHelperText>
+ </FormControl>
+ ))}
+ </Card>
+ </Box>
+ )}
+ <Box mt={2}>
+ <Typography level='h4'>Labels :</Typography>
+ <Typography level='h5'>
+ Things to remember about this chore or to tag it
+ </Typography>
+ <FreeSoloCreateOption
+ options={labels}
+ onSelectChange={changes => {
+ const newLabels = []
+ changes.map(change => {
+ // if type is string :
+ if (typeof change === 'string') {
+ // add the change to the labels array:
+ newLabels.push(change)
+ } else {
+ newLabels.push(change.inputValue)
+ }
+ })
+ setLabels(newLabels)
+ }}
+ />
+ </Box>
+ {choreId > 0 && (
+ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5 }}>
+ <Sheet
+ sx={{
+ p: 2,
+ borderRadius: 'md',
+ boxShadow: 'sm',
+ }}
+ >
+ <Typography level='body1'>
+ Created by{' '}
+ <Chip variant='solid'>
+ {performers.find(f => f.id === createdBy)?.displayName}
+ </Chip>{' '}
+ {moment(chore.createdAt).fromNow()}
+ </Typography>
+ {(chore.updatedAt && updatedBy > 0 && (
+ <>
+ <Divider sx={{ my: 1 }} />
+
+ <Typography level='body1'>
+ Updated by{' '}
+ <Chip variant='solid'>
+ {performers.find(f => f.id === updatedBy)?.displayName}
+ </Chip>{' '}
+ {moment(chore.updatedAt).fromNow()}
+ </Typography>
+ </>
+ )) || <></>}
+ </Sheet>
+ </Box>
+ )}
+ <Divider sx={{ mb: 9 }} />
+
+ {/* <Box mt={2} alignSelf={'flex-start'} display='flex' gap={2}>
+ <Button onClick={SaveChore}>Save</Button>
+ </Box> */}
+ <Sheet
+ variant='outlined'
+ sx={{
+ position: 'fixed',
+ bottom: 0,
+ left: 0,
+ right: 0,
+ p: 2, // padding
+ display: 'flex',
+ justifyContent: 'flex-end',
+ gap: 2,
+ 'z-index': 1000,
+ bgcolor: 'background.body',
+ boxShadow: 'md', // Add a subtle shadow
+ }}
+ >
+ {choreId > 0 && (
+ <Button
+ color='danger'
+ variant='solid'
+ onClick={() => {
+ // confirm before deleting:
+ handleDelete()
+ }}
+ >
+ Delete
+ </Button>
+ )}
+ <Button
+ color='neutral'
+ variant='outlined'
+ onClick={() => {
+ window.history.back()
+ }}
+ >
+ Cancel
+ </Button>
+ <Button color='primary' variant='solid' onClick={HandleSaveChore}>
+ {choreId > 0 ? 'Save' : 'Create'}
+ </Button>
+ </Sheet>
+ <ConfirmationModal config={confirmModelConfig} />
+ {/* <ChoreHistory ChoreHistory={choresHistory} UsersData={performers} /> */}
+ </Container>
+ )
+}
+
+export default ChoreEdit
diff --git a/src/views/ChoreEdit/RepeatSection.jsx b/src/views/ChoreEdit/RepeatSection.jsx
new file mode 100644
index 0000000..cb680eb
--- /dev/null
+++ b/src/views/ChoreEdit/RepeatSection.jsx
@@ -0,0 +1,496 @@
+import {
+ Box,
+ Card,
+ Checkbox,
+ Chip,
+ FormControl,
+ FormHelperText,
+ Grid,
+ Input,
+ List,
+ ListItem,
+ Option,
+ Radio,
+ RadioGroup,
+ Select,
+ Typography,
+} from '@mui/joy'
+import { useContext, useState } from 'react'
+import { UserContext } from '../../contexts/UserContext'
+import { isPlusAccount } from '../../utils/Helpers'
+import ThingTriggerSection from './ThingTriggerSection'
+
+const FREQUANCY_TYPES_RADIOS = [
+ 'daily',
+ 'weekly',
+ 'monthly',
+ 'yearly',
+ 'adaptive',
+ 'custom',
+]
+
+const FREQUENCY_TYPE_MESSAGE = {
+ adaptive:
+ 'This chore will be scheduled dynamically based on previous completion dates.',
+ custom: 'This chore will be scheduled based on a custom frequency.',
+}
+const REPEAT_ON_TYPE = ['interval', 'days_of_the_week', 'day_of_the_month']
+const FREQUANCY_TYPES = [
+ 'once',
+ 'daily',
+ 'weekly',
+ 'monthly',
+ 'yearly',
+ 'adaptive',
+ ...REPEAT_ON_TYPE,
+]
+const MONTH_WITH_NO_31_DAYS = [
+ // TODO: Handle these months if day is 31
+ 'february',
+ 'april',
+ 'june',
+ 'september',
+ 'november',
+]
+const RepeatOnSections = ({
+ frequencyType,
+ frequency,
+ onFrequencyUpdate,
+ onFrequencyTypeUpdate,
+ frequencyMetadata,
+ onFrequencyMetadataUpdate,
+ things,
+}) => {
+ const [months, setMonths] = useState({})
+ // const [dayOftheMonth, setDayOftheMonth] = useState(1)
+ const [daysOfTheWeek, setDaysOfTheWeek] = useState({})
+ const [monthsOfTheYear, setMonthsOfTheYear] = useState({})
+ const [intervalUnit, setIntervalUnit] = useState('days')
+
+ switch (frequencyType) {
+ case 'interval':
+ return (
+ <Grid item sm={12} sx={{ display: 'flex', alignItems: 'center' }}>
+ <Typography level='h5'>Every: </Typography>
+ <Input
+ type='number'
+ value={frequency}
+ onChange={e => {
+ if (e.target.value < 1) {
+ e.target.value = 1
+ }
+ onFrequencyUpdate(e.target.value)
+ }}
+ />
+ <Select placeholder='Unit' value={intervalUnit}>
+ {['hours', 'days', 'weeks', 'months', 'years'].map(item => (
+ <Option
+ key={item}
+ value={item}
+ onClick={() => {
+ setIntervalUnit(item)
+ onFrequencyMetadataUpdate({
+ unit: item,
+ })
+ }}
+ >
+ {item.charAt(0).toUpperCase() + item.slice(1)}
+ </Option>
+ ))}
+ </Select>
+ </Grid>
+ )
+ case 'days_of_the_week':
+ return (
+ <Grid item sm={12} sx={{ display: 'flex', alignItems: 'center' }}>
+ <Card>
+ <List
+ orientation='horizontal'
+ wrap
+ sx={{
+ '--List-gap': '8px',
+ '--ListItem-radius': '20px',
+ }}
+ >
+ {[
+ 'monday',
+ 'tuesday',
+ 'wednesday',
+ 'thursday',
+ 'friday',
+ 'saturday',
+ 'sunday',
+ ].map(item => (
+ <ListItem key={item}>
+ <Checkbox
+ // disabled={index === 0}
+
+ checked={frequencyMetadata?.days?.includes(item) || false}
+ onClick={() => {
+ const newDaysOfTheWeek = frequencyMetadata['days'] || []
+ if (newDaysOfTheWeek.includes(item)) {
+ newDaysOfTheWeek.splice(
+ newDaysOfTheWeek.indexOf(item),
+ 1,
+ )
+ } else {
+ newDaysOfTheWeek.push(item)
+ }
+
+ onFrequencyMetadataUpdate({
+ days: newDaysOfTheWeek.sort(),
+ })
+ }}
+ overlay
+ disableIcon
+ variant='soft'
+ label={item.charAt(0).toUpperCase() + item.slice(1)}
+ />
+ </ListItem>
+ ))}
+ </List>
+ </Card>
+ </Grid>
+ )
+ case 'day_of_the_month':
+ return (
+ <Grid
+ item
+ sm={12}
+ sx={{
+ display: 'flex',
+ alignItems: 'center',
+ flexDirection: 'column',
+ justifyContent: 'space-between',
+ }}
+ >
+ <Box
+ sx={{
+ display: 'flex',
+ alignItems: 'center',
+ mb: 1.5,
+ }}
+ >
+ <Typography>on the </Typography>
+ <Input
+ sx={{ width: '80px' }}
+ type='number'
+ value={frequency}
+ onChange={e => {
+ if (e.target.value < 1) {
+ e.target.value = 1
+ } else if (e.target.value > 31) {
+ e.target.value = 31
+ }
+ // setDayOftheMonth(e.target.value)
+
+ onFrequencyUpdate(e.target.value)
+ }}
+ />
+ <Typography>of the following month/s: </Typography>
+ </Box>
+ <Card>
+ <List
+ orientation='horizontal'
+ wrap
+ sx={{
+ '--List-gap': '8px',
+ '--ListItem-radius': '20px',
+ }}
+ >
+ {[
+ 'january',
+ 'february',
+ 'march',
+ 'april',
+ 'may',
+ 'june',
+ 'july',
+ 'august',
+ 'september',
+ 'october',
+ 'november',
+ 'december',
+ ].map(item => (
+ <ListItem key={item}>
+ <Checkbox
+ // disabled={index === 0}
+ checked={frequencyMetadata?.months?.includes(item)}
+ // checked={months[item] || false}
+ // onClick={() => {
+ // const newMonthsOfTheYear = {
+ // ...monthsOfTheYear,
+ // }
+ // newMonthsOfTheYear[item] = !newMonthsOfTheYear[item]
+ // onFrequencyMetadataUpdate({
+ // months: newMonthsOfTheYear,
+ // })
+ // setMonthsOfTheYear(newMonthsOfTheYear)
+ // }}
+ onClick={() => {
+ const newMonthsOfTheYear =
+ frequencyMetadata['months'] || []
+ if (newMonthsOfTheYear.includes(item)) {
+ newMonthsOfTheYear.splice(
+ newMonthsOfTheYear.indexOf(item),
+ 1,
+ )
+ } else {
+ newMonthsOfTheYear.push(item)
+ }
+
+ onFrequencyMetadataUpdate({
+ months: newMonthsOfTheYear.sort(),
+ })
+ console.log('newMonthsOfTheYear', newMonthsOfTheYear)
+ // setDaysOfTheWeek(newDaysOfTheWeek)
+ }}
+ overlay
+ disableIcon
+ variant='soft'
+ label={item.charAt(0).toUpperCase() + item.slice(1)}
+ />
+ </ListItem>
+ ))}
+ </List>
+ </Card>
+ </Grid>
+ )
+
+ default:
+ return <></>
+ }
+}
+
+const RepeatSection = ({
+ frequencyType,
+ frequency,
+ onFrequencyUpdate,
+ onFrequencyTypeUpdate,
+ frequencyMetadata,
+ onFrequencyMetadataUpdate,
+ frequencyError,
+ allUserThings,
+ onTriggerUpdate,
+ OnTriggerValidate,
+ isAttemptToSave,
+ selectedThing,
+}) => {
+ const [repeatOn, setRepeatOn] = useState('interval')
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ return (
+ <Box mt={2}>
+ <Typography level='h4'>Repeat :</Typography>
+ <FormControl sx={{ mt: 1 }}>
+ <Checkbox
+ onChange={e => {
+ onFrequencyTypeUpdate(e.target.checked ? 'daily' : 'once')
+ if (e.target.checked) {
+ onTriggerUpdate(null)
+ }
+ }}
+ defaultChecked={!['once', 'trigger'].includes(frequencyType)}
+ checked={!['once', 'trigger'].includes(frequencyType)}
+ value={!['once', 'trigger'].includes(frequencyType)}
+ overlay
+ label='Repeat this task'
+ />
+ <FormHelperText>
+ Is this something needed to be done regularly?
+ </FormHelperText>
+ </FormControl>
+ {!['once', 'trigger'].includes(frequencyType) && (
+ <>
+ <Card sx={{ mt: 1 }}>
+ <Typography level='h5'>How often should it be repeated?</Typography>
+
+ <List
+ orientation='horizontal'
+ wrap
+ sx={{
+ '--List-gap': '8px',
+ '--ListItem-radius': '20px',
+ }}
+ >
+ {FREQUANCY_TYPES_RADIOS.map((item, index) => (
+ <ListItem key={item}>
+ <Checkbox
+ // disabled={index === 0}
+ checked={
+ item === frequencyType ||
+ (item === 'custom' &&
+ REPEAT_ON_TYPE.includes(frequencyType))
+ }
+ // defaultChecked={item === frequencyType}
+ onClick={() => {
+ if (item === 'custom') {
+ onFrequencyTypeUpdate(REPEAT_ON_TYPE[0])
+ onFrequencyUpdate(1)
+ onFrequencyMetadataUpdate({
+ unit: 'days',
+ })
+ return
+ }
+ onFrequencyTypeUpdate(item)
+ }}
+ overlay
+ disableIcon
+ variant='soft'
+ label={
+ item.charAt(0).toUpperCase() +
+ item.slice(1).replace('_', ' ')
+ }
+ />
+ </ListItem>
+ ))}
+ </List>
+ <Typography>{FREQUENCY_TYPE_MESSAGE[frequencyType]}</Typography>
+ {frequencyType === 'custom' ||
+ (REPEAT_ON_TYPE.includes(frequencyType) && (
+ <>
+ <Grid container spacing={1} mt={2}>
+ <Grid item>
+ <Typography>Repeat on:</Typography>
+ <Box
+ sx={{ display: 'flex', alignItems: 'center', gap: 2 }}
+ >
+ <RadioGroup
+ orientation='horizontal'
+ aria-labelledby='segmented-controls-example'
+ name='justify'
+ // value={justify}
+ // onChange={event => setJustify(event.target.value)}
+ sx={{
+ minHeight: 48,
+ padding: '4px',
+ borderRadius: '12px',
+ bgcolor: 'neutral.softBg',
+ '--RadioGroup-gap': '4px',
+ '--Radio-actionRadius': '8px',
+ mb: 1,
+ }}
+ >
+ {REPEAT_ON_TYPE.map(item => (
+ <Radio
+ key={item}
+ color='neutral'
+ checked={item === frequencyType}
+ onClick={() => {
+ if (
+ item === 'day_of_the_month' ||
+ item === 'interval'
+ ) {
+ onFrequencyUpdate(1)
+ }
+ onFrequencyTypeUpdate(item)
+ if (item === 'days_of_the_week') {
+ onFrequencyMetadataUpdate({ days: [] })
+ } else if (item === 'day_of_the_month') {
+ onFrequencyMetadataUpdate({ months: [] })
+ } else if (item === 'interval') {
+ onFrequencyMetadataUpdate({ unit: 'days' })
+ }
+ // setRepeatOn(item)
+ }}
+ value={item}
+ disableIcon
+ label={item
+ .split('_')
+ .map((i, idx) => {
+ // first or last word
+ if (
+ idx === 0 ||
+ idx === item.split('_').length - 1
+ ) {
+ return (
+ i.charAt(0).toUpperCase() + i.slice(1)
+ )
+ }
+ return i
+ })
+ .join(' ')}
+ variant='plain'
+ sx={{
+ px: 2,
+ alignItems: 'center',
+ }}
+ slotProps={{
+ action: ({ checked }) => ({
+ sx: {
+ ...(checked && {
+ bgcolor: 'background.surface',
+ boxShadow: 'sm',
+ '&:hover': {
+ bgcolor: 'background.surface',
+ },
+ }),
+ },
+ }),
+ }}
+ />
+ ))}
+ </RadioGroup>
+ </Box>
+ </Grid>
+
+ <RepeatOnSections
+ frequency={frequency}
+ onFrequencyUpdate={onFrequencyUpdate}
+ frequencyType={frequencyType}
+ onFrequencyTypeUpdate={onFrequencyTypeUpdate}
+ frequencyMetadata={frequencyMetadata || {}}
+ onFrequencyMetadataUpdate={onFrequencyMetadataUpdate}
+ things={allUserThings}
+ />
+ </Grid>
+ </>
+ ))}
+ <FormControl error={Boolean(frequencyError)}>
+ <FormHelperText error>{frequencyError}</FormHelperText>
+ </FormControl>
+ </Card>
+ </>
+ )}
+ <FormControl sx={{ mt: 1 }}>
+ <Checkbox
+ onChange={e => {
+ onFrequencyTypeUpdate(e.target.checked ? 'trigger' : 'once')
+ // if unchecked, set selectedThing to null:
+ if (!e.target.checked) {
+ onTriggerUpdate(null)
+ }
+ }}
+ defaultChecked={frequencyType === 'trigger'}
+ checked={frequencyType === 'trigger'}
+ value={frequencyType === 'trigger'}
+ disabled={!isPlusAccount(userProfile)}
+ overlay
+ label='Trigger this task based on a thing state'
+ />
+ <FormHelperText
+ sx={{
+ opacity: !isPlusAccount(userProfile) ? 0.5 : 1,
+ }}
+ >
+ Is this something that should be done when a thing state changes?{' '}
+ {!isPlusAccount(userProfile) && (
+ <Chip variant='soft' color='warning'>
+ Not available in Basic Plan
+ </Chip>
+ )}
+ </FormHelperText>
+ </FormControl>
+ {frequencyType === 'trigger' && (
+ <ThingTriggerSection
+ things={allUserThings}
+ onTriggerUpdate={onTriggerUpdate}
+ onValidate={OnTriggerValidate}
+ isAttemptToSave={isAttemptToSave}
+ selected={selectedThing}
+ />
+ )}
+ </Box>
+ )
+}
+
+export default RepeatSection
diff --git a/src/views/ChoreEdit/ThingTriggerSection.jsx b/src/views/ChoreEdit/ThingTriggerSection.jsx
new file mode 100644
index 0000000..7a040ad
--- /dev/null
+++ b/src/views/ChoreEdit/ThingTriggerSection.jsx
@@ -0,0 +1,230 @@
+import { Widgets } from '@mui/icons-material'
+import {
+ Autocomplete,
+ Box,
+ Button,
+ Card,
+ Chip,
+ FormControl,
+ FormLabel,
+ Input,
+ ListItem,
+ ListItemContent,
+ ListItemDecorator,
+ Option,
+ Select,
+ TextField,
+ Typography,
+} from '@mui/joy'
+import { useEffect, useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+const isValidTrigger = (thing, condition, triggerState) => {
+ const newErrors = {}
+ if (!thing || !triggerState) {
+ newErrors.thing = 'Please select a thing and trigger state'
+ return false
+ }
+ if (thing.type === 'boolean') {
+ if (['true', 'false'].includes(triggerState)) {
+ return true
+ } else {
+ newErrors.type = 'Boolean type does not require a condition'
+ return false
+ }
+ }
+ if (thing.type === 'number') {
+ if (isNaN(triggerState)) {
+ newErrors.triggerState = 'Trigger state must be a number'
+ return false
+ }
+ if (['eq', 'neq', 'gt', 'gte', 'lt', 'lte'].includes(condition)) {
+ return true
+ }
+ }
+ if (thing.type === 'text') {
+ if (typeof triggerState === 'string') {
+ return true
+ }
+ }
+ newErrors.triggerState = 'Trigger state must be a number'
+
+ return false
+}
+
+const ThingTriggerSection = ({
+ things,
+ onTriggerUpdate,
+ onValidate,
+ selected,
+ isAttepmtingToSave,
+}) => {
+ const [selectedThing, setSelectedThing] = useState(null)
+ const [condition, setCondition] = useState(null)
+ const [triggerState, setTriggerState] = useState(null)
+ const navigate = useNavigate()
+
+ useEffect(() => {
+ if (selected) {
+ setSelectedThing(things?.find(t => t.id === selected.thingId))
+ setCondition(selected.condition)
+ setTriggerState(selected.triggerState)
+ }
+ }, [things])
+
+ useEffect(() => {
+ if (selectedThing && triggerState) {
+ onTriggerUpdate({
+ thing: selectedThing,
+ condition: condition,
+ triggerState: triggerState,
+ })
+ }
+ if (isValidTrigger(selectedThing, condition, triggerState)) {
+ onValidate(true)
+ } else {
+ onValidate(false)
+ }
+ }, [selectedThing, condition, triggerState])
+
+ return (
+ <Card sx={{ mt: 1 }}>
+ <Typography level='h5'>
+ Trigger a task when a thing state changes to a desired state
+ </Typography>
+ {things.length !== 0 && (
+ <Typography level='body-sm'>
+ it's look like you don't have any things yet, create a thing to
+ trigger a task when the state changes.
+ <Button
+ startDecorator={<Widgets />}
+ size='sm'
+ onClick={() => {
+ navigate('/things')
+ }}
+ >
+ Go to Things
+ </Button>{' '}
+ to create a thing
+ </Typography>
+ )}
+ <FormControl error={isAttepmtingToSave && !selectedThing}>
+ <Autocomplete
+ options={things}
+ value={selectedThing}
+ onChange={(e, newValue) => setSelectedThing(newValue)}
+ getOptionLabel={option => option.name}
+ renderOption={(props, option) => (
+ <ListItem {...props}>
+ <Box
+ sx={{
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ p: 1,
+ }}
+ >
+ <ListItemDecorator sx={{ alignSelf: 'flex-start' }}>
+ <Typography level='body-lg' textColor='primary'>
+ {option.name}
+ </Typography>
+ </ListItemDecorator>
+ <ListItemContent>
+ <Typography level='body2' textColor='text.secondary'>
+ <Chip>type: {option.type}</Chip>{' '}
+ <Chip>state: {option.state}</Chip>
+ </Typography>
+ </ListItemContent>
+ </Box>
+ </ListItem>
+ )}
+ renderInput={params => (
+ <TextField {...params} label='Select a thing' />
+ )}
+ />
+ </FormControl>
+ <Typography level='body-sm'>
+ Create a condition to trigger a task when the thing state changes to
+ desired state
+ </Typography>
+ {selectedThing?.type == 'boolean' && (
+ <Box>
+ <Typography level='body-sm'>
+ When the state of {selectedThing.name} changes as specified below,
+ the task will become due.
+ </Typography>
+ <Select
+ value={triggerState}
+ onChange={e => {
+ if (e?.target.value === 'true' || e?.target.value === 'false')
+ setTriggerState(e.target.value)
+ else setTriggerState('false')
+ }}
+ >
+ {['true', 'false'].map(state => (
+ <Option
+ key={state}
+ value={state}
+ onClick={() => setTriggerState(state)}
+ >
+ {state.charAt(0).toUpperCase() + state.slice(1)}
+ </Option>
+ ))}
+ </Select>
+ </Box>
+ )}
+ {selectedThing?.type == 'number' && (
+ <Box>
+ <Typography level='body-sm'>
+ When the state of {selectedThing.name} changes as specified below,
+ the task will become due.
+ </Typography>
+
+ <Box sx={{ display: 'flex', gap: 1, direction: 'row' }}>
+ <Typography level='body-sm'>State is</Typography>
+ <Select value={condition} sx={{ width: '50%' }}>
+ {[
+ { name: 'Equal', value: 'eq' },
+ { name: 'Not equal', value: 'neq' },
+ { name: 'Greater than', value: 'gt' },
+ { name: 'Greater than or equal', value: 'gte' },
+ { name: 'Less than', value: 'lt' },
+ { name: 'Less than or equal', value: 'lte' },
+ ].map(condition => (
+ <Option
+ key={condition.value}
+ value={condition.value}
+ onClick={() => setCondition(condition.value)}
+ >
+ {condition.name}
+ </Option>
+ ))}
+ </Select>
+ <Input
+ type='number'
+ value={triggerState}
+ onChange={e => setTriggerState(e.target.value)}
+ sx={{ width: '50%' }}
+ />
+ </Box>
+ </Box>
+ )}
+ {selectedThing?.type == 'text' && (
+ <Box>
+ <Typography level='body-sm'>
+ When the state of {selectedThing.name} changes as specified below,
+ the task will become due.
+ </Typography>
+
+ <Input
+ value={triggerState}
+ onChange={e => setTriggerState(e.target.value)}
+ label='Enter the text to trigger the task'
+ />
+ </Box>
+ )}
+ </Card>
+ )
+}
+
+export default ThingTriggerSection
diff --git a/src/views/Chores/ChoreCard.jsx b/src/views/Chores/ChoreCard.jsx
new file mode 100644
index 0000000..0b2a408
--- /dev/null
+++ b/src/views/Chores/ChoreCard.jsx
@@ -0,0 +1,578 @@
+import {
+ Check,
+ Delete,
+ Edit,
+ HowToReg,
+ KeyboardDoubleArrowUp,
+ LocalOffer,
+ ManageSearch,
+ MoreTime,
+ MoreVert,
+ NoteAdd,
+ RecordVoiceOver,
+ Repeat,
+ Report,
+ SwitchAccessShortcut,
+ TimesOneMobiledata,
+ Update,
+ Webhook,
+} from '@mui/icons-material'
+import {
+ Avatar,
+ Box,
+ Card,
+ Chip,
+ CircularProgress,
+ Divider,
+ Grid,
+ IconButton,
+ Menu,
+ MenuItem,
+ Typography,
+} from '@mui/joy'
+import moment from 'moment'
+import React, { useEffect } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { API_URL } from '../../Config'
+import { Fetch } from '../../utils/TokenManager'
+import ConfirmationModal from '../Modals/Inputs/ConfirmationModal'
+import DateModal from '../Modals/Inputs/DateModal'
+import SelectModal from '../Modals/Inputs/SelectModal'
+import TextModal from '../Modals/Inputs/TextModal'
+const ChoreCard = ({ chore, performers, onChoreUpdate, onChoreRemove, sx }) => {
+ const [activeUserId, setActiveUserId] = React.useState(0)
+ const [isChangeDueDateModalOpen, setIsChangeDueDateModalOpen] =
+ React.useState(false)
+ const [isCompleteWithPastDateModalOpen, setIsCompleteWithPastDateModalOpen] =
+ React.useState(false)
+ const [isChangeAssigneeModalOpen, setIsChangeAssigneeModalOpen] =
+ React.useState(false)
+ const [isCompleteWithNoteModalOpen, setIsCompleteWithNoteModalOpen] =
+ React.useState(false)
+ const [confirmModelConfig, setConfirmModelConfig] = React.useState({})
+ const [anchorEl, setAnchorEl] = React.useState(null)
+ const menuRef = React.useRef(null)
+ const navigate = useNavigate()
+ const [isDisabled, setIsDisabled] = React.useState(false)
+
+ // useEffect(() => {
+ // GetAllUsers()
+ // .then(response => response.json())
+ // .then(data => {
+ // setPerformers(data.res)
+ // })
+ // }, [])
+
+ useEffect(() => {
+ document.addEventListener('mousedown', handleMenuOutsideClick)
+ return () => {
+ document.removeEventListener('mousedown', handleMenuOutsideClick)
+ }
+ }, [anchorEl])
+
+ const handleMenuOpen = event => {
+ setAnchorEl(event.currentTarget)
+ }
+
+ const handleMenuClose = () => {
+ setAnchorEl(null)
+ }
+
+ const handleMenuOutsideClick = event => {
+ if (
+ anchorEl &&
+ !anchorEl.contains(event.target) &&
+ !menuRef.current.contains(event.target)
+ ) {
+ handleMenuClose()
+ }
+ }
+ const handleEdit = () => {
+ navigate(`/chores/${chore.id}/edit`)
+ }
+ const handleDelete = () => {
+ setConfirmModelConfig({
+ isOpen: true,
+ title: 'Delete Chore',
+ confirmText: 'Delete',
+ cancelText: 'Cancel',
+ message: 'Are you sure you want to delete this chore?',
+ onClose: isConfirmed => {
+ console.log('isConfirmed', isConfirmed)
+ if (isConfirmed === true) {
+ Fetch(`${API_URL}/chores/${chore.id}`, {
+ method: 'DELETE',
+ }).then(response => {
+ if (response.ok) {
+ onChoreRemove(chore)
+ }
+ })
+ }
+ setConfirmModelConfig({})
+ },
+ })
+ }
+
+ const handleCompleteChore = () => {
+ Fetch(`${API_URL}/chores/${chore.id}/do`, {
+ method: 'POST',
+ }).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ onChoreUpdate(newChore, 'completed')
+ })
+ }
+ })
+ setIsDisabled(true)
+ setTimeout(() => setIsDisabled(false), 5000) // Re-enable the button after 5 seconds
+ }
+ const handleChangeDueDate = newDate => {
+ if (activeUserId === null) {
+ alert('Please select a performer')
+ return
+ }
+ Fetch(`${API_URL}/chores/${chore.id}/dueDate`, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ dueDate: newDate ? new Date(newDate).toISOString() : null,
+ UpdatedBy: activeUserId,
+ }),
+ }).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ onChoreUpdate(newChore, 'rescheduled')
+ })
+ }
+ })
+ }
+
+ const handleCompleteWithPastDate = newDate => {
+ if (activeUserId === null) {
+ alert('Please select a performer')
+ return
+ }
+ Fetch(
+ `${API_URL}/chores/${chore.id}/do?completedDate=${new Date(
+ newDate,
+ ).toISOString()}`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({}),
+ },
+ ).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ onChoreUpdate(newChore, 'completed')
+ })
+ }
+ })
+ }
+ const handleAssigneChange = assigneeId => {
+ // TODO: Implement assignee change
+ }
+ const handleCompleteWithNote = note => {
+ Fetch(`${API_URL}/chores/${chore.id}/do`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ note: note,
+ }),
+ }).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ onChoreUpdate(newChore, 'completed')
+ })
+ }
+ })
+ }
+ const getDueDateChipText = nextDueDate => {
+ if (chore.nextDueDate === null) return 'No Due Date'
+ // if due in next 48 hours, we should it in this format : Tomorrow 11:00 AM
+ const diff = moment(nextDueDate).diff(moment(), 'hours')
+ if (diff < 48 && diff > 0) {
+ return moment(nextDueDate).calendar().replace(' at', '')
+ }
+ return 'Due ' + moment(nextDueDate).fromNow()
+ }
+ const getDueDateChipColor = nextDueDate => {
+ if (chore.nextDueDate === null) return 'neutral'
+ const diff = moment(nextDueDate).diff(moment(), 'hours')
+ if (diff < 48 && diff > 0) {
+ return 'warning'
+ }
+ if (diff < 0) {
+ return 'danger'
+ }
+
+ return 'neutral'
+ }
+
+ const getIconForLabel = label => {
+ if (!label || label.trim() === '') return <></>
+ switch (String(label).toLowerCase()) {
+ case 'high':
+ return <KeyboardDoubleArrowUp />
+ case 'important':
+ return <Report />
+ default:
+ return <LocalOffer />
+ }
+ }
+
+ const getRecurrentChipText = chore => {
+ const dayOfMonthSuffix = n => {
+ if (n >= 11 && n <= 13) {
+ return 'th'
+ }
+ switch (n % 10) {
+ case 1:
+ return 'st'
+ case 2:
+ return 'nd'
+ case 3:
+ return 'rd'
+ default:
+ return 'th'
+ }
+ }
+ if (chore.frequencyType === 'once') {
+ return 'Once'
+ } else if (chore.frequencyType === 'trigger') {
+ return 'Trigger'
+ } else if (chore.frequencyType === 'daily') {
+ return 'Daily'
+ } else if (chore.frequencyType === 'weekly') {
+ return 'Weekly'
+ } else if (chore.frequencyType === 'monthly') {
+ return 'Monthly'
+ } else if (chore.frequencyType === 'yearly') {
+ return 'Yearly'
+ } else if (chore.frequencyType === 'days_of_the_week') {
+ let days = JSON.parse(chore.frequencyMetadata).days
+ days = days.map(d => moment().day(d).format('ddd'))
+ return days.join(', ')
+ } else if (chore.frequencyType === 'day_of_the_month') {
+ let freqData = JSON.parse(chore.frequencyMetadata)
+ const months = freqData.months.map(m => moment().month(m).format('MMM'))
+ return `${chore.frequency}${dayOfMonthSuffix(
+ chore.frequency,
+ )} of ${months.join(', ')}`
+ } else if (chore.frequencyType === 'interval') {
+ return `Every ${chore.frequency} ${
+ JSON.parse(chore.frequencyMetadata).unit
+ }`
+ } else {
+ return chore.frequencyType
+ }
+ }
+
+ const getFrequencyIcon = chore => {
+ if (['once', 'no_repeat'].includes(chore.frequencyType)) {
+ return <TimesOneMobiledata />
+ } else if (chore.frequencyType === 'trigger') {
+ return <Webhook />
+ } else {
+ return <Repeat />
+ }
+ }
+
+ return (
+ <>
+ <Chip
+ variant='soft'
+ sx={{
+ position: 'relative',
+ top: 10,
+ zIndex: 1,
+ left: 10,
+ }}
+ color={getDueDateChipColor(chore.nextDueDate)}
+ >
+ {getDueDateChipText(chore.nextDueDate)}
+ </Chip>
+
+ <Chip
+ variant='soft'
+ sx={{
+ position: 'relative',
+ top: 10,
+ zIndex: 1,
+ ml: 0.4,
+ left: 10,
+ }}
+ >
+ <div
+ style={{
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ }}
+ >
+ {getFrequencyIcon(chore)}
+
+ {getRecurrentChipText(chore)}
+ </div>
+ </Chip>
+
+ <Card
+ variant='plain'
+ sx={{
+ ...sx,
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'space-between',
+ p: 2,
+ // backgroundColor: 'white',
+ boxShadow: 'sm',
+ borderRadius: 20,
+
+ // mb: 2,
+ }}
+ >
+ <Grid container>
+ <Grid item xs={9}>
+ {/* Box in top right with Chip showing next due date */}
+ <Box display='flex' justifyContent='start' alignItems='center'>
+ <Avatar sx={{ mr: 1, fontSize: 22 }}>
+ {chore.name.charAt(0).toUpperCase()}
+ </Avatar>
+ <Box display='flex' flexDirection='column'>
+ <Typography level='title-md'>{chore.name}</Typography>
+ <Typography level='body-md' color='text.disabled'>
+ Assigned to{' '}
+ <Chip variant='outlined'>
+ {
+ performers.find(p => p.id === chore.assignedTo)
+ ?.displayName
+ }
+ </Chip>
+ </Typography>
+ <Box>
+ {chore.labels?.split(',').map(label => (
+ <Chip
+ variant='solid'
+ key={label}
+ color='primary'
+ sx={{
+ position: 'relative',
+ ml: 0.5,
+ top: 10,
+ zIndex: 1,
+ left: 10,
+ }}
+ startDecorator={getIconForLabel(label)}
+ >
+ {label}
+ </Chip>
+ ))}
+ </Box>
+ </Box>
+ </Box>
+ {/* <Box display='flex' justifyContent='space-between' alignItems='center'>
+ <Chip variant='outlined'>
+ {chore.nextDueDate === null
+ ? '--'
+ : 'Due ' + moment(chore.nextDueDate).fromNow()}
+ </Chip>
+ </Box> */}
+ </Grid>
+ <Grid
+ item
+ xs={3}
+ sx={{
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ }}
+ >
+ <Box display='flex' justifyContent='flex-end' alignItems='flex-end'>
+ {/* <ButtonGroup> */}
+ <IconButton
+ variant='solid'
+ color='success'
+ onClick={handleCompleteChore}
+ disabled={isDisabled}
+ sx={{
+ borderRadius: '50%',
+ width: 50,
+ height: 50,
+ zIndex: 1,
+ }}
+ >
+ <div className='relative grid place-items-center'>
+ <Check />
+ {isDisabled && (
+ <CircularProgress
+ variant='solid'
+ color='success'
+ size='md'
+ sx={{
+ color: 'success.main',
+ position: 'absolute',
+ zIndex: 0,
+ }}
+ />
+ )}
+ </div>
+ </IconButton>
+ <IconButton
+ // sx={{ width: 15 }}
+ variant='soft'
+ color='success'
+ onClick={handleMenuOpen}
+ sx={{
+ borderRadius: '50%',
+ width: 25,
+ height: 25,
+ position: 'relative',
+ left: -10,
+ }}
+ >
+ <MoreVert />
+ </IconButton>
+ {/* </ButtonGroup> */}
+ <Menu
+ size='md'
+ ref={menuRef}
+ anchorEl={anchorEl}
+ open={Boolean(anchorEl)}
+ onClose={handleMenuClose}
+ >
+ <MenuItem
+ onClick={() => {
+ setIsCompleteWithNoteModalOpen(true)
+ }}
+ >
+ <NoteAdd />
+ Complete with note
+ </MenuItem>
+ <MenuItem
+ onClick={() => {
+ setIsCompleteWithPastDateModalOpen(true)
+ }}
+ >
+ <Update />
+ Complete in past
+ </MenuItem>
+ <MenuItem
+ onClick={() => {
+ Fetch(`${API_URL}/chores/${chore.id}/skip`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({}),
+ }).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ onChoreUpdate(newChore, 'skipped')
+ handleMenuClose()
+ })
+ }
+ })
+ }}
+ >
+ <SwitchAccessShortcut />
+ Skip to next due date
+ </MenuItem>
+ <MenuItem
+ onClick={() => {
+ setIsChangeAssigneeModalOpen(true)
+ }}
+ >
+ <RecordVoiceOver />
+ Delegate to someone else
+ </MenuItem>
+ <MenuItem>
+ <HowToReg />
+ Complete as someone else
+ </MenuItem>
+ <Divider />
+ <MenuItem
+ onClick={() => {
+ navigate(`/chores/${chore.id}/history`)
+ }}
+ >
+ <ManageSearch />
+ History
+ </MenuItem>
+ <Divider />
+ <MenuItem
+ onClick={() => {
+ setIsChangeDueDateModalOpen(true)
+ }}
+ >
+ <MoreTime />
+ Change due date
+ </MenuItem>
+ <MenuItem onClick={handleEdit}>
+ <Edit />
+ Edit
+ </MenuItem>
+ <MenuItem onClick={handleDelete} color='danger'>
+ <Delete />
+ Delete
+ </MenuItem>
+ </Menu>
+ </Box>
+ </Grid>
+ </Grid>
+ <DateModal
+ isOpen={isChangeDueDateModalOpen}
+ key={'changeDueDate' + chore.id}
+ current={chore.nextDueDate}
+ title={`Change due date`}
+ onClose={() => {
+ setIsChangeDueDateModalOpen(false)
+ }}
+ onSave={handleChangeDueDate}
+ />
+ <DateModal
+ isOpen={isCompleteWithPastDateModalOpen}
+ key={'completedInPast' + chore.id}
+ current={chore.nextDueDate}
+ title={`Save Chore that you completed in the past`}
+ onClose={() => {
+ setIsCompleteWithPastDateModalOpen(false)
+ }}
+ onSave={handleCompleteWithPastDate}
+ />
+ <SelectModal
+ isOpen={isChangeAssigneeModalOpen}
+ options={performers}
+ displayKey='displayName'
+ title={`Delegate to someone else`}
+ onClose={() => {
+ setIsChangeAssigneeModalOpen(false)
+ }}
+ onSave={handleAssigneChange}
+ />
+ <ConfirmationModal config={confirmModelConfig} />
+ <TextModal
+ isOpen={isCompleteWithNoteModalOpen}
+ title='Add note to attach to this completion:'
+ onClose={() => {
+ setIsCompleteWithNoteModalOpen(false)
+ }}
+ okText={'Complete'}
+ onSave={handleCompleteWithNote}
+ />
+ </Card>
+ </>
+ )
+}
+
+export default ChoreCard
diff --git a/src/views/Chores/MyChores.jsx b/src/views/Chores/MyChores.jsx
new file mode 100644
index 0000000..98fd443
--- /dev/null
+++ b/src/views/Chores/MyChores.jsx
@@ -0,0 +1,384 @@
+import { Add, EditCalendar } from '@mui/icons-material'
+import {
+ Badge,
+ Box,
+ Checkbox,
+ CircularProgress,
+ Container,
+ IconButton,
+ List,
+ ListItem,
+ Menu,
+ MenuItem,
+ Snackbar,
+ Typography,
+} from '@mui/joy'
+import { useContext, useEffect, useRef, useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { UserContext } from '../../contexts/UserContext'
+import Logo from '../../Logo'
+import { GetAllUsers, GetChores, GetUserProfile } from '../../utils/Fetcher'
+import ChoreCard from './ChoreCard'
+
+const MyChores = () => {
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ const [isSnackbarOpen, setIsSnackbarOpen] = useState(false)
+ const [snackBarMessage, setSnackBarMessage] = useState(null)
+ const [chores, setChores] = useState([])
+ const [filteredChores, setFilteredChores] = useState([])
+ const [selectedFilter, setSelectedFilter] = useState('All')
+ const [activeUserId, setActiveUserId] = useState(0)
+ const [performers, setPerformers] = useState([])
+ const [anchorEl, setAnchorEl] = useState(null)
+ const menuRef = useRef(null)
+ const Navigate = useNavigate()
+ const choreSorter = (a, b) => {
+ // 1. Handle null due dates (always last):
+ if (!a.nextDueDate && !b.nextDueDate) return 0 // Both null, no order
+ if (!a.nextDueDate) return 1 // a is null, comes later
+ if (!b.nextDueDate) return -1 // b is null, comes earlier
+
+ const aDueDate = new Date(a.nextDueDate)
+ const bDueDate = new Date(b.nextDueDate)
+ const now = new Date()
+
+ const oneDayInMs = 24 * 60 * 60 * 1000
+
+ // 2. Prioritize tasks due today +- 1 day:
+ const aTodayOrNear = Math.abs(aDueDate - now) <= oneDayInMs
+ const bTodayOrNear = Math.abs(bDueDate - now) <= oneDayInMs
+ if (aTodayOrNear && !bTodayOrNear) return -1 // a is closer
+ if (!aTodayOrNear && bTodayOrNear) return 1 // b is closer
+
+ // 3. Handle overdue tasks (excluding today +- 1):
+ const aOverdue = aDueDate < now && !aTodayOrNear
+ const bOverdue = bDueDate < now && !bTodayOrNear
+ if (aOverdue && !bOverdue) return -1 // a is overdue, comes earlier
+ if (!aOverdue && bOverdue) return 1 // b is overdue, comes earlier
+
+ // 4. Sort future tasks by due date:
+ return aDueDate - bDueDate // Sort ascending by due date
+ }
+
+ const handleSelectedFilter = selected => {
+ setFilteredChores(FILTERS[selected](chores))
+
+ setSelectedFilter(selected)
+ }
+
+ useEffect(() => {
+ if (userProfile === null) {
+ GetUserProfile()
+ .then(response => response.json())
+ .then(data => {
+ setUserProfile(data.res)
+ })
+ }
+ GetChores()
+ .then(response => response.json())
+ .then(data => {
+ data.res.sort(choreSorter)
+ setChores(data.res)
+
+ setFilteredChores(data.res)
+ })
+
+ GetAllUsers()
+ .then(response => response.json())
+ .then(data => {
+ setPerformers(data.res)
+ })
+
+ const currentUser = JSON.parse(localStorage.getItem('user'))
+ if (currentUser !== null) {
+ setActiveUserId(currentUser.id)
+ }
+ }, [])
+ useEffect(() => {
+ document.addEventListener('mousedown', handleMenuOutsideClick)
+ return () => {
+ document.removeEventListener('mousedown', handleMenuOutsideClick)
+ }
+ }, [anchorEl])
+ const handleMenuOutsideClick = event => {
+ if (
+ anchorEl &&
+ !anchorEl.contains(event.target) &&
+ !menuRef.current.contains(event.target)
+ ) {
+ handleFilterMenuClose()
+ }
+ }
+ const handleFilterMenuOpen = event => {
+ event.preventDefault()
+ setAnchorEl(event.currentTarget)
+ }
+
+ const handleFilterMenuClose = () => {
+ setAnchorEl(null)
+ }
+ const handleChoreUpdated = (updatedChore, event) => {
+ const newChores = chores.map(chore => {
+ if (chore.id === updatedChore.id) {
+ return updatedChore
+ }
+ return chore
+ })
+
+ const newFilteredChores = filteredChores.map(chore => {
+ if (chore.id === updatedChore.id) {
+ return updatedChore
+ }
+ return chore
+ })
+ setChores(newChores)
+ setFilteredChores(newFilteredChores)
+ switch (event) {
+ case 'completed':
+ setSnackBarMessage('Completed')
+ break
+ case 'skipped':
+ setSnackBarMessage('Skipped')
+ break
+ case 'rescheduled':
+ setSnackBarMessage('Rescheduled')
+ break
+ default:
+ setSnackBarMessage('Updated')
+ }
+ setIsSnackbarOpen(true)
+ }
+
+ const handleChoreDeleted = deletedChore => {
+ const newChores = chores.filter(chore => chore.id !== deletedChore.id)
+ const newFilteredChores = filteredChores.filter(
+ chore => chore.id !== deletedChore.id,
+ )
+ setChores(newChores)
+ setFilteredChores(newFilteredChores)
+ }
+
+ if (userProfile === null) {
+ return (
+ <Container className='flex h-full items-center justify-center'>
+ <Box className='flex flex-col items-center justify-center'>
+ <CircularProgress
+ color='success'
+ sx={{ '--CircularProgress-size': '200px' }}
+ >
+ <Logo />
+ </CircularProgress>
+ </Box>
+ </Container>
+ )
+ }
+
+ return (
+ <Container maxWidth='md'>
+ {/* <Typography level='h3' mb={1.5}>
+ My Chores
+ </Typography> */}
+ {/* <Sheet> */}
+ <List
+ orientation='horizontal'
+ wrap
+ sx={{
+ '--List-gap': '8px',
+ '--ListItem-radius': '20px',
+ '--ListItem-minHeight': '32px',
+ '--ListItem-gap': '4px',
+ mt: 0.2,
+ }}
+ >
+ {['All', 'Overdue', 'Due today', 'Due in week'].map(filter => (
+ <Badge
+ key={filter}
+ anchorOrigin={{
+ vertical: 'top',
+ horizontal: 'right',
+ }}
+ variant='outlined'
+ color={selectedFilter === filter ? 'primary' : 'neutral'}
+ badgeContent={FILTERS[filter](chores).length}
+ badgeInset={'5px'}
+ >
+ <ListItem key={filter}>
+ <Checkbox
+ key={'checkbox' + filter}
+ label={filter}
+ onClick={() => handleSelectedFilter(filter)}
+ checked={filter === selectedFilter}
+ disableIcon
+ overlay
+ size='sm'
+ />
+ </ListItem>
+ </Badge>
+ ))}
+
+ <ListItem onClick={handleFilterMenuOpen}>
+ <Checkbox key='checkboxAll' label='⋮' disableIcon overlay size='lg' />
+ </ListItem>
+ <Menu
+ ref={menuRef}
+ anchorEl={anchorEl}
+ open={Boolean(anchorEl)}
+ onClose={handleFilterMenuClose}
+ >
+ <MenuItem
+ onClick={() => {
+ setFilteredChores(
+ FILTERS['Assigned To Me'](chores, userProfile.id),
+ )
+ setSelectedFilter('Assigned To Me')
+ handleFilterMenuClose()
+ }}
+ >
+ Assigned to me
+ </MenuItem>
+ <MenuItem
+ onClick={() => {
+ setFilteredChores(
+ FILTERS['Created By Me'](chores, userProfile.id),
+ )
+ setSelectedFilter('Created By Me')
+ handleFilterMenuClose()
+ }}
+ >
+ Created by me
+ </MenuItem>
+ <MenuItem
+ onClick={() => {
+ setFilteredChores(FILTERS['No Due Date'](chores, userProfile.id))
+ setSelectedFilter('No Due Date')
+ handleFilterMenuClose()
+ }}
+ >
+ No Due Date
+ </MenuItem>
+ </Menu>
+ </List>
+ {/* </Sheet> */}
+ {filteredChores.length === 0 && (
+ <Box
+ sx={{
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ flexDirection: 'column',
+ height: '50vh',
+ }}
+ >
+ <EditCalendar
+ sx={{
+ fontSize: '4rem',
+ // color: 'text.disabled',
+ mb: 1,
+ }}
+ />
+ <Typography level='title-md' gutterBottom>
+ Nothing scheduled
+ </Typography>
+ </Box>
+ )}
+
+ {filteredChores.map(chore => (
+ <ChoreCard
+ key={chore.id}
+ chore={chore}
+ onChoreUpdate={handleChoreUpdated}
+ onChoreRemove={handleChoreDeleted}
+ performers={performers}
+ />
+ ))}
+
+ <Box
+ // variant='outlined'
+ sx={{
+ position: 'fixed',
+ bottom: 0,
+ left: 10,
+ p: 2, // padding
+ display: 'flex',
+ justifyContent: 'flex-end',
+ gap: 2,
+ 'z-index': 1000,
+ }}
+ >
+ <IconButton
+ color='primary'
+ variant='solid'
+ sx={{
+ borderRadius: '50%',
+ width: 50,
+ height: 50,
+ }}
+ // startDecorator={<Add />}
+ onClick={() => {
+ Navigate(`/chores/create`)
+ }}
+ >
+ <Add />
+ </IconButton>
+ </Box>
+ <Snackbar
+ open={isSnackbarOpen}
+ onClose={() => {
+ setIsSnackbarOpen(false)
+ }}
+ autoHideDuration={3000}
+ variant='soft'
+ color='success'
+ size='lg'
+ invertedColors
+ >
+ <Typography level='title-md'>{snackBarMessage}</Typography>
+ </Snackbar>
+ </Container>
+ )
+}
+
+const FILTERS = {
+ All: function (chores) {
+ return chores
+ },
+ Overdue: function (chores) {
+ return chores.filter(chore => {
+ if (chore.nextDueDate === null) return false
+ return new Date(chore.nextDueDate) < new Date()
+ })
+ },
+ 'Due today': function (chores) {
+ return chores.filter(chore => {
+ return (
+ new Date(chore.nextDueDate).toDateString() === new Date().toDateString()
+ )
+ })
+ },
+ 'Due in week': function (chores) {
+ return chores.filter(chore => {
+ return (
+ new Date(chore.nextDueDate) <
+ new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) &&
+ new Date(chore.nextDueDate) > new Date()
+ )
+ })
+ },
+ 'Created By Me': function (chores, userID) {
+ return chores.filter(chore => {
+ return chore.createdBy === userID
+ })
+ },
+ 'Assigned To Me': function (chores, userID) {
+ return chores.filter(chore => {
+ return chore.assignedTo === userID
+ })
+ },
+ 'No Due Date': function (chores, userID) {
+ return chores.filter(chore => {
+ return chore.nextDueDate === null
+ })
+ },
+}
+
+export default MyChores
diff --git a/src/views/ChoresOverview.jsx b/src/views/ChoresOverview.jsx
new file mode 100644
index 0000000..396ab0d
--- /dev/null
+++ b/src/views/ChoresOverview.jsx
@@ -0,0 +1,354 @@
+import {
+ Adjust,
+ CancelRounded,
+ CheckBox,
+ Edit,
+ HelpOutline,
+ History,
+ QueryBuilder,
+ SearchRounded,
+ Warning,
+} from '@mui/icons-material'
+import {
+ Avatar,
+ Button,
+ ButtonGroup,
+ Chip,
+ Container,
+ Grid,
+ IconButton,
+ Input,
+ Table,
+ Tooltip,
+ Typography,
+} from '@mui/joy'
+
+import moment from 'moment'
+import { useEffect, useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { API_URL } from '../Config'
+import { GetAllUsers } from '../utils/Fetcher'
+import { Fetch } from '../utils/TokenManager'
+import DateModal from './Modals/Inputs/DateModal'
+// import moment from 'moment'
+
+// enum for chore status:
+const CHORE_STATUS = {
+ NO_DUE_DATE: 'No due date',
+ DUE_SOON: 'Soon',
+ DUE_NOW: 'Due',
+ OVER_DUE: 'Overdue',
+}
+
+const ChoresOverview = () => {
+ const [chores, setChores] = useState([])
+ const [filteredChores, setFilteredChores] = useState([])
+ const [performers, setPerformers] = useState([])
+ const [activeUserId, setActiveUserId] = useState(null)
+ const [isDateModalOpen, setIsDateModalOpen] = useState(false)
+ const [choreId, setChoreId] = useState(null)
+ const [search, setSearch] = useState('')
+ const Navigate = useNavigate()
+
+ const getChoreStatus = chore => {
+ if (chore.nextDueDate === null) {
+ return CHORE_STATUS.NO_DUE_DATE
+ }
+ const dueDate = new Date(chore.nextDueDate)
+ const now = new Date()
+ const diff = dueDate - now
+ if (diff < 0) {
+ return CHORE_STATUS.OVER_DUE
+ }
+ if (diff > 1000 * 60 * 60 * 24) {
+ return CHORE_STATUS.DUE_NOW
+ }
+ if (diff > 0) {
+ return CHORE_STATUS.DUE_SOON
+ }
+ return CHORE_STATUS.NO_DUE_DATE
+ }
+ const getChoreStatusColor = chore => {
+ switch (getChoreStatus(chore)) {
+ case CHORE_STATUS.NO_DUE_DATE:
+ return 'neutral'
+ case CHORE_STATUS.DUE_SOON:
+ return 'success'
+ case CHORE_STATUS.DUE_NOW:
+ return 'primary'
+ case CHORE_STATUS.OVER_DUE:
+ return 'warning'
+ default:
+ return 'neutral'
+ }
+ }
+ const getChoreStatusIcon = chore => {
+ switch (getChoreStatus(chore)) {
+ case CHORE_STATUS.NO_DUE_DATE:
+ return <HelpOutline />
+ case CHORE_STATUS.DUE_SOON:
+ return <QueryBuilder />
+ case CHORE_STATUS.DUE_NOW:
+ return <Adjust />
+ case CHORE_STATUS.OVER_DUE:
+ return <Warning />
+ default:
+ return <HelpOutline />
+ }
+ }
+ useEffect(() => {
+ // fetch chores:
+ Fetch(`${API_URL}/chores/`)
+ .then(response => response.json())
+ .then(data => {
+ const filteredData = data.res.filter(
+ chore => chore.assignedTo === activeUserId || chore.assignedTo === 0,
+ )
+ setChores(data.res)
+ setFilteredChores(data.res)
+ })
+ GetAllUsers()
+ .then(response => response.json())
+ .then(data => {
+ setPerformers(data.res)
+ })
+ const user = JSON.parse(localStorage.getItem('user'))
+ if (user != null && user.id > 0) {
+ setActiveUserId(user.id)
+ }
+ }, [])
+
+ return (
+ <Container>
+ <Typography level='h4' mb={1.5}>
+ Chores Overviews
+ </Typography>
+ {/* <SummaryCard /> */}
+ <Grid container>
+ <Grid
+ item
+ sm={6}
+ alignSelf={'flex-start'}
+ minWidth={100}
+ display='flex'
+ gap={2}
+ >
+ <Input
+ placeholder='Search'
+ value={search}
+ onChange={e => {
+ if (e.target.value === '') {
+ setFilteredChores(chores)
+ }
+ setSearch(e.target.value)
+ const newChores = chores.filter(chore => {
+ return chore.name.includes(e.target.value)
+ })
+ setFilteredChores(newChores)
+ }}
+ endDecorator={
+ search !== '' ? (
+ <Button
+ variant='text'
+ onClick={() => {
+ setSearch('')
+ setFilteredChores(chores)
+ }}
+ >
+ <CancelRounded />
+ </Button>
+ ) : (
+ <Button variant='text'>
+ <SearchRounded />
+ </Button>
+ )
+ }
+ ></Input>
+ </Grid>
+ <Grid item sm={6} justifyContent={'flex-end'} display={'flex'} gap={2}>
+ <Button
+ onClick={() => {
+ Navigate(`/chores/create`)
+ }}
+ >
+ New Chore
+ </Button>
+ </Grid>
+ </Grid>
+
+ <Table>
+ <thead>
+ <tr>
+ {/* first column has minium size because its icon */}
+ <th style={{ width: 100 }}>Due</th>
+ <th>Chore</th>
+ <th>Assignee</th>
+ <th>Due</th>
+ <th>Action</th>
+ </tr>
+ </thead>
+ <tbody>
+ {filteredChores.map(chore => (
+ <tr key={chore.id}>
+ {/* cirular icon if the chore is due will be red else yellow: */}
+ <td>
+ <Chip color={getChoreStatusColor(chore)}>
+ {getChoreStatus(chore)}
+ </Chip>
+ </td>
+ <td
+ onClick={() => {
+ Navigate(`/chores/${chore.id}/edit`)
+ }}
+ >
+ {chore.name || '--'}
+ </td>
+ <td>
+ {chore.assignedTo > 0 ? (
+ <Tooltip
+ title={
+ performers.find(p => p.id === chore.assignedTo)
+ ?.displayName
+ }
+ size='sm'
+ >
+ <Chip
+ startDecorator={
+ <Avatar color='primary'>
+ {
+ performers.find(p => p.id === chore.assignedTo)
+ ?.displayName[0]
+ }
+ </Avatar>
+ }
+ >
+ {performers.find(p => p.id === chore.assignedTo)?.name}
+ </Chip>
+ </Tooltip>
+ ) : (
+ <Chip
+ color='warning'
+ startDecorator={<Avatar color='primary'>?</Avatar>}
+ >
+ Unassigned
+ </Chip>
+ )}
+ </td>
+ <td>
+ <Tooltip
+ title={
+ chore.nextDueDate === null
+ ? 'no due date'
+ : moment(chore.nextDueDate).format('YYYY-MM-DD')
+ }
+ size='sm'
+ >
+ <Typography>
+ {chore.nextDueDate === null
+ ? '--'
+ : moment(chore.nextDueDate).fromNow()}
+ </Typography>
+ </Tooltip>
+ </td>
+
+ <td>
+ <ButtonGroup
+ // display='flex'
+ // // justifyContent='space-around'
+ // alignItems={'center'}
+ // gap={0.5}
+ >
+ <IconButton
+ variant='outlined'
+ size='sm'
+ // sx={{ borderRadius: '50%' }}
+ onClick={() => {
+ Fetch(`${API_URL}/chores/${chore.id}/do`, {
+ method: 'POST',
+ }).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ const newChores = [...chores]
+ const index = newChores.findIndex(
+ c => c.id === chore.id,
+ )
+ newChores[index] = newChore
+ setChores(newChores)
+ setFilteredChores(newChores)
+ })
+ }
+ })
+ }}
+ aria-setsize={2}
+ >
+ <CheckBox />
+ </IconButton>
+ <IconButton
+ variant='outlined'
+ size='sm'
+ // sx={{ borderRadius: '50%' }}
+ onClick={() => {
+ setChoreId(chore.id)
+ setIsDateModalOpen(true)
+ }}
+ aria-setsize={2}
+ >
+ <History />
+ </IconButton>
+ <IconButton
+ variant='outlined'
+ size='sm'
+ // sx={{
+ // borderRadius: '50%',
+ // }}
+ onClick={() => {
+ Navigate(`/chores/${chore.id}/edit`)
+ }}
+ >
+ <Edit />
+ </IconButton>
+ </ButtonGroup>
+ </td>
+ </tr>
+ ))}
+ </tbody>
+ </Table>
+ <DateModal
+ isOpen={isDateModalOpen}
+ key={choreId}
+ title={`Change due date`}
+ onClose={() => {
+ setIsDateModalOpen(false)
+ }}
+ onSave={date => {
+ if (activeUserId === null) {
+ alert('Please select a performer')
+ return
+ }
+ fetch(
+ `${API_URL}/chores/${choreId}/do?performer=${activeUserId}&completedDate=${new Date(
+ date,
+ ).toISOString()}`,
+ {
+ method: 'POST',
+ },
+ ).then(response => {
+ if (response.ok) {
+ response.json().then(data => {
+ const newChore = data.res
+ const newChores = [...chores]
+ const index = newChores.findIndex(c => c.id === chore.id)
+ newChores[index] = newChore
+ setChores(newChores)
+ setFilteredChores(newChores)
+ })
+ }
+ })
+ }}
+ />
+ </Container>
+ )
+}
+
+export default ChoresOverview
diff --git a/src/views/Circles/JoinCircle.jsx b/src/views/Circles/JoinCircle.jsx
new file mode 100644
index 0000000..fd6d542
--- /dev/null
+++ b/src/views/Circles/JoinCircle.jsx
@@ -0,0 +1,154 @@
+import { Box, Container, Input, Sheet, Typography } from '@mui/joy'
+import Logo from '../../Logo'
+
+import { Button } from '@mui/joy'
+import { useContext } from 'react'
+import { useNavigate, useSearchParams } from 'react-router-dom'
+import { UserContext } from '../../contexts/UserContext'
+import { JoinCircle } from '../../utils/Fetcher'
+const JoinCircleView = () => {
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ let [searchParams, setSearchParams] = useSearchParams()
+ const navigate = useNavigate()
+ const code = searchParams.get('code')
+
+ return (
+ <Container
+ component='main'
+ maxWidth='xs'
+
+ // make content center in the middle of the page:
+ >
+ <Box
+ sx={{
+ marginTop: 4,
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ }}
+ >
+ <Sheet
+ component='form'
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ }}
+ >
+ {/* <img
+ src='/src/assets/logo.svg'
+ alt='logo'
+ width='128px'
+ height='128px'
+ /> */}
+ <Logo />
+
+ <Typography level='h2'>
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+ {code && userProfile && (
+ <>
+ <Typography level='body-md' alignSelf={'center'}>
+ Hi {userProfile?.displayName}, you have been invited to join the
+ circle{' '}
+ </Typography>
+ <Input
+ fullWidth
+ placeholder='Enter code'
+ value={code}
+ disabled={!!code}
+ size='lg'
+ sx={{
+ width: '220px',
+ mb: 1,
+ }}
+ />
+ <Typography level='body-md' alignSelf={'center'}>
+ Joining will give you access to the circle's chores and members.
+ </Typography>
+ <Typography level='body-md' alignSelf={'center'}>
+ You can leave the circle later from you Settings page.
+ </Typography>
+ <Button
+ fullWidth
+ size='lg'
+ sx={{ mt: 3, mb: 2 }}
+ onClick={() => {
+ JoinCircle(code).then(resp => {
+ if (resp.ok) {
+ alert(
+ 'Joined circle successfully, wait for the circle owner to accept your request.',
+ )
+ navigate('/my/chores')
+ } else {
+ if (resp.status === 409) {
+ alert('You are already a member of this circle')
+ } else {
+ alert('Failed to join circle')
+ }
+ navigate('/my/chores')
+ }
+ })
+ }}
+ >
+ Join Circle
+ </Button>
+ <Button
+ fullWidth
+ size='lg'
+ q
+ variant='plain'
+ sx={{
+ width: '100%',
+ mb: 2,
+ border: 'moccasin',
+ borderRadius: '8px',
+ }}
+ onClick={() => {
+ navigate('/my/chores')
+ }}
+ >
+ Cancel
+ </Button>
+ </>
+ )}
+ {!code ||
+ (!userProfile && (
+ <>
+ <Typography level='body-md' alignSelf={'center'}>
+ You need to be logged in to join a circle
+ </Typography>
+ <Typography level='body-md' alignSelf={'center'} sx={{ mb: 9 }}>
+ Login or sign up to continue
+ </Typography>
+ <Button
+ fullWidth
+ size='lg'
+ sx={{ mt: 3, mb: 2 }}
+ onClick={() => {
+ navigate('/login')
+ }}
+ >
+ Login
+ </Button>
+ </>
+ ))}
+ </Sheet>
+ </Box>
+ </Container>
+ )
+}
+
+export default JoinCircleView
diff --git a/src/views/Error.jsx b/src/views/Error.jsx
new file mode 100644
index 0000000..d04fc29
--- /dev/null
+++ b/src/views/Error.jsx
@@ -0,0 +1,11 @@
+import { Typography } from '@mui/joy'
+
+const Error = () => {
+ return (
+ <div className='grid min-h-screen place-items-center'>
+ <Typography level='h1'>404</Typography>
+ </div>
+ )
+}
+
+export default Error
diff --git a/src/views/History/BigChip.jsx b/src/views/History/BigChip.jsx
new file mode 100644
index 0000000..4987367
--- /dev/null
+++ b/src/views/History/BigChip.jsx
@@ -0,0 +1,26 @@
+import Chip from '@mui/joy/Chip'
+import * as React from 'react'
+
+function BigChip(props) {
+ return (
+ <Chip
+ variant='outlined'
+ color='primary'
+ size='lg' // Adjust to your desired size
+ sx={{
+ fontSize: '1rem', // Example: Increase font size
+ padding: '1rem', // Example: Increase padding
+ height: '1rem', // Adjust to your desired height
+ // Add other custom styles as needed
+ }}
+ {...props}
+ >
+ {props.children}
+ </Chip>
+ )
+}
+
+export default BigChip
+BigChip.propTypes = {
+ ...Chip.propTypes,
+}
diff --git a/src/views/History/ChoreHistory.jsx b/src/views/History/ChoreHistory.jsx
new file mode 100644
index 0000000..22ea6a9
--- /dev/null
+++ b/src/views/History/ChoreHistory.jsx
@@ -0,0 +1,344 @@
+import { Checklist, EventBusy, Timelapse } from '@mui/icons-material'
+import {
+ Avatar,
+ Box,
+ Button,
+ Chip,
+ CircularProgress,
+ Container,
+ Grid,
+ List,
+ ListDivider,
+ ListItem,
+ ListItemContent,
+ ListItemDecorator,
+ Sheet,
+ Typography,
+} from '@mui/joy'
+import moment from 'moment'
+import React, { useEffect, useState } from 'react'
+import { Link, useParams } from 'react-router-dom'
+import { API_URL } from '../../Config'
+import { GetAllCircleMembers } from '../../utils/Fetcher'
+import { Fetch } from '../../utils/TokenManager'
+
+const ChoreHistory = () => {
+ const [choreHistory, setChoresHistory] = useState([])
+ const [userHistory, setUserHistory] = useState([])
+ const [performers, setPerformers] = useState([])
+ const [historyInfo, setHistoryInfo] = useState([])
+
+ const [isLoading, setIsLoading] = useState(true) // Add loading state
+ const { choreId } = useParams()
+
+ useEffect(() => {
+ setIsLoading(true) // Start loading
+
+ Promise.all([
+ Fetch(`${API_URL}/chores/${choreId}/history`).then(res => res.json()),
+ GetAllCircleMembers().then(res => res.json()),
+ ])
+ .then(([historyData, usersData]) => {
+ setChoresHistory(historyData.res)
+
+ const newUserChoreHistory = {}
+ historyData.res.forEach(choreHistory => {
+ const userId = choreHistory.completedBy
+ newUserChoreHistory[userId] = (newUserChoreHistory[userId] || 0) + 1
+ })
+ setUserHistory(newUserChoreHistory)
+
+ setPerformers(usersData.res)
+ updateHistoryInfo(historyData.res, newUserChoreHistory, usersData.res)
+ })
+ .catch(error => {
+ console.error('Error fetching data:', error)
+ // Handle errors, e.g., show an error message to the user
+ })
+ .finally(() => {
+ setIsLoading(false) // Finish loading
+ })
+ }, [choreId])
+
+ const updateHistoryInfo = (histories, userHistories, performers) => {
+ // average delay for task completaion from due date:
+
+ const averageDelay =
+ histories.reduce((acc, chore) => {
+ if (chore.dueDate) {
+ // Only consider chores with a due date
+ return acc + moment(chore.completedAt).diff(chore.dueDate, 'hours')
+ }
+ return acc
+ }, 0) / histories.length
+ const averageDelayMoment = moment.duration(averageDelay, 'hours')
+ const maximumDelay = histories.reduce((acc, chore) => {
+ if (chore.dueDate) {
+ // Only consider chores with a due date
+ const delay = moment(chore.completedAt).diff(chore.dueDate, 'hours')
+ return delay > acc ? delay : acc
+ }
+ return acc
+ }, 0)
+
+ const maxDelayMoment = moment.duration(maximumDelay, 'hours')
+
+ // find max value in userHistories:
+ const userCompletedByMost = Object.keys(userHistories).reduce((a, b) =>
+ userHistories[a] > userHistories[b] ? a : b,
+ )
+ const userCompletedByLeast = Object.keys(userHistories).reduce((a, b) =>
+ userHistories[a] < userHistories[b] ? a : b,
+ )
+
+ const historyInfo = [
+ {
+ icon: (
+ <Avatar>
+ <Checklist />
+ </Avatar>
+ ),
+ text: `${histories.length} completed`,
+ subtext: `${Object.keys(userHistories).length} users contributed`,
+ },
+ {
+ icon: (
+ <Avatar>
+ <Timelapse />
+ </Avatar>
+ ),
+ text: `Completed within ${moment
+ .duration(averageDelayMoment)
+ .humanize()}`,
+ subtext: `Maximum delay was ${moment
+ .duration(maxDelayMoment)
+ .humanize()}`,
+ },
+ {
+ icon: <Avatar></Avatar>,
+ text: `${
+ performers.find(p => p.userId === Number(userCompletedByMost))
+ ?.displayName
+ } completed most`,
+ subtext: `${userHistories[userCompletedByMost]} time/s`,
+ },
+ ]
+ if (userCompletedByLeast !== userCompletedByMost) {
+ historyInfo.push({
+ icon: (
+ <Avatar>
+ {
+ performers.find(p => p.userId === userCompletedByLeast)
+ ?.displayName
+ }
+ </Avatar>
+ ),
+ text: `${
+ performers.find(p => p.userId === Number(userCompletedByLeast))
+ .displayName
+ } completed least`,
+ subtext: `${userHistories[userCompletedByLeast]} time/s`,
+ })
+ }
+
+ setHistoryInfo(historyInfo)
+ }
+
+ function formatTimeDifference(startDate, endDate) {
+ const diffInMinutes = moment(startDate).diff(endDate, 'minutes')
+ let timeValue = diffInMinutes
+ let unit = 'minute'
+
+ if (diffInMinutes >= 60) {
+ const diffInHours = moment(startDate).diff(endDate, 'hours')
+ timeValue = diffInHours
+ unit = 'hour'
+
+ if (diffInHours >= 24) {
+ const diffInDays = moment(startDate).diff(endDate, 'days')
+ timeValue = diffInDays
+ unit = 'day'
+ }
+ }
+
+ return `${timeValue} ${unit}${timeValue !== 1 ? 's' : ''}`
+ }
+ if (isLoading) {
+ return <CircularProgress /> // Show loading indicator
+ }
+ if (!choreHistory.length) {
+ return (
+ <Container
+ maxWidth='md'
+ sx={{
+ textAlign: 'center',
+ display: 'flex',
+ // make sure the content is centered vertically:
+ alignItems: 'center',
+ justifyContent: 'center',
+ flexDirection: 'column',
+ height: '50vh',
+ }}
+ >
+ <EventBusy
+ sx={{
+ fontSize: '6rem',
+ // color: 'text.disabled',
+ mb: 1,
+ }}
+ />
+
+ <Typography level='h3' gutterBottom>
+ No History Yet
+ </Typography>
+ <Typography level='body1'>
+ You haven't completed any tasks. Once you start finishing tasks,
+ they'll show up here.
+ </Typography>
+ <Button variant='soft' sx={{ mt: 2 }}>
+ <Link to='/my/chores'>Go back to chores</Link>
+ </Button>
+ </Container>
+ )
+ }
+
+ return (
+ <Container maxWidth='md'>
+ <Typography level='h3' mb={1.5}>
+ Summary:
+ </Typography>
+ {/* <Sheet sx={{ mb: 1, borderRadius: 'sm', p: 2, boxShadow: 'md' }}>
+ <ListItem sx={{ gap: 1.5 }}>
+ <ListItemDecorator>
+ <Avatar>
+ <AccountCircle />
+ </Avatar>
+ </ListItemDecorator>
+ <ListItemContent>
+ <Typography level='body1' sx={{ fontWeight: 'md' }}>
+ {choreHistory.length} completed
+ </Typography>
+ <Typography level='body2' color='text.tertiary'>
+ {Object.keys(userHistory).length} users contributed
+ </Typography>
+ </ListItemContent>
+ </ListItem>
+ </Sheet> */}
+ <Grid container>
+ {historyInfo.map((info, index) => (
+ <Grid key={index} item xs={12} sm={6}>
+ <Sheet sx={{ mb: 1, borderRadius: 'sm', p: 2, boxShadow: 'md' }}>
+ <ListItem sx={{ gap: 1.5 }}>
+ <ListItemDecorator>{info.icon}</ListItemDecorator>
+ <ListItemContent>
+ <Typography level='body1' sx={{ fontWeight: 'md' }}>
+ {info.text}
+ </Typography>
+ <Typography level='body1' color='text.tertiary'>
+ {info.subtext}
+ </Typography>
+ </ListItemContent>
+ </ListItem>
+ </Sheet>
+ </Grid>
+ ))}
+ </Grid>
+ {/* User History Cards */}
+ <Typography level='h3' my={1.5}>
+ History:
+ </Typography>
+ <Box sx={{ borderRadius: 'sm', p: 2, boxShadow: 'md' }}>
+ {/* Chore History List (Updated Style) */}
+
+ <List sx={{ p: 0 }}>
+ {choreHistory.map((chore, index) => (
+ <>
+ <ListItem sx={{ gap: 1.5, alignItems: 'flex-start' }}>
+ {' '}
+ {/* Adjusted spacing and alignment */}
+ <ListItemDecorator>
+ <Avatar sx={{ mr: 1 }}>
+ {performers
+ .find(p => p.userId === chore.completedBy)
+ ?.displayName?.charAt(0) || '?'}
+ </Avatar>
+ </ListItemDecorator>
+ <ListItemContent sx={{ my: 0 }}>
+ {' '}
+ {/* Removed vertical margin */}
+ <Box
+ sx={{
+ display: 'flex',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ }}
+ >
+ <Typography level='body1' sx={{ fontWeight: 'md' }}>
+ {moment(chore.completedAt).format('ddd MM/DD/yyyy HH:mm')}
+ </Typography>
+
+ <Chip>
+ {chore.dueDate && chore.completedAt > chore.dueDate
+ ? 'Late'
+ : 'On Time'}
+ </Chip>
+ </Box>
+ <Typography level='body2' color='text.tertiary'>
+ <Chip>
+ {
+ performers.find(p => p.userId === chore.completedBy)
+ ?.displayName
+ }
+ </Chip>{' '}
+ completed
+ {chore.completedBy !== chore.assignedTo && (
+ <>
+ {', '}
+ assigned to{' '}
+ <Chip>
+ {
+ performers.find(p => p.userId === chore.assignedTo)
+ ?.displayName
+ }
+ </Chip>
+ </>
+ )}
+ </Typography>
+ {chore.dueDate && (
+ <Typography level='body2' color='text.tertiary'>
+ Due: {moment(chore.dueDate).format('ddd MM/DD/yyyy')}
+ </Typography>
+ )}
+ {chore.notes && (
+ <Typography level='body2' color='text.tertiary'>
+ Note: {chore.notes}
+ </Typography>
+ )}
+ </ListItemContent>
+ </ListItem>
+ {index < choreHistory.length - 1 && (
+ <>
+ <ListDivider component='li'>
+ {/* time between two completion: */}
+ {index < choreHistory.length - 1 &&
+ choreHistory[index + 1].completedAt && (
+ <Typography level='body3' color='text.tertiary'>
+ {formatTimeDifference(
+ chore.completedAt,
+ choreHistory[index + 1].completedAt,
+ )}{' '}
+ before
+ </Typography>
+ )}
+ </ListDivider>
+ </>
+ )}
+ </>
+ ))}
+ </List>
+ </Box>
+ </Container>
+ )
+}
+
+export default ChoreHistory
diff --git a/src/views/History/InfoCard.jsx b/src/views/History/InfoCard.jsx
new file mode 100644
index 0000000..bf1ada8
--- /dev/null
+++ b/src/views/History/InfoCard.jsx
@@ -0,0 +1,26 @@
+import { AddTask } from '@mui/icons-material'
+import { Box } from '@mui/joy'
+import Card from '@mui/joy/Card'
+import CardContent from '@mui/joy/CardContent'
+import Typography from '@mui/joy/Typography'
+import * as React from 'react'
+
+function InfoCard() {
+ return (
+ <Card sx={{ minWidth: 200, maxWidth: 200 }}>
+ <CardContent>
+ <Box mb={2} sx={{ textAlign: 'left' }}>
+ <AddTask
+ sx={{
+ fontSize: '2.5em' /* Increase the font size */,
+ }}
+ />
+ </Box>
+ <Typography level='title-md'>You've completed</Typography>
+ <Typography level='body-sm'>12345 Chores</Typography>
+ </CardContent>
+ </Card>
+ )
+}
+
+export default InfoCard
diff --git a/src/views/Home.jsx b/src/views/Home.jsx
new file mode 100644
index 0000000..4b16a1e
--- /dev/null
+++ b/src/views/Home.jsx
@@ -0,0 +1,46 @@
+import { Box, Button, Container, Typography } from '@mui/joy'
+import { useEffect } from 'react'
+import { useNavigate } from 'react-router-dom'
+
+import { useState } from 'react'
+import Logo from '../Logo'
+const Home = () => {
+ const Navigate = useNavigate()
+ const getCurrentUser = () => {
+ return JSON.parse(localStorage.getItem('user'))
+ }
+ const [users, setUsers] = useState([])
+ const [currentUser, setCurrentUser] = useState(getCurrentUser())
+
+ useEffect(() => {}, [])
+
+ return (
+ <Container className='flex h-full items-center justify-center'>
+ <Box className='flex flex-col items-center justify-center'>
+ <Logo />
+ <Typography level='h1'>
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+ </Box>
+ <Box className='flex flex-col items-center justify-center' mt={10}>
+ <Button
+ sx={{ mt: 1 }}
+ onClick={() => {
+ Navigate('/my/chores')
+ }}
+ >
+ Get Started!
+ </Button>
+ </Box>
+ </Container>
+ )
+}
+
+export default Home
diff --git a/src/views/Landing/FeaturesSection.jsx b/src/views/Landing/FeaturesSection.jsx
new file mode 100644
index 0000000..a7da1f0
--- /dev/null
+++ b/src/views/Landing/FeaturesSection.jsx
@@ -0,0 +1,139 @@
+import {
+ AutoAwesomeMosaicOutlined,
+ AutoAwesomeRounded,
+ CodeRounded,
+ GroupRounded,
+ HistoryRounded,
+ Webhook,
+} from '@mui/icons-material'
+import Card from '@mui/joy/Card'
+import Container from '@mui/joy/Container'
+import Typography from '@mui/joy/Typography'
+import { styled } from '@mui/system'
+
+const FeatureIcon = styled('div')({
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ backgroundColor: '#f0f0f0', // Adjust the background color as needed
+ borderRadius: '50%',
+ minWidth: '60px',
+ height: '60px',
+ marginRight: '16px',
+})
+
+const CardData = [
+ {
+ title: 'Open Source & Transparent',
+ headline: 'Built for the Community',
+ description:
+ 'Donetick is a community-driven, open-source project. Contribute, customize, and make task management truly yours.',
+ icon: CodeRounded,
+ },
+ {
+ title: 'Circles: Your Task Hub',
+ headline: 'Share & Conquer Together',
+ description:
+ 'Create circles for your family, friends, or team. Easily share tasks and track progress within each group.',
+ icon: GroupRounded,
+ },
+ {
+ title: 'Track Your Progress',
+ headline: "See Who's Done What",
+ description:
+ 'View a history of task completion for each member of your circles. Celebrate successes and stay on top of your goals.',
+ icon: HistoryRounded,
+ },
+ {
+ title: 'Automated Chore Scheduling',
+ headline: 'Fully Customizable Recurring Tasks',
+ description:
+ 'Set up chores to repeat daily, weekly, or monthly. Donetick will automatically assign and track each task for you.',
+ icon: AutoAwesomeMosaicOutlined,
+ },
+ {
+ title: 'Automated Task Assignment',
+ headline: 'Share Responsibilities Equally',
+ description:
+ 'can automatically assigns tasks to each member of your circle. Randomly or based on past completion.',
+ icon: AutoAwesomeRounded,
+ },
+ {
+ title: 'Integrations & Webhooks',
+ headline: 'API & 3rd Party Integrations',
+ description:
+ 'Connect Donetick with your favorite apps and services. Trigger tasks based on events from other platforms.',
+ icon: Webhook,
+ },
+]
+
+function Feature2({ icon: Icon, title, headline, description, index }) {
+ return (
+ <Card
+ variant='plain'
+ sx={{ textAlign: 'left', p: 2 }}
+ data-aos-delay={100 * index}
+ data-aos-anchor='[data-aos-id-features2-blocks]'
+ data-aos='fade-up'
+ >
+ <div style={{ display: 'flex', alignItems: 'center' }}>
+ <FeatureIcon>
+ <Icon
+ color='primary'
+ style={{ Width: '30px', height: '30px' }}
+ stroke={1.5}
+ />
+ </FeatureIcon>
+ <div>
+ {/* Changes are within this div */}
+ <Typography level='h4' mt={1} mb={0.5}>
+ {title}
+ </Typography>
+ <Typography level='body-sm' color='neutral' lineHeight={1.4}>
+ {headline}
+ </Typography>
+ </div>
+ </div>
+ <Typography level='body-md' color='neutral' lineHeight={1.6}>
+ {description}
+ </Typography>
+ </Card>
+ )
+}
+
+function FeaturesSection() {
+ const features = CardData.map((feature, index) => (
+ <Feature2
+ icon={feature.icon}
+ title={feature.title}
+ headline={feature.headline}
+ description={feature.description}
+ index={index}
+ key={index}
+ />
+ ))
+
+ return (
+ <Container sx={{ textAlign: 'center' }}>
+ <Typography level='h4' mt={2} mb={4}>
+ Donetick
+ </Typography>
+
+ <Container maxWidth={'lg'} sx={{ mb: 8 }}>
+ <Typography level='body-md' color='neutral'>
+ Navigate personal growth with genuine insights, thoughtful privacy,
+ and actionable steps tailored just for you.
+ </Typography>
+ </Container>
+
+ <div
+ className='align-center mt-8 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3'
+ data-aos-id-features2-blocks
+ >
+ {features}
+ </div>
+ </Container>
+ )
+}
+
+export default FeaturesSection
diff --git a/src/views/Landing/HomeHero.jsx b/src/views/Landing/HomeHero.jsx
new file mode 100644
index 0000000..a96374a
--- /dev/null
+++ b/src/views/Landing/HomeHero.jsx
@@ -0,0 +1,186 @@
+/* eslint-disable tailwindcss/no-custom-classname */
+// import { StyledButton } from '@/components/styled-button'
+import { Button } from '@mui/joy'
+import Typography from '@mui/joy/Typography'
+import Box from '@mui/material/Box'
+import Grid from '@mui/material/Grid'
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+
+import Logo from '@/assets/logo.svg'
+import screenShotMyChore from '@/assets/screenshot-my-chore.png'
+import { GitHub } from '@mui/icons-material'
+
+const HomeHero = () => {
+ const navigate = useNavigate()
+ const HERO_TEXT_THAT = [
+ // 'Donetick simplifies the entire process, from scheduling and reminders to automatic task assignment and progress tracking.',
+ // 'Donetick is the intuitive task and chore management app designed for groups. Take charge of shared responsibilities, automate your workflow, and achieve more together.',
+ 'An open-source, user-friendly app for managing tasks and chores, featuring customizable options to help you and others stay organized',
+ ]
+
+ const [heroTextIndex, setHeroTextIndex] = React.useState(0)
+
+ React.useEffect(() => {
+ // const intervalId = setInterval(
+ // () => setHeroTextIndex(index => index + 1),
+ // 4000, // every 4 seconds
+ // )
+ // return () => clearTimeout(intervalId)
+ }, [])
+
+ const Title = () => (
+ <Box
+ sx={{
+ textAlign: 'center',
+ display: 'flex',
+ flexDirection: 'row',
+ justifyContent: 'center',
+ alignItems: 'center',
+ }}
+ >
+ <img src={Logo} width={'100px'} />
+ <Typography level='h1' fontSize={58} fontWeight={800}>
+ <span
+ data-aos-delay={50 * 1}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='fade-up'
+ >
+ Done
+ </span>
+ <span
+ data-aos-delay={100 * 3}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='fade-up'
+ style={{
+ color: '#06b6d4',
+ }}
+ >
+ tick
+ </span>
+ </Typography>
+ </Box>
+ )
+
+ const Subtitle = () => (
+ <Typography
+ level='h2'
+ fontWeight={500}
+ textAlign={'center'}
+ className='opacity-70'
+ data-aos-delay={100 * 5}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='zoom-in'
+ >
+ Simplify Tasks & Chores, Together.
+ </Typography>
+ )
+
+ const CTAButton = () => (
+ <Button
+ data-aos-delay={100 * 2}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='fade-up'
+ variant='solid'
+ size='lg'
+ sx={{
+ py: 1.25,
+ px: 5,
+ fontSize: 20,
+ mt: 2,
+ borderWidth: 3,
+ // boxShadow: '0px 0px 24px rgba(81, 230, 221, 0.5)',
+ transition: 'all 0.20s',
+ }}
+ className='hover:scale-105'
+ onClick={() => {
+ // if the url is donetick.com then navigate to app.donetick.com/my/chores
+ // else navigate to /my/chores
+ if (window.location.hostname === 'donetick.com') {
+ window.location.href = 'https://app.donetick.com/my/chores'
+ } else {
+ navigate('/my/chores')
+ }
+ }}
+ >
+ Get started
+ </Button>
+ )
+
+ return (
+ // <Box
+ // id='hero'
+ // className='grid min-h-[90vh] w-full place-items-center px-4 py-12'
+ // data-aos-id-hero
+ // >
+ <Grid container spacing={16} sx={{ py: 12 }}>
+ <Grid item xs={12} md={7}>
+ <Title />
+ <div className='flex flex-col gap-6'>
+ <Subtitle />
+
+ <Typography
+ level='title-lg'
+ textAlign={'center'}
+ fontSize={28}
+ // textColor={'#06b6d4'}
+ color='primary'
+ data-aos-delay={100 * 1}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='fade-up'
+ >
+ {`"${HERO_TEXT_THAT[heroTextIndex % HERO_TEXT_THAT.length]}"`}
+ </Typography>
+
+ <Box className='flex w-full justify-center'>
+ <CTAButton />
+ <Button
+ data-aos-delay={100 * 2.5}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='fade-up'
+ variant='soft'
+ size='lg'
+ sx={{
+ py: 1.25,
+ px: 5,
+ ml: 2,
+ fontSize: 20,
+ mt: 2,
+ borderWidth: 3,
+ // boxShadow: '0px 0px 24px rgba(81, 230, 221, 0.5)',
+ transition: 'all 0.20s',
+ }}
+ className='hover:scale-105'
+ onClick={() => {
+ // new window open to https://github.com/Donetick:
+ window.open('https://github.com/donetick', '_blank')
+ }}
+ startDecorator={<GitHub />}
+ >
+ Github
+ </Button>
+ </Box>
+ </div>
+ </Grid>
+
+ <Grid item xs={12} md={5}>
+ <div className='flex justify-center'>
+ <img
+ src={screenShotMyChore}
+ width={'100%'}
+ style={{
+ maxWidth: 300,
+ }}
+ height={'auto'}
+ alt='Hero img'
+ data-aos-delay={100 * 2}
+ data-aos-anchor='[data-aos-id-hero]'
+ data-aos='fade-left'
+ />
+ </div>
+ </Grid>
+ </Grid>
+ )
+}
+
+export default HomeHero
diff --git a/src/views/Landing/Landing.jsx b/src/views/Landing/Landing.jsx
new file mode 100644
index 0000000..2041e42
--- /dev/null
+++ b/src/views/Landing/Landing.jsx
@@ -0,0 +1,32 @@
+import { Container } from '@mui/joy'
+import AOS from 'aos'
+import 'aos/dist/aos.css'
+import { useEffect, useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import FeaturesSection from './FeaturesSection'
+import HomeHero from './HomeHero'
+import PricingSection from './PricingSection'
+const Landing = () => {
+ const Navigate = useNavigate()
+ const getCurrentUser = () => {
+ return JSON.parse(localStorage.getItem('user'))
+ }
+ const [users, setUsers] = useState([])
+ const [currentUser, setCurrentUser] = useState(getCurrentUser())
+
+ useEffect(() => {
+ AOS.init({
+ once: false, // whether animation should happen only once - while scrolling down
+ })
+ }, [])
+
+ return (
+ <Container className='flex h-full items-center justify-center'>
+ <HomeHero />
+ <FeaturesSection />
+ <PricingSection />
+ </Container>
+ )
+}
+
+export default Landing
diff --git a/src/views/Landing/PricingSection.jsx b/src/views/Landing/PricingSection.jsx
new file mode 100644
index 0000000..634cf7d
--- /dev/null
+++ b/src/views/Landing/PricingSection.jsx
@@ -0,0 +1,179 @@
+/* eslint-disable react/jsx-key */
+import { CheckRounded } from '@mui/icons-material'
+import { Box, Button, Card, Container, Typography } from '@mui/joy'
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+
+const PricingSection = () => {
+ const navigate = useNavigate()
+ const FEATURES_FREE = [
+ ['Create Tasks and Chores', <CheckRounded color='primary' />],
+ ['Limited Task History', <CheckRounded color='primary' />],
+ ['Circle up to two members', <CheckRounded color='primary' />],
+ ]
+ const FEATURES_PREMIUM = [
+ ['All Basic Features', <CheckRounded color='primary' />],
+ ['Hosted on DoneTick servers', <CheckRounded color='primary' />],
+ ['Up to 8 Circle Members', <CheckRounded color='primary' />],
+ [
+ 'Notification through Telegram (Discord coming soon)',
+ <CheckRounded color='primary' />,
+ ],
+ ['Unlimited History', <CheckRounded color='primary' />],
+ [
+ 'All circle members get the same features as the owner',
+ <CheckRounded color='primary' />,
+ ],
+ ]
+ const FEATURES_YEARLY = [
+ // ['All Basic Features', <CheckRounded color='primary' />],
+ // ['Up to 8 Circle Members', <CheckRounded color='primary' />],
+ ['Notification through Telegram bot', <CheckRounded color='primary' />],
+ ['Custom Webhook/API Integration', <CheckRounded color='primary' />],
+ ['Unlimited History', <CheckRounded color='primary' />],
+
+ ['Priority Support', <CheckRounded color='primary' />],
+ ]
+ const PRICEITEMS = [
+ {
+ title: 'Basic',
+ description:
+ 'Hosted on Donetick servers, supports up to 2 circle members and includes all the features of the free plan.',
+ price: 0,
+ previousPrice: 0,
+ interval: 'month',
+ discount: false,
+ features: FEATURES_FREE,
+ },
+
+ {
+ title: 'Plus',
+ description:
+ // 'Supports up to 8 circle members and includes all the features of the Basic plan.',
+ 'Hosted on Donetick servers, supports up to 8 circle members and includes all the features of the Basic plan.',
+ price: 30.0,
+ // previousPrice: 76.89,
+ interval: 'year',
+ // discount: true,
+ features: FEATURES_YEARLY,
+ },
+ ]
+ return (
+ <Container
+ sx={{ textAlign: 'center', mb: 2 }}
+ maxWidth={'lg'}
+ id='pricing-tiers'
+ >
+ <Typography level='h4' mt={2} mb={2}>
+ Pricing
+ </Typography>
+
+ <Container maxWidth={'sm'} sx={{ mb: 8 }}>
+ <Typography level='body-md' color='neutral'>
+ Choose the plan that works best for you.
+ </Typography>
+ </Container>
+
+ <div
+ className='mt-8 grid grid-cols-1 gap-2 sm:grid-cols-1 lg:grid-cols-2'
+ data-aos-id-pricing
+ >
+ {PRICEITEMS.map((pi, index) => (
+ <Card
+ key={index}
+ data-aos-delay={50 * (1 + index)}
+ data-aos-anchor='[data-aos-id-pricing]'
+ data-aos='fade-up'
+ className='hover:bg-white dark:hover:bg-teal-900'
+ sx={{
+ textAlign: 'center',
+ p: 5,
+ minHeight: 400,
+ // maxWidth: 400,
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'space-between',
+ // when top reach the top change the background color:
+ '&:hover': {
+ // backgroundColor: '#FFFFFF',
+ boxShadow: '0px 0px 20px rgba(0, 0, 0, 0.1)',
+ },
+ }}
+ >
+ <Box
+ display='flex'
+ flexDirection='column'
+ justifyContent='flex-start' // Updated property
+ alignItems='center'
+ >
+ <Typography level='h2'>{pi.title}</Typography>
+ <Typography level='body-md'>{pi.description}</Typography>
+ </Box>
+ <Box
+ display='flex'
+ flexDirection='column'
+ justifyContent='center'
+ alignItems='center'
+ >
+ <Box
+ display='flex'
+ flexDirection='row'
+ alignItems='baseline'
+ sx={{ my: 4 }}
+ >
+ {pi.discount && (
+ <Typography
+ level='h3'
+ component='span'
+ sx={{ textDecoration: 'line-through', opacity: 0.5 }}
+ >
+ ${pi.previousPrice}&nbsp;
+ </Typography>
+ )}
+ <Typography level='h2' component='span'>
+ ${pi.price}
+ </Typography>
+ <Typography level='body-md' component='span'>
+ / {pi.interval}
+ </Typography>
+ </Box>
+
+ <Typography level='title-md'>Features</Typography>
+ {pi.features.map(feature => (
+ <Typography
+ startDecorator={feature[1]}
+ level='body-md'
+ color='neutral'
+ lineHeight={1.6}
+ >
+ {feature[0]}
+ </Typography>
+ ))}
+
+ {/* Here start the test */}
+ <div style={{ marginTop: 'auto' }}>
+ <Button
+ sx={{ mt: 5 }}
+ onClick={() => {
+ navigate('/settings#account')
+ }}
+ >
+ Get Started
+ </Button>
+ <Typography
+ level='body-md'
+ color='neutral'
+ lineHeight={1.6}
+ ></Typography>
+ </div>
+ </Box>
+ </Card>
+ ))}
+ </div>
+
+ {/* Here start the test */}
+ </Container>
+ )
+}
+
+export default PricingSection
diff --git a/src/views/Modals/Inputs/ConfirmationModal.jsx b/src/views/Modals/Inputs/ConfirmationModal.jsx
new file mode 100644
index 0000000..10f9bee
--- /dev/null
+++ b/src/views/Modals/Inputs/ConfirmationModal.jsx
@@ -0,0 +1,43 @@
+import { Box, Button, Modal, ModalDialog, Typography } from '@mui/joy'
+import React from 'react'
+
+function ConfirmationModal({ config }) {
+ const handleAction = isConfirmed => {
+ config.onClose(isConfirmed)
+ }
+
+ return (
+ <Modal open={config?.isOpen} onClose={config?.onClose}>
+ <ModalDialog>
+ <Typography level='h4' mb={1}>
+ {config?.title}
+ </Typography>
+
+ <Typography level='body-md' gutterBottom>
+ {config?.message}
+ </Typography>
+
+ <Box display={'flex'} justifyContent={'space-around'} mt={1}>
+ <Button
+ onClick={() => {
+ handleAction(true)
+ }}
+ fullWidth
+ sx={{ mr: 1 }}
+ >
+ {config?.confirmText}
+ </Button>
+ <Button
+ onClick={() => {
+ handleAction(false)
+ }}
+ variant='outlined'
+ >
+ {config?.cancelText}
+ </Button>
+ </Box>
+ </ModalDialog>
+ </Modal>
+ )
+}
+export default ConfirmationModal
diff --git a/src/views/Modals/Inputs/CreateThingModal.jsx b/src/views/Modals/Inputs/CreateThingModal.jsx
new file mode 100644
index 0000000..59263ff
--- /dev/null
+++ b/src/views/Modals/Inputs/CreateThingModal.jsx
@@ -0,0 +1,112 @@
+import {
+ Box,
+ Button,
+ FormLabel,
+ Input,
+ Modal,
+ ModalDialog,
+ Option,
+ Select,
+ Textarea,
+ Typography,
+} from '@mui/joy'
+import { useEffect, useState } from 'react'
+
+function CreateThingModal({ isOpen, onClose, onSave, currentThing }) {
+ const [name, setName] = useState(currentThing?.name || '')
+ const [type, setType] = useState(currentThing?.type || 'numeric')
+ const [state, setState] = useState(currentThing?.state || '')
+ useEffect(() => {
+ if (type === 'boolean') {
+ if (state !== 'true' && state !== 'false') {
+ setState('false')
+ }
+ } else if (type === 'number') {
+ if (isNaN(state)) {
+ setState(0)
+ }
+ }
+ }, [type])
+ const handleSave = () => {
+ onSave({ name, type, id: currentThing?.id, state: state || null })
+ onClose()
+ }
+
+ return (
+ <Modal open={isOpen} onClose={onClose}>
+ <ModalDialog>
+ {/* <ModalClose /> */}
+ <Typography variant='h4'>P;lease add info</Typography>
+ <FormLabel>Name</FormLabel>
+
+ <Textarea
+ placeholder='Thing name'
+ value={name}
+ onChange={e => setName(e.target.value)}
+ sx={{ minWidth: 300 }}
+ />
+ <FormLabel>Type</FormLabel>
+ <Select value={type} sx={{ minWidth: 300 }}>
+ {['text', 'number', 'boolean'].map(type => (
+ <Option value={type} key={type} onClick={() => setType(type)}>
+ {type.charAt(0).toUpperCase() + type.slice(1)}
+ </Option>
+ ))}
+ </Select>
+
+ {type === 'text' && (
+ <>
+ <FormLabel>Value</FormLabel>
+ <Input
+ placeholder='Thing value'
+ value={state || ''}
+ onChange={e => setState(e.target.value)}
+ sx={{ minWidth: 300 }}
+ />
+ </>
+ )}
+ {type === 'number' && (
+ <>
+ <FormLabel>Value</FormLabel>
+ <Input
+ placeholder='Thing value'
+ type='number'
+ value={state || ''}
+ onChange={e => {
+ setState(e.target.value)
+ }}
+ sx={{ minWidth: 300 }}
+ />
+ </>
+ )}
+ {type === 'boolean' && (
+ <>
+ <FormLabel>Value</FormLabel>
+ <Select sx={{ minWidth: 300 }} value={state}>
+ {['true', 'false'].map(value => (
+ <Option
+ value={value}
+ key={value}
+ onClick={() => setState(value)}
+ >
+ {value.charAt(0).toUpperCase() + value.slice(1)}
+ </Option>
+ ))}
+ </Select>
+ </>
+ )}
+
+ <Box display={'flex'} justifyContent={'space-around'} mt={1}>
+ <Button onClick={handleSave} fullWidth sx={{ mr: 1 }}>
+ {currentThing?.id ? 'Update' : 'Create'}
+ </Button>
+ <Button onClick={onClose} variant='outlined'>
+ {currentThing?.id ? 'Cancel' : 'Close'}
+ </Button>
+ </Box>
+ </ModalDialog>
+ </Modal>
+ )
+}
+
+export default CreateThingModal
diff --git a/src/views/Modals/Inputs/DateModal.jsx b/src/views/Modals/Inputs/DateModal.jsx
new file mode 100644
index 0000000..34319c3
--- /dev/null
+++ b/src/views/Modals/Inputs/DateModal.jsx
@@ -0,0 +1,45 @@
+import React, { useState } from 'react'
+import {
+ Modal,
+ Button,
+ Input,
+ ModalDialog,
+ ModalClose,
+ Box,
+ Typography,
+} from '@mui/joy'
+
+function DateModal({ isOpen, onClose, onSave, current, title }) {
+ const [date, setDate] = useState(
+ current ? new Date(current).toISOString().split('T')[0] : null,
+ )
+
+ const handleSave = () => {
+ onSave(date)
+ onClose()
+ }
+
+ return (
+ <Modal open={isOpen} onClose={onClose}>
+ <ModalDialog>
+ {/* <ModalClose /> */}
+ <Typography variant='h4'>{title}</Typography>
+ <Input
+ sx={{ mt: 3 }}
+ type='date'
+ value={date}
+ onChange={e => setDate(e.target.value)}
+ />
+ <Box display={'flex'} justifyContent={'space-around'} mt={1}>
+ <Button onClick={handleSave} fullWidth sx={{ mr: 1 }}>
+ Save
+ </Button>
+ <Button onClick={onClose} variant='outlined'>
+ Cancel
+ </Button>
+ </Box>
+ </ModalDialog>
+ </Modal>
+ )
+}
+export default DateModal
diff --git a/src/views/Modals/Inputs/SelectModal.jsx b/src/views/Modals/Inputs/SelectModal.jsx
new file mode 100644
index 0000000..61e7ae9
--- /dev/null
+++ b/src/views/Modals/Inputs/SelectModal.jsx
@@ -0,0 +1,49 @@
+import {
+ Box,
+ Button,
+ Modal,
+ ModalDialog,
+ Option,
+ Select,
+ Typography,
+} from '@mui/joy'
+import React from 'react'
+
+function SelectModal({ isOpen, onClose, onSave, options, title, displayKey }) {
+ const [selected, setSelected] = React.useState(null)
+ const handleSave = () => {
+ onSave(options.find(item => item.id === selected))
+ onClose()
+ }
+
+ return (
+ <Modal open={isOpen} onClose={onClose}>
+ <ModalDialog>
+ <Typography variant='h4'>{title}</Typography>
+ <Select>
+ {options.map((item, index) => (
+ <Option
+ value={item.id}
+ key={item[displayKey]}
+ onClick={() => {
+ setSelected(item.id)
+ }}
+ >
+ {item[displayKey]}
+ </Option>
+ ))}
+ </Select>
+
+ <Box display={'flex'} justifyContent={'space-around'} mt={1}>
+ <Button onClick={handleSave} fullWidth sx={{ mr: 1 }}>
+ Save
+ </Button>
+ <Button onClick={onClose} variant='outlined'>
+ Cancel
+ </Button>
+ </Box>
+ </ModalDialog>
+ </Modal>
+ )
+}
+export default SelectModal
diff --git a/src/views/Modals/Inputs/TextModal.jsx b/src/views/Modals/Inputs/TextModal.jsx
new file mode 100644
index 0000000..2b44f78
--- /dev/null
+++ b/src/views/Modals/Inputs/TextModal.jsx
@@ -0,0 +1,46 @@
+import { Box, Button, Modal, ModalDialog, Textarea, Typography } from '@mui/joy'
+import { useState } from 'react'
+
+function TextModal({
+ isOpen,
+ onClose,
+ onSave,
+ current,
+ title,
+ okText,
+ cancelText,
+}) {
+ const [text, setText] = useState(current)
+
+ const handleSave = () => {
+ onSave(text)
+ onClose()
+ }
+
+ return (
+ <Modal open={isOpen} onClose={onClose}>
+ <ModalDialog>
+ {/* <ModalClose /> */}
+ <Typography variant='h4'>{title}</Typography>
+ <Textarea
+ placeholder='Type in here…'
+ value={text}
+ onChange={e => setText(e.target.value)}
+ minRows={2}
+ maxRows={4}
+ sx={{ minWidth: 300 }}
+ />
+
+ <Box display={'flex'} justifyContent={'space-around'} mt={1}>
+ <Button onClick={handleSave} fullWidth sx={{ mr: 1 }}>
+ {okText ? okText : 'Save'}
+ </Button>
+ <Button onClick={onClose} variant='outlined'>
+ {cancelText ? cancelText : 'Cancel'}
+ </Button>
+ </Box>
+ </ModalDialog>
+ </Modal>
+ )
+}
+export default TextModal
diff --git a/src/views/NotificationTargets/EditNotificationTarget.jsx b/src/views/NotificationTargets/EditNotificationTarget.jsx
new file mode 100644
index 0000000..ba1a38a
--- /dev/null
+++ b/src/views/NotificationTargets/EditNotificationTarget.jsx
@@ -0,0 +1,51 @@
+import { useEffect, useState } from 'react'
+import { useParams } from 'react-router-dom'
+
+const EditNotificationTarget = () => {
+ const { id } = useParams()
+ const [notificationTarget, setNotificationTarget] = useState(null)
+ const [loading, setLoading] = useState(true)
+ const [error, setError] = useState(null)
+
+ useEffect(() => {
+ // const fetchNotificationTarget = async () => {
+ // try {
+ // const response = await fetch(`/api/notification-targets/${id}`)
+ // const data = await response.json()
+ // setNotificationTarget(data)
+ // } catch (error) {
+ // setError(error)
+ // } finally {
+ // setLoading(false)
+ // }
+ // }
+ // fetchNotificationTarget()
+ }, [id])
+
+ if (loading) {
+ return <div>Loading...</div>
+ }
+
+ if (error) {
+ return <div>Error: {error.message}</div>
+ }
+
+ return (
+ <div>
+ <h1>Edit Notification Target</h1>
+ <form>
+ <label>
+ Name:
+ <input type='text' value={notificationTarget.name} />
+ </label>
+ <label>
+ Email:
+ <input type='email' value={notificationTarget.email} />
+ </label>
+ <button type='submit'>Save</button>
+ </form>
+ </div>
+ )
+}
+
+export default EditNotificationTarget
diff --git a/src/views/Payments/PaymentFailView.jsx b/src/views/Payments/PaymentFailView.jsx
new file mode 100644
index 0000000..38fcc2a
--- /dev/null
+++ b/src/views/Payments/PaymentFailView.jsx
@@ -0,0 +1,51 @@
+import { Box, Container, Sheet, Typography } from '@mui/joy'
+import { useEffect } from 'react'
+import { useNavigate } from 'react-router-dom'
+import Logo from '../../Logo'
+
+const PaymentCancelledView = () => {
+ const navigate = useNavigate()
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ navigate('/my/chores')
+ }, 5000)
+ return () => clearTimeout(timer)
+ }, [navigate])
+
+ return (
+ <Container component='main' maxWidth='xs'>
+ <Box
+ sx={{
+ marginTop: 4,
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ }}
+ >
+ <Sheet
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ }}
+ >
+ <Logo />
+ <Typography level='h2' sx={{ mt: 2, mb: 1 }}>
+ Payment has been cancelled
+ </Typography>
+ <Typography level='body-md' sx={{ mb: 2 }}>
+ You will be redirected to the main page shortly.
+ </Typography>
+ </Sheet>
+ </Box>
+ </Container>
+ )
+}
+
+export default PaymentCancelledView
diff --git a/src/views/Payments/PaymentSuccessView.jsx b/src/views/Payments/PaymentSuccessView.jsx
new file mode 100644
index 0000000..b2fbb50
--- /dev/null
+++ b/src/views/Payments/PaymentSuccessView.jsx
@@ -0,0 +1,51 @@
+import { Box, Container, Sheet, Typography } from '@mui/joy'
+import { useEffect } from 'react'
+import { useNavigate } from 'react-router-dom'
+import Logo from '../../Logo'
+
+const PaymentSuccessView = () => {
+ const navigate = useNavigate()
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ navigate('/settings')
+ }, 5000)
+ return () => clearTimeout(timer)
+ }, [navigate])
+
+ return (
+ <Container component='main' maxWidth='xs'>
+ <Box
+ sx={{
+ marginTop: 4,
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ }}
+ >
+ <Sheet
+ sx={{
+ mt: 1,
+ width: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ padding: 2,
+ borderRadius: '8px',
+ boxShadow: 'md',
+ }}
+ >
+ <Logo />
+ <Typography level='h2' sx={{ mt: 2, mb: 1 }}>
+ Payment Successful!
+ </Typography>
+ <Typography level='body-md' sx={{ mb: 2 }}>
+ You will be redirected to the settings page shortly.
+ </Typography>
+ </Sheet>
+ </Box>
+ </Container>
+ )
+}
+
+export default PaymentSuccessView
diff --git a/src/views/PrivacyPolicy/PrivacyPolicyView.jsx b/src/views/PrivacyPolicy/PrivacyPolicyView.jsx
new file mode 100644
index 0000000..42a4707
--- /dev/null
+++ b/src/views/PrivacyPolicy/PrivacyPolicyView.jsx
@@ -0,0 +1,102 @@
+import React from 'react'
+
+const PrivacyPolicyView = () => {
+ return (
+ <div>
+ <h1>Privacy Policy</h1>
+ <p>
+ Favoro LLC ("we," "us," or "our") operates the Donetick application and
+ website (collectively, the "Service"). This Privacy Policy informs you
+ of our policies regarding the collection, use, and disclosure of
+ personal data when you use our Service and the choices you have
+ associated with that data.
+ </p>
+ <h2>Information We Collect</h2>
+ <p>
+ <strong>Personal Data:</strong> When you register for an account or use
+ the Service, we may collect certain personally identifiable information,
+ such as your name and email address.
+ </p>
+ <p>
+ <strong>Usage Data:</strong> We collect information on how you use the
+ Service, such as your IP address, browser type, pages visited, and the
+ time and date of your visit.
+ </p>
+ <p>
+ <strong>Task Data:</strong> We store the tasks and chores you create
+ within the app, including their details and any assigned users.
+ </p>
+ <h2>How We Use Your Information</h2>
+ <p>
+ <strong>Provide and Maintain the Service:</strong> We use your
+ information to operate, maintain, and improve the Service.
+ </p>
+ <p>
+ <strong>Communicate with You:</strong> We may use your email address to
+ send you notifications, updates, and promotional materials related to
+ the Service.
+ </p>
+ <p>
+ <strong>Analyze Usage:</strong> We analyze usage data to understand how
+ the Service is used and to make improvements.
+ </p>
+ <h2>How We Share Your Information</h2>
+ <p>
+ <strong>With Your Consent:</strong> We will not share your personal data
+ with third parties without your consent, except as described in this
+ Privacy Policy.
+ </p>
+ <p>
+ <strong>Service Providers:</strong> We may engage third-party companies
+ or individuals to perform services on our behalf (e.g., hosting,
+ analytics). These third parties have access to your personal data only
+ to perform these tasks and are obligated not to disclose or use it for
+ any other purpose.
+ </p>
+ <p>
+ <strong>Compliance with Law:</strong> We may disclose your personal data
+ if required to do so by law or in response to valid requests by public
+ authorities (e.g., a court or government agency).
+ </p>
+ <h2>Security</h2>
+ <p>
+ We value your privacy and have implemented reasonable security measures
+ to protect your personal data from unauthorized access, disclosure,
+ alteration, or destruction. However, no method of transmission over the
+ Internet or electronic storage is 100% secure, and we cannot guarantee
+ absolute security.
+ </p>
+ <h2>Your Choices</h2>
+ <p>
+ <strong>Account Information:</strong> You can update or correct your
+ account information at any time.
+ </p>
+ <p>
+ <strong>Marketing Communications:</strong> You can opt out of receiving
+ promotional emails by following the unsubscribe instructions included in
+ those emails.
+ </p>
+ <h2>Children's Privacy</h2>
+ <p>
+ Our Service is not intended for children under 13 years of age. We do
+ not knowingly collect personal data from children under 13. If you are a
+ parent or guardian and you are aware that your child has provided us
+ with personal data, please contact us.
+ </p>
+ <h2>Changes to This Privacy Policy</h2>
+ <p>
+ We may update our Privacy Policy from time to time. We will notify you
+ of any changes by posting the new Privacy Policy on this page and
+ updating the "Effective Date" at the top of this Privacy Policy.
+ </p>
+ <h2>Contact Us</h2>
+ <p>
+ If you have any questions about this Privacy Policy, please contact us
+ at:
+ </p>
+ <p>Favoro LLC</p>
+ </div>
+ )
+}
+
+export default PrivacyPolicyView
diff --git a/src/views/Settings/APITokenSettings.jsx b/src/views/Settings/APITokenSettings.jsx
new file mode 100644
index 0000000..5bd9887
--- /dev/null
+++ b/src/views/Settings/APITokenSettings.jsx
@@ -0,0 +1,130 @@
+import { Box, Button, Card, Chip, Divider, Typography } from '@mui/joy'
+import moment from 'moment'
+import { useContext, useEffect, useState } from 'react'
+import { UserContext } from '../../contexts/UserContext'
+import {
+ CreateLongLiveToken,
+ DeleteLongLiveToken,
+ GetLongLiveTokens,
+} from '../../utils/Fetcher'
+import { isPlusAccount } from '../../utils/Helpers'
+import TextModal from '../Modals/Inputs/TextModal'
+
+const APITokenSettings = () => {
+ const [tokens, setTokens] = useState([])
+ const [isGetTokenNameModalOpen, setIsGetTokenNameModalOpen] = useState(false)
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ useEffect(() => {
+ GetLongLiveTokens().then(resp => {
+ resp.json().then(data => {
+ setTokens(data.res)
+ })
+ })
+ }, [])
+
+ const handleSaveToken = name => {
+ CreateLongLiveToken(name).then(resp => {
+ if (resp.ok) {
+ resp.json().then(data => {
+ // add the token to the list:
+ console.log(data)
+ const newTokens = [...tokens]
+ newTokens.push(data.res)
+ setTokens(newTokens)
+ })
+ }
+ })
+ }
+
+ return (
+ <div className='grid gap-4 py-4' id='apitokens'>
+ <Typography level='h3'>Long Live Token</Typography>
+ <Divider />
+ <Typography level='body-sm'>
+ Create token to use with the API to update things that trigger task or
+ chores
+ </Typography>
+ {!isPlusAccount(userProfile) && (
+ <Chip variant='soft' color='warning'>
+ Not available in Basic Plan
+ </Chip>
+ )}
+
+ {tokens.map(token => (
+ <Card key={token.token} className='p-4'>
+ <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
+ <Box>
+ <Typography level='body-md'>{token.name}</Typography>
+ <Typography level='body-xs'>
+ {moment(token.createdAt).fromNow()}(
+ {moment(token.createdAt).format('lll')})
+ </Typography>
+ </Box>
+ <Box>
+ {token.token && (
+ <Button
+ variant='outlined'
+ color='primary'
+ sx={{ mr: 1 }}
+ onClick={() => {
+ navigator.clipboard.writeText(token.token)
+ alert('Token copied to clipboard')
+ }}
+ >
+ Copy Token
+ </Button>
+ )}
+
+ <Button
+ variant='outlined'
+ color='danger'
+ onClick={() => {
+ const confirmed = confirm(
+ `Are you sure you want to remove ${token.name} ?`,
+ )
+ if (confirmed) {
+ DeleteLongLiveToken(token.id).then(resp => {
+ if (resp.ok) {
+ alert('Token removed')
+ const newTokens = tokens.filter(t => t.id !== token.id)
+ setTokens(newTokens)
+ }
+ })
+ }
+ }}
+ >
+ Remove
+ </Button>
+ </Box>
+ </Box>
+ </Card>
+ ))}
+
+ <Button
+ variant='soft'
+ color='primary'
+ disabled={!isPlusAccount(userProfile)}
+ sx={{
+ width: '210px',
+ mb: 1,
+ }}
+ onClick={() => {
+ setIsGetTokenNameModalOpen(true)
+ }}
+ >
+ Generate New Token
+ </Button>
+ <TextModal
+ isOpen={isGetTokenNameModalOpen}
+ title='Give a name for your new token, something to remember it by.'
+ onClose={() => {
+ setIsGetTokenNameModalOpen(false)
+ }}
+ okText={'Generate Token'}
+ onSave={handleSaveToken}
+ />
+ </div>
+ )
+}
+
+export default APITokenSettings
diff --git a/src/views/Settings/NotificationSetting.jsx b/src/views/Settings/NotificationSetting.jsx
new file mode 100644
index 0000000..4ead3b9
--- /dev/null
+++ b/src/views/Settings/NotificationSetting.jsx
@@ -0,0 +1,90 @@
+import { Button, Divider, Input, Option, Select, Typography } from '@mui/joy'
+import { useContext, useEffect, useState } from 'react'
+import { UserContext } from '../../contexts/UserContext'
+import { GetUserProfile, UpdateUserDetails } from '../../utils/Fetcher'
+
+const NotificationSetting = () => {
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ useEffect(() => {
+ if (!userProfile) {
+ GetUserProfile().then(resp => {
+ resp.json().then(data => {
+ setUserProfile(data.res)
+ setChatID(data.res.chatID)
+ })
+ })
+ }
+ }, [])
+ const [chatID, setChatID] = useState(userProfile?.chatID)
+
+ return (
+ <div className='grid gap-4 py-4' id='notifications'>
+ <Typography level='h3'>Notification Settings</Typography>
+ <Divider />
+ <Typography level='body-md'>Manage your notification settings</Typography>
+
+ <Select defaultValue='telegram' sx={{ maxWidth: '200px' }} disabled>
+ <Option value='telegram'>Telegram</Option>
+ <Option value='discord'>Discord</Option>
+ </Select>
+
+ <Typography level='body-xs'>
+ You need to initiate a message to the bot in order for the Telegram
+ notification to work{' '}
+ <a
+ style={{
+ textDecoration: 'underline',
+ color: '#0891b2',
+ }}
+ href='https://t.me/DonetickBot'
+ >
+ Click here
+ </a>{' '}
+ to start a chat
+ </Typography>
+
+ <Input
+ value={chatID}
+ onChange={e => setChatID(e.target.value)}
+ placeholder='User ID / Chat ID'
+ sx={{
+ width: '200px',
+ }}
+ />
+ <Typography mt={0} level='body-xs'>
+ If you don't know your Chat ID, start chat with userinfobot and it will
+ send you your Chat ID.{' '}
+ <a
+ style={{
+ textDecoration: 'underline',
+ color: '#0891b2',
+ }}
+ href='https://t.me/userinfobot'
+ >
+ Click here
+ </a>{' '}
+ to start chat with userinfobot{' '}
+ </Typography>
+
+ <Button
+ sx={{
+ width: '110px',
+ mb: 1,
+ }}
+ onClick={() => {
+ UpdateUserDetails({
+ chatID: Number(chatID),
+ }).then(resp => {
+ resp.json().then(data => {
+ setUserProfile(data)
+ })
+ })
+ }}
+ >
+ Save
+ </Button>
+ </div>
+ )
+}
+
+export default NotificationSetting
diff --git a/src/views/Settings/Settings.jsx b/src/views/Settings/Settings.jsx
new file mode 100644
index 0000000..d612eec
--- /dev/null
+++ b/src/views/Settings/Settings.jsx
@@ -0,0 +1,384 @@
+import {
+ Box,
+ Button,
+ Card,
+ Chip,
+ CircularProgress,
+ Container,
+ Divider,
+ Input,
+ Typography,
+} from '@mui/joy'
+import moment from 'moment'
+import { useContext, useEffect, useState } from 'react'
+import { UserContext } from '../../contexts/UserContext'
+import Logo from '../../Logo'
+import {
+ AcceptCircleMemberRequest,
+ CancelSubscription,
+ DeleteCircleMember,
+ GetAllCircleMembers,
+ GetCircleMemberRequests,
+ GetSubscriptionSession,
+ GetUserCircle,
+ GetUserProfile,
+ JoinCircle,
+ LeaveCircle,
+} from '../../utils/Fetcher'
+import APITokenSettings from './APITokenSettings'
+import NotificationSetting from './NotificationSetting'
+import ThemeToggle from './ThemeToggle'
+
+const Settings = () => {
+ const { userProfile, setUserProfile } = useContext(UserContext)
+ const [userCircles, setUserCircles] = useState([])
+ const [circleMemberRequests, setCircleMemberRequests] = useState([])
+ const [circleInviteCode, setCircleInviteCode] = useState('')
+ const [circleMembers, setCircleMembers] = useState([])
+ useEffect(() => {
+ GetUserProfile().then(resp => {
+ resp.json().then(data => {
+ setUserProfile(data.res)
+ })
+ })
+ GetUserCircle().then(resp => {
+ resp.json().then(data => {
+ setUserCircles(data.res ? data.res : [])
+ })
+ })
+ GetCircleMemberRequests().then(resp => {
+ resp.json().then(data => {
+ setCircleMemberRequests(data.res ? data.res : [])
+ })
+ })
+ GetAllCircleMembers()
+ .then(res => res.json())
+ .then(data => {
+ setCircleMembers(data.res ? data.res : [])
+ })
+ }, [])
+
+ useEffect(() => {
+ const hash = window.location.hash
+ if (hash) {
+ const sharingSection = document.getElementById(
+ window.location.hash.slice(1),
+ )
+ if (sharingSection) {
+ sharingSection.scrollIntoView({ behavior: 'smooth' })
+ }
+ }
+ }, [])
+
+ const getSubscriptionDetails = () => {
+ if (userProfile?.subscription === 'active') {
+ return `You are currently subscribed to the Plus plan. Your subscription will renew on ${moment(
+ userProfile?.expiration,
+ ).format('MMM DD, YYYY')}.`
+ } else if (userProfile?.subscription === 'canceled') {
+ return `You have cancelled your subscription. Your account will be downgraded to the Free plan on ${moment(
+ userProfile?.expiration,
+ ).format('MMM DD, YYYY')}.`
+ } else {
+ return `You are currently on the Free plan. Upgrade to the Plus plan to unlock more features.`
+ }
+ }
+ const getSubscriptionStatus = () => {
+ if (userProfile?.subscription === 'active') {
+ return `Plus`
+ } else if (userProfile?.subscription === 'canceled') {
+ if (moment().isBefore(userProfile?.expiration)) {
+ return `Plus(until ${moment(userProfile?.expiration).format(
+ 'MMM DD, YYYY',
+ )})`
+ }
+ return `Free`
+ } else {
+ return `Free`
+ }
+ }
+
+ if (userProfile === null) {
+ return (
+ <Container className='flex h-full items-center justify-center'>
+ <Box className='flex flex-col items-center justify-center'>
+ <CircularProgress
+ color='success'
+ sx={{ '--CircularProgress-size': '200px' }}
+ >
+ <Logo />
+ </CircularProgress>
+ </Box>
+ </Container>
+ )
+ }
+ return (
+ <Container>
+ <div className='grid gap-4 py-4' id='sharing'>
+ <Typography level='h3'>Sharing settings</Typography>
+ <Divider />
+ <Typography level='body-md'>
+ Your account is automatically connected to a Circle when you create or
+ join one. Easily invite friends by sharing the unique Circle code or
+ link below. You'll receive a notification below when someone requests
+ to join your Circle.
+ </Typography>
+ <Typography level='title-sm' mb={-1}>
+ {userCircles[0]?.userRole === 'member'
+ ? `You part of ${userCircles[0]?.name} `
+ : `You circle code is:`}
+
+ <Input
+ value={userCircles[0]?.invite_code}
+ disabled
+ size='lg'
+ sx={{
+ width: '220px',
+ mb: 1,
+ }}
+ />
+ <Button
+ variant='soft'
+ onClick={() => {
+ navigator.clipboard.writeText(userCircles[0]?.invite_code)
+ alert('Code Copied to clipboard')
+ }}
+ >
+ Copy Code
+ </Button>
+ <Button
+ variant='soft'
+ sx={{ ml: 1 }}
+ onClick={() => {
+ navigator.clipboard.writeText(
+ window.location.protocol +
+ '//' +
+ window.location.host +
+ `/circle/join?code=${userCircles[0]?.invite_code}`,
+ )
+ alert('Link Copied to clipboard')
+ }}
+ >
+ Copy Link
+ </Button>
+ {userCircles.length > 0 && userCircles[0]?.userRole === 'member' && (
+ <Button
+ sx={{ ml: 1 }}
+ onClick={() => {
+ const confirmed = confirm(
+ `Are you sure you want to leave your circle?`,
+ )
+ if (confirmed) {
+ LeaveCircle(userCircles[0]?.id).then(resp => {
+ if (resp.ok) {
+ alert('Left circle successfully.')
+ } else {
+ alert('Failed to leave circle.')
+ }
+ })
+ }
+ }}
+ >
+ Leave Circle
+ </Button>
+ )}
+ </Typography>
+ <Typography level='title-md'>Circle Members</Typography>
+ {circleMembers.map(member => (
+ <Card key={member.id} className='p-4'>
+ <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
+ <Box>
+ <Typography level='body-md'>
+ {member.displayName.charAt(0).toUpperCase() +
+ member.displayName.slice(1)}
+ {member.userId === userProfile.id ? '(You)' : ''}{' '}
+ <Chip>
+ {' '}
+ {member.isActive ? member.role : 'Pending Approval'}
+ </Chip>
+ </Typography>
+ {member.isActive ? (
+ <Typography level='body-sm'>
+ Joined on {moment(member.createdAt).format('MMM DD, YYYY')}
+ </Typography>
+ ) : (
+ <Typography level='body-sm' color='danger'>
+ Request to join{' '}
+ {moment(member.updatedAt).format('MMM DD, YYYY')}
+ </Typography>
+ )}
+ </Box>
+ {member.userId !== userProfile.id && member.isActive && (
+ <Button
+ disabled={
+ circleMembers.find(m => userProfile.id == m.userId).role !==
+ 'admin'
+ }
+ variant='outlined'
+ color='danger'
+ size='sm'
+ onClick={() => {
+ const confirmed = confirm(
+ `Are you sure you want to remove ${member.displayName} from your circle?`,
+ )
+ if (confirmed) {
+ DeleteCircleMember(member.circleId, member.userId).then(
+ resp => {
+ if (resp.ok) {
+ alert('Removed member successfully.')
+ }
+ },
+ )
+ }
+ }}
+ >
+ Remove
+ </Button>
+ )}
+ </Box>
+ </Card>
+ ))}
+
+ {circleMemberRequests.length > 0 && (
+ <Typography level='title-md'>Circle Member Requests</Typography>
+ )}
+ {circleMemberRequests.map(request => (
+ <Card key={request.id} className='p-4'>
+ <Typography level='body-md'>
+ {request.displayName} wants to join your circle.
+ </Typography>
+ <Button
+ variant='soft'
+ color='success'
+ onClick={() => {
+ const confirmed = confirm(
+ `Are you sure you want to accept ${request.displayName}(username:${request.username}) to join your circle?`,
+ )
+ if (confirmed) {
+ AcceptCircleMemberRequest(request.id).then(resp => {
+ if (resp.ok) {
+ alert('Accepted request successfully.')
+ // reload the page
+ window.location.reload()
+ }
+ })
+ }
+ }}
+ >
+ Accept
+ </Button>
+ </Card>
+ ))}
+ <Divider> or </Divider>
+
+ <Typography level='body-md'>
+ if want to join someone else's Circle? Ask them for their unique
+ Circle code or join link. Enter the code below to join their Circle.
+ </Typography>
+
+ <Typography level='title-sm' mb={-1}>
+ Enter Circle code:
+ <Input
+ placeholder='Enter code'
+ value={circleInviteCode}
+ onChange={e => setCircleInviteCode(e.target.value)}
+ size='lg'
+ sx={{
+ width: '220px',
+ mb: 1,
+ }}
+ />
+ <Button
+ variant='soft'
+ onClick={() => {
+ const confirmed = confirm(
+ `Are you sure you want to leave you circle and join '${circleInviteCode}'?`,
+ )
+ if (confirmed) {
+ JoinCircle(circleInviteCode).then(resp => {
+ if (resp.ok) {
+ alert(
+ 'Joined circle successfully, wait for the circle owner to accept your request.',
+ )
+ }
+ })
+ }
+ }}
+ >
+ Join Circle
+ </Button>
+ </Typography>
+ </div>
+
+ <div className='grid gap-4 py-4' id='account'>
+ <Typography level='h3'>Account Settings</Typography>
+ <Divider />
+ <Typography level='body-md'>
+ Change your account settings, including your password, display name
+ </Typography>
+ <Typography level='title-md' mb={-1}>
+ Account Type : {getSubscriptionStatus()}
+ </Typography>
+ <Typography level='body-sm'>{getSubscriptionDetails()}</Typography>
+ <Box>
+ <Button
+ sx={{
+ width: '110px',
+ mb: 1,
+ }}
+ disabled={
+ userProfile?.subscription === 'active' ||
+ moment(userProfile?.expiration).isAfter(moment())
+ }
+ onClick={() => {
+ GetSubscriptionSession().then(data => {
+ data.json().then(data => {
+ console.log(data)
+ window.location.href = data.sessionURL
+ // open in new window:
+ // window.open(data.sessionURL, '_blank')
+ })
+ })
+ }}
+ >
+ Upgrade
+ </Button>
+
+ {userProfile?.subscription === 'active' && (
+ <Button
+ sx={{
+ width: '110px',
+ mb: 1,
+ ml: 1,
+ }}
+ variant='outlined'
+ onClick={() => {
+ CancelSubscription().then(resp => {
+ if (resp.ok) {
+ alert('Subscription cancelled.')
+ window.location.reload()
+ }
+ })
+ }}
+ >
+ Cancel
+ </Button>
+ )}
+ </Box>
+ </div>
+ <NotificationSetting />
+ <APITokenSettings />
+ <div className='grid gap-4 py-4'>
+ <Typography level='h3'>Theme preferences</Typography>
+ <Divider />
+ <Typography level='body-md'>
+ Choose how the site looks to you. Select a single theme, or sync with
+ your system and automatically switch between day and night themes.
+ </Typography>
+ <ThemeToggle />
+ </div>
+ </Container>
+ )
+}
+
+export default Settings
diff --git a/src/views/Settings/Sharing.jsx b/src/views/Settings/Sharing.jsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/Settings/Sharing.jsx
diff --git a/src/views/Settings/SharingSettings.jsx b/src/views/Settings/SharingSettings.jsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/Settings/SharingSettings.jsx
diff --git a/src/views/Settings/ThemeToggle.jsx b/src/views/Settings/ThemeToggle.jsx
new file mode 100644
index 0000000..6ff33f1
--- /dev/null
+++ b/src/views/Settings/ThemeToggle.jsx
@@ -0,0 +1,62 @@
+import useStickyState from '@/hooks/useStickyState'
+import {
+ DarkModeOutlined,
+ LaptopOutlined,
+ LightModeOutlined,
+} from '@mui/icons-material'
+import {
+ Button,
+ FormControl,
+ FormLabel,
+ ToggleButtonGroup,
+ useColorScheme,
+} from '@mui/joy'
+
+const ELEMENTID = 'select-theme-mode'
+
+const ThemeToggle = () => {
+ const { mode, setMode } = useColorScheme()
+ const [themeMode, setThemeMode] = useStickyState(mode, 'themeMode')
+
+ const handleThemeModeChange = (_, newThemeMode) => {
+ if (!newThemeMode) return
+ setThemeMode(newThemeMode)
+ setMode(newThemeMode)
+ }
+
+ const FormThemeModeToggleLabel = () => (
+ <FormLabel
+ level='title-md'
+ id={`${ELEMENTID}-label`}
+ htmlFor='select-theme-mode'
+ >
+ Theme mode
+ </FormLabel>
+ )
+
+ return (
+ <FormControl>
+ <FormThemeModeToggleLabel />
+ <div className='flex items-center gap-4'>
+ <ToggleButtonGroup
+ id={ELEMENTID}
+ variant='outlined'
+ value={themeMode}
+ onChange={handleThemeModeChange}
+ >
+ <Button startDecorator={<LightModeOutlined />} value='light'>
+ Light
+ </Button>
+ <Button startDecorator={<DarkModeOutlined />} value='dark'>
+ Dark
+ </Button>
+ <Button startDecorator={<LaptopOutlined />} value='system'>
+ System
+ </Button>
+ </ToggleButtonGroup>
+ </div>
+ </FormControl>
+ )
+}
+
+export default ThemeToggle
diff --git a/src/views/SummaryCard.jsx b/src/views/SummaryCard.jsx
new file mode 100644
index 0000000..ac1d23a
--- /dev/null
+++ b/src/views/SummaryCard.jsx
@@ -0,0 +1,31 @@
+import { Card, IconButton, Typography } from '@mui/joy'
+
+const SummaryCard = () => {
+ return (
+ <Card>
+ <div className='flex justify-between'>
+ <div>
+ <Typography level='h2'>Summary</Typography>
+ <Typography level='body-xs'>
+ This is a summary of your chores
+ </Typography>
+ </div>
+ <IconButton>
+ <MoreVert />
+ </IconButton>
+ </div>
+ <div className='flex justify-between'>
+ <div>
+ <Typography level='h3'>Due Today</Typography>
+ <Typography level='h1'>3</Typography>
+ </div>
+ <div>
+ <Typography level='h3'>Overdue</Typography>
+ <Typography level='h1'>1</Typography>
+ </div>
+ </div>
+ </Card>
+ )
+}
+
+export default SummaryCard
diff --git a/src/views/Terms/TermsView.jsx b/src/views/Terms/TermsView.jsx
new file mode 100644
index 0000000..f0a0d9c
--- /dev/null
+++ b/src/views/Terms/TermsView.jsx
@@ -0,0 +1,194 @@
+import React from 'react'
+
+const TermsView = () => {
+ return (
+ <div>
+ <h1>Terms of Service</h1>
+
+ <p>
+ These Terms of Service ("Terms") govern your access to and use of the
+ services provided by Favoro LLC, doing business as donetick.com
+ ("Favoro", "we", "us", or "our"). By accessing or using our website and
+ services, you agree to be bound by these Terms. If you do not agree to
+ these Terms, you may not access or use our services.
+ </p>
+
+ <h2>Use of Services</h2>
+
+ <ul>
+ <li>
+ You must be at least 18 years old or have the legal capacity to enter
+ into contracts in your jurisdiction to use our services.
+ </li>
+ <li>
+ You are responsible for maintaining the confidentiality of your
+ account credentials and for any activity that occurs under your
+ account.
+ </li>
+ <li>
+ You may not use our services for any illegal or unauthorized purpose,
+ or in any way that violates these Terms.
+ </li>
+ </ul>
+ <h2>Subscriptions</h2>
+
+ <ul>
+ <li>
+ Some parts of the Service are billed on a subscription basis
+ ("Subscription(s)"). You will be billed in advance on a recurring and
+ periodic basis ("Billing Cycle"). Billing cycles are set either on a
+ monthly or annual basis, depending on the type of subscription plan
+ you select when purchasing a Subscription.
+ </li>
+ <li>
+ At the end of each Billing Cycle, your Subscription will automatically
+ renew under the exact same conditions unless you cancel it or Favoro
+ cancels it. You may cancel your Subscription renewal either through
+ your online account management page or by contacting Donetickcustomer
+ support team.
+ </li>
+ <li>
+ A valid payment method, including credit or debit card, is required to
+ process the payment for your Subscription. You shall provide Favoro
+ with accurate and complete billing information including full name,
+ address, state, zip code, telephone number, and a valid payment method
+ information. By submitting such payment information, you automatically
+ authorize Donetickto charge all Subscription fees incurred through
+ your account to any such payment instruments.
+ </li>
+ <li>
+ Should automatic billing fail to occur for any reason, Donetickwill
+ issue an electronic invoice indicating that you must proceed manually,
+ within a certain deadline date, with the full payment corresponding to
+ the billing period as indicated on the invoice.
+ </li>
+ </ul>
+
+ <h2>Fee Changes</h2>
+ <ul>
+ <li>
+ {' '}
+ Favoro, in its sole discretion and at any time, may modify the
+ Subscription fees for the Subscriptions. Any Subscription fee change
+ will become effective at the end of the then-current Billing Cycle.
+ </li>
+ <li>
+ Donetickwill provide you with reasonable prior notice of any change in
+ Subscription fees to give you an opportunity to terminate your
+ Subscription before such change becomes effective.
+ </li>
+ </ul>
+
+ <h2>Refunds</h2>
+ <ul>
+ <li>
+ Certain refund requests for Subscriptions may be considered by Favoro
+ on a case-by-case basis and granted at the sole discretion of Favoro.
+ </li>
+ </ul>
+
+ <h2>Content</h2>
+ <ul>
+ <li>
+ Our services allow you to post, link, store, share, and otherwise make
+ available certain information, text, graphics, videos, or other
+ material ("Content").
+ </li>
+ <li>
+ You are responsible for the Content that you post to our services,
+ including its legality, reliability, and appropriateness.
+ </li>
+ <li>
+ You may not post Content that is defamatory, obscene, abusive,
+ offensive, or otherwise objectionable.
+ </li>
+ <li>
+ You may not post Content that violates any party's intellectual
+ property rights.
+ </li>
+ <li> You may not post Content that violates any law or regulation.</li>
+ </ul>
+ <h2>Feedback Requests</h2>
+
+ <p>
+ Our platform allows users to send feedback requests to others. You are
+ solely responsible for the content of any feedback requests you send
+ using our services.
+ </p>
+
+ <p>
+ You may not use our services to send spam, harass others, or engage in
+ any abusive behavior.
+ </p>
+
+ <h2>Credits</h2>
+
+ <p>
+ Certain actions on our platform may require credits. You can purchase
+ credits through our website.
+ </p>
+
+ <p>Credits are non-refundable and non-transferable.</p>
+
+ <h2>Intellectual Property</h2>
+
+ <p>
+ All content on our website and services, including text, graphics,
+ logos, and images, is the property of Donetickor its licensors and is
+ protected by copyright and other intellectual property laws.
+ </p>
+
+ <p>
+ You may not reproduce, modify, or distribute any content from our
+ website or services without our prior written consent.
+ </p>
+
+ <h2>Disclaimer of Warranties</h2>
+
+ <p>
+ Our services are provided "as is" and "as available" without any
+ warranty of any kind, express or implied.
+ </p>
+
+ <p>
+ We do not warrant that our services will be uninterrupted, secure, or
+ error-free, or that any defects will be corrected.
+ </p>
+
+ <h2>Limitation of Liability</h2>
+
+ <p>
+ In no event shall Donetickbe liable for any indirect, incidental,
+ special, consequential, or punitive damages, including but not limited
+ to lost profits, arising out of or in connection with your use of our
+ services.
+ </p>
+
+ <h2>Governing Law</h2>
+
+ <p>
+ These Terms shall be governed by and construed in accordance with the
+ laws of the state of [Your State/Country], without regard to its
+ conflict of law principles.
+ </p>
+
+ <h2>Changes to These Terms</h2>
+
+ <p>
+ We may update these Terms from time to time. Any changes will be posted
+ on this page, and the revised date will be indicated at the top of the
+ page. Your continued use of our services after any such changes
+ constitutes your acceptance of the new Terms.
+ </p>
+
+ <h2>Contact Us</h2>
+
+ <p>
+ If you have any questions or concerns about these Terms, please contact
+ us at support@donetick.com
+ </p>
+ </div>
+ )
+}
+
+export default TermsView
diff --git a/src/views/TestView/IconPicker.jsx b/src/views/TestView/IconPicker.jsx
new file mode 100644
index 0000000..d1bf229
--- /dev/null
+++ b/src/views/TestView/IconPicker.jsx
@@ -0,0 +1,58 @@
+import * as allIcons from '@mui/icons-material' // Import all icons using * as
+import { Grid, Input, SvgIcon } from '@mui/joy'
+import React, { useEffect, useState } from 'react'
+
+function MuiIconPicker({ onIconSelect }) {
+ const [searchTerm, setSearchTerm] = useState('')
+ const [filteredIcons, setFilteredIcons] = useState([])
+ const outlined = Object.keys(allIcons).filter(name =>
+ name.includes('Outlined'),
+ )
+ useEffect(() => {
+ // Filter icons based on the search term
+ setFilteredIcons(
+ outlined.filter(name =>
+ name
+ .toLowerCase()
+ .includes(searchTerm ? searchTerm.toLowerCase() : false),
+ ),
+ )
+ }, [searchTerm])
+
+ const handleIconClick = iconName => {
+ onIconSelect(iconName) // Callback for selected icon
+ }
+
+ return (
+ <div>
+ {/* Autocomplete component for searching */}
+ {JSON.stringify({ 1: searchTerm, filteredIcons: filteredIcons })}
+ <Input
+ onChange={(event, newValue) => {
+ setSearchTerm(newValue)
+ }}
+ />
+ {/* Grid to display icons */}
+ <Grid container spacing={2}>
+ {filteredIcons.map(iconName => {
+ const IconComponent = allIcons[iconName]
+ if (IconComponent) {
+ // Add this check to prevent errors
+ return (
+ <Grid item key={iconName} xs={3} sm={2} md={1}>
+ <SvgIcon
+ component={IconComponent}
+ onClick={() => handleIconClick(iconName)}
+ style={{ cursor: 'pointer' }}
+ />
+ </Grid>
+ )
+ }
+ return null // Return null for non-icon exports
+ })}
+ </Grid>
+ </div>
+ )
+}
+
+export default MuiIconPicker
diff --git a/src/views/TestView/Test.jsx b/src/views/TestView/Test.jsx
new file mode 100644
index 0000000..0494e93
--- /dev/null
+++ b/src/views/TestView/Test.jsx
@@ -0,0 +1,11 @@
+import MuiIconPicker from './IconPicker'
+
+const TestView = () => {
+ return (
+ <div>
+ <MuiIconPicker />
+ </div>
+ )
+}
+
+export default TestView
diff --git a/src/views/Things/ThingsHistory.jsx b/src/views/Things/ThingsHistory.jsx
new file mode 100644
index 0000000..39f0e30
--- /dev/null
+++ b/src/views/Things/ThingsHistory.jsx
@@ -0,0 +1,13 @@
+import { Container, Typography } from '@mui/joy'
+
+const ThingsHistory = () => {
+ return (
+ <Container maxWidth='md'>
+ <Typography level='h3' mb={1.5}>
+ Summary:
+ </Typography>
+ </Container>
+ )
+}
+
+export default ThingsHistory
diff --git a/src/views/Things/ThingsView.jsx b/src/views/Things/ThingsView.jsx
new file mode 100644
index 0000000..deb2df5
--- /dev/null
+++ b/src/views/Things/ThingsView.jsx
@@ -0,0 +1,324 @@
+import {
+ Add,
+ Delete,
+ Edit,
+ Flip,
+ PlusOne,
+ ToggleOff,
+ ToggleOn,
+ Widgets,
+} from '@mui/icons-material'
+import {
+ Box,
+ Card,
+ Chip,
+ Container,
+ Grid,
+ IconButton,
+ Typography,
+} from '@mui/joy'
+import { useEffect, useState } from 'react'
+import {
+ CreateThing,
+ DeleteThing,
+ GetThings,
+ SaveThing,
+ UpdateThingState,
+} from '../../utils/Fetcher'
+import ConfirmationModal from '../Modals/Inputs/ConfirmationModal'
+import CreateThingModal from '../Modals/Inputs/CreateThingModal'
+
+const ThingCard = ({
+ thing,
+ onEditClick,
+ onStateChangeRequest,
+ onDeleteClick,
+}) => {
+ const getThingIcon = type => {
+ if (type === 'text') {
+ return <Flip />
+ } else if (type === 'number') {
+ return <PlusOne />
+ } else if (type === 'boolean') {
+ if (thing.state === 'true') {
+ return <ToggleOn />
+ } else {
+ return <ToggleOff />
+ }
+ } else {
+ return <ToggleOff />
+ }
+ }
+ return (
+ <Card
+ variant='outlined'
+ sx={{
+ // display: 'flex',
+ // flexDirection: 'row', // Change to 'row'
+ justifyContent: 'space-between',
+ p: 2,
+ backgroundColor: 'white',
+ boxShadow: 'sm',
+ borderRadius: 8,
+ mb: 1,
+ }}
+ >
+ <Grid container>
+ <Grid item xs={9}>
+ <Box
+ sx={{
+ display: 'flex',
+ flexDirection: 'row',
+ gap: 1,
+ }}
+ >
+ <Typography level='title-lg' component='h2'>
+ {thing?.name}
+ </Typography>
+ <Chip level='body-md' component='p'>
+ {thing?.type}
+ </Chip>
+ </Box>
+ <Box>
+ <Typography level='body-sm' component='p'>
+ Current state:
+ <Chip level='title-md' component='span' size='sm'>
+ {thing?.state}
+ </Chip>
+ </Typography>
+ </Box>
+ </Grid>
+ <Grid item xs={3}>
+ <Box display='flex' justifyContent='flex-end' alignItems='flex-end'>
+ {/* <ButtonGroup> */}
+ <IconButton
+ variant='solid'
+ color='success'
+ onClick={() => {
+ onStateChangeRequest(thing)
+ }}
+ sx={{
+ borderRadius: '50%',
+ width: 50,
+ height: 50,
+ zIndex: 1,
+ }}
+ >
+ {getThingIcon(thing?.type)}
+ </IconButton>
+ <IconButton
+ // sx={{ width: 15 }}
+ variant='soft'
+ color='success'
+ onClick={() => {
+ onEditClick(thing)
+ }}
+ sx={{
+ borderRadius: '50%',
+ width: 25,
+ height: 25,
+ position: 'relative',
+ left: -10,
+ }}
+ >
+ <Edit />
+ </IconButton>
+ {/* add delete icon: */}
+ <IconButton
+ // sx={{ width: 15 }}
+
+ color='danger'
+ variant='soft'
+ onClick={() => {
+ onDeleteClick(thing)
+ }}
+ sx={{
+ borderRadius: '50%',
+ width: 25,
+ height: 25,
+ position: 'relative',
+ left: -10,
+ }}
+ >
+ <Delete />
+ </IconButton>
+ </Box>
+ </Grid>
+ </Grid>
+ </Card>
+ )
+}
+
+const ThingsView = () => {
+ const [things, setThings] = useState([])
+ const [isShowCreateThingModal, setIsShowCreateThingModal] = useState(false)
+ const [createModalThing, setCreateModalThing] = useState(null)
+ const [confirmModelConfig, setConfirmModelConfig] = useState({})
+ useEffect(() => {
+ // fetch things
+ GetThings().then(result => {
+ result.json().then(data => {
+ setThings(data.res)
+ })
+ })
+ }, [])
+
+ const handleSaveThing = thing => {
+ let saveFunc = CreateThing
+ if (thing?.id) {
+ saveFunc = SaveThing
+ }
+ saveFunc(thing).then(result => {
+ result.json().then(data => {
+ if (thing?.id) {
+ const currentThings = [...things]
+ const thingIndex = currentThings.findIndex(
+ currentThing => currentThing.id === thing.id,
+ )
+ currentThings[thingIndex] = data.res
+ setThings(currentThings)
+ } else {
+ const currentThings = [...things]
+ currentThings.push(data.res)
+ setThings(currentThings)
+ }
+ })
+ })
+ }
+ const handleEditClick = thing => {
+ setCreateModalThing(thing)
+ setIsShowCreateThingModal(true)
+ }
+ const handleDeleteClick = thing => {
+ setConfirmModelConfig({
+ isOpen: true,
+ title: 'Delete Things',
+ confirmText: 'Delete',
+ cancelText: 'Cancel',
+ message: 'Are you sure you want to delete this Thing?',
+ onClose: isConfirmed => {
+ if (isConfirmed === true) {
+ DeleteThing(thing.id).then(response => {
+ if (response.ok) {
+ const currentThings = [...things]
+ const thingIndex = currentThings.findIndex(
+ currentThing => currentThing.id === thing.id,
+ )
+ currentThings.splice(thingIndex, 1)
+ setThings(currentThings)
+ }
+ })
+ }
+ setConfirmModelConfig({})
+ },
+ })
+ }
+
+ const handleStateChangeRequest = thing => {
+ if (thing?.type === 'text') {
+ setCreateModalThing(thing)
+ setIsShowCreateThingModal(true)
+ } else {
+ if (thing?.type === 'number') {
+ thing.state = Number(thing.state) + 1
+ } else if (thing?.type === 'boolean') {
+ if (thing.state === 'true') {
+ thing.state = 'false'
+ } else {
+ thing.state = 'true'
+ }
+ }
+
+ UpdateThingState(thing).then(result => {
+ result.json().then(data => {
+ const currentThings = [...things]
+ const thingIndex = currentThings.findIndex(
+ currentThing => currentThing.id === thing.id,
+ )
+ currentThings[thingIndex] = data.res
+ setThings(currentThings)
+ })
+ })
+ }
+ }
+
+ return (
+ <Container maxWidth='md'>
+ {things.length === 0 && (
+ <Box
+ sx={{
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ flexDirection: 'column',
+ height: '50vh',
+ }}
+ >
+ <Widgets
+ sx={{
+ fontSize: '4rem',
+ // color: 'text.disabled',
+ mb: 1,
+ }}
+ />
+ <Typography level='title-md' gutterBottom>
+ No things has been created/found
+ </Typography>
+ </Box>
+ )}
+ {things.map(thing => (
+ <ThingCard
+ key={thing?.id}
+ thing={thing}
+ onEditClick={handleEditClick}
+ onDeleteClick={handleDeleteClick}
+ onStateChangeRequest={handleStateChangeRequest}
+ />
+ ))}
+ <Box
+ // variant='outlined'
+ sx={{
+ position: 'fixed',
+ bottom: 0,
+ left: 10,
+ p: 2, // padding
+ display: 'flex',
+ justifyContent: 'flex-end',
+ gap: 2,
+
+ 'z-index': 1000,
+ }}
+ >
+ <IconButton
+ color='primary'
+ variant='solid'
+ sx={{
+ borderRadius: '50%',
+ width: 50,
+ height: 50,
+ }}
+ // startDecorator={<Add />}
+ onClick={() => {
+ setIsShowCreateThingModal(true)
+ }}
+ >
+ <Add />
+ </IconButton>
+ {isShowCreateThingModal && (
+ <CreateThingModal
+ isOpen={isShowCreateThingModal}
+ onClose={() => {
+ setIsShowCreateThingModal(false)
+ setCreateModalThing(null)
+ }}
+ onSave={handleSaveThing}
+ currentThing={createModalThing}
+ />
+ )}
+ <ConfirmationModal config={confirmModelConfig} />
+ </Box>
+ </Container>
+ )
+}
+
+export default ThingsView
diff --git a/src/views/components/AutocompleteSelect.jsx b/src/views/components/AutocompleteSelect.jsx
new file mode 100644
index 0000000..7708214
--- /dev/null
+++ b/src/views/components/AutocompleteSelect.jsx
@@ -0,0 +1,87 @@
+import Add from '@mui/icons-material/Add'
+import Autocomplete, { createFilterOptions } from '@mui/joy/Autocomplete'
+import AutocompleteOption from '@mui/joy/AutocompleteOption'
+import FormControl from '@mui/joy/FormControl'
+import ListItemDecorator from '@mui/joy/ListItemDecorator'
+import * as React from 'react'
+
+const filter = createFilterOptions()
+
+export default function FreeSoloCreateOption({ options, onSelectChange }) {
+ React.useEffect(() => {
+ setValue(options)
+ }, [options])
+
+ const [value, setValue] = React.useState([])
+ const [selectOptions, setSelectOptions] = React.useState(
+ options ? options : [],
+ )
+ return (
+ <FormControl id='free-solo-with-text-demo'>
+ <Autocomplete
+ value={value}
+ multiple
+ size='lg'
+ on
+ onChange={(event, newValue) => {
+ if (typeof newValue === 'string') {
+ setValue({
+ title: newValue,
+ })
+ } else if (newValue && newValue.inputValue) {
+ // Create a new value from the user input
+ setValue({
+ title: newValue.inputValue,
+ })
+ } else {
+ setValue(newValue)
+ }
+ onSelectChange(newValue)
+ }}
+ filterOptions={(options, params) => {
+ const filtered = filter(options, params)
+
+ const { inputValue } = params
+ // Suggest the creation of a new value
+ const isExisting = options.some(option => inputValue === option.title)
+ if (inputValue !== '' && !isExisting) {
+ filtered.push({
+ inputValue,
+ title: `Add "${inputValue}"`,
+ })
+ }
+
+ return filtered
+ }}
+ selectOnFocus
+ clearOnBlur
+ handleHomeEndKeys
+ // freeSolo
+ options={selectOptions}
+ getOptionLabel={option => {
+ // Value selected with enter, right from the input
+ if (typeof option === 'string') {
+ return option
+ }
+ // Add "xxx" option created dynamically
+ if (option.inputValue) {
+ return option.inputValue
+ }
+ // Regular option
+ return option.title
+ }}
+ renderOption={(props, option) => (
+ <AutocompleteOption {...props}>
+ {option.title?.startsWith('Add "') && (
+ <ListItemDecorator>
+ <Add />
+ </ListItemDecorator>
+ )}
+
+ {option.title ? option.title : option}
+ </AutocompleteOption>
+ )}
+ />
+ </FormControl>
+ )
+}
diff --git a/src/views/components/NavBar.jsx b/src/views/components/NavBar.jsx
new file mode 100644
index 0000000..25463b2
--- /dev/null
+++ b/src/views/components/NavBar.jsx
@@ -0,0 +1,177 @@
+import Logo from '@/assets/logo.svg'
+import {
+ AccountBox,
+ HomeOutlined,
+ ListAltRounded,
+ Logout,
+ MenuRounded,
+ Message,
+ SettingsOutlined,
+ ShareOutlined,
+ Widgets,
+} from '@mui/icons-material'
+import {
+ Box,
+ Drawer,
+ IconButton,
+ List,
+ ListItemButton,
+ ListItemContent,
+ ListItemDecorator,
+ Typography,
+} from '@mui/joy'
+import { useState } from 'react'
+import { useLocation } from 'react-router-dom'
+import { version } from '../../../package.json'
+import NavBarLink from './NavBarLink'
+const links = [
+ {
+ to: '/my/chores',
+ label: 'Home',
+ icon: <HomeOutlined />,
+ },
+ {
+ to: '/chores',
+ label: 'Desktop View',
+ icon: <ListAltRounded />,
+ },
+ {
+ to: '/things',
+ label: 'Things',
+ icon: <Widgets />,
+ },
+ {
+ to: '/settings#sharing',
+ label: 'Sharing',
+ icon: <ShareOutlined />,
+ },
+ {
+ to: '/settings#notifications',
+ label: 'Notifications',
+ icon: <Message />,
+ },
+ {
+ to: '/settings#account',
+ label: 'Account',
+ icon: <AccountBox />,
+ },
+ {
+ to: '/settings',
+ label: 'Settings',
+ icon: <SettingsOutlined />,
+ },
+]
+
+const NavBar = () => {
+ const [drawerOpen, setDrawerOpen] = useState(false)
+ const [openDrawer, closeDrawer] = [
+ () => setDrawerOpen(true),
+ () => setDrawerOpen(false),
+ ]
+ const location = useLocation()
+ // if url has /landing then remove the navbar:
+ if (
+ ['/', '/signup', '/login', '/landing', '/forgot-password'].includes(
+ location.pathname,
+ )
+ ) {
+ return null
+ }
+
+ return (
+ <nav className='flex gap-2 p-3'>
+ <IconButton size='sm' variant='plain' onClick={() => setDrawerOpen(true)}>
+ <MenuRounded />
+ </IconButton>
+ <Box className='flex items-center gap-2'>
+ <img component='img' src={Logo} width='34' />
+ <Typography
+ level='title-lg'
+ sx={{
+ fontWeight: 700,
+ fontSize: 24,
+ }}
+ >
+ Done
+ <span
+ style={{
+ color: '#06b6d4',
+ fontWeight: 600,
+ }}
+ >
+ tick✓
+ </span>
+ </Typography>
+ </Box>
+ <Drawer
+ open={drawerOpen}
+ onClose={closeDrawer}
+ size='sm'
+ onClick={closeDrawer}
+ >
+ <div>
+ {/* <div className='align-center flex px-5 pt-4'>
+ <ModalClose size='sm' sx={{ top: 'unset', right: 20 }} />
+ </div> */}
+ <List
+ // sx={{ p: 2, height: 'min-content' }}
+ size='md'
+ onClick={openDrawer}
+ sx={{ borderRadius: 4, width: '100%', padding: 1 }}
+ >
+ {links.map((link, index) => (
+ <NavBarLink key={index} link={link} />
+ ))}
+ </List>
+ </div>
+ <div>
+ <List
+ sx={{
+ p: 2,
+ height: 'min-content',
+ position: 'absolute',
+ bottom: 0,
+ borderRadius: 4,
+ width: '100%',
+ padding: 2,
+ }}
+ size='md'
+ onClick={openDrawer}
+ >
+ <ListItemButton
+ onClick={() => {
+ localStorage.removeItem('ca_token')
+ localStorage.removeItem('ca_expiration')
+ // go to login page:
+ window.location.href = '/login'
+ }}
+ sx={{
+ py: 1.2,
+ }}
+ >
+ <ListItemDecorator>
+ <Logout />
+ </ListItemDecorator>
+ <ListItemContent>Logout</ListItemContent>
+ </ListItemButton>
+ <Typography
+ level='body-xs'
+ sx={{
+ // p: 2,
+ p: 1,
+ color: 'text.tertiary',
+ textAlign: 'center',
+ bottom: 0,
+ // mb: -2,
+ }}
+ >
+ V{version}
+ </Typography>
+ </List>
+ </div>
+ </Drawer>
+ </nav>
+ )
+}
+
+export default NavBar
diff --git a/src/views/components/NavBarLink.jsx b/src/views/components/NavBarLink.jsx
new file mode 100644
index 0000000..3fe10d2
--- /dev/null
+++ b/src/views/components/NavBarLink.jsx
@@ -0,0 +1,31 @@
+import {
+ ListItem,
+ ListItemButton,
+ ListItemContent,
+ ListItemDecorator,
+} from '@mui/joy'
+import { Link } from 'react-router-dom'
+
+const NavBarLink = ({ link }) => {
+ const { to, icon, label } = link
+ return (
+ <ListItem>
+ <ListItemButton
+ key={to}
+ component={Link}
+ to={to}
+ variant='plain'
+ color='neutral'
+ sx={{
+ borderRadius: 4,
+ py: 1.2,
+ }}
+ >
+ <ListItemDecorator>{icon}</ListItemDecorator>
+ <ListItemContent>{label}</ListItemContent>
+ </ListItemButton>
+ </ListItem>
+ )
+}
+
+export default NavBarLink
diff --git a/src/views/components/NavBarMobile.jsx b/src/views/components/NavBarMobile.jsx
new file mode 100644
index 0000000..5fb1100
--- /dev/null
+++ b/src/views/components/NavBarMobile.jsx
@@ -0,0 +1,107 @@
+import * as React from 'react'
+import Box from '@mui/joy/Box'
+import ListItemDecorator from '@mui/joy/ListItemDecorator'
+import Tabs from '@mui/joy/Tabs'
+import TabList from '@mui/joy/TabList'
+import Tab, { tabClasses } from '@mui/joy/Tab'
+import HomeRoundedIcon from '@mui/icons-material/HomeRounded'
+import FavoriteBorder from '@mui/icons-material/FavoriteBorder'
+import Search from '@mui/icons-material/Search'
+import Person from '@mui/icons-material/Person'
+
+export default function NavBarMobile() {
+ const [index, setIndex] = React.useState(0)
+ const colors = ['primary', 'danger', 'success', 'warning']
+ return (
+ <Box
+ sx={{
+ position: 'absolute',
+ width: '100%',
+ bottom: 0,
+
+ flexGrow: 1,
+
+ p: 1,
+ borderTopLeftRadius: '12px',
+ borderTopRightRadius: '12px',
+
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ }}
+ >
+ <Tabs
+ size='lg'
+ aria-label='Bottom Navigation'
+ value={index}
+ onChange={(event, value) => setIndex(value)}
+ sx={theme => ({
+ p: 1,
+ borderRadius: 16,
+ maxWidth: 500,
+ // mx: 'auto',
+ boxShadow: theme.shadow.sm,
+ '--joy-shadowChannel': theme.vars.palette[colors[index]].darkChannel,
+ [`& .${tabClasses.root}`]: {
+ py: 1,
+ flex: 1,
+ transition: '0.3s',
+ fontWeight: 'md',
+ fontSize: 'md',
+ [`&:not(.${tabClasses.selected}):not(:hover)`]: {
+ opacity: 0.7,
+ },
+ },
+ })}
+ >
+ <TabList
+ variant='plain'
+ size='sm'
+ disableUnderline
+ sx={{ borderRadius: 'lg', p: 0 }}
+ >
+ <Tab
+ disableIndicator
+ orientation='vertical'
+ {...(index === 0 && { color: colors[0] })}
+ >
+ <ListItemDecorator>
+ <HomeRoundedIcon />
+ </ListItemDecorator>
+ Home
+ </Tab>
+ <Tab
+ disableIndicator
+ orientation='vertical'
+ {...(index === 1 && { color: colors[1] })}
+ >
+ <ListItemDecorator>
+ <FavoriteBorder />
+ </ListItemDecorator>
+ Likes
+ </Tab>
+ <Tab
+ disableIndicator
+ orientation='vertical'
+ {...(index === 2 && { color: colors[2] })}
+ >
+ <ListItemDecorator>
+ <Search />
+ </ListItemDecorator>
+ Search
+ </Tab>
+ <Tab
+ disableIndicator
+ orientation='vertical'
+ {...(index === 3 && { color: colors[3] })}
+ >
+ <ListItemDecorator>
+ <Person />
+ </ListItemDecorator>
+ Profile
+ </Tab>
+ </TabList>
+ </Tabs>
+ </Box>
+ )
+}
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 0000000..373e459
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,24 @@
+export default {
+ content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
+ theme: {
+ extend: {
+ colors: {
+ ice: {
+ 50: '#CFECF7',
+ 100: '#B9E3F3',
+ 200: '#8DD1EC',
+ 300: '#61C0E5',
+ 400: '#36AEDD',
+ 500: '#2093C0',
+ 600: '#197599',
+ 700: '#135771',
+ 800: '#0C394A',
+ 900: '#061B23',
+ 950: '#020B0F',
+ },
+ },
+ },
+ },
+ darkMode: 'class',
+ plugins: [],
+}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..5af4b6f
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,69 @@
+import react from '@vitejs/plugin-react-swc'
+import { defineConfig } from 'vite'
+import { VitePWA } from 'vite-plugin-pwa'
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ react(),
+ VitePWA({
+ registerType: 'prompt',
+ includeAssets: [
+ 'favicon.ico',
+ 'robots.txt',
+ 'apple-touch-icon.png',
+ 'safari-pinned-tab.svg',
+ 'mstile-150x150.png',
+ ],
+ injectManifest: true,
+ manifest: {
+ name: 'Donetick: Simplify Tasks & Chores, Together.',
+ short_name: 'Donetick',
+ icons: [
+ {
+ src: '/android-chrome-192x192.png',
+ sizes: '192x192',
+ type: 'image/png',
+ },
+ {
+ src: '/android-chrome-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ },
+ {
+ src: 'pwa-64x64.png',
+ sizes: '64x64',
+ type: 'image/png',
+ },
+ {
+ src: 'pwa-192x192.png',
+ sizes: '192x192',
+ type: 'image/png',
+ },
+ {
+ src: 'pwa-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ },
+ {
+ src: 'maskable-icon-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ purpose: 'maskable',
+ },
+ ],
+ theme_color: '#ffffff',
+ background_color: '#ffffff',
+ display: 'standalone',
+ },
+ }),
+ ],
+
+ resolve: {
+ alias: [
+ {
+ find: '@',
+ replacement: '/src',
+ },
+ ],
+ },
+})