From 0fc5f05b6a58be350b73773b4fe309baa72b4623 Mon Sep 17 00:00:00 2001 From: Dunemask Date: Sat, 24 Aug 2024 12:41:04 -0600 Subject: [PATCH] [INIT] Initial Project Structure --- .dockerignore | 1 + .forgejo/workflows/deploy-edge.yml | 34 + .forgejo/workflows/qa-api-tests.yml | 43 + .forgejo/workflows/s3-repo-backup.yml | 16 + .gitignore | 8 + .helmignore | 28 + .npmrc | 1 + .prettierrc | 13 + Chart.yaml | 24 + Dockerfile | 21 + LICENSE | 504 ++ README.md | 2 + index.html | 37 + lib/Cairo.ts | 32 + lib/app.ts | 7 + lib/config.ts | 49 + lib/database/PostgresService.ts | 54 + lib/database/TableService.ts | 9 + lib/database/tables/KeyPairTableService.ts | 60 + lib/database/tables/ProjectTableService.ts | 34 + lib/database/tables/RolePolicyTableService.ts | 37 + lib/database/tables/UsersTableService.ts | 63 + lib/middlewares/policy-guard.ts | 22 + lib/middlewares/user-guard.ts | 41 + lib/modules/auth/auth.controller.ts | 48 + lib/modules/auth/auth.router.ts | 26 + lib/modules/auth/auth.service.ts | 36 + lib/modules/projects/project.controller.ts | 48 + lib/modules/projects/project.router.ts | 22 + lib/modules/projects/project.service.ts | 36 + lib/services/app-init.service.ts | 9 + lib/services/crypt.service.ts | 37 + lib/services/token.service.ts | 15 + lib/types/ApiRequests.ts | 9 + lib/types/ContractTypes.ts | 5 + lib/types/contracts/auth.contracts.ts | 40 + lib/types/contracts/database.contracts.ts | 35 + lib/types/contracts/keypair.contracts.ts | 31 + lib/types/contracts/project.contracts.ts | 36 + lib/types/contracts/role-policy.contracts.ts | 34 + lib/types/contracts/user.contracts.ts | 29 + lib/util/mailing.ts | 16 + lib/vix/AppGuards.ts | 15 + lib/vix/AppPolicies.ts | 26 + lib/vix/AppResources.ts | 20 + lib/vix/AppRouter.ts | 15 + lib/vix/ClientErrors.ts | 25 + lib/vix/RouteGuard.ts | 9 + package-lock.json | 6913 +++++++++++++++++ package.json | 96 + .../20240824171333_schema_init/migration.sql | 75 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 73 + public/icons/android-chrome-192x192.png | Bin 0 -> 25461 bytes public/icons/android-chrome-512x512.png | Bin 0 -> 127695 bytes public/icons/apple-touch-icon-114x114.png | Bin 0 -> 6372 bytes public/icons/apple-touch-icon-120x120.png | Bin 0 -> 6775 bytes public/icons/apple-touch-icon-144x144.png | Bin 0 -> 8241 bytes public/icons/apple-touch-icon-152x152.png | Bin 0 -> 8835 bytes public/icons/apple-touch-icon-180x180.png | Bin 0 -> 10994 bytes public/icons/apple-touch-icon-57x57.png | Bin 0 -> 2779 bytes public/icons/apple-touch-icon-60x60.png | Bin 0 -> 2958 bytes public/icons/apple-touch-icon-72x72.png | Bin 0 -> 3717 bytes public/icons/apple-touch-icon-76x76.png | Bin 0 -> 3887 bytes public/icons/apple-touch-icon.png | Bin 0 -> 10994 bytes public/icons/browserconfig.xml | 9 + public/icons/favicon-16x16.png | Bin 0 -> 1205 bytes public/icons/favicon-32x32.png | Bin 0 -> 2503 bytes public/icons/favicon.ico | Bin 0 -> 15086 bytes public/icons/mstile-150x150.png | Bin 0 -> 4023 bytes public/icons/safari-pinned-tab.svg | 165 + public/icons/site.webmanifest | 19 + public/robots.txt | 3 + src/App.tsx | 27 + src/Portal.tsx | 59 + src/Viewport.tsx | 17 + src/components/MainHeader.tsx | 34 + src/components/MainMenu.tsx | 102 + src/components/common/Fallback.tsx | 13 + src/components/common/Inputs.tsx | 34 + src/components/common/Loading.tsx | 12 + src/ctx/AuthContext.tsx | 220 + src/hooks/init-hooks.ts | 9 + src/index.tsx | 8 + src/util/api/GeneratedRequests.ts | 22 + src/util/api/requests.ts | 9 + src/util/guards.ts | 39 + src/util/links.ts | 26 + src/util/theme.ts | 86 + src/views/AuthenticateView.tsx | 92 + src/views/AuthorizedView.tsx | 11 + src/views/AutoRedirect.tsx | 35 + src/views/ProjectView.tsx | 11 + templates/NOTES.txt | 22 + templates/_helpers.tpl | 62 + templates/deployment.yaml | 74 + templates/hpa.yaml | 28 + templates/ingress.yaml | 61 + templates/service.yaml | 15 + templates/serviceaccount.yaml | 12 + templates/tests/test-connection.yaml | 15 + tsconfig.json | 39 + tsconfig.server.json | 19 + values.yaml | 86 + vite.config.ts | 31 + 105 files changed, 10448 insertions(+) create mode 100644 .dockerignore create mode 100644 .forgejo/workflows/deploy-edge.yml create mode 100644 .forgejo/workflows/qa-api-tests.yml create mode 100644 .forgejo/workflows/s3-repo-backup.yml create mode 100644 .gitignore create mode 100644 .helmignore create mode 100644 .npmrc create mode 100644 .prettierrc create mode 100644 Chart.yaml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 index.html create mode 100644 lib/Cairo.ts create mode 100644 lib/app.ts create mode 100644 lib/config.ts create mode 100644 lib/database/PostgresService.ts create mode 100644 lib/database/TableService.ts create mode 100644 lib/database/tables/KeyPairTableService.ts create mode 100644 lib/database/tables/ProjectTableService.ts create mode 100644 lib/database/tables/RolePolicyTableService.ts create mode 100644 lib/database/tables/UsersTableService.ts create mode 100644 lib/middlewares/policy-guard.ts create mode 100644 lib/middlewares/user-guard.ts create mode 100644 lib/modules/auth/auth.controller.ts create mode 100644 lib/modules/auth/auth.router.ts create mode 100644 lib/modules/auth/auth.service.ts create mode 100644 lib/modules/projects/project.controller.ts create mode 100644 lib/modules/projects/project.router.ts create mode 100644 lib/modules/projects/project.service.ts create mode 100644 lib/services/app-init.service.ts create mode 100644 lib/services/crypt.service.ts create mode 100644 lib/services/token.service.ts create mode 100644 lib/types/ApiRequests.ts create mode 100644 lib/types/ContractTypes.ts create mode 100644 lib/types/contracts/auth.contracts.ts create mode 100644 lib/types/contracts/database.contracts.ts create mode 100644 lib/types/contracts/keypair.contracts.ts create mode 100644 lib/types/contracts/project.contracts.ts create mode 100644 lib/types/contracts/role-policy.contracts.ts create mode 100644 lib/types/contracts/user.contracts.ts create mode 100644 lib/util/mailing.ts create mode 100644 lib/vix/AppGuards.ts create mode 100644 lib/vix/AppPolicies.ts create mode 100644 lib/vix/AppResources.ts create mode 100644 lib/vix/AppRouter.ts create mode 100644 lib/vix/ClientErrors.ts create mode 100644 lib/vix/RouteGuard.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 prisma/migrations/20240824171333_schema_init/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 public/icons/android-chrome-192x192.png create mode 100644 public/icons/android-chrome-512x512.png create mode 100644 public/icons/apple-touch-icon-114x114.png create mode 100644 public/icons/apple-touch-icon-120x120.png create mode 100644 public/icons/apple-touch-icon-144x144.png create mode 100644 public/icons/apple-touch-icon-152x152.png create mode 100644 public/icons/apple-touch-icon-180x180.png create mode 100644 public/icons/apple-touch-icon-57x57.png create mode 100644 public/icons/apple-touch-icon-60x60.png create mode 100644 public/icons/apple-touch-icon-72x72.png create mode 100644 public/icons/apple-touch-icon-76x76.png create mode 100644 public/icons/apple-touch-icon.png create mode 100644 public/icons/browserconfig.xml create mode 100644 public/icons/favicon-16x16.png create mode 100644 public/icons/favicon-32x32.png create mode 100644 public/icons/favicon.ico create mode 100644 public/icons/mstile-150x150.png create mode 100644 public/icons/safari-pinned-tab.svg create mode 100644 public/icons/site.webmanifest create mode 100644 public/robots.txt create mode 100644 src/App.tsx create mode 100644 src/Portal.tsx create mode 100644 src/Viewport.tsx create mode 100644 src/components/MainHeader.tsx create mode 100644 src/components/MainMenu.tsx create mode 100644 src/components/common/Fallback.tsx create mode 100644 src/components/common/Inputs.tsx create mode 100644 src/components/common/Loading.tsx create mode 100644 src/ctx/AuthContext.tsx create mode 100644 src/hooks/init-hooks.ts create mode 100644 src/index.tsx create mode 100644 src/util/api/GeneratedRequests.ts create mode 100644 src/util/api/requests.ts create mode 100644 src/util/guards.ts create mode 100644 src/util/links.ts create mode 100644 src/util/theme.ts create mode 100644 src/views/AuthenticateView.tsx create mode 100644 src/views/AuthorizedView.tsx create mode 100644 src/views/AutoRedirect.tsx create mode 100644 src/views/ProjectView.tsx create mode 100644 templates/NOTES.txt create mode 100644 templates/_helpers.tpl create mode 100644 templates/deployment.yaml create mode 100644 templates/hpa.yaml create mode 100644 templates/ingress.yaml create mode 100644 templates/service.yaml create mode 100644 templates/serviceaccount.yaml create mode 100644 templates/tests/test-connection.yaml create mode 100644 tsconfig.json create mode 100644 tsconfig.server.json create mode 100644 values.yaml create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/.forgejo/workflows/deploy-edge.yml b/.forgejo/workflows/deploy-edge.yml new file mode 100644 index 0000000..0b460ef --- /dev/null +++ b/.forgejo/workflows/deploy-edge.yml @@ -0,0 +1,34 @@ +name: Deploy Edge +run-name: ${{ forgejo.actor }} Deploy Edge +on: + push: + branches: [ master ] + +env: + # Additional Deploy Envars + GARDEN_DEPLOY_ACTION: cairo + CAIRO_ALLOW_REGISTRATION: ${{ vars.CAIRO_ALLOW_REGISTRATION }} + +jobs: + deploy-edge: + steps: + # Setup Oasis + - name: Oasis Setup + uses: https://forgejo.dunemask.dev/elysium/elysium-actions@oasis-setup-auto + with: + deploy-env: edge + infisical-token: ${{ secrets.INFISICAL_ELYSIUM_EDGE_READ_TOKEN }} + extra-secret-paths: /dashboard,/alexandria + extra-secret-envs: edge,edge + # Deploy to Edge + - name: Deploy to Edge env + run: garden deploy $GARDEN_DEPLOY_ACTION --force --force-build --env usw-edge + working-directory: ${{ env.OASIS_WORKSPACE }} + # Alert via Discord + - name: Discord Alert + if: always() + uses: https://forgejo.dunemask.dev/elysium/elysium-actions@discord-status + with: + status: ${{ job.status }} + channel: deployments + header: DEPLOY EDGE \ No newline at end of file diff --git a/.forgejo/workflows/qa-api-tests.yml b/.forgejo/workflows/qa-api-tests.yml new file mode 100644 index 0000000..cd8792c --- /dev/null +++ b/.forgejo/workflows/qa-api-tests.yml @@ -0,0 +1,43 @@ +name: QA API Tests +run-name: ${{ forgejo.actor }} QA API Test +on: + pull_request: + branches: [ master ] + +env: + REPO_DIR: ${{ forgejo.workspace }}/cairo + GARDEN_LINK_ACTION: build.cairo-image + +jobs: + qa-api-tests: + steps: + # Setup Oasis + - name: Oasis Setup + uses: https://forgejo.dunemask.dev/elysium/elysium-actions@oasis-setup-auto + with: + deploy-env: ci + infisical-token: ${{ secrets.INFISICAL_ELYSIUM_CI_READ_TOKEN }} + extra-secret-paths: /dashboard,/alexandria + extra-secret-envs: ci,ci + # Test Code + - name: Checkout repository + uses: actions/checkout@v3 + with: + path: ${{ env.REPO_DIR }} + # Garden tests + - name: Link Repo code to Garden + run: garden link action $GARDEN_LINK_ACTION $REPO_DIR --env usw-ci + working-directory: ${{ env.OASIS_WORKSPACE }} + # Cubit CI Tests + - name: Run Cubit tests in CI env + run: garden workflow qa-api-tests --env usw-ci --var ci-ttl=25m + working-directory: ${{ env.OASIS_WORKSPACE }} + # Discord Alert + - name: Discord Alert + if: always() + uses: https://forgejo.dunemask.dev/elysium/elysium-actions@discord-status + with: + status: ${{ job.status }} + channel: ci + header: QA API Tests + additional-content: "CI Namespace: `${{env.CI_NAMESPACE}}`" diff --git a/.forgejo/workflows/s3-repo-backup.yml b/.forgejo/workflows/s3-repo-backup.yml new file mode 100644 index 0000000..9d7fd13 --- /dev/null +++ b/.forgejo/workflows/s3-repo-backup.yml @@ -0,0 +1,16 @@ +name: S3 Repo Backup +run-name: ${{ forgejo.actor }} S3 Repo Backup +on: + push: + branches: [ master ] + +jobs: + s3-repo-backup: + steps: + - name: S3 Backup + uses: https://forgejo.dunemask.dev/elysium/elysium-actions@s3-backup + with: + infisical-token: ${{ secrets.INFISICAL_ELYSIUM_EDGE_READ_TOKEN }} + - name: Status Alert + if: always() + run: echo "The Job ended with status ${{ job.status }}." diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aabcaf7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# Deploy ignores +dist/ +build/ +node_modules +# Env files +.env +.env.dev +.env.prod \ No newline at end of file diff --git a/.helmignore b/.helmignore new file mode 100644 index 0000000..0a8009a --- /dev/null +++ b/.helmignore @@ -0,0 +1,28 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +node_modules/ +src/ +build/ +public/ +lib/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..12b777e --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@dunemask:registry=https://forgejo.dunemask.dev/api/packages/dunemask/npm/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..3eb94f8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +printWidth: 130 +semi: true +singleQuote: false +trailingComma: all +bracketSpacing: true +arrowParens: always +requirePragma: false +insertPragma: false + +overrides: + - files: ["lib/router/ClientErrors.ts", "lib/router/routes/*.ts"] + options: + printWidth: 250 diff --git a/Chart.yaml b/Chart.yaml new file mode 100644 index 0000000..268095f --- /dev/null +++ b/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: cairo +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "0.0.4" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..522cde4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM node:20-bookworm-slim +WORKDIR /dunemask/net/cairo +COPY package.json . +COPY package-lock.json . +COPY .npmrc . +RUN npm ci +# Copy server build resources over +COPY tsconfig.json . +COPY tsconfig.server.json . +COPY lib lib +COPY prisma prisma +RUN npm run db:generate +# Copy react build resources over +COPY public public +COPY src src +COPY index.html . +COPY vite.config.ts . +# Build Project +RUN npm run package:full + +CMD ["npm","start"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f868b42 --- /dev/null +++ b/LICENSE @@ -0,0 +1,504 @@ +GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bdffed --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Cairo +Typescript Authentication & Authorization Server \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..bd8d7d4 --- /dev/null +++ b/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + Cairo + + + +
+ + + diff --git a/lib/Cairo.ts b/lib/Cairo.ts new file mode 100644 index 0000000..f72e56a --- /dev/null +++ b/lib/Cairo.ts @@ -0,0 +1,32 @@ +// Import Core Modules +import { INFO, OK, logInfo } from "@dunemask/vix/logging"; +import { Vixpress } from "@dunemask/vix"; +import { MappedRoute, routePreviews } from "@dunemask/vix/express"; +import figlet from "figlet"; +import AppRouter from "./vix/AppRouter.js"; +import PostgresService from "./database/PostgresService.js"; +import AppInitService from "./services/app-init.service.js"; + +export default class Cairo extends Vixpress { + static PostgresService: string = "pg"; + static AppInitService: string = "app-init"; + constructor(port?: number) { + super("Cairo", port ?? Number(process.env.CAIRO_DEV_PORT ?? 52000)); + this.setService(Cairo.PostgresService, PostgresService); + this.setService(Cairo.AppInitService, AppInitService); + this.setRouter(AppRouter); + } + + protected async preconfigure(): Promise { + logInfo(figlet.textSync(this.title, "Cosmike")); + } + + protected async onStart() { + const previews = routePreviews(this.app, (r: MappedRoute, methodDisplay: string) => { + const authSection = r.routeMetadata?.authType === "user" ? "🔒" : " "; + return `${methodDisplay} ${authSection} ${r.path}`; + }); + for (const p of previews) INFO("ROUTE", p); + OK("SERVER", `${this.title} server running on ${this.port} 🚀`); + } +} diff --git a/lib/app.ts b/lib/app.ts new file mode 100644 index 0000000..dc22d31 --- /dev/null +++ b/lib/app.ts @@ -0,0 +1,7 @@ +import "dotenv/config"; +import "dotenv-expand/config"; +import Cairo from "./Cairo"; +import { assertRequired } from "./config"; +assertRequired(); +const cairo = new Cairo(); +await cairo.start(); diff --git a/lib/config.ts b/lib/config.ts new file mode 100644 index 0000000..56540bc --- /dev/null +++ b/lib/config.ts @@ -0,0 +1,49 @@ +import DefaultRolePolicies from "./vix/AppPolicies"; + +const requiredEnvars: string[] = ["CAIRO_KEYPAIR_KEY"]; + +const encodedEnvar = (envar: string | undefined) => (!!envar ? Buffer.from(envar, "base64").toString("utf8") : envar); + +export function assertRequired() { + for (const e of requiredEnvars) if (!process.env[e]) throw Error(`Envar '${e}' is required!`); +} + +export default { + Server: { + basePath: "/cairo/", + projectSlug: "$cairo", + projectName: "$cairo", + rootPassword: process.env.CAIRO_ROOT_PASSWORD, + }, + RolePolicy: { + Root: { + id: "ck1ro7ekp000203zu5gn3d9cr", + name: "Root", + policies: DefaultRolePolicies.Root, + }, + Admin: { + id: "ck1ro7bm0000103z5h45sswqs", + name: "Admin", + policies: DefaultRolePolicies.Admin, + }, + User: { + id: "ck1ro7g3e000303z52ee63nqs", + name: "User", + policies: DefaultRolePolicies.User, + }, + }, + SigningOptions: { + HashRounds: 12, + Version: "0.0.1-alpha", + Issuer: encodedEnvar(process.env.CAIRO_HOSTNAME) ?? "https://cairo.dunemask.net", + Keys: { + KeyPair: encodedEnvar(process.env.CAIRO_KEYPAIR_KEY) ?? "keypair-key", + }, + Subjects: { + User: "user", + Cargo: "cargo", + Runner: "runner", + Pod: "pod", + }, + }, +}; diff --git a/lib/database/PostgresService.ts b/lib/database/PostgresService.ts new file mode 100644 index 0000000..2cab3e3 --- /dev/null +++ b/lib/database/PostgresService.ts @@ -0,0 +1,54 @@ +import { Prisma, PrismaClient } from "@prisma/client"; +import { VixpressService } from "@dunemask/vix"; +import { VERB } from "@dunemask/vix/logging"; +import UsersTableService from "./tables/UsersTableService.js"; +import RolePolicyTableService from "./tables/RolePolicyTableService.js"; +import ProjectTableService from "./tables/ProjectTableService.js"; +import KeyPairTableService from "./tables/KeyPairTableService.js"; + +export class DBPrismaClient extends PrismaClient { + private async queryUniqueOrThrow(data: unknown): Promise { + if (!Array.isArray(data)) throw Error("Returned non-array!"); + if (data.length > 1) throw Error("Non unique value found!"); + return data.length === 1 ? data[0] : undefined; + } + async $queryRawUnique(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Promise { + const data = await this.$queryRaw(query, ...values); + return this.queryUniqueOrThrow(data); + } + + async $queryRawUnsafeUnique(query: string, ...values: any[]): Promise { + const data = await this.$queryRawUnsafe(query, ...values); + return this.queryUniqueOrThrow(data); + } +} + +export default class PostgresService extends VixpressService { + declare pg: DBPrismaClient; + declare users: UsersTableService; + declare rolePolicy: RolePolicyTableService; + declare project: ProjectTableService; + declare keypair: KeyPairTableService; + + async configureService() { + this.pg = new DBPrismaClient({ + errorFormat: "pretty", + log: ["warn", "error", "info", { emit: "event", level: "query" }], + }); + this.users = new UsersTableService(this.pg); + this.rolePolicy = new RolePolicyTableService(this.pg); + this.project = new ProjectTableService(this.pg); + this.keypair = new KeyPairTableService(this.pg); + } + + async startService() { + VERB("POSTGRES", "Connecting to postgres...."); + await this.pg.$connect(); + await this.project.$upsertDefaultProject(); + await this.keypair.$upsertDefaultKeyPairs(); + await this.rolePolicy.$upsertDefaultAuthorities(); + const user = await this.users.$upsertDefaultRootUser(); + if (!!user) VERB("APP INIT", `Created identity 'root' with password '${user.password}'!`); + if (!!user) VERB("APP INIT", "This will not be shown again!"); + } +} diff --git a/lib/database/TableService.ts b/lib/database/TableService.ts new file mode 100644 index 0000000..fa76d26 --- /dev/null +++ b/lib/database/TableService.ts @@ -0,0 +1,9 @@ +import { DBPrismaClient } from "./PostgresService"; + +export default abstract class TableService { + declare pg: DBPrismaClient; + protected abstract table: string; + constructor(pg: DBPrismaClient) { + this.pg = pg; + } +} diff --git a/lib/database/tables/KeyPairTableService.ts b/lib/database/tables/KeyPairTableService.ts new file mode 100644 index 0000000..cc1c44c --- /dev/null +++ b/lib/database/tables/KeyPairTableService.ts @@ -0,0 +1,60 @@ +import config from "@lib/config"; +import TableService from "../TableService"; +import { CKeyPairContract } from "@lib/contracts/keypair.contracts"; +import { KeyPairErrors, ProjectErrors } from "@lib/vix/ClientErrors"; +import { encrypt, generateKeypair } from "@lib/svc/crypt.service"; +import { KeyPair, KeyPairType } from "@prisma/client"; + +declare type Custom = "Custom"; // Make sure this matches KeyPairType.Custom; + +export default class KeyPairTableService extends TableService { + protected table = "KeyPair"; + async byId(keypairId: string) { + const keypair = this.pg.keyPair.findUnique({ where: { id: keypairId } }); + if (!keypair) throw KeyPairErrors.NotFoundKeypair; + } + + async byUsage(projectIdentity: string, usage: Custom): Promise; + async byUsage(projectIdentity: string, usage: Exclude): Promise; + async byUsage(projectIdentity: string, usage: KeyPairType): Promise { + const projectOr = { OR: [{ id: projectIdentity }, { slug: projectIdentity }] }; + const projectInclude = { keyPairs: { where: { usage: KeyPairType.UserToken } } }; + const project = await this.pg.project.findFirst({ where: projectOr, include: projectInclude }); + if (!project) throw ProjectErrors.BadRequestProjectIncomplete; + const keypairs = project.keyPairs; + if (usage !== KeyPairType.Custom && keypairs.length > 1) + throw new Error(`Multiple keypairs found for project ${projectIdentity} and usage ${usage}`); + if (usage !== KeyPairType.Custom && keypairs.length === 0) return null; + if (usage !== KeyPairType.Custom) return keypairs[0]; + return keypairs; + } + + async $upsertDefaultKeyPairs() { + const projectSlug = config.Server.projectSlug; + const cairoProject = await this.pg.project.findUnique({ where: { slug: projectSlug } }); + if (!cairoProject) throw new Error("Cairo Project Not Found!"); + const projectId = cairoProject.id; + await this.upsertProjecttDefaultKeyPairs(projectId); + } + + async upsertProjecttDefaultKeyPairs(projectId: string) { + const storeKeypair = this.create.bind(this); + const keyTypes = Object.values(KeyPairType).filter((kp) => kp !== KeyPairType.Custom); + await Promise.all( + keyTypes.map(async (kp) => { + const existingKp = await this.byUsage(projectId, kp); + if (!!existingKp) return; + const { publicKey, privateKey } = await generateKeypair(); + const [encryptedPrivateKey, encryptedPublicKey] = await Promise.all([ + encrypt(privateKey, config.SigningOptions.Keys.KeyPair), + encrypt(publicKey, config.SigningOptions.Keys.KeyPair), + ]); + return storeKeypair({ encryptedPrivateKey, encryptedPublicKey, projectId, usage: kp }); + }), + ); + } + + async create(keypair: CKeyPairContract["Create"]) { + return this.pg.keyPair.create({ data: keypair }); + } +} diff --git a/lib/database/tables/ProjectTableService.ts b/lib/database/tables/ProjectTableService.ts new file mode 100644 index 0000000..0120d11 --- /dev/null +++ b/lib/database/tables/ProjectTableService.ts @@ -0,0 +1,34 @@ +import config from "@lib/config"; +import TableService from "../TableService"; +import { CProjectContract } from "@lib/types/ContractTypes"; +import { ProjectErrors } from "@lib/vix/ClientErrors"; +import { VERB } from "@dunemask/vix/logging"; + +export default class ProjectTableService extends TableService { + protected table = "Project"; + async byId(projectId: string) { + return this.pg.project.findUnique({ where: { id: projectId } }); + } + + async bySlug(slug: string) { + return this.pg.project.findUnique({ where: { slug } }); + } + + async $upsertDefaultProject() { + const { projectSlug: slug, projectName: name } = config.Server; + const createOptions = { slug, name, parentProject: slug }; + const existingProject = await this.pg.project.findUnique({ where: { slug } }); + if (!!existingProject) return VERB("PROJECT", "Default project already exists!"); + VERB("PROJECT", "Default project not found! Creating now!"); + const proj = await this.pg.project.upsert({ where: { slug }, create: createOptions, update: createOptions }); + await this.pg.project.update({ where: { id: proj.id }, data: { parentProject: proj.id } }); // Use ProjectID instead of slug + } + + async create(project: CProjectContract["Create"] & { parentProject: string }) { + const existingProject = await this.pg.project.findMany({ where: { id: project.slug } }); + if (existingProject.length > 1) throw ProjectErrors.BadRequestSlugInvalid; + return this.pg.project.create({ data: project }).catch(() => { + throw ProjectErrors.ConflictNonUnique; + }); + } +} diff --git a/lib/database/tables/RolePolicyTableService.ts b/lib/database/tables/RolePolicyTableService.ts new file mode 100644 index 0000000..1343e49 --- /dev/null +++ b/lib/database/tables/RolePolicyTableService.ts @@ -0,0 +1,37 @@ +import TableService from "../TableService"; +import { AuthorityType } from "@prisma/client"; +import { Policy, PolicyDefault } from "@lib/Policies"; +import config from "@lib/config"; +import { CRolePolicyContract } from "@lib/contracts/role-policy.contracts"; + +export default class RolePolicyTableService extends TableService { + protected table = "RolePolicy"; + async byId(id: string) { + return this.pg.rolePolicy.findUnique({ where: { id } }); + } + + async $upsertDefaultAuthorities() { + const projectSlug = config.Server.projectSlug; + const cairoProject = await this.pg.project.findUnique({ where: { slug: projectSlug } }); + if (!cairoProject) throw new Error("Cairo Project Not Found!"); + const project = cairoProject.id; + const $chk = ({ id, name, policies }: PolicyDefault) => this.$upsertDefaultsAuthority(project, name, id, policies); + await Promise.all(Object.values(config.RolePolicy).map($chk)); + } + + private async $upsertDefaultsAuthority(projectId: string, name: string, id: string, userPolicies: Policy[]) { + const rootAuthority = config.RolePolicy.Root.id; + const authorityType = id === rootAuthority ? AuthorityType.Root : AuthorityType.RolePolicy; + const authority = id === rootAuthority ? name : rootAuthority; // Set Root Authority to root if root + const policies = Policy.asStrings(userPolicies); + return this.pg.rolePolicy.upsert({ + where: { id }, + create: { projectId, id, name, policies, authority, authorityType }, + update: { projectId, name, policies, authority, authorityType }, + }); + } + + async create(rp: CRolePolicyContract["Create"]) { + return this.pg.rolePolicy.create({ data: rp }); + } +} diff --git a/lib/database/tables/UsersTableService.ts b/lib/database/tables/UsersTableService.ts new file mode 100644 index 0000000..6ddd079 --- /dev/null +++ b/lib/database/tables/UsersTableService.ts @@ -0,0 +1,63 @@ +import config from "@lib/config"; +import TableService from "../TableService"; +import { CUserContract } from "@lib/types/ContractTypes"; +import { hashText } from "@lib/modules/auth/auth.service"; +import { KeyPairType } from "@prisma/client"; +import { UserErrors } from "@lib/vix/ClientErrors"; + +// prettier-ignore +const generateBase64Password = (length: number = 32): string => Array.from(crypto.getRandomValues(new Uint8Array(length)), byte => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt(byte % 64)).join(''); + +export default class UsersTableService extends TableService { + protected table = "User"; + async byId(userId: string) { + return this.pg.user.findUnique({ where: { id: userId }, include: { rolePolicy: true, project: true } }); + } + + async byUsername(username: string, projectId: string) { + return this.pg.user.findUnique({ where: { projectId_username: { projectId, username } } }); + } + + async byEmail(email: string, projectId: string) { + return this.pg.user.findUnique({ where: { projectId_email: { projectId, email } } }); + } + + async $upsertDefaultRootUser() { + const project = await this.pg.project.findUnique({ where: { slug: config.Server.projectSlug } }); + if (!project) throw new Error("Cairo Project Not Found!"); + const rolePolicyId = config.RolePolicy.Root.id; + return this.$upsertRootUser(project.id, rolePolicyId); + } + + async $upsertRootUser(projectId: string, rolePolicyId: string) { + const root = await this.pg.user.findUnique({ where: { projectId_username: { username: "root", projectId } } }); + if (!!root) return; + const password = config.Server.rootPassword ?? generateBase64Password(); + const hash = await hashText(password); + const user = await this.pg.user.create({ data: { projectId, username: "root", email: "root", hash, rolePolicyId } }); + return { ...user, password }; + } + + async create(options: CUserContract["Create"]) { + const { hash, projectId, rolePolicyId } = options; + const username = options.username?.toLowerCase(); + const email = options.email?.toLowerCase() ?? undefined; + const [existingUsername, existingEmail] = await Promise.all([ + this.byUsername(username, projectId), + !!email ? this.byEmail(email, projectId) : undefined, + ]); + if (!existingUsername || !existingEmail) throw UserErrors.ConflictIdentityTaken; + const userData = { projectId, username, email, hash, rolePolicyId }; + return this.pg.user.create({ data: userData, include: { rolePolicy: true } }); + } + + async byIdentity(projectIdentity: string, identity: string) { + const username = identity.toLowerCase(); + const email = identity.toLowerCase(); + const OrUser = { OR: [{ username }, { email }] }; + const OrProject = { project: { OR: [{ id: projectIdentity }, { slug: projectIdentity }] } }; + const projectInclude = { include: { keyPairs: { where: { usage: KeyPairType.UserToken } } } }; + const AND = [OrUser, OrProject]; + return this.pg.user.findFirst({ where: { AND }, include: { rolePolicy: true, project: projectInclude } }); + } +} diff --git a/lib/middlewares/policy-guard.ts b/lib/middlewares/policy-guard.ts new file mode 100644 index 0000000..6089ccf --- /dev/null +++ b/lib/middlewares/policy-guard.ts @@ -0,0 +1,22 @@ +import { Request, Response, NextFunction, Router, Express } from "express"; +import userGuard from "./user-guard"; +import { MetadataRouter } from "@dunemask/vix/express"; +import { Policy } from "@lib/Policies"; +import { AuthErrors } from "@lib/vix/ClientErrors"; +import { UserRequest } from "@lib/types/ApiRequests"; + +export default function policyMiddlewareGuard(requiredPolicies: Policy[]) { + const middlewares: MetadataRouter = Router({ mergeParams: true }); + + async function policyAuthMiddleware(req: Request, res: Response, next: NextFunction) { + const { user, policies: userPolicies } = req as UserRequest; + if (!user) throw AuthErrors.UnauthorizedRequest; + if (!userPolicies) throw AuthErrors.UnauthorizedRequest; + if (!Policy.multiAuthorizedTo(userPolicies, requiredPolicies)) throw AuthErrors.ForbiddenPermissions; + if (!next) return res.sendStatus(200); + next(); + } + middlewares.routeMetadata = { authType: "policy" }; + middlewares.use([userGuard(), policyAuthMiddleware]); + return middlewares; +} diff --git a/lib/middlewares/user-guard.ts b/lib/middlewares/user-guard.ts new file mode 100644 index 0000000..c0a0ac0 --- /dev/null +++ b/lib/middlewares/user-guard.ts @@ -0,0 +1,41 @@ +import { AuthorizedTokenRequest, MetadataRouter, tokenAuthMiddleware } from "@dunemask/vix/express"; +import Cairo from "@lib/Cairo"; +import { getUserTokenId } from "@lib/modules/auth/auth.service"; +import { Policy, PolicyComputeType } from "@lib/Policies"; +import { UserRequest } from "@lib/types/ApiRequests"; +import { Resource } from "@lib/vix/AppResources"; +import { AuthErrors, ProjectErrors } from "@lib/vix/ClientErrors"; +import { Request, Response, NextFunction, Router, Express } from "express"; +import expressBearerToken from "express-bearer-token"; +import type PostgresService from "@lib/database/PostgresService.js"; +import { KeyPairType, User } from "@prisma/client"; + +export default function userGuard() { + const middlewares: MetadataRouter = Router({ mergeParams: true }); + async function userGuardMiddleware(req: Request, _res: Response, next: NextFunction) { + const { token } = req as AuthorizedTokenRequest; + if (!token) throw AuthErrors.UnauthorizedRequiredToken; + + const PostgresService = req.app.get(Cairo.PostgresService) as PostgresService; + const { project } = req.params; + if (!project) throw AuthErrors.UnauthorizedRequiredProject; + + const userKeypair = await PostgresService.keypair.byUsage(project, KeyPairType.UserToken); + if (!userKeypair) throw ProjectErrors.BadRequestProjectIncomplete; + + const id = await getUserTokenId(token, userKeypair.encryptedPublicKey); + if (!id) throw AuthErrors.UnauthorizedRequest; + const user = await PostgresService.users.byId(id); + if (!user) throw AuthErrors.UnauthorizedRequiredUser; + const policies = Policy.parseResourcePolicies(user.rolePolicy.policies as PolicyComputeType); + const projectData = { ...user.project }; + delete (user as Partial).project; + (req as UserRequest).user = user; + (req as UserRequest).policies = policies; + (req as UserRequest).project = projectData; + next(); + } + middlewares.routeMetadata = { authType: "user" }; + middlewares.use([expressBearerToken(), userGuardMiddleware]); + return middlewares; +} diff --git a/lib/modules/auth/auth.controller.ts b/lib/modules/auth/auth.controller.ts new file mode 100644 index 0000000..a9640a2 --- /dev/null +++ b/lib/modules/auth/auth.controller.ts @@ -0,0 +1,48 @@ +import { Request, Response, Express } from "express"; +import { VixpressController } from "@dunemask/vix"; +import Cairo from "@lib/Cairo"; +import type PostgresService from "@lib/database/PostgresService"; +import { CAuthContract, AuthContract } from "@lib/contracts/auth.contracts"; +import { ContractRouteContext } from "@dunemask/vix/express"; +import { AuthErrors, ProjectErrors } from "@lib/vix/ClientErrors"; +import { getUserToken, hashCompare } from "./auth.service"; +import { CDatabaseContract } from "@lib/contracts/database.contracts"; +import { ProjectContract } from "@lib/contracts/project.contracts"; +import { UserRequest } from "@lib/types/ApiRequests"; +import { ResourcePolicy } from "@dunemask/vix/util"; + +type LoginCRC = ContractRouteContext<{ + RequestBodyContract: typeof AuthContract.Login; + RequestParamsContract: typeof ProjectContract.ProjectParams; +}>; + +export default class AuthController extends VixpressController { + declare pg: PostgresService; + constructor(app: Express) { + super(app); + this.pg = this.app.get(Cairo.PostgresService); + } + + verify = (_req: Request, res: Response) => res.sendStatus(200); + + async login(crc: LoginCRC): Promise { + const { identity, password } = crc.reqBody; + const { project } = crc.reqParams; + const user = await this.pg.users.byIdentity(project, identity); + if (!user?.rolePolicy?.policies) throw AuthErrors.UnauthorizedRequest; + const authorized = await hashCompare(password, user.hash); + if (!authorized) throw AuthErrors.UnauthorizedRequest; + const projectKeyPairs = user.project.keyPairs; + if (projectKeyPairs.length !== 1) throw ProjectErrors.BadRequestProjectIncomplete; + const token = await getUserToken(user.id, user.project.keyPairs[0].encryptedPrivateKey); + const policies = user.rolePolicy.policies; + const userData: CDatabaseContract["User"] = { username: user.username, rolePolicyId: user.rolePolicyId }; + return { token, user: userData, policies }; + } + + async credentials(crc: ContractRouteContext): Promise { + const { user, policies } = crc.req as UserRequest; + const userData: CDatabaseContract["User"] = { username: user.username, rolePolicyId: user.rolePolicyId }; + return { user: userData, policies: ResourcePolicy.asStrings(policies) }; + } +} diff --git a/lib/modules/auth/auth.router.ts b/lib/modules/auth/auth.router.ts new file mode 100644 index 0000000..69e7a51 --- /dev/null +++ b/lib/modules/auth/auth.router.ts @@ -0,0 +1,26 @@ +import { VixpressRoute } from "@dunemask/vix"; +import { contract } from "@dunemask/vix/express"; +import RouteGuard from "@lib/vix/RouteGuard"; +import { Router } from "express"; +import AuthController from "./auth.controller"; +import { AuthContract } from "@lib/contracts/auth.contracts"; +import { ProjectContract } from "@lib/contracts/project.contracts"; + +export class AuthRoute extends VixpressRoute { + async configureRoutes(router: Router) { + const jsonOpts = { limit: "20mb" }; + const cBase = { json: jsonOpts, reqParams: ProjectContract.ProjectParams }; + // Controllers + const authController = this.useController(AuthController); + + // Configuration + const loginCreds = { ...cBase, reqBody: AuthContract.Login, resBody: AuthContract.LoginCredentials }; + const credRes = { ...cBase, resBody: AuthContract.Credentials }; + // Middleware + + // Routes + router.get("/verify", RouteGuard.User, authController.verify); + router.post("/login", contract(authController.login, loginCreds)); + router.get("/credentials", RouteGuard.User, contract(authController.credentials, credRes)); + } +} diff --git a/lib/modules/auth/auth.service.ts b/lib/modules/auth/auth.service.ts new file mode 100644 index 0000000..f5b1732 --- /dev/null +++ b/lib/modules/auth/auth.service.ts @@ -0,0 +1,36 @@ +import bcrypt from "bcrypt"; +import { signToken, verifyToken } from "@lib/svc/token.service"; +import config from "@lib/config"; +import { decrypt } from "@lib/svc/crypt.service"; +const { HashRounds } = config.SigningOptions; + +export async function getUserToken(id: string, encryptedPrivateKey: string) { + const privateKey = await decrypt(encryptedPrivateKey, config.SigningOptions.Keys.KeyPair); + const tokenPayload = { + iss: config.SigningOptions.Issuer, + sub: [config.SigningOptions.Subjects.User], + aud: [config.SigningOptions.Issuer], + id, + }; + return signToken(tokenPayload, privateKey); +} + +export async function userTokenLogin(token: string, encryptedPublicKey: string): Promise { + const publicKey = await decrypt(encryptedPublicKey, config.SigningOptions.Keys.KeyPair); + return !!verifyToken(token, publicKey); +} + +export async function getUserTokenId(token: string, encryptedPublicKey: string): Promise { + const publicKey = await decrypt(encryptedPublicKey, config.SigningOptions.Keys.KeyPair); + const tokenData = verifyToken(token, publicKey); + if (!tokenData) return undefined; + return tokenData.id; +} + +export async function hashText(password: string) { + return bcrypt.hash(password, HashRounds); +} + +export async function hashCompare(password: string, hash: string) { + return bcrypt.compare(password, hash); +} diff --git a/lib/modules/projects/project.controller.ts b/lib/modules/projects/project.controller.ts new file mode 100644 index 0000000..73ff55e --- /dev/null +++ b/lib/modules/projects/project.controller.ts @@ -0,0 +1,48 @@ +import { Express } from "express"; +import { VixpressController } from "@dunemask/vix"; +import Cairo from "@lib/Cairo"; +import type PostgresService from "@lib/database/PostgresService"; +import { ContractRouteContext } from "@dunemask/vix/express"; +import { ProjectErrors } from "@lib/vix/ClientErrors"; +import { CDatabaseContract } from "@lib/contracts/database.contracts"; +import { CProjectContract, ProjectContract } from "@lib/contracts/project.contracts"; +import { KeyPairType } from "@prisma/client"; +import { decrypt } from "@lib/svc/crypt.service"; +import config from "@lib/config"; +import { UserRequest } from "@lib/types/ApiRequests"; +import { PolicyString } from "@lib/Policies"; +import { Resource } from "@lib/vix/AppResources"; + +type CreateCRC = ContractRouteContext<{ + RequestBodyContract: typeof ProjectContract.Create; + RequestParamsContract: typeof ProjectContract.ProjectParams; +}>; + +export default class ProjectController extends VixpressController { + declare pg: PostgresService; + constructor(app: Express) { + super(app); + this.pg = this.app.get(Cairo.PostgresService); + } + + async create(crc: CreateCRC): Promise { + const { project: parentProject } = crc.req as UserRequest; + const proj = await this.pg.project.create({ ...crc.reqBody, parentProject: parentProject.id }); + const rolePolicy = await this.pg.rolePolicy.create({ + name: `${crc.reqBody.slug} Project Root`, + authority: config.RolePolicy.Root.id, + projectId: proj.id, + policies: [`${Resource.CairoProjectRoot}.root`] as PolicyString[], + }); + const [user] = await Promise.all([ + this.pg.users.$upsertRootUser(proj.id, rolePolicy.id), + this.pg.keypair.upsertProjecttDefaultKeyPairs(proj.id), + ]); + const kp = await this.pg.keypair.byUsage(proj.id, KeyPairType.UserToken); + if (!kp) throw ProjectErrors.BadRequestProjectIncomplete; + if (!user) throw ProjectErrors.UnexpectedRootUserError; + const userData: CDatabaseContract["User"] = { username: user.username, rolePolicyId: user.rolePolicyId }; + const publicKey = await decrypt(kp.encryptedPublicKey, config.SigningOptions.Keys.KeyPair); + return { user: userData, project: proj, publicKey }; + } +} diff --git a/lib/modules/projects/project.router.ts b/lib/modules/projects/project.router.ts new file mode 100644 index 0000000..1b71f84 --- /dev/null +++ b/lib/modules/projects/project.router.ts @@ -0,0 +1,22 @@ +import { VixpressRoute } from "@dunemask/vix"; +import { contract } from "@dunemask/vix/express"; +import { Router } from "express"; +import ProjectController from "./project.controller"; +import { ProjectContract } from "@lib/contracts/project.contracts"; +import RouteGuard from "@lib/vix/RouteGuard"; + +export class ProjectRoute extends VixpressRoute { + async configureRoutes(router: Router) { + const jsonOpts = { limit: "20mb" }; + const cBase = { json: jsonOpts, reqParams: ProjectContract.ProjectParams }; + // Controllers + const projController = this.useController(ProjectController); + + // Configuration + const projCreate = { ...cBase, reqBody: ProjectContract.Create }; + // Middleware + + // Routes + router.post("/create", RouteGuard.MangeProjectsCreate, contract(projController.create, projCreate)); + } +} diff --git a/lib/modules/projects/project.service.ts b/lib/modules/projects/project.service.ts new file mode 100644 index 0000000..f5b1732 --- /dev/null +++ b/lib/modules/projects/project.service.ts @@ -0,0 +1,36 @@ +import bcrypt from "bcrypt"; +import { signToken, verifyToken } from "@lib/svc/token.service"; +import config from "@lib/config"; +import { decrypt } from "@lib/svc/crypt.service"; +const { HashRounds } = config.SigningOptions; + +export async function getUserToken(id: string, encryptedPrivateKey: string) { + const privateKey = await decrypt(encryptedPrivateKey, config.SigningOptions.Keys.KeyPair); + const tokenPayload = { + iss: config.SigningOptions.Issuer, + sub: [config.SigningOptions.Subjects.User], + aud: [config.SigningOptions.Issuer], + id, + }; + return signToken(tokenPayload, privateKey); +} + +export async function userTokenLogin(token: string, encryptedPublicKey: string): Promise { + const publicKey = await decrypt(encryptedPublicKey, config.SigningOptions.Keys.KeyPair); + return !!verifyToken(token, publicKey); +} + +export async function getUserTokenId(token: string, encryptedPublicKey: string): Promise { + const publicKey = await decrypt(encryptedPublicKey, config.SigningOptions.Keys.KeyPair); + const tokenData = verifyToken(token, publicKey); + if (!tokenData) return undefined; + return tokenData.id; +} + +export async function hashText(password: string) { + return bcrypt.hash(password, HashRounds); +} + +export async function hashCompare(password: string, hash: string) { + return bcrypt.compare(password, hash); +} diff --git a/lib/services/app-init.service.ts b/lib/services/app-init.service.ts new file mode 100644 index 0000000..bf4f53b --- /dev/null +++ b/lib/services/app-init.service.ts @@ -0,0 +1,9 @@ +import { VixpressService } from "@dunemask/vix"; +import { OK, VERB } from "@dunemask/vix/logging"; + +export default class AppInitService extends VixpressService { + async startService() { + VERB("APP INIT", "Running init services...."); + OK("APP INIT", "Done!"); + } +} diff --git a/lib/services/crypt.service.ts b/lib/services/crypt.service.ts new file mode 100644 index 0000000..d650975 --- /dev/null +++ b/lib/services/crypt.service.ts @@ -0,0 +1,37 @@ +import crypto, { createCipheriv, createDecipheriv, randomBytes } from "node:crypto"; + +export async function generateKeypair() { + return crypto.generateKeyPairSync("rsa", { + modulusLength: 2048, + publicKeyEncoding: { type: "pkcs1", format: "pem" }, + privateKeyEncoding: { type: "pkcs1", format: "pem" }, + }); +} + +export async function encrypt(plaintext: string, hexKey: string): Promise { + const key = Buffer.from(hexKey, "hex"); + const algorithm = "aes-256-cbc"; // Encryption algorithm + const iv = randomBytes(16); // Initialization vector + + const cipher = createCipheriv(algorithm, key, iv); + let encrypted = cipher.update(plaintext, "utf8", "hex"); + encrypted += cipher.final("hex"); + + // Combine IV and encrypted text + return iv.toString("hex") + ":" + encrypted; +} + +// Decrypt function +export async function decrypt(encryptedText: string, hexKey: string): Promise { + const key = Buffer.from(hexKey, "hex"); + const algorithm = "aes-256-cbc"; + const textParts = encryptedText.split(":"); + const iv = Buffer.from(textParts[0], "hex"); + const encrypted = textParts[1]; + + const decipher = createDecipheriv(algorithm, key, iv); + let decrypted = decipher.update(encrypted, "hex", "utf8"); + decrypted += decipher.final("utf8"); + + return decrypted; +} diff --git a/lib/services/token.service.ts b/lib/services/token.service.ts new file mode 100644 index 0000000..db82c4b --- /dev/null +++ b/lib/services/token.service.ts @@ -0,0 +1,15 @@ +import jwt, { Secret, SignOptions } from "jsonwebtoken"; + +export function signToken(payload: object, signingKey: Secret, options: SignOptions = {}) { + return jwt.sign(payload, signingKey, { + ...{ algorithm: "RS256" }, + ...options, + }); +} + +export function verifyToken(token: string, signingKey: Secret) { + return jwtVerify(token, signingKey) ?? undefined; +} + +const jwtVerify = (token: string, key: Secret): any => + jwt.verify(token, key, (err: any, decoded: any) => (!err && decoded) || null); diff --git a/lib/types/ApiRequests.ts b/lib/types/ApiRequests.ts new file mode 100644 index 0000000..7c1db86 --- /dev/null +++ b/lib/types/ApiRequests.ts @@ -0,0 +1,9 @@ +import { Policy } from "@lib/Policies"; +import { AuthorizedTokenRequest } from "@dunemask/vix/express"; +import { Project, User } from "@prisma/client"; + +export interface UserRequest extends AuthorizedTokenRequest { + user: User; + policies: Policy[]; + project: Project; +} diff --git a/lib/types/ContractTypes.ts b/lib/types/ContractTypes.ts new file mode 100644 index 0000000..3cb577d --- /dev/null +++ b/lib/types/ContractTypes.ts @@ -0,0 +1,5 @@ +export type { CAuthContract } from "./contracts/auth.contracts"; +export type { CDatabaseContract } from "./contracts/database.contracts"; +export type { CUserContract } from "./contracts/user.contracts"; +export type { CProjectContract } from "./contracts/project.contracts"; +export type { CKeyPairContract } from "./contracts/keypair.contracts"; diff --git a/lib/types/contracts/auth.contracts.ts b/lib/types/contracts/auth.contracts.ts new file mode 100644 index 0000000..5dfaba7 --- /dev/null +++ b/lib/types/contracts/auth.contracts.ts @@ -0,0 +1,40 @@ +import { ContractTypeDefinitions, defineContractExport, defineContracts } from "@dunemask/vix/util"; +import * as y from "yup"; +import { DatabaseContractRes } from "./database.contracts"; + +// ======================================= Re-used Contracts -====================================== + +const Credentials = y.object({ + user: DatabaseContractRes.User.required(), + policies: y.array(y.string()).required(), +}); + +// ====================================== Responses Contracts ====================================== + +export const AuthContractRes = defineContractExport("CAuthContractRes", { + Credentials, + LoginCredentials: y + .object({ + token: y.string().required(), + }) + .concat(Credentials), +}); + +// ======================================= Request Contracts ======================================= + +export const AuthContractReq = defineContractExport("CAuthContractReq", { + Login: y.object({ + identity: y.string().required(), + password: y.string().required(), + }), +}); + +// ===================================== Combined Declarations ===================================== + +export const AuthContract = defineContractExport("CAuthContract", { ...AuthContractRes, ...AuthContractReq }); + +// ======================================= Type Declarations ======================================= + +export type CAuthContractRes = ContractTypeDefinitions; +export type CAuthContractReq = ContractTypeDefinitions; +export type CAuthContract = ContractTypeDefinitions; diff --git a/lib/types/contracts/database.contracts.ts b/lib/types/contracts/database.contracts.ts new file mode 100644 index 0000000..99bf043 --- /dev/null +++ b/lib/types/contracts/database.contracts.ts @@ -0,0 +1,35 @@ +import { ContractTypeDefinitions, defineContractExport, defineContracts } from "@dunemask/vix/util"; +import * as y from "yup"; +const antiRequired = y.string().test("insecure-exposure", "Insecure Exposure", (value) => !value); +// ====================================== Reused Contracts ====================================== + +// ====================================== Response Contracts ====================================== + +export const DatabaseContractRes = defineContractExport("CDatabaseContractRes", { + User: y.object({ + username: y.string().required(), + email: y.string().nullable(), + hash: antiRequired, + rolePolicyId: y.string().required(), + }), + Project: y.object({ + id: y.string().required(), + slug: y.string().required(), + parentProject: y.string().required(), + name: y.string().nullable(), + }), +}); + +// ====================================== Request Contracts ====================================== + +export const DatabaseContractReq = defineContractExport("CDatabaseContractReq", {}); + +// ====================================== Combined Declarations ====================================== + +export const DatabaseContract = defineContractExport("CDatabaseContract", { ...DatabaseContractRes, ...DatabaseContractReq }); + +// ====================================== Type Declarations ====================================== + +export type CDatabaseContractRes = ContractTypeDefinitions; +export type CDatabaseContractReq = ContractTypeDefinitions; +export type CDatabaseContract = ContractTypeDefinitions; diff --git a/lib/types/contracts/keypair.contracts.ts b/lib/types/contracts/keypair.contracts.ts new file mode 100644 index 0000000..8655f95 --- /dev/null +++ b/lib/types/contracts/keypair.contracts.ts @@ -0,0 +1,31 @@ +import { ContractTypeDefinitions, defineContractExport, defineContracts } from "@dunemask/vix/util"; +import { KeyPairType } from "@prisma/client"; +import * as y from "yup"; +const antiRequired = y.string().test("insecure-exposure", "Insecure Exposure", (value) => !!value); +// ====================================== Reused Contracts ====================================== + +// ====================================== Response Contracts ====================================== + +export const KeyPairContractRes = defineContractExport("CKeyPairContractRes", {}); + +// ====================================== Request Contracts ====================================== + +export const KeyPairContractReq = defineContractExport("CKeyPairContractReq", { + Create: y.object({ + projectId: y.string().required(), + usage: y.string().oneOf(Object.values(KeyPairType)).required(), + encryptedPublicKey: y.string().required(), + encryptedPrivateKey: y.string().required(), + name: y.string().nullable(), + }), +}); + +// ====================================== Combined Declarations ====================================== + +export const KeyPairContract = defineContractExport("CKeyPairContract", { ...KeyPairContractRes, ...KeyPairContractReq }); + +// ====================================== Type Declarations ====================================== + +export type CKeyPairContractRes = ContractTypeDefinitions; +export type CKeyPairContractReq = ContractTypeDefinitions; +export type CKeyPairContract = ContractTypeDefinitions; diff --git a/lib/types/contracts/project.contracts.ts b/lib/types/contracts/project.contracts.ts new file mode 100644 index 0000000..46c430b --- /dev/null +++ b/lib/types/contracts/project.contracts.ts @@ -0,0 +1,36 @@ +import { ContractTypeDefinitions, defineContractExport, defineContracts } from "@dunemask/vix/util"; +import * as y from "yup"; +import { DatabaseContract } from "./database.contracts"; +// ====================================== Reused Contracts ====================================== + +// ====================================== Response Contracts ====================================== + +export const ProjectContractRes = defineContractExport("CProjectContractRes", { + CreateResponse: y.object({ + project: DatabaseContract.Project, + user: DatabaseContract.User, + publicKey: y.string().required(), + }), +}); + +// ====================================== Request Contracts ====================================== + +export const ProjectContractReq = defineContractExport("CProjectContractReq", { + ProjectParams: y.object({ + project: y.string().required(), + }), + Create: y.object({ + slug: y.string().required(), + name: y.string().nullable(), + }), +}); + +// ====================================== Combined Declarations ====================================== + +export const ProjectContract = defineContractExport("CProjectContract", { ...ProjectContractRes, ...ProjectContractReq }); + +// ====================================== Type Declarations ====================================== + +export type CProjectContractRes = ContractTypeDefinitions; +export type CProjectContractReq = ContractTypeDefinitions; +export type CProjectContract = ContractTypeDefinitions; diff --git a/lib/types/contracts/role-policy.contracts.ts b/lib/types/contracts/role-policy.contracts.ts new file mode 100644 index 0000000..59667f8 --- /dev/null +++ b/lib/types/contracts/role-policy.contracts.ts @@ -0,0 +1,34 @@ +import { ContractTypeDefinitions, defineContractExport, defineContracts } from "@dunemask/vix/util"; +import { AuthorityType } from "@prisma/client"; +import * as y from "yup"; +const antiRequired = y.string().test("insecure-exposure", "Insecure Exposure", (value) => !value); +// ====================================== Reused Contracts ====================================== + +// ====================================== Response Contracts ====================================== + +export const RolePolicyContractRes = defineContractExport("CRolePolicyContractRes", {}); + +// ====================================== Request Contracts ====================================== + +export const RolePolicyContractReq = defineContractExport("CRolePolicyContractReq", { + Create: y.object({ + authority: y.string().required(), + authorityType: y.string().oneOf(Object.values(AuthorityType)), + projectId: y.string().required(), + name: y.string().required(), + policies: y.array(y.string().required()).required(), + }), +}); + +// ====================================== Combined Declarations ====================================== + +export const RolePolicyContract = defineContractExport("CRolePolicyContract", { + ...RolePolicyContractRes, + ...RolePolicyContractReq, +}); + +// ====================================== Type Declarations ====================================== + +export type CRolePolicyContractRes = ContractTypeDefinitions; +export type CRolePolicyContractReq = ContractTypeDefinitions; +export type CRolePolicyContract = ContractTypeDefinitions; diff --git a/lib/types/contracts/user.contracts.ts b/lib/types/contracts/user.contracts.ts new file mode 100644 index 0000000..7ae2f2d --- /dev/null +++ b/lib/types/contracts/user.contracts.ts @@ -0,0 +1,29 @@ +import { ContractTypeDefinitions, defineContractExport } from "@dunemask/vix/util"; +import * as y from "yup"; +// ====================================== Reused Contracts ====================================== + +// ====================================== Response Contracts ====================================== + +export const UserContractRes = defineContractExport("CUserContractRes", {}); + +// ====================================== Request Contracts ====================================== + +export const UserContractReq = defineContractExport("CUserContractReq", { + Create: y.object({ + projectId: y.string().required(), + username: y.string().required(), + email: y.string(), + hash: y.string().required(), + rolePolicyId: y.string().required(), + }), +}); + +// ====================================== Combined Declarations ====================================== + +export const UserContract = defineContractExport("CUserContract", { ...UserContractRes, ...UserContractReq }); + +// ====================================== Type Declarations ====================================== + +export type CUserContractRes = ContractTypeDefinitions; +export type CUserContractReq = ContractTypeDefinitions; +export type CUserContract = ContractTypeDefinitions; diff --git a/lib/util/mailing.ts b/lib/util/mailing.ts new file mode 100644 index 0000000..3776e0b --- /dev/null +++ b/lib/util/mailing.ts @@ -0,0 +1,16 @@ +import sgMail from "@sendgrid/mail"; + +const { CAIRO_BOT_EMAIL: botEmail, CAIRO_SENDGRID_KEY: sendgridApiKey } = process.env; + +// Configure API Key +sgMail.setApiKey(sendgridApiKey ?? ""); +if (!botEmail && !!sendgridApiKey) throw Error("Bot Email wasn't defined but API key was!"); + +const from = botEmail ?? "donotreply@dunemask.dev"; +const ignoreMessage = `If you did not sign up for a cairo account, please ignore this email!`; + +export const sendMessage = (to: string, subject: string, text: string) => + sgMail.send({ from, to, subject, text: text + `\n${ignoreMessage}` }); + +export const sendHtml = (to: string, subject: string, html: string) => + sgMail.send({ from, to, subject, html: html + `

${ignoreMessage}

` }); diff --git a/lib/vix/AppGuards.ts b/lib/vix/AppGuards.ts new file mode 100644 index 0000000..cdbab49 --- /dev/null +++ b/lib/vix/AppGuards.ts @@ -0,0 +1,15 @@ +import { IAMResource, ManagementResource } from "./AppResources"; +import { Policy, PolicyType } from "./AppPolicies"; + +function appPolicies(...userPolicies: PolicyType[] | PolicyType[][]) { + const policies = userPolicies.length === 1 && Array.isArray(userPolicies[0]) ? userPolicies[0] : (userPolicies as PolicyType[]); + const requiredPolicies = Policy.parseResourcePolicies(policies); + return requiredPolicies; +} + +export default class AppGuard { + static IAMRoot = appPolicies(`${IAMResource.Root}.root`); + static IAMAuthenticated = appPolicies(Object.values(IAMResource).map((iam) => `${iam}.root`) as PolicyType[]); + static ManageProjects = appPolicies(`${ManagementResource.ManageProject}.*`); + static CreateProjects = appPolicies(`${ManagementResource.ManageProject}.create`); +} diff --git a/lib/vix/AppPolicies.ts b/lib/vix/AppPolicies.ts new file mode 100644 index 0000000..cdaa4e8 --- /dev/null +++ b/lib/vix/AppPolicies.ts @@ -0,0 +1,26 @@ +import { ResourcePolicy, ResourcePolicyComputeType, ResourcePolicyString, ResourcePolicyType } from "@dunemask/vix/util"; +import { IAMResource, ManagementResource, Resource } from "./AppResources"; + +export const Policy = ResourcePolicy; +export declare type Policy = ResourcePolicy; +export declare type PolicyType = ResourcePolicyType; +export declare type PolicyComputeType = ResourcePolicyComputeType; +export declare type PolicyString = ResourcePolicyString; +export declare type PolicyDefault = { id: string; name: string; policies: Policy[] }; + +export default class DefaultRolePolicies { + static Root = $unsafeGetRootPolicy(); + static Admin = Policy.multiple( + `${IAMResource.Admin}.root`, + `${ManagementResource.ManageProject}.root`, + `${ManagementResource.ManageUser}.root`, + ); + + static User = Policy.multiple(`${IAMResource.User}.root`); +} + +function $unsafeGetRootPolicy(): Policy[] { + const policies: PolicyString[] = []; + for (const resource of Object.values(Resource)) policies.push(`${resource}.root`); + return Policy.multiple(...policies) as Policy[]; +} diff --git a/lib/vix/AppResources.ts b/lib/vix/AppResources.ts new file mode 100644 index 0000000..aa1eaf4 --- /dev/null +++ b/lib/vix/AppResources.ts @@ -0,0 +1,20 @@ +export enum IAMResource { + Root = "root", + Admin = "admin", + User = "user", + CairoProjectRoot = "cairo-project-root", +} + +export enum ManagementResource { + ManageAdmin = "manage-admin", + ManageUser = "manage-user", + ManageProject = "manage-project", +} + +export enum OtherResource { + Random = "Random", +} + +type ResourceEnums> = T[keyof T]; +export const Resource = { ...IAMResource, ...ManagementResource, ...OtherResource }; +export type Resource = ResourceEnums; diff --git a/lib/vix/AppRouter.ts b/lib/vix/AppRouter.ts new file mode 100644 index 0000000..4cb9796 --- /dev/null +++ b/lib/vix/AppRouter.ts @@ -0,0 +1,15 @@ +import "express-async-errors"; +import config from "@lib/config"; +import { VixpressRouter } from "@dunemask/vix"; +import { AuthRoute } from "@lib/modules/auth/auth.router"; +import { ProjectRoute } from "@lib/modules/projects/project.router"; + +export default class AppRouter extends VixpressRouter { + protected routerImportUrl = import.meta.url; // Used to configure the relative static route + protected baseUrl = config.Server.basePath; // Path for static assets + async configureRoutes() { + // API Routes go here: + await this.useRoute("/api/:project/auth", AuthRoute); + await this.useRoute("/api/:project", ProjectRoute); + } +} diff --git a/lib/vix/ClientErrors.ts b/lib/vix/ClientErrors.ts new file mode 100644 index 0000000..bedbc6b --- /dev/null +++ b/lib/vix/ClientErrors.ts @@ -0,0 +1,25 @@ +import { ClientError } from "@dunemask/vix/bridge"; + +export class AuthErrors { + static readonly UnauthorizedRequiredProject = new ClientError(401, "Project required!"); + static readonly UnauthorizedRequiredToken = new ClientError(401, "Token required!"); + static readonly UnauthorizedRequiredUser = new ClientError(401, "User not set!"); + static readonly UnauthorizedRole = new ClientError(403, "Insufficient Privileges"); + static readonly UnauthorizedRequest = new ClientError(401, "Unauthorized!"); + static readonly ForbiddenPermissions = new ClientError(403, "Insufficient privileges!"); +} + +export class UserErrors { + static readonly ConflictIdentityTaken = new ClientError(409, "Identity taken!"); +} + +export class ProjectErrors { + static readonly BadRequestSlugInvalid = new ClientError(400, "Project slug invalid!"); + static readonly BadRequestProjectIncomplete = new ClientError(400, "Project incomplete!"); + static readonly UnexpectedRootUserError = new ClientError(500, "Error creating root user!"); + static readonly ConflictNonUnique = new ClientError(409, "Slug already taken!"); +} + +export class KeyPairErrors { + static readonly NotFoundKeypair = new ClientError(400, "Keypair not found!"); +} diff --git a/lib/vix/RouteGuard.ts b/lib/vix/RouteGuard.ts new file mode 100644 index 0000000..a0909b4 --- /dev/null +++ b/lib/vix/RouteGuard.ts @@ -0,0 +1,9 @@ +import policyMiddlewareGuard from "@lib/middlewares/policy-guard"; +import userGuard from "@lib/middlewares/user-guard"; +import AppGuard from "./AppGuards"; + +export default class RouteGuard { + static User = userGuard(); + static ManageProjectsRead = policyMiddlewareGuard(AppGuard.ManageProjects); + static MangeProjectsCreate = policyMiddlewareGuard(AppGuard.CreateProjects); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ba1b6bc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6913 @@ +{ + "name": "cairo", + "version": "0.0.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cairo", + "version": "0.0.3", + "license": "LGPL-2.1", + "dependencies": { + "@chakra-ui/react": "^2.8.2", + "@dunemask/vix": "^0.0.1-alpha.0", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@mui/material": "^5.16.7", + "@prisma/client": "^5.18.0", + "@sendgrid/mail": "^8.1.3", + "bcrypt": "^5.1.1", + "cron": "^3.1.7", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "express": "^4.19.2", + "express-async-errors": "^3.1.1", + "express-bearer-token": "^2.4.0", + "figlet": "^1.7.0", + "framer-motion": "^11.3.30", + "jsonwebtoken": "^9.0.2", + "moment-timezone": "^0.5.45", + "prisma": "^5.18.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-error-boundary": "^4.0.13", + "react-icons": "^5.3.0", + "react-router-dom": "^6.26.1", + "react-toastify": "^10.0.5", + "yup": "^1.4.0" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/express": "^4.17.21", + "@types/figlet": "^1.5.8", + "@types/jsonwebtoken": "^9.0.6", + "@types/node": "^22.5.0", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "concurrently": "^8.2.2", + "esbuild": "^0.23.1", + "nodemon": "^3.1.4", + "prettier": "^3.3.3", + "tsc-alias": "^1.8.10", + "tsx": "^4.17.0", + "typescript": "^5.5.4", + "vite": "^5.4.2", + "vite-bundle-analyzer": "^0.10.6", + "vite-tsconfig-paths": "^5.0.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "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==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", + "dependencies": { + "@babel/types": "^7.25.4", + "@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-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "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.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "engines": { + "node": ">=6.9.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==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "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.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "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.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "dependencies": { + "@babel/types": "^7.25.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dev": true, + "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-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@chakra-ui/accordion": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.3.1.tgz", + "integrity": "sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==", + "dependencies": { + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/alert": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.2.2.tgz", + "integrity": "sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/anatomy": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz", + "integrity": "sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg==" + }, + "node_modules/@chakra-ui/avatar": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.3.0.tgz", + "integrity": "sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==", + "dependencies": { + "@chakra-ui/image": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breadcrumb": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz", + "integrity": "sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==", + "dependencies": { + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breakpoint-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz", + "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "node_modules/@chakra-ui/button": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.1.0.tgz", + "integrity": "sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/card": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.2.0.tgz", + "integrity": "sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz", + "integrity": "sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/visually-hidden": "2.2.0", + "@zag-js/focus-visible": "0.16.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/clickable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.1.0.tgz", + "integrity": "sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==", + "dependencies": { + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/close-button": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.1.1.tgz", + "integrity": "sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/color-mode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz", + "integrity": "sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/control-box": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.1.0.tgz", + "integrity": "sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/counter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.1.0.tgz", + "integrity": "sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/css-reset": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz", + "integrity": "sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==", + "peerDependencies": { + "@emotion/react": ">=10.0.35", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/descendant": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.1.0.tgz", + "integrity": "sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/dom-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz", + "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==" + }, + "node_modules/@chakra-ui/editable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.1.0.tgz", + "integrity": "sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/event-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz", + "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==" + }, + "node_modules/@chakra-ui/focus-lock": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz", + "integrity": "sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "react-focus-lock": "^2.9.4" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/form-control": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.2.0.tgz", + "integrity": "sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/hooks": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.1.tgz", + "integrity": "sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ==", + "dependencies": { + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/utils": "2.0.15", + "compute-scroll-into-view": "3.0.3", + "copy-to-clipboard": "3.3.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/icon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.2.0.tgz", + "integrity": "sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/image": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz", + "integrity": "sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/input": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.1.2.tgz", + "integrity": "sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/layout": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.3.1.tgz", + "integrity": "sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/lazy-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz", + "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==" + }, + "node_modules/@chakra-ui/live-region": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.1.0.tgz", + "integrity": "sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/media-query": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.3.0.tgz", + "integrity": "sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/menu": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.2.1.tgz", + "integrity": "sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==", + "dependencies": { + "@chakra-ui/clickable": "2.1.0", + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-animation-state": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-focus-effect": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-outside-click": "2.2.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/modal": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.3.1.tgz", + "integrity": "sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==", + "dependencies": { + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/focus-lock": "2.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0", + "aria-hidden": "^1.2.3", + "react-remove-scroll": "^2.5.6" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/number-input": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.1.2.tgz", + "integrity": "sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==", + "dependencies": { + "@chakra-ui/counter": "2.1.0", + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-interval": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/number-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz", + "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==" + }, + "node_modules/@chakra-ui/object-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz", + "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==" + }, + "node_modules/@chakra-ui/pin-input": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz", + "integrity": "sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==", + "dependencies": { + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popover": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.2.1.tgz", + "integrity": "sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==", + "dependencies": { + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-animation-state": "2.1.0", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-focus-effect": "2.1.0", + "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popper": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.1.0.tgz", + "integrity": "sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==", + "dependencies": { + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@popperjs/core": "^2.9.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/portal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.1.0.tgz", + "integrity": "sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/progress": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.2.0.tgz", + "integrity": "sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/provider": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.4.2.tgz", + "integrity": "sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==", + "dependencies": { + "@chakra-ui/css-reset": "2.3.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/system": "2.6.2", + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/radio": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.1.2.tgz", + "integrity": "sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@zag-js/focus-visible": "0.16.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.8.2.tgz", + "integrity": "sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==", + "dependencies": { + "@chakra-ui/accordion": "2.3.1", + "@chakra-ui/alert": "2.2.2", + "@chakra-ui/avatar": "2.3.0", + "@chakra-ui/breadcrumb": "2.2.0", + "@chakra-ui/button": "2.1.0", + "@chakra-ui/card": "2.2.0", + "@chakra-ui/checkbox": "2.3.2", + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/control-box": "2.1.0", + "@chakra-ui/counter": "2.1.0", + "@chakra-ui/css-reset": "2.3.0", + "@chakra-ui/editable": "3.1.0", + "@chakra-ui/focus-lock": "2.1.0", + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/hooks": "2.2.1", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/image": "2.1.0", + "@chakra-ui/input": "2.1.2", + "@chakra-ui/layout": "2.3.1", + "@chakra-ui/live-region": "2.1.0", + "@chakra-ui/media-query": "3.3.0", + "@chakra-ui/menu": "2.2.1", + "@chakra-ui/modal": "2.3.1", + "@chakra-ui/number-input": "2.1.2", + "@chakra-ui/pin-input": "2.1.0", + "@chakra-ui/popover": "2.2.1", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/progress": "2.2.0", + "@chakra-ui/provider": "2.4.2", + "@chakra-ui/radio": "2.1.2", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/select": "2.1.2", + "@chakra-ui/skeleton": "2.1.0", + "@chakra-ui/skip-nav": "2.1.0", + "@chakra-ui/slider": "2.1.0", + "@chakra-ui/spinner": "2.1.0", + "@chakra-ui/stat": "2.1.1", + "@chakra-ui/stepper": "2.3.1", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/switch": "2.1.2", + "@chakra-ui/system": "2.6.2", + "@chakra-ui/table": "2.1.0", + "@chakra-ui/tabs": "3.0.0", + "@chakra-ui/tag": "3.1.1", + "@chakra-ui/textarea": "2.1.2", + "@chakra-ui/theme": "3.3.1", + "@chakra-ui/theme-utils": "2.0.21", + "@chakra-ui/toast": "7.0.2", + "@chakra-ui/tooltip": "2.3.1", + "@chakra-ui/transition": "2.1.0", + "@chakra-ui/utils": "2.0.15", + "@chakra-ui/visually-hidden": "2.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/react-children-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz", + "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-context": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.1.0.tgz", + "integrity": "sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-env": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.1.0.tgz", + "integrity": "sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz", + "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-animation-state": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz", + "integrity": "sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-callback-ref": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz", + "integrity": "sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-controllable-state": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz", + "integrity": "sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-disclosure": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz", + "integrity": "sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-event-listener": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz", + "integrity": "sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz", + "integrity": "sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-on-pointer-down": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz", + "integrity": "sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==", + "dependencies": { + "@chakra-ui/react-use-event-listener": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-interval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz", + "integrity": "sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-latest-ref": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz", + "integrity": "sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-merge-refs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz", + "integrity": "sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-outside-click": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz", + "integrity": "sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-pan-event": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz", + "integrity": "sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==", + "dependencies": { + "@chakra-ui/event-utils": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.1.0", + "framesync": "6.1.2" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-previous": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz", + "integrity": "sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-safe-layout-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz", + "integrity": "sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-size": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz", + "integrity": "sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==", + "dependencies": { + "@zag-js/element-size": "0.10.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-timeout": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz", + "integrity": "sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-update-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz", + "integrity": "sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-utils": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz", + "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==", + "dependencies": { + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/select": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.1.2.tgz", + "integrity": "sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/shared-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz", + "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==" + }, + "node_modules/@chakra-ui/skeleton": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz", + "integrity": "sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==", + "dependencies": { + "@chakra-ui/media-query": "3.3.0", + "@chakra-ui/react-use-previous": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/skip-nav": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz", + "integrity": "sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/slider": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.1.0.tgz", + "integrity": "sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-latest-ref": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-pan-event": "2.1.0", + "@chakra-ui/react-use-size": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/spinner": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.1.0.tgz", + "integrity": "sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.1.1.tgz", + "integrity": "sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stepper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.3.1.tgz", + "integrity": "sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/styled-system": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz", + "integrity": "sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "csstype": "^3.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/switch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.1.2.tgz", + "integrity": "sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==", + "dependencies": { + "@chakra-ui/checkbox": "2.3.2", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/system": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.6.2.tgz", + "integrity": "sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==", + "dependencies": { + "@chakra-ui/color-mode": "2.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme-utils": "2.0.21", + "@chakra-ui/utils": "2.0.15", + "react-fast-compare": "3.2.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.1.0.tgz", + "integrity": "sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tabs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-3.0.0.tgz", + "integrity": "sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw==", + "dependencies": { + "@chakra-ui/clickable": "2.1.0", + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tag": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.1.1.tgz", + "integrity": "sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/textarea": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.1.2.tgz", + "integrity": "sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/theme": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.3.1.tgz", + "integrity": "sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ==", + "dependencies": { + "@chakra-ui/anatomy": "2.2.2", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/theme-tools": "2.1.2" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.8.0" + } + }, + "node_modules/@chakra-ui/theme-tools": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz", + "integrity": "sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==", + "dependencies": { + "@chakra-ui/anatomy": "2.2.2", + "@chakra-ui/shared-utils": "2.0.5", + "color2k": "^2.0.2" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.0.0" + } + }, + "node_modules/@chakra-ui/theme-utils": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz", + "integrity": "sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme": "3.3.1", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/toast": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-7.0.2.tgz", + "integrity": "sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==", + "dependencies": { + "@chakra-ui/alert": "2.2.2", + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-timeout": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme": "3.3.1" + }, + "peerDependencies": { + "@chakra-ui/system": "2.6.2", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/tooltip": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz", + "integrity": "sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/transition": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.1.0.tgz", + "integrity": "sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz", + "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==", + "dependencies": { + "@types/lodash.mergewith": "4.6.7", + "css-box-model": "1.2.1", + "framesync": "6.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/visually-hidden": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz", + "integrity": "sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@dunemask/vix": { + "version": "0.0.1-alpha.0", + "resolved": "https://forgejo.dunemask.dev/api/packages/dunemask/npm/%40dunemask%2Fvix/-/0.0.1-alpha.0/vix-0.0.1-alpha.0.tgz", + "integrity": "sha512-CGBvL7GYBgIHYfJCgARquSZqvalrjc6Iqqv0LtGOvz2sE5rTf9lPGAlylB714gSZ7KdVktOeRgkIzzr9tW+/7A==", + "dependencies": { + "auto-bind": "^5.0.1", + "express-async-errors": "^3.1.1", + "tsx": "^4.16.2" + }, + "bin": { + "vix": "dist/bin/entrypoint.mjs" + }, + "peerDependencies": { + "chalk": "^5.3.0", + "express": "^4.19.2", + "yup": "^1.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "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.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz", + "integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/react": { + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", + "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "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/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", + "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.7", + "@mui/system": "^5.16.7", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "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/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "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.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "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.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "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.15", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", + "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.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/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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/@prisma/client": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.18.0.tgz", + "integrity": "sha512-BWivkLh+af1kqC89zCJYkHsRcyWsM8/JHpsDMM76DjP3ZdEquJhXa4IeX+HkWPnwJ5FanxEJFZZDTWiDs/Kvyw==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.18.0.tgz", + "integrity": "sha512-f+ZvpTLidSo3LMJxQPVgAxdAjzv5OpzAo/eF8qZqbwvgi2F5cTOI9XCpdRzJYA0iGfajjwjOKKrVq64vkxEfUw==" + }, + "node_modules/@prisma/engines": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.18.0.tgz", + "integrity": "sha512-ofmpGLeJ2q2P0wa/XaEgTnX/IsLnvSp/gZts0zjgLNdBhfuj2lowOOPmDcfKljLQUXMvAek3lw5T01kHmCG8rg==", + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.18.0", + "@prisma/engines-version": "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169", + "@prisma/fetch-engine": "5.18.0", + "@prisma/get-platform": "5.18.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169.tgz", + "integrity": "sha512-a/+LpJj8vYU3nmtkg+N3X51ddbt35yYrRe8wqHTJtYQt7l1f8kjIBcCs6sHJvodW/EK5XGvboOiwm47fmNrbgg==" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.18.0.tgz", + "integrity": "sha512-I/3u0x2n31rGaAuBRx2YK4eB7R/1zCuayo2DGwSpGyrJWsZesrV7QVw7ND0/Suxeo/vLkJ5OwuBqHoCxvTHpOg==", + "dependencies": { + "@prisma/debug": "5.18.0", + "@prisma/engines-version": "5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169", + "@prisma/get-platform": "5.18.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.18.0.tgz", + "integrity": "sha512-Tk+m7+uhqcKDgnMnFN0lRiH7Ewea0OEsZZs9pqXa7i3+7svS3FSCqDBCaM9x5fmhhkufiG0BtunJVDka+46DlA==", + "dependencies": { + "@prisma/debug": "5.18.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", + "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sendgrid/client": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-8.1.3.tgz", + "integrity": "sha512-mRwTticRZIdUTsnyzvlK6dMu3jni9ci9J+dW/6fMMFpGRAJdCJlivFVYQvqk8kRS3RnFzS7sf6BSmhLl1ldDhA==", + "dependencies": { + "@sendgrid/helpers": "^8.0.0", + "axios": "^1.6.8" + }, + "engines": { + "node": ">=12.*" + } + }, + "node_modules/@sendgrid/helpers": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-8.0.0.tgz", + "integrity": "sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==", + "dependencies": { + "deepmerge": "^4.2.2" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@sendgrid/mail": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-8.1.3.tgz", + "integrity": "sha512-Wg5iKSUOER83/cfY6rbPa+o3ChnYzWwv1OcsR8gCV8SKi+sUPIMroildimlnb72DBkQxcbylxng1W7f0RIX7MQ==", + "dependencies": { + "@sendgrid/client": "^8.1.3", + "@sendgrid/helpers": "^8.0.0" + }, + "engines": { + "node": ">=12.*" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bcrypt": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/figlet": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.8.tgz", + "integrity": "sha512-G22AUvy4Tl95XLE7jmUM8s8mKcoz+Hr+Xm9W90gJsppJq9f9tHvOGkrpn4gRX0q/cLtBdNkWtWCKDg2UDZoZvQ==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==" + }, + "node_modules/@types/lodash.mergewith": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz", + "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "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.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.4.tgz", + "integrity": "sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.16.0.tgz", + "integrity": "sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==" + }, + "node_modules/@zag-js/element-size": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.10.5.tgz", + "integrity": "sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==" + }, + "node_modules/@zag-js/focus-visible": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz", + "integrity": "sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==", + "dependencies": { + "@zag-js/dom-query": "0.16.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "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==", + "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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/axios": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz", + "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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/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/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/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-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color2k": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz", + "integrity": "sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, + "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/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "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/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "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/cron": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.7.tgz", + "integrity": "sha512-tlBg7ARsAMQLzgwqVxy8AZl/qlTc5nibqYwtNGoCrd+cV+ugI+tvZC1oT/8dFH8W455YrywGykx/KMmAqOr7Jw==", + "dependencies": { + "@types/luxon": "~3.4.0", + "luxon": "~3.4.0" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "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/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": 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.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "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/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/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "dependencies": { + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true + }, + "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==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "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-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-async-errors": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/express-async-errors/-/express-async-errors-3.1.1.tgz", + "integrity": "sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==", + "peerDependencies": { + "express": "^4.16.2" + } + }, + "node_modules/express-bearer-token": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/express-bearer-token/-/express-bearer-token-2.4.0.tgz", + "integrity": "sha512-2+kRZT2xo+pmmvSY7Ma5FzxTJpO3kGaPCEXPbAm3GaoZ/z6FE4K6L7cvs1AUZwY2xkk15PcQw7t4dWjsl5rdJw==", + "dependencies": { + "cookie": "^0.3.1", + "cookie-parser": "^1.4.4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/express-bearer-token/node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figlet": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", + "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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/focus-lock": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.5.tgz", + "integrity": "sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/framer-motion": { + "version": "11.3.30", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.3.30.tgz", + "integrity": "sha512-9VmqGe9OIjfMoCcs+ZsKXlv6JaG5QagKX2F1uSbkG3Z33wgjnz60Kw+CngC1M49rDYau+Y9aL+8jGagAwrbVyw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/framesync/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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": "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/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/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/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/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "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/hoist-non-react-statics/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/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "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/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "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-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-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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/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-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/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "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/mylas": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.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-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/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/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.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-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-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "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==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dev": true, + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.18.0.tgz", + "integrity": "sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.18.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "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/prop-types/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/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-boundary": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz", + "integrity": "sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-focus-lock": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.12.1.tgz", + "integrity": "sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.5", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.2", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-icons": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", + "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.10", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", + "integrity": "sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", + "dependencies": { + "@remix-run/router": "1.19.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", + "dependencies": { + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-toastify": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", + "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "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/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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/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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/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/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", + "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", + "dev": true, + "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.21.0", + "@rollup/rollup-android-arm64": "4.21.0", + "@rollup/rollup-darwin-arm64": "4.21.0", + "@rollup/rollup-darwin-x64": "4.21.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", + "@rollup/rollup-linux-arm-musleabihf": "4.21.0", + "@rollup/rollup-linux-arm64-gnu": "4.21.0", + "@rollup/rollup-linux-arm64-musl": "4.21.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", + "@rollup/rollup-linux-riscv64-gnu": "4.21.0", + "@rollup/rollup-linux-s390x-gnu": "4.21.0", + "@rollup/rollup-linux-x64-gnu": "4.21.0", + "@rollup/rollup-linux-x64-musl": "4.21.0", + "@rollup/rollup-win32-arm64-msvc": "4.21.0", + "@rollup/rollup-win32-ia32-msvc": "4.21.0", + "@rollup/rollup-win32-x64-msvc": "4.21.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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "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/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tsc-alias": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.10.tgz", + "integrity": "sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + } + }, + "node_modules/tsconfck": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "node_modules/tsx": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.18.0.tgz", + "integrity": "sha512-a1jaKBSVQkd6yEc1/NI7G6yHFfefIcuf3QJST7ZEyn4oQnxLYrZR5uZAM8UrwUa3Ge8suiZHcNS1gNrEvmobqg==", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", + "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.41", + "rollup": "^4.20.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": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-bundle-analyzer": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-0.10.6.tgz", + "integrity": "sha512-w/5wvRZeZo2lKdJzRGCTn4YW/mT++fKeii2PQPK3odblfFqsODYHF72V+QTg1Xznbxy543N0WfT5vPiSosVWxA==", + "dev": true + }, + "node_modules/vite-tsconfig-paths": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.0.1.tgz", + "integrity": "sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/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/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yup": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz", + "integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..23ddb89 --- /dev/null +++ b/package.json @@ -0,0 +1,96 @@ +{ + "name": "cairo", + "version": "0.0.4", + "description": "Typescript Authentication & Authorization Server", + "type": "module", + "scripts": { + "start": "node dist/app.js", + "start:dev": "concurrently \"CAIRO_DEV_PORT=52025 nodemon lib/app.ts\" \" CAIRO_VITE_DEV_PORT=52000 CAIRO_VITE_BACKEND_URL=http://localhost:52025 vite\" -n s,v -p -c green,yellow", + "build:server": "esbuild `find lib \\( -name '*.ts' \\)` --tsconfig=tsconfig.server.json --outdir=build/server && tsc-alias -p tsconfig.server.json", + "build:all": "rm -Rf build && concurrently --kill-others-on-fail \"vite build\" \"npm run build:server\" -n s,v -c cyan,yellow", + "package:dist": "mkdir -p dist && mv build/server/* dist/ && mv build/vite dist/static && rm -Rf build", + "package:full": "rm -Rf dist && npm run build:all && npm run package:dist", + "format": "prettier -w src lib vite.config.ts tsconfig*.json && prisma format", + "tsc": "concurrently --kill-others-on-fail \"tsc --noEmit\" \"tsc -p tsconfig.server.json --noEmit\" -n s,v -c cyan,yellow", + "generate:api": "vix --generate-api --vixpress-path lib/Cairo.ts", + "db:generate": "prisma generate", + "db:deploy": "prisma migrate deploy", + "db:migrate": "prisma migrate dev", + "db:seed": "tsx prisma/seed.ts" + }, + "keywords": [ + "Cairo", + "Dunemask", + "Authentication" + ], + "author": "Dunemask", + "license": "LGPL-2.1", + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/express": "^4.17.21", + "@types/figlet": "^1.5.8", + "@types/jsonwebtoken": "^9.0.6", + "@types/node": "^22.5.0", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "concurrently": "^8.2.2", + "esbuild": "^0.23.1", + "nodemon": "^3.1.4", + "prettier": "^3.3.3", + "tsc-alias": "^1.8.10", + "tsx": "^4.17.0", + "typescript": "^5.5.4", + "vite": "^5.4.2", + "vite-bundle-analyzer": "^0.10.6", + "vite-tsconfig-paths": "^5.0.1" + }, + "dependencies": { + "@dunemask/vix": "^0.0.1-alpha.0", + "@chakra-ui/react": "^2.8.2", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@mui/material": "^5.16.7", + "@prisma/client": "^5.18.0", + "@sendgrid/mail": "^8.1.3", + "bcrypt": "^5.1.1", + "cron": "^3.1.7", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "express": "^4.19.2", + "express-async-errors": "^3.1.1", + "express-bearer-token": "^2.4.0", + "figlet": "^1.7.0", + "framer-motion": "^11.3.30", + "jsonwebtoken": "^9.0.2", + "moment-timezone": "^0.5.45", + "prisma": "^5.18.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-error-boundary": "^4.0.13", + "react-icons": "^5.3.0", + "react-router-dom": "^6.26.1", + "react-toastify": "^10.0.5", + "yup": "^1.4.0" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "nodemonConfig": { + "watch": [ + "lib" + ], + "ext": "ts", + "execMap": { + "ts": "tsx --tsconfig tsconfig.server.json" + } + } +} diff --git a/prisma/migrations/20240824171333_schema_init/migration.sql b/prisma/migrations/20240824171333_schema_init/migration.sql new file mode 100644 index 0000000..fa86d81 --- /dev/null +++ b/prisma/migrations/20240824171333_schema_init/migration.sql @@ -0,0 +1,75 @@ +-- CreateEnum +CREATE TYPE "AuthorityType" AS ENUM ('Root', 'User', 'RolePolicy'); + +-- CreateEnum +CREATE TYPE "KeyPairType" AS ENUM ('UserToken', 'Custom'); + +-- CreateTable +CREATE TABLE "Project" ( + "id" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "parentProject" TEXT NOT NULL, + "name" TEXT, + + CONSTRAINT "Project_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "email" TEXT, + "hash" TEXT NOT NULL, + "rolePolicyId" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RolePolicy" ( + "id" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "authority" TEXT NOT NULL, + "authorityType" "AuthorityType" NOT NULL DEFAULT 'RolePolicy', + "name" TEXT NOT NULL, + "policies" TEXT[], + + CONSTRAINT "RolePolicy_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "KeyPair" ( + "id" TEXT NOT NULL, + "projectId" TEXT NOT NULL, + "usage" "KeyPairType" NOT NULL, + "name" TEXT, + "encryptedPrivateKey" TEXT NOT NULL, + "encryptedPublicKey" TEXT NOT NULL, + + CONSTRAINT "KeyPair_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Project_slug_key" ON "Project"("slug"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_id_key" ON "User"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_projectId_username_key" ON "User"("projectId", "username"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_projectId_email_key" ON "User"("projectId", "email"); + +-- AddForeignKey +ALTER TABLE "User" ADD CONSTRAINT "User_rolePolicyId_fkey" FOREIGN KEY ("rolePolicyId") REFERENCES "RolePolicy"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "User" ADD CONSTRAINT "User_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RolePolicy" ADD CONSTRAINT "RolePolicy_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "KeyPair" ADD CONSTRAINT "KeyPair_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..9fbaf4a --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,73 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("CAIRO_POSTGRES_URI") +} + +// Models +model Project { + id String @id @default(cuid()) + slug String @unique + parentProject String + name String? + users User[] + rolePolicies RolePolicy[] + keyPairs KeyPair[] +} + +// User +model User { + id String @id @unique @default(cuid()) + username String + email String? + hash String + rolePolicyId String + projectId String + + // Relations + rolePolicy RolePolicy @relation(fields: [rolePolicyId], references: [id]) + project Project @relation(fields: [projectId], references: [id]) + + // Unique constraints + @@unique([projectId, username]) + @@unique([projectId, email]) +} + +model RolePolicy { + id String @id @default(cuid()) + projectId String + authority String + authorityType AuthorityType @default(RolePolicy) + name String + policies String[] + + // Relations + users User[] + project Project @relation(fields: [projectId], references: [id]) +} + +model KeyPair { + id String @id @default(cuid()) + projectId String + usage KeyPairType // Application Level Uniqueness for non-custom usages. For example, there can only be 1 UserToken Keypair + name String? + encryptedPrivateKey String + encryptedPublicKey String + project Project @relation(fields: [projectId], references: [id]) + + // Application Level Uniqueness for non-custom usages. For example, there can only be 1 UserToken Keypair +} + +enum AuthorityType { + Root + User + RolePolicy +} + +enum KeyPairType { + UserToken + Custom +} diff --git a/public/icons/android-chrome-192x192.png b/public/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a6e8ab2ea3bc7ba79a94c7dc83045f361788a7 GIT binary patch literal 25461 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%0AoO@d+WkC!d3 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

=(jVU6#5!%2**0{`wa$8i4IoGLEXP_r6Y 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

E(~tGWQd!tSo5dRP#tkA z6QO3qc?{=D;YS=Wd!~-i$1`TY=kA%t!IM3Feg7mDR*gH;@5?KuxkO0r_=e3`bV#qm z@LlEUU*NCZIK<_<3fy@47)4?HaX)g6y7|-i+U5`XRhxDom{kzS1qfK7HGq%;6S0K@Nm=R1!8IQWZy>lZKT#sH*jj@;_5QS7o( zmzgZ6!)x0pX1){g2ei|^Dp^V(--s2l_=zf8Wl6xr+g9-2>ks3it*a~}j8L3>PNVhh;Q807lPvwP{( zB-#tvjBquidtR3i;#NsOSyY(#sy%D?nOjfdx4*F!&mJ9M(5IwjMUOj?2!W$8o>5^< z6Cg|V`KdQ4N{yDHz69 z|99TAf*URyqsR?LBNNPLuoMLGmr{APcE&KYj*C_0+%p-%xNC*|sQdET7OLJg|IP<%9`bi1`d=cQw+ui_lER0k1>k2%hbA*3@HNNYR*I}P ztYK0vSM|nC+f*W-ycA@v!or*K&ZA|4X~1qI0q;L6=Y^!5PT<_rAhSGMBVV$Vkq zOlX4w;-6rwBK;0$2wXLax+)RE*uJ*RfaOLgBRu}n0FS*maQROyXPBKV(aQ+G_^w6F zPLbNNECZfC+{Yi>HH&_aaQJi&PaWzbGnJixvae`4TJEtA=0Lz9dFy5bD^Zf-@_D*Y0;L+UyY9nInz|h~&C1%Vjy8IA{39<6KvXdcr&luPR}io- zb$h2*GCXytUteg2`m!Qu3XRy-<<=O}YLLFp$gA$cI;G8Db?QO1=Snh|nJjVrCArh$ z@oSl5&IODqFi5YkS~o&Dnphp~!5VM!oX8>Bv z0DLi6CP0e{STg`wDDO%tXr&(eE%M?*!?LTZAk>UN2~g&F3Ayo+ax(-&Dk49nB!%z= zM|C9uTc*eO;Ee|{IVf z-}0t;TyNR5Eu^p_SvxHpXMpsw(FnvbP8aKd2#>rlfEz`Eaqai0 zu?^R+k-Yj=?B^8wrw+}Q72PXKgI${n{N4Ah)RFyI%}sd9Z8P2<5lez9R7wr; zI-H1Og(p+5S{4wjdCf)DNd`b3{o9cI6Y0EW06Hel0Hk~YMt9ut=bxUQp8EFfx8MHb z+qP}H$QqygW)!P7p@wTt1y;6v5UZPR$Lz^JM1S-=z-5VDA7e*G_aY8 z96$bs7cn^~uycM003q=Y3Q<5%9T>PjfYDlMn--uE4FuvbDa8~tqG={N^eUF*(_wG8 zc1RnIvs+7DJZsDfVqvIN#w0{bKssN61^Xo4q1v8=&O3j)sAh8JB&dVpts-dyjk6vc$4>f%rOd-=xO$1cb?|)K~ z@sde(N71Oiw!aD3JX7MI{OB@fCJ2}AEKru=Qfy6ux-(?#%4`}(w)_K>*(~%JbB^>2 zX4LN{>3En*!_jc*FaF}oA0LlKN065OE%D!Q{!63{2B1os7Qh}M83GtS{q)l>0$BNh zA9&}gji_aUjYpC>KBI1w{T(3mKxWGIj8Lf?HTMITl*VI}8hi+zt%Nz*FYuw8p2zf{ zz_!`3E=76oL^u{+lR7&{U(Fp8?;HWK6jE>;Qqs4k3&4izYYb|&Fp zz}qs)ERlF1B_BoA$9>mz6s(Nwn#&yR|Z9{e$-&$A9|5_KFDr zyoAS_3^+x7+U+x`Ds)~Tx#AUOf*LenA!kU+;<5XJTI!3P9fg*|uHz1OBIs?zBlfL^ z+7JL3^a)p9kfWbfa~1ZdNlTHM7}hsr7!EE2nQ2t0RHkNU0#hR)3StQ)S}Q4k{ISQL z&hz{jnjQZ(0{=9m?B!Q+cBdAuj&p@tP@u$V0E#y3I;{Ol7x+`%g~}dK(^q2nO&|n| zh$vJPlI^4Arm6Z*kdM{bGbJYbC4Tx%&*Q=^YuGk73T>xgLk|AdmAq^vTZh7tT0tSS z22jtV83p~YfF%i!2}k(2z6b1=3A8eCa9s<0C+*a8;&>M>O&T^tqbN^;HhsVJ2oLd_ zsJ^7ON)f>#ElvY+rfN-IynT#+`2ORVnJDY#VwS{+y_A{_&5limghnB>vk?2AgpH~J zQ#jYSY&`am5zwH{wPLIWw>K$n(MW9$b2R2t6k7~xMn-5u2-q@P;-CM-GBOh~M66n+ z|LLb_g501=))!ftvq8+ckIh*(VF3hP^>5GpZv_77kTx^`VQP#C0ANUEIVy?D8k;$N z)_PWt-vai9r3gIrL1qF#8IhDg$_#4sdq=niHTb^~Ci*3Q>Za$hd3uc5$=rSCQer5m z3Bs%NE*|MCwZ8(9R1V({%!m)`oFiK(`GE_9q&r;N z*JN#}@X&C#R)?C`YE>dFN;CMoez<7c7{B~O$MGLNzYU|Y37trl01QUh^4%;*;a^qx zE0A#1O<{0?rnNTY`q4BD6x;3Vx&qcjXc8zfdv-;Aq zg^eUrM?Z^mKefaJFz}ZG*$aUt0n7lH1F#9eW&m5aZrysJF=p$}|J=|0;^wVeb~n;O zHC3B0u&Elh@vRJ5tiqtg{L%l4{`in%5WKmNaAIW=zxmB8RFyGrPRcO^V9+b;%ZCXc zdeaNIaPw+|k(V(YE{lO0p^WA3MorS{WHAU|rzRFVB%`bST@aB5^>wVQ?K-!D^pKy^ zsK5MrUz^W?OFyR{_d)mG=dN^`lp1T>Ie_#jAxMRa28kBv5U@NnIJVfwfBgJ5td8TL zQ8xYo$r^>)NuE$~qo$BK(?eXwM6;TQaMnp<5Xi$lIDMdiLf0AyFgb>W^k>md_)EYJ zx|8qZfH2V~{2w1$!q(Xm^V9XZvynOVyTM!MQ$PlU0S@l?7s#{CD6=^@_EYdifxpBV zrtx^Z_Q_9v^1rUGt{ypY;=~I8P5?LsU;)(yKr0B%0amC>w)|?9{(%h*08bWoSPeh{ zMFVj1w`DGgp0PVfC!lEmpUuRBp@)B4bX3q2xGOqEOh+_s2I7LYjmz0DbF~?Gj4q(jMs3mAc=x^$P z^2mOv4n(P|xzi4hM8ND6p`Q`{>5o?u|MUclA7V{V>Yn4Pt~*8ps^C9GHt%3%YW&8T zCki%~Z)0672Z2tVI(1@sdHFcvnE#skKjJAjl25N12B1S^K&~!InE_nD36r5j$7CeZ zwH9R|0kIO^wp$tRJx;DegBsRb9r0OPqd`9_@vhe#!3`IlLQz(I==VxwK?h8N2?$jj zz8^?zsiytbMd7EAU9O_GSpuzVtu={#sdPo7P+pLdQ})!TZ&NHxRYH@>g3cRun^`zw zM(*pn5HcvfjISe@6scjdMAj}vF|TSLJ-8C{)W#ObJcP@3j`4qf_z1ELcduW8R5oD*6_FAeG1bPWw<|-R#kCZqnuGx zy0BimPU4}dHYIQyxhpFeLGEbCKgSMwu_tOOcxQkO2+qeOoC^PzWHQv~-xi`f%>$s8&TE^gjpi0!$m6?iJ3w_F zD}08-(p%-aAyWF&jzqZ#miS}@>^M-|G&HIFTZq2vXv4Z-pGq=#{iSR8TR#AN?5mrx zw3@kydO$)GKtO!Tqx}e;ZCl1~(4F8cn5^DKXR;&7w*DR1{0XXhKdBoMOrhsr6m5cq zV+m}YE%6UOu#6in&8v7F(kU48=*scWm)E* z_{1mv`-u}LUMz~@H1xRtn)m-kYDljt4Zs;32~3&+ilSJ_^L*79e&)shHC!x2NC3zp zNpaLiO(p}?(-cN{3mYs;V4_#xf=#Q~IlqRtUU3X>z2X=gz6?4EeU}sa$fa#bgoCn8 z5b34VvxO!OFo+_LspW5Wx^%CCbRFJV_z>p-=@+E*3-3b0<;OXqp|_O!-K1 zg3c{3T-_hDAsY0I_A=xI`B6FP)y_3P_60Q&0I8o4$q|2(E*?Brm+`#m@-_V2J5J-G z9b;^nse{v~1kwVP&8Bmn^H3w6pO05`fge8$>Wj|18f8@EEA_)sU_wys?T*0+TaqRX zlIjX^l(#6W<9#3fp=G?`@-fOfS{E6yLik=$_i<{%lzkec41`{_YMI|i$P}LmE#?}P zs^YRNSBs)pL1+Tlkp5pr+Ry;#NiqS}!6a}9tp0hDx<*Ko^~tN8l-86rn2sownCEibfdM$N2Ore9@_PG*&_q{8)Y2Vm|^|co#X|v*B zq}HEqOFkPa)p5ldl@4o5Y9^S!l-pwlWQ+;?u;6X~DF$F8wWJLOAWU*8YQ6xH3Glo; z5y-}MClhSKBpvLyKk|voQTDf^KRf_~>Z;O-UWrS$Eo0~05I=bRL6ihX{5jfG2}D5r zx!zpl4f-cAT%!Y7O6hJ`{S+5br$bQ=aOw`rNRd*~!XcEi)wzgKzx(0&6>?yUk_Dst zZ5%?Bpbz`!?~LUA3izYgmJp7C=Zk?5GXcy;p*giJ(2!M9%W&^Q4t#F9Az+*vy#3l$ z5P(nIHILIP8G3BF@Y>b$>15}b_z)pyHoh>&9#2!)Etys02BLSi{ZPU;vcj5?BvD`6 zt$!s|H!<$sT;e0|S;5U$jxa8KPNSB!z9%nR9}f^=II$0fnL%kLQ60ggXo+>G2%%#U z0s+eIozn}aUn=rqG0*d5gtq@7&QSW_NLA{+{3_0^bk9Ba;HH~yYQlRG4`=LO4?a%7 zgfV8~)?459?um)PtlMP5*+!*n>rE!ZXy)}8&b$s&%in;ZF@Wm$-i;TZ!WBE0P?Fw~ z(eSg?MsUtR6FJYQ<4q`_;aeML6!`{(oi)ko($?&-28v4r>>yQFGaGnyXKh|EDpB?X zR_mKe?BQsFKf=e&9;R)Itom0Ob;wPiIlTuEjXpZ=3i|Ie>|?Q3_e zt*xCzb=KdW_vdDSbzS_kq5iMZh6W%`T+rZJfXE?`h(JY|_u_9aGTAN(P71bRw-Hz&z@sYB)K7-)o94eN_yzNmjxHhrUicF#7X zQrsUYO@?wK%V*fZyTE;(Vmc$oAo?YRU%39o%t#PT(1b)&C;k-YNvNWwe}SHw=DTG* zsOk&RiKs5N76};T2JgCV1!W05^xP!+J;L{1n83nHhAfjh^#mam^Q2zK3$K`ns}saf zxgC*O^0}{(y`YwGqez3&R^%DFq5yVoDsk1G9JgFG#=CADqR4@99)eI^aGkU`>8VuT zQwf7Y+Y0MWZl_YXL!6tmF(brwe|hwe6aNkAzhipUX#jwAYXJ-r8UO%;?>+pzXK%UX zmbdl$gK4MT4z%QFF8|wYV8}87V@xl81%`%j0fKmvJb+Z0b7@kJQf<9y53Of^)g9B^ z%LQF+ms3oKH|<}1*Muz}9G^y=3t?QtGbZi|Gl7u!8m%fu5V=#8`=Sc)ZDt#v&vagj zT^K#(lL>xk{7_gRt+qi?8tmIO##^si!!1{>B7?!xhX+_0X2`78MIk<2n*uZ`JTbl$ zAJo!%7D&o23xc8m%b%CRu> zF66!KFGKq0<204elwlLg1cUwi_kZp5>C;C5ECN`r|E(f40d&6jXG8k;X+s0hoVXT1 zyD4yNj2U?;+RJu+OP`@c>@a?{DJp!>$J*Sj$ciOQtlSGDBV1|-l| zRbw0UWRsdUN(mU$aiqFLFXo%#eI5rjW?DC?!7yU0)~f!p1a@vJ@RqB`xZ;8wx4&+P z@z6lMQ=NbY%>h4^R%55NSuVvVJo|5kY$;estW zPA+FCOW@BRn!#vn(C_JeC$;W)tdT%Zl-L!j;y=!*Ncj4tUcQe+z^DM`r%L?rn}#3) z_HHZi{+os<3t&8stM6vg2{lXsuINns0fPbyv+u$3)J@1}4Xqx`3Q~%8jj@`NbS1S3 zAm#PHF3dU3F_e@&#zFTq64FhrKLF zN`nN@7@*vD%bFczo%YFzj!o;HeQ%`$9rjOCAR*T;1I5Lt|O>sNx45|s+medIZQc1Cp;i3CZ{^nQG`q{yzuOeeni9eWf4Kqt$sTqMRK&D2jW19$uy@jaLzImBi0d61WFknzNT3xMx z)Gkcn?TNY-co_AlgfdxQ^kM7pd$P<#M1O_7!US# zv;CWOe+bf@cYfoKzVVH3+_}2CdIFW_KR*U&H33#AOX?17+K~R^w4nh=Cus(-S^((> zFa$8F)l^+|aj_5*sK)D`2|YDsQ&`&a6Ud6wm|3_Z&Ln#td=Q>xR!i{x*c!5JMFq@- zCVPQMQ(r>x#YkP#e!D6eqe1KkML~%IXxDWZC*kSrLUP~@;7Jj8KY{j0py3EP7;M)z z6~d-|Z$Qq{#?;6>a@Cej9=S|xI*}A&f2xqnc~Ko3``{awv1z(MSypD0L#KQA^xc(K zATvNOQ)&|C3DV3`iE%|*0wrt8$Iu4s`RTWmsa23!*7L~UjQt8;HhZ+sXti+8Mp2(Y%3 zwqgFFi)yh=4Jk2?#;owZ=xRiPHRu#281>lBPsT&{4SJm2wei(A(p#nYDMkM! z7i}xh&j^pb)W;Ven88F}7ZUBA5%QbPfXBB9_Bo^5>)CI5GSO3$iAuo*YV{>nCU3yv^gAote?uS1#>?QUe=&k&jBJr==f9?if1LO? zngBMWe?7hG8Gw#S(*WdPQ32Oh*OtEd&2Rkv{?+H z)fD#)jXAXUq@r+p)2p^pY`EhZ4D!OStJ%pC?|$tHi~(-ABtuES7w(_NguNn{_eG)fQbXV_mf{Km$)F{GQ`Ay@ zK?Xl_+X{a4<~7VsmdFcJo#U^^+3n`M6yvVxrQ|@BdK#|v4T}~q7`M)vUzUn_PV$S1 zDxP@aiEkc1e*Ec!2M@l8Py=9@0PWoWMmmGE!2mQTDGJNbz*Y;eHXe^xzVel?-o10@ z&Wqms<~P6B7LxX0uy+>8kkebYku>eI4Gxs8zwCNbAbK}x5FiMKCma#ZYLX^8j3b0< zh(d!a)IotNT@MlDXC|&U?bj&foQOb4sbA8{`khH3_u3&e3P#kJy3W0j5|#d`)vB~6 z#Y}nD$HKC!ktBdo@WVS~8soJ?yjWgT)M(30iJ!P-8E?8`h;KbUi8~&eu1*bz?)D7S zI|J-HzFe&WgzVU;7D-FCf~ZpW|M**0@w!XL7#F~G7v-255XJ>}g7J(*2wpBioJk@- zmtE#mn^%-Dlml&Qf6gQc=|6RJHtJ!Ter;H2`b%g%w_}$1pxeg0ZB&-Ze@ndRuU6=iftrdoqk@(_4PXXfQec~7R@Ma~>G)lXvxat+r@K5as zoYiXSe1x591x*;_C1LAq zi5;7UxOjVkx4mXqJAV4qGr<4++AN+r-1nCdi9H(ikG;za;LTT#@MAZxIvYPwdGTMi zGspJ%%GRHk1|_A}b8Np~k5)i|V8ECey_kGghY7C&{=5fEQ@3E;+YJ*%B4x+=YSWdE z!5H71DZ7=L?<~v4XutHw;^Ho9u#J>R8w>zm5kCOQ0Dur4xAFc(FMpjncEU_xJb4Ys zOadLqOmmH?WGP}wHz+BCR;|}zdtV2=K2H3F315`*?Q(B>-fK4x%quX`f(qNUgrcld zULl-UjZ zSU-tIB}S}S;Hji)A8K^(qU{BYDcIIjGA0-u``^m!AUfde?2@IGb*^6v*q9>q7JKHJ zI?fBFl=ai*M;>|Pt4}=f#C=DO965kk1E8J#w+$s5+fe^E zrws;ReaS91Ylo6%fYtGMyu5$^{%0<`?6R!d6`3m-R>7a!8wKE~lz|D66i~Ng0F*5? z2`Mnr4obamsv0YrB?yYDcI5JXoHYA88@9h8Pv+nR1N@R5&LA*VyyzMa;KILaYJWK* z`@(8_3`3@p=u_>m=G$P_aXH9NjA7swC*~)bko0#>QB6}lqOJyF*p|4_CNlTb?RsKg z0aHr-Dt)$dD!%&`Vk1+as8Y6OOw+jer`}IdSZ3Z)h&@r~2$esq=B^qY@u==$1;o+P z(&p3v=z;3qWNfcHzQQW@h!{l9oZc=jE*^jCsi&R=a0(#ojQu)iDWWu)xoS8;x% z7EY1aza}$))dZ{>lMRU>8+&KA-H=$IeJyvFBESy2Mbh{efPVBvfZtO}W&!a~aS;p`A( z74a+)8-X%`s1PML>4(|}PW;K;2&gB%93@0$=Nkxxrlo;WHBqYahI!DQL#X+A7KD-U zxAvB6W9Ledn7!7391#ysC~|nkOlY_?By8(_$Lcf@Ork{}L%^tSA?L7}_$TI@k6!{3 zsUm6mX)wm(%n#t%o&OPw({D%R{SWwnPGYdZ@Xo{xS@os1{jb6Y`{DNgja&b|4{3t| zSbx&A05)L78tTPs4A#mbAC*Osb3_#r4w;m#M3qY0mUjrP-t>e%ivA9iy?MmckPw)FD%L+%P;|DG{x%hw(_c8Lxy)N+>Ei zP&s=j1szHWUmS_AE23|dl>W;Jh>mX(*aA~V+lFsr;?9|>&}=0JZo>S$PUkSol~#3( z1glYz^KO5TlVA1G1o;GHawSA|vK7 zGKcj*W)elV3FH25l-Z24UXZIZJaJJC(?X)#!sWTjl8Tb3M0n+|=Ka5}u)iDX|Mv8% z4h1Yzhiig);y6oQ7u;W1SjZoI=%M>goH%jls;jQL@l5-~k*9I$W2Rbky)o#Gk6?P` zZm3rUH;%+oE+MHXw(|CRLXs~LdQ&Ba<#Bg`!^A`&B3uB+EM%L7Q-nN>P zQ2B8%14E?4t+f>Vbbz6z_T(EaGc|l$Z?Y;8im4ze`LqETEnnBZwdJek(l9egu$mZr zP3;gMwm{T3EeNrnVVfr$nAAX#Gx3CLnrkDB(@>c-NK|u*QL=Ejwro1b1c^2x4u^pF zR;(b8p&U!oZ^cX7{u$OLu6BLkbK&Me;)$+UlYz)S?|*dvoqzntfBdoMpMUgek8juQmB#Lb5QsWUyTf*+k5VkiO)KZ1$ zsSS9uZh5oDFWe0m2a3#Lf$dKD%BC7;=^_>@h#4M&Wc> zTFKWvcc?QVSPXdIC_N3tDo8R<(FW{3pAsib`qys#OSZfr{dY?nCIFFMX1b664TlD_PKk|4m5b_^mSNGm z;X&%u=}kfwC4TcElT#UM#~(>CRax7*6KVtI#EXq&$X${|9CVJzkve~h0Y)8}T&a%f zPxbn(->F^GRh8bhZrJ{AY(8B7+y}!m5#|inr`Ckuw`2$=>)CVvn(g04{@ZZ= z`#z)%4ZxYFHZ8y!fVDg?mRDC-Pns;7n3|lN)hnu1pY{clEUWkAZE(bpU6e8q`he-H zt%SGAup}jZrxEb9AQY?!EOsq|vs&R00$^F0UTfMCYKwA%>s(p&R$7bhp)m}GWMyj6 zmXy*Fs&?C_o5PA658&$eqJ2npC|#WnrD#&R_0K5PNcBWg^{;4p(w%O|7_xVoQp4Mn zD^ks+X5MZ0OzfnDq8aBhrBzx-QoWz0;J+sN!l^tPiJeyV+I2&6pO6i=!A+YS@J$oe z$?MP*20e?08( zhV=h^NE;2N(BhS2v7Ce(rKxjKmyGj%P<%} zkI9w$0MkQ2kUEWs>0Z_RY09Qc>&;SRK<@Y$wdQLzEQ_8Rv?kkQ;8Z7#*nhRYS(0KD zq88A2!}^~z-4YVP092@TlfE0OAP+B%wm5j2uFG7&be(-Owm)QVhfCKIOVy?oD#5Uo zx~hJA|BSG8rqQVhX25`OlTyI+k+Qx5?yCiwobW68gU%-yJR|E$Fd_}pY^cD>Y@c$1u$h`O#xQ4=K=y3jV#h;SB_HLXj7NUY!2he%VEkD^oo;lL5(;C zm{X&$5?O_*s~jDauqx+SU(Ah%5j@)e7;)q5SNl8hl2?VGolv4)$vY} z5O<0K*+lpglw5KqTCepIBhThiPRDvm@l#t)w)iG2L`Z~ zW!b1gC?*gDtu#aoDRWh%N0lw>+U>jo!>MbrHvKxxF8&$jPksWFO(5w3%-=a7f*LZU znvW$A`NkntYri#0E0&mBX-t!{h!G769la3J7S?Nvg!`vi zOXVw0j7{4Qodo=sF`wG|WOZI(2u`IWn$Wy;sz`rDSYsECUNJwo(>I1O*v3~%0A4!y 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�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 literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon-144x144.png b/public/icons/apple-touch-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..803719f0d233ccce7883fa9c959c854dbb5ccec1 GIT binary patch literal 8241 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 literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon-152x152.png b/public/icons/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8b819dfce6dbea24c7a2b79c7bf282aaf791b6 GIT binary patch literal 8835 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 EUpo7Z*#H0l literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon-180x180.png b/public/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..e64c44e772587b0c65c4c2238a47a6a0108bb991 GIT binary patch literal 10994 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 Ml#*n%xKZH$1L-%)a{vGU literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon-57x57.png b/public/icons/apple-touch-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..11df305267412327a07fc7dab6be50c03ca49670 GIT binary patch literal 2779 zcmV<13MBQ3P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rg2nQ1^8;Z{Cf&c&sd`Uz>RA}Dq*;{Z_=Rm2vve>9pfRr=9VsK6TXgp;m2m zv}mm@a*2R~#h4hun1qmp>~2Cfx6NL&d#>N54+&z_foxcZI+Op?K74cjzwiHD&skJk zTMIvs;BGZw#(K+R#yVr2vCde9n|}n)A)ZH+F@hQUzqJ;+q*XsET{%=A+bEuF)fq4Vv~a<^pX_-QW1LNEalU!uO84gavf_M` ztmyB3Japvap`QMV`-;RtPZ5q?`Nu%ttp~tsKTbBzd znVfAW2*K(lbno7}9JlBE`OmMPJp*e=f#vrH7kg)086#hI$Nqje_*q8`lL-nYED%!v z{PtjLXY$FN`SU7F&+N{-(`$P3gG5iip<^(Ku&`3tzsXeVlFYHViXh7)M32vuI{w5=MI2( z76(jcAQ~*!FpN+rlr`&cM1Aewf$`r6fu}s@kqyOl3#<++0!9!}j2*r{<&9&}|F+4h z&fYzpKJQak*Gfw~yv@P}M)8N|jB`G6-x9QcBXbnjV$LQck5SI5Gn=k!u~;l?)~~{r z%WtbM+|^K6;N&SKv4o~*Smc?@2Dev=&+gBE|E%e+hm)}}8W+Pa`h*mmmSzUJV?nQR937Xns zuO1${&?D1t9gy)9ef3DHE2urS-Qt}E&+OvYF1sxx-@am@VYayy>nb8uBN8!(UlJ3C zff*D`X{aEC^!4@88y(FVSTUxZJ!2oWMo+iK)9S=?Z8=<#ix+rc3}RzsG(j1I=1$|v zFn;WQ)0!3YJ@-6TCCvpu8YcoUUb!fZz9^)c00?4+j@&8gRy8FM2;2~mfps9P{q|3O z`Kr>I!__az-LfLLqLk+m1)$M{aqLs&{ZG_zoDGiBmM&xYvRsL39Emby;`E4+{#1;= z&FTFBgo&k;x24oFjpl|&1_uWRvuPz1#-RwoqH6QL`<-?3C4py@5o|Dlr`BS0V5_vM z2EB3=&nY9j*Kl^)#0JhW!3jt}ID&8lF#~{5Q>9w+Yfk2;Qr*zHySt~7Is>a@LhF{=AGp^(w_GHIv~`F^6B0qA!O@U4oP+6Y-9Yjwu2%u#QBHXa6+R zH)N2>`{05~?&%$-nmK@A;spU15mIM({j%!L=rBB#%tJ9on)U^>=sggqBMx<9*fQ_na}YqgtuYP+;-0piftp%W7TfFede04Eb$22jJ$?GLEXx@WX<1p>)LTa)5xd=9RXs=J%6T$s zB0UqUeiC$Ig`sQfi~xgPebZ%Sou=uhPMwjq%@%P;qWzO( z*PvgkE|7ks;exzN!(2;Cb8~Yuo7RV~%&Y*QX<9HCtg5WEI!a{Z5y^nW`q8!OeiI6e z4dZ2<@@^GdeBBpMo;+z7Mn)N@Zv}uvA`uJ*z23PdOF;@e5*?6O|J5Vl8WaHm27Si* zj`Slk&biXp+t}DRHa0dr=rpYW5R1k7`ug1NGK;M^!R8ArodW>`##aSKfC&?W`lhb* zb`?u~eZiwgkKXX@?|ZQVKqM0J`~A1M-MO}+IGsnBWQEH-$iNr^Lu0OP^-CX+s&&*8A=e{d z`yQW9sHj9??y#{ahCMyXx|m)n%c-WOrZZ>GsH%GN&@5O1z%UHI-yaT# z3kvcC$(b-pHOybR(%abB*xufr(TV@PTLFMEHZn4D>Cz=isl#DwYim1k;>7UqaJH1= zfoA@bpRwL*z>M{l$BcEx`a`n*4?~iI8i@=vsQ>@~C3HntbYx+4WjbSWWnpw>05UK# zF)c7SEigA!F*!OkG&(XjD=;uRFfhx;=2rj!03~!qSaf7zbY(hiZ)9m^c>ppnGBGVM zI4v+YR53X^G&DLgH!CnOIxsN0n_lYx0038dR9JLUVRs;Ka&Km7Y-J#Hd2nSQX>fF7 z004NLlYOg9ma%Vxv4oJuF0v#`gfW;bA$zJ(_NK@nvV<|&vJ4_?L^ETF zLC6+a%9^a1$b9<#eLuc)&%MvN&pFS%=l;4+(ltwCcGk13006L?n!s&NQ0HGV)1B0} z`IZtVz~FuP>SX{Rq_7>ipE~J95GFQP0U$~e0MM}j@aKd=F9Sd*6aZG;06;4X00aVa zo2~y1V)QUKh6A*JQP5U`JzZopO#mbbMF+>XrTjq zPPLvaN7IiE2_W0$SHTvAC6p7?wjxX;^r#~?S-){9oWOaT|tOj{C< zLg8`2gA~<7I%XZ|NeBKsa=c8R;>PsybiIm_k}X3)2l*GSM33sapzpGiT0Yb==$83S zgCo1@o#}$3PV`3)f@a=8-wUPLC6}Xm)CjS2DY8B)=;w}A|AV>qn-$r%YF#6*cK=`* zc%ER+s|TRskWtURj8=5p(ndFG3cY=oHhjCQwSJAdvH}tk5{LU66>r|?L~bv-*k7=U z;vKB{IlcVGHQzhKS`4po|I(M;y}9e*1|z8W>kdxtQ_VzzTV`uyWRyFYmV%4Pe8!7x zv{DgIxYsaN-;m5|5Pf@l^HZJ;?nT1KUW^ zTdqEmv4M$!`a(GGDnX?SLl?VUC;RwcC^MwfrDS6W-}a)Ucq-5BW;_gwM`%fke?6bz z(AG}~3nKQ@nR1s_Ve@sDzN{>7sU}4vHy=LLYg79?ncWbIFDnMJA!g7$#w`N>!r#HC zarj>r>~hjsAXpqm_XB>Vzi4feLZNsT$voDND8`wIIn|K~zUDu3#e_hojJVJfvHTf1 zvfjwbs@oh~Www^-88Dl=(Eoy2 z)LYAA^TAo2yBDi&&q7Y$sw3LejonO*bDc)yZ7iNqlkSwJ2hMc%QkTQkuIc2F8lF0h zjaZQRaiOhar#kQ*Nh}9{k9}ZT**>Q5!ArV3#}Z+HmY~h7Huzu;E}bu?k-`$&vv%R5 zlU6!?ic`56^_G9?cfQW&3#-(ChDf2PV60o6)wn8nOjVset(e^Mx}zd7R)#DiT^zf+ zw|6!8_Z(-h#g9<>hhNX?+UW(3R!0AT66XvWw-UyS-aokZwb{nu+G*rrUz?||t0cF? zlQi{&WNIR$xKIO6nM#xdN}mPuWqP|+mXvtg5e3}OMTM2i<*MjiQ;S2~+Z!^Q_HtGLJPw=SN#`x{)!wRgt0 z{EW$IG|2pnGuJiXgJwm3o7LU*?>?HAujRVIDaI|$%|A~;)nNuT9x+RV+lNIHwbGQB z)Z^*}Ldr`lVUc{i6QzgR7`81BB_ZTsO}(jd)|2vgccCSrXEqzS#DQ2dONB!r@%uap zSBB?iyLxOaB2!2UzYjO#l-27^;rALe`7?81dFSt#wqF-m+5bA6@8=b91S$&?Rwr?6 z$-hDBJo;I+HyB-uM1v`b>%Z@9Dr*oi#Mrj|&Qwyh@qA;hG3O(`orA|yAJb5PKH3^!#jy4a zM$F)~!_JMVS&%&>wE;s-2r(sxu6ny!j`1$j(~s$MYyyhi9)wL6c7c}9Q;NOZ>o=uz zn;gkCHSWr1gLnY_W@qrh6W)uDK0Oh-V+@gnyq_NpE08_alTg9uCw!K*zOivu8&OoU z^+>*+=DrexZzYdtck>Ef?m(~P4lBwCa3TOfGziK7feZXzGiOm7$iJk$ib4)k*vzSq zwTr0|K5(k={5j(gHy{yYh>pLdBC^ojezi;T{p|SUq}JKO6~R=N^Fk;FaxFMi zTyl39Z|?8!k2r-9@^75F74fYpIhi$=>_yPvv>h_37L zeT}}0p}M-NWba1k#8QguWl>HXm`;Um>+V=nm)rg(;j(3LTicPW)y*8i9brkcvc4r* zMaACUf$LO{=Le8^kehh7bJ}8c|IRPUzBoRo&WZ zk*oKa6gG~JP$;Qpc%l?o?<~N`#Dp92K~2b8l1=op znL*i+cNVw&Jqn$tf-XAZxC#e|vp?4?sUQ7Ldco5x zVLM$r^up`)mwlrY3g>A?Dd~I$7{Ktj^Jl<~fB;LQcyY7jqT>EoF>d(Z2t()XGPM08 zcHGIK1O&;bjcuo^5F`Rl2@ea~)_IkehcnnOAh=OVgDWbq@e0|Pht#FA@87))ttHz} zUK>b%q`s=E$^?>@ks)I;#?Wvst7&FjkGhE6-`@`kZ`>4M2QY-=;|DML;y7z3-uxKI z^Y!z~jhL7b;`xJHCMDB0_4NL0%uN0nG@9=+4e%{F;(qd&#B$;$B|;1xLOk6=kXndf z#GiS&K>Oz!UQKHtsMhc+oNQv_B8xI(rK)G|(10H%hP@G1khNB;q% Cw~l=P literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon-72x72.png b/public/icons/apple-touch-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..0a23e002e3c7f15236fd62c0e5b956be0b175bda GIT binary patch literal 3717 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 IvHQLM0LU-VHUIzs literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon-76x76.png b/public/icons/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..1dac6601f0e8770e9be7829d2018492a05805ae8 GIT binary patch literal 3887 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 literal 0 HcmV?d00001 diff --git a/public/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e64c44e772587b0c65c4c2238a47a6a0108bb991 GIT binary patch literal 10994 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 Ml#*n%xKZH$1L-%)a{vGU literal 0 HcmV?d00001 diff --git a/public/icons/browserconfig.xml b/public/icons/browserconfig.xml new file mode 100644 index 0000000..6e1de61 --- /dev/null +++ b/public/icons/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #ffc40d + + + diff --git a/public/icons/favicon-16x16.png b/public/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..5110185f44f9a5519d83eb4e7955a2e4d6431f68 GIT binary patch literal 1205 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 literal 0 HcmV?d00001 diff --git a/public/icons/mstile-150x150.png b/public/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..6f13152ed836d843fe5c312d67f3340fae754cc8 GIT binary patch literal 4023 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 literal 0 HcmV?d00001 diff --git a/public/icons/safari-pinned-tab.svg b/public/icons/safari-pinned-tab.svg new file mode 100644 index 0000000..9a52632 --- /dev/null +++ b/public/icons/safari-pinned-tab.svg @@ -0,0 +1,165 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + diff --git a/public/icons/site.webmanifest b/public/icons/site.webmanifest new file mode 100644 index 0000000..6c06e98 --- /dev/null +++ b/public/icons/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Cairo", + "short_name": "Cairo", + "icons": [ + { + "src": "/cairo/icons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/cairo/icons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#333333", + "background_color": "#333333", + "display": "standalone" +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..96331c8 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,27 @@ +import { ReactNode } from "react"; +import { BrowserRouter } from "react-router-dom"; +import { ChakraProvider } from "@chakra-ui/react"; +import useInitHooks from "@src/hooks/init-hooks"; +import theme from "@src/util/theme"; +import { AuthProvider } from "@src/ctx/AuthContext"; +import "react-toastify/dist/ReactToastify.css"; +import Viewport from "./Viewport"; + +export default function App() { + return ( + + + + + + + + + + ); +} + +function InitProvider(props: { children: ReactNode }) { + useInitHooks(); + return props.children; +} diff --git a/src/Portal.tsx b/src/Portal.tsx new file mode 100644 index 0000000..271cec9 --- /dev/null +++ b/src/Portal.tsx @@ -0,0 +1,59 @@ +import { lazy, LazyExoticComponent, ReactNode, Suspense } from "react"; +import { ErrorBoundary } from "react-error-boundary"; +import { Route, Routes } from "react-router-dom"; +import { CenteredLoadingSpinner } from "./components/common/Loading"; +import { CenteredErrorFallback } from "./components/common/Fallback"; +import { Links, rootLink } from "./util/links"; + +// Lazy Views +const ProjectView = lazy(() => import("@src/views/ProjectView")); + +// Static Views +import AutoRedirect from "./views/AutoRedirect"; +import AuthenticateView from "./views/AuthenticateView"; +import { useAuth } from "./ctx/AuthContext"; +import AuthorizedView from "./views/AuthorizedView"; + +declare type Portal = { path: Links; view: ReactNode }; + +function Auth(props: { view: (() => ReactNode) | LazyExoticComponent<() => ReactNode> }) { + const { auth } = useAuth(); + const Component = props.view; + if (!!auth) return ; + return ; +} + +const lazyPortals: Portal[] = [{ path: Links.ProjectView, view: }]; + +// Raw Routes +const rawPortals: Portal[] = [ + { path: Links.Authenticate, view: }, + { path: Links.Authorized, view: }, +]; + +export default function Portal() { + return ( + + {lazyPortals.map((p: Portal, i) => ( + }> + } key={p.path}> + } key={p.path}> + {p.view} + + + + } + /> + ))} + + {rawPortals.map((p: Portal, i) => ( + + ))} + } /> + + ); +} diff --git a/src/Viewport.tsx b/src/Viewport.tsx new file mode 100644 index 0000000..285ed66 --- /dev/null +++ b/src/Viewport.tsx @@ -0,0 +1,17 @@ +import { Box } from "@chakra-ui/react"; +import MainMenu, { useMainMenu } from "./components/MainMenu"; +import Portal from "./Portal"; +import { ToastContainer } from "react-toastify"; + +export default function Viewport() { + const [minified, toggleMinified, drawerWidth] = useMainMenu(); + return ( + + + + + + + + ); +} diff --git a/src/components/MainHeader.tsx b/src/components/MainHeader.tsx new file mode 100644 index 0000000..a794eff --- /dev/null +++ b/src/components/MainHeader.tsx @@ -0,0 +1,34 @@ +import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, Box, Flex, useBreakpointValue } from "@chakra-ui/react"; +import { Link, useParams } from "react-router-dom"; + +interface LinkChunk { + name: string; + link: string; +} + +export default function MainHeader() { + const { sectionId, moduleId } = useParams(); + const linkChunks: LinkChunk[] = [{ name: "Hi", link: "https://dunemask.net" }]; + + return ( + + + + {linkChunks.map((lc, i) => ( + + + {lc.name} + + + ))} + + + + ); +} diff --git a/src/components/MainMenu.tsx b/src/components/MainMenu.tsx new file mode 100644 index 0000000..998a99f --- /dev/null +++ b/src/components/MainMenu.tsx @@ -0,0 +1,102 @@ +import { useState } from "react"; +import { Link } from "react-router-dom"; +import { Box, Flex, IconButton, Text, List, ListItem, ListIcon, Tooltip, Divider, Icon, Slide } from "@chakra-ui/react"; +import { Links } from "../util/links"; +import { GuardedContent } from "../util/guards"; +import { MdSettings, MdMenu, MdLogout, MdLock } from "react-icons/md"; +import AppGuard from "@lib/Guards"; +import { useAuth } from "@src/ctx/AuthContext"; +import { Policy } from "@lib/Policies"; + +const layouts = [ + { + name: "Settings", + link: Links.Settings, + icon: MdSettings, + guards: [...AppGuard.IAMAuthenticated], + }, +]; + +export const drawerWidth = "230px"; +export const miniDrawerWidth = "5rem"; + +export function useMainMenu(defaultState: boolean = false): [boolean, () => void, string] { + const [minified, setMinified] = useState(defaultState); + const toggleMinified = () => setMinified(!minified); + const width = minified ? miniDrawerWidth : drawerWidth; + return [minified, toggleMinified, width]; +} + +export default function MainMenu(props: { minified: boolean; toggleMinified: () => void; width: string }) { + const { logout, activePolicies, auth } = useAuth(); + const menus = layouts.filter(({ guards: g }) => g.length === 0 || Policy.multiAuthorizedTo(activePolicies, g)); + const menuButtonSx = { height: "3rem", _hover: { bg: "rgba(0,0,0,.1)" }, w: "100%" }; + + const slideMotion = { animate: { width: props.width }, initial: { width: props.width } }; + + return ( + + + + + + } + onClick={props.toggleMinified} + aria-label="Toggle menu" + w="48px" + h="100%" + p="0" + /> + + + Cairo + + + + + + + {menus.map((menuItem, index) => ( + + + + + + {menuItem.name} + + + + + ))} + + + + + + Logout + + + + + + + + + + Login + + + + + + + + + + ); +} diff --git a/src/components/common/Fallback.tsx b/src/components/common/Fallback.tsx new file mode 100644 index 0000000..0c882fd --- /dev/null +++ b/src/components/common/Fallback.tsx @@ -0,0 +1,13 @@ +import { Flex, FlexProps, TextProps, Text } from "@chakra-ui/react"; +import React from "react"; + +export function CenteredErrorFallback(props: { TextProps?: TextProps; FlexProps?: FlexProps }) { + return ( + + + Oops! Looks like something broke! +
Please try again later! +
+
+ ); +} diff --git a/src/components/common/Inputs.tsx b/src/components/common/Inputs.tsx new file mode 100644 index 0000000..9734997 --- /dev/null +++ b/src/components/common/Inputs.tsx @@ -0,0 +1,34 @@ +import { Icon, IconButton, IconButtonProps, Input, InputGroup, InputProps, InputRightElement } from "@chakra-ui/react"; +import { SyntheticEvent, useEffect, useState } from "react"; +import { FaEye, FaEyeSlash } from "react-icons/fa"; + +interface PasswordInputProps extends InputProps { + value: string; + setPassword: (password: string) => void; + InputProps?: InputProps; + IconButtonProps?: IconButtonProps; +} + +export function PasswordInput(props: PasswordInputProps) { + const { setPassword, value } = props; + const [visible, setVisible] = useState(); + const toggleVisible = () => setVisible(!visible); + + const inputType = visible ? "text" : "password"; + const inputIcon = visible ? FaEyeSlash : FaEye; + const passwordChange = (e: SyntheticEvent) => setPassword((e.target as HTMLInputElement).value); + const iconButtonProps: IconButtonProps = { ...props.IconButtonProps, "aria-label": "Show Password" }; + + const combinedInputProps: InputProps = { ...props.InputProps, value, onChange: passwordChange }; + + return ( + + + + + + + + + ); +} diff --git a/src/components/common/Loading.tsx b/src/components/common/Loading.tsx new file mode 100644 index 0000000..1bf0eeb --- /dev/null +++ b/src/components/common/Loading.tsx @@ -0,0 +1,12 @@ +import { Flex, FlexProps, Spinner, SpinnerProps } from "@chakra-ui/react"; +export function LoadingSpinner(props: SpinnerProps) { + return ; +} + +export function CenteredLoadingSpinner(props: { SpinnerProps?: SpinnerProps; FlexProps?: FlexProps }) { + return ( + + + + ); +} diff --git a/src/ctx/AuthContext.tsx b/src/ctx/AuthContext.tsx new file mode 100644 index 0000000..b867f9a --- /dev/null +++ b/src/ctx/AuthContext.tsx @@ -0,0 +1,220 @@ +import { ReactNode, createContext, useContext, useMemo, useReducer } from "react"; +import { apiRequest } from "@dunemask/vix/bridge"; +import { Policy, PolicyString } from "@lib/Policies"; +import { Resource } from "@lib/vix/AppResources"; +import { CDatabaseContract } from "@lib/contracts/database.contracts"; + +const project = import.meta.env.VITE_CAIRO_PROJECT as string; +const credentialApiPath = `/${project}/auth/credentials`; + +export enum AuthStorageKeys { + USER = "user", + USER_TOKEN = "user-token", + SPOOF_USER = "spoof-user", + SPOOF_TOKEN = "spoof-token", +} + +export interface CredentialDTO { + user: CDatabaseContract["User"]; + policies: PolicyString[]; +} + +export interface LoginCredentialDTO extends CredentialDTO { + token: string; +} + +type LoginAction = { type: AuthAction.LOGIN; token: string; user: any; policies: Policy[] }; +type LogoutAction = { type: AuthAction.LOGOUT }; +type SpoofAction = { type: AuthAction.SPOOF; token: string; user: any; policies: Policy[] }; +type UnspoofAction = { type: AuthAction.UNSPOOF }; +type LoadingAction = { type: AuthAction.LOADING; loading: boolean }; +type InitializeAction = { type: AuthAction.INTIALIZE; initialized: boolean }; +type Action = LoginAction | LogoutAction | SpoofAction | UnspoofAction | LoadingAction | InitializeAction; + +enum AuthAction { + LOGIN, + LOGOUT, + SPOOF, + UNSPOOF, + LOADING, + INTIALIZE, +} + +interface AuthState { + user?: CDatabaseContract["User"]; + auth: boolean; + token?: string; + userPolicies: Policy[]; + spoofUser?: CDatabaseContract["User"]; + spoofToken?: string; + spoofPolicies: Policy[]; + activeUser?: CDatabaseContract["User"]; + activeToken?: string; + activePolicies: Policy[]; + loading: boolean; + initialized: false; +} + +interface AuthContextType extends AuthState { + logout: () => void; + login: (userData: CDatabaseContract["User"], token: string, policies?: Policy[]) => Promise; + spoof: (userData: CDatabaseContract["User"], token: string, policies?: Policy[]) => Promise; + unspoof: () => void; + authInit: () => Promise; +} + +const initialState: AuthContextType = { + auth: false, + userPolicies: [], + spoofPolicies: [], + activePolicies: [], + logout: () => {}, + login: async () => {}, + spoof: async () => {}, + unspoof: () => {}, + authInit: async () => {}, + loading: false, + initialized: false, +}; + +const AuthContext = createContext(initialState); + +export const useAuth = () => useContext(AuthContext); + +function onLogout(state: AuthState): AuthState { + window.localStorage.removeItem(AuthStorageKeys.USER); + window.localStorage.removeItem(AuthStorageKeys.USER_TOKEN); + window.localStorage.removeItem(AuthStorageKeys.SPOOF_USER); + window.localStorage.removeItem(AuthStorageKeys.SPOOF_TOKEN); + return { + ...state, + auth: false, + token: undefined, + spoofToken: undefined, + user: undefined, + spoofUser: undefined, + activeUser: undefined, + activeToken: undefined, + activePolicies: [], + }; +} + +function onLogin(state: AuthState, action: LoginAction): AuthState { + const { token, user, policies: userPolicies } = action; + window.localStorage.setItem(AuthStorageKeys.USER, JSON.stringify(user)); + window.localStorage.setItem(AuthStorageKeys.USER_TOKEN, token); + const [activeToken, activeUser, activePolicies] = [token, user, userPolicies]; + return { ...state, auth: true, token, user, activeToken, activeUser, activePolicies, userPolicies }; +} + +function onSpoof(state: AuthState, action: SpoofAction): AuthState { + const { token: spoofToken, user: spoofUser, policies: spoofPolicies } = action; + window.localStorage.setItem(AuthStorageKeys.SPOOF_USER, JSON.stringify(spoofUser)); + window.localStorage.setItem(AuthStorageKeys.SPOOF_TOKEN, spoofToken); + const [activeToken, activeUser, activePolicies] = [spoofToken, spoofUser, spoofPolicies]; + return { ...state, auth: true, spoofToken, spoofUser, activeToken, activeUser, activePolicies, spoofPolicies }; +} + +function onUnspoof(state: AuthState): AuthState { + const { token, user } = state; + window.localStorage.removeItem(AuthStorageKeys.SPOOF_USER); + window.localStorage.removeItem(AuthStorageKeys.SPOOF_TOKEN); + const [activeToken, activeUser, activePolicies] = [token, user, state.userPolicies]; + return { + ...state, + auth: true, + spoofToken: undefined, + spoofUser: undefined, + activeToken, + activeUser, + spoofPolicies: [], + activePolicies, + }; +} + +const onLoading = (state: AuthState, action: LoadingAction) => ({ ...state, loading: action.loading }) as AuthState; + +const onInitialized = (state: AuthState, action: InitializeAction) => + ({ ...state, initialized: action.initialized }) as AuthState; + +function authReducer(state: AuthState, action: Action): AuthState { + if (action.type === AuthAction.LOGIN) return onLogin(state, action); + if (action.type === AuthAction.SPOOF) return onSpoof(state, action); + if (action.type === AuthAction.LOGOUT) return onLogout(state); + if (action.type === AuthAction.UNSPOOF) return onUnspoof(state); + if (action.type === AuthAction.LOADING) return onLoading(state, action); + if (action.type === AuthAction.INTIALIZE) return onInitialized(state, action); + return state; +} + +export async function getPolicies(token: string): Promise { + const extraHeaders = { Authorization: `Bearer ${token}` }; + const credentials = await apiRequest({ subpath: credentialApiPath, jsonify: true, extraHeaders }); + if (!credentials) return []; + const { policies } = credentials as CredentialDTO; + return Policy.parseResourcePolicies(policies); +} + +export const AuthProvider = ({ children }: { children: ReactNode }) => { + const [state, dispatch] = useReducer(authReducer, initialState); + + async function login(userData: CDatabaseContract["User"], token: string, policies?: Policy[]) { + dispatch({ type: AuthAction.LOADING, loading: true }); + const userPolicies = !!policies ? policies : await getPolicies(token); + dispatch({ type: AuthAction.LOGIN, policies: userPolicies, user: userData, token }); + dispatch({ type: AuthAction.LOADING, loading: false }); + } + + async function spoof(userData: CDatabaseContract["User"], token: string, policies?: Policy[]) { + dispatch({ type: AuthAction.LOADING, loading: true }); + const userPolicies = !!policies ? policies : await getPolicies(token); + dispatch({ type: AuthAction.SPOOF, policies: userPolicies, user: userData, token }); + dispatch({ type: AuthAction.LOADING, loading: false }); + } + + const logout = () => dispatch({ type: AuthAction.LOGOUT }); + const unspoof = () => dispatch({ type: AuthAction.UNSPOOF }); + + const credFail = (handler: () => void) => () => (handler(), [undefined, undefined]); + + async function fetchCredentials(token: string): Promise<[user: CDatabaseContract["User"], rp: Policy[]]> { + const extraHeaders = getAuthHeader(token); + const credentials = await apiRequest({ subpath: credentialApiPath, jsonify: true, extraHeaders }); + if (!credentials) throw Error("Could not authenticate!"); + const { user, policies } = credentials as CredentialDTO; + if (!user || !policies) throw Error("Could not authenticate!"); + const rp = Policy.parseResourcePolicies(policies); + return [user as CDatabaseContract["User"], rp as Policy[]]; + } + + async function authInit() { + const userToken = getUserToken(); + const spoofToken = getSpoofToken(); + const [[user, userPolicies], [spoofUser, spoofPolicies]] = await Promise.all([ + !!userToken ? fetchCredentials(userToken).catch(credFail(logout)) : [], + !!spoofToken ? fetchCredentials(spoofToken).catch(credFail(unspoof)) : [], + ]); + + if (!!user && !!userToken) await login(user, userToken, userPolicies); + if (!!spoofUser && !!spoofToken) await spoof(spoofUser, spoofToken, spoofPolicies); + dispatch({ type: AuthAction.INTIALIZE, initialized: true }); + } + + const context: AuthContextType = { + ...state, + logout, + login, + spoof, + unspoof, + authInit, + }; + + const contextValue = useMemo(() => context, [state, dispatch]); + + return {children}; +}; + +export const getUserToken = () => window.localStorage.getItem(AuthStorageKeys.USER_TOKEN) ?? undefined; +export const getSpoofToken = () => window.localStorage.getItem(AuthStorageKeys.SPOOF_TOKEN) ?? undefined; +export const getActiveUserToken = () => getSpoofToken() ?? getUserToken() ?? undefined; +export const getAuthHeader = (token?: string) => (!!token ? { Authorization: `Bearer ${token}` } : undefined); diff --git a/src/hooks/init-hooks.ts b/src/hooks/init-hooks.ts new file mode 100644 index 0000000..de55182 --- /dev/null +++ b/src/hooks/init-hooks.ts @@ -0,0 +1,9 @@ +import { useAuth } from "@src/ctx/AuthContext"; +import { useEffect } from "react"; + +export default function useInitHooks() { + const { authInit } = useAuth(); + useEffect(function initHooks() { + authInit(); + }, []); +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..d5db142 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,8 @@ +import { createRoot } from "react-dom/client"; +import App from "./App"; + +const appRoot = document.getElementById("root"); +if (!appRoot) throw Error("Root not found!"); +const root = createRoot(appRoot); + +root.render(); diff --git a/src/util/api/GeneratedRequests.ts b/src/util/api/GeneratedRequests.ts new file mode 100644 index 0000000..e080a77 --- /dev/null +++ b/src/util/api/GeneratedRequests.ts @@ -0,0 +1,22 @@ +/* ----- Vix Auto Generated Routes ----- */ +import { CAuthContract, CProjectContract } from "@vix/ContractTypes"; +import { apiRequest } from "@dunemask/vix/bridge"; +import { authenticatedApiRequest } from "./requests"; + +export const getProjectAuthVerify = (project: string) => + authenticatedApiRequest({ subpath: `/${project}/auth/verify`, method: "GET", jsonify: true }); + +export const postProjectAuthLogin = (project: string, login: CAuthContract["Login"]) => + apiRequest({ + subpath: `/${project}/auth/login`, + method: "POST", + json: login, + jsonify: true, + }); + +export const getProjectAuthCredentials = (project: string) => + authenticatedApiRequest({ + subpath: `/${project}/auth/credentials`, + method: "GET", + jsonify: true, + }); diff --git a/src/util/api/requests.ts b/src/util/api/requests.ts new file mode 100644 index 0000000..02ecff2 --- /dev/null +++ b/src/util/api/requests.ts @@ -0,0 +1,9 @@ +import { apiRequest, ApiRequestArgs } from "@dunemask/vix/bridge"; +import { getAuthHeader } from "@src/ctx/AuthContext"; + +export async function authenticatedApiRequest(apiRequestArgs: ApiRequestArgs): Promise { + const extraHeaders = apiRequestArgs.extraHeaders ?? {}; + const authHeaders = getAuthHeader(); + apiRequestArgs.extraHeaders = { ...extraHeaders, ...authHeaders }; + return apiRequest(apiRequestArgs); +} diff --git a/src/util/guards.ts b/src/util/guards.ts new file mode 100644 index 0000000..d51d1bb --- /dev/null +++ b/src/util/guards.ts @@ -0,0 +1,39 @@ +import { Policy } from "@lib/Policies"; +import { useAuth } from "@src/ctx/AuthContext"; +import { ReactNode } from "react"; + +export enum GUARD_TARGETS { + ACTIVE = "active", + SPOOF = "spoof", + USER = "user", +} + +interface GuardedContentProps { + guard: Policy[] | boolean; + children: ReactNode | ReactNode[]; + target?: GUARD_TARGETS; +} + +export function useGuardTarget(target = GUARD_TARGETS.ACTIVE) { + const { activePolicies, userPolicies, spoofPolicies } = useAuth(); + const policyMapping = { + [GUARD_TARGETS.ACTIVE]: activePolicies, + [GUARD_TARGETS.SPOOF]: spoofPolicies, + [GUARD_TARGETS.USER]: userPolicies, + }; + return policyMapping[target]; +} + +export default function useContentGuard(required: Policy[], target = GUARD_TARGETS.ACTIVE) { + const policies = useGuardTarget(target); + return Policy.multiAuthorizedTo(policies, required); +} + +export function GuardedContent(props: GuardedContentProps) { + const guardTarget = props.target ?? GUARD_TARGETS.ACTIVE; + const policies = useGuardTarget(guardTarget); + if (props.guard === false) return undefined; + if (props.guard === true) return props.children; + if (Policy.multiAuthorizedTo(policies, props.guard)) return props.children; + return undefined; +} diff --git a/src/util/links.ts b/src/util/links.ts new file mode 100644 index 0000000..c7f83fb --- /dev/null +++ b/src/util/links.ts @@ -0,0 +1,26 @@ +import { useNavigate } from "react-router-dom"; + +export enum StaticLinks { + Authenticate = "/authenticate", + AutoRedirect = "/auto-redirect", + ProjectView = "/projects", + Settings = "/settings", + Authorized = "/authorized", +} + +export enum DynamicLinks {} + +type LinkEnums> = T[keyof T]; +export const Links = { ...StaticLinks, ...DynamicLinks }; +export type Links = LinkEnums; +export const rootLink = (l: Links) => import.meta.env.BASE_URL + l.substring(1); +export function useLinkNav() { + const nav = useNavigate(); + const linkNav = (l: Links) => nav(rootLink(l)); + return linkNav; +} + +export function useAutoRedirect() { + const nav = useLinkNav(); + return () => nav(Links.AutoRedirect); +} diff --git a/src/util/theme.ts b/src/util/theme.ts new file mode 100644 index 0000000..f2b4598 --- /dev/null +++ b/src/util/theme.ts @@ -0,0 +1,86 @@ +import { extendTheme, ThemeConfig } from "@chakra-ui/react"; + +const themeConfig: ThemeConfig = { + initialColorMode: "dark", + useSystemColorMode: false, +}; + +const theme = extendTheme({ + config: themeConfig, + colors: { + primary: { + "50": "#fef7e8", + "100": "#fadda3", + "200": "#f5bc4c", + "300": "#d99a1d", + "400": "#c28a1a", + "500": "#f3ac20", + "600": "#8a6212", + "700": "#6f4f0f", + "800": "#5e420c", + "900": "#443009", + }, + secondary: "#ffbc03", + background: { + default: "#101010", + paper: "#222222", + }, + }, + fonts: { + heading: "Inter, sans-serif", + body: "Inter, sans-serif", + }, + fontSizes: { + "4xl": "4rem", + "3xl": "3rem", + "2xl": "2rem", + xl: "1.5rem", + lg: "1.2rem", + md: "1rem", + }, + components: { + Modal: { + baseStyle: { + dialog: { + borderRadius: "18px", + }, + closeButton: { + borderRadius: "full", + bg: "primary", + _hover: { + bg: "secondary", + }, + }, + }, + }, + Button: { + baseStyle: { + textTransform: "none", + fontWeight: "bold", + }, + sizes: { + md: { + borderRadius: "8px", + }, + }, + variants: { + solid: (props: { colorMode: string }) => ({ + bg: props.colorMode === "dark" ? "primary" : "secondary", + color: "white", + _hover: { + bg: props.colorMode === "dark" ? "secondary" : "primary", + }, + }), + }, + }, + }, + styles: { + global: (props: { colorMode: string }) => ({ + body: { + bg: props.colorMode === "dark" ? "#1c1c1c" : "#eee", // Adjust based on colorMode + }, + }), + }, +}); + +export default theme; diff --git a/src/views/AuthenticateView.tsx b/src/views/AuthenticateView.tsx new file mode 100644 index 0000000..36c9046 --- /dev/null +++ b/src/views/AuthenticateView.tsx @@ -0,0 +1,92 @@ +import { Box, Button, Heading, Input, Stack, Image, Text } from "@chakra-ui/react"; +import { Policy } from "@lib/Policies"; +import { Resource } from "@lib/vix/AppResources"; +import { SyntheticEvent, useState } from "react"; +import { toast } from "react-toastify"; +import { useAuth } from "@src/ctx/AuthContext"; +import { useAutoRedirect } from "@src/util/links"; +import { ClientError } from "@dunemask/vix/bridge"; +import { AuthErrors } from "@lib/vix/ClientErrors"; +import { PasswordInput } from "@src/components/common/Inputs"; +import { ResourcePolicyType } from "@dunemask/vix/util"; +import { postProjectAuthLogin } from "@src/util/api/GeneratedRequests"; + +const project = import.meta.env.VITE_CAIRO_PROJECT as string; + +export default function AuthenticateView() { + const { auth, login } = useAuth(); + const autoRedirect = useAutoRedirect(); + const [identity, setIdentity] = useState(""); + const [password, setPassword] = useState(""); + const identityChange = (e: SyntheticEvent) => setIdentity((e.target as HTMLInputElement).value); + + function submitCredentials() { + const loginPromise = postProjectAuthLogin(project, { identity: identity, password }).then(async (creds) => { + if (!creds.token) return toast.error("Server didn't provide token!"); + await login( + creds.user, + creds.token, + Policy.parseResourcePolicies(creds.policies as ResourcePolicyType[]), + ); + autoRedirect(); + }); + toast.promise(loginPromise, { + pending: "Logging in", + success: "Logged in successfully!", + error: { + render({ data }) { + const clientError = data as ClientError; + if (clientError.isError(AuthErrors.UnauthorizedRequest)) return "Incorrect credentials!"; + console.error(data); + return "Error logging in!"; + }, + }, + }); + setPassword(""); + } + + function detectEnter(e: KeyboardEvent) { + if (e.key === "Enter") submitCredentials(); + } + if (auth) return; + return ( + + + + + + Sign in + Logo + + + Please enter your credentials below + + + + + + + + + + + + + ); +} diff --git a/src/views/AuthorizedView.tsx b/src/views/AuthorizedView.tsx new file mode 100644 index 0000000..a0dfe15 --- /dev/null +++ b/src/views/AuthorizedView.tsx @@ -0,0 +1,11 @@ +import { Flex, Text, Center } from "@chakra-ui/react"; + +export default function AuthorizedView() { + return ( + +

+ Your account is authorized! +
+ + ); +} diff --git a/src/views/AutoRedirect.tsx b/src/views/AutoRedirect.tsx new file mode 100644 index 0000000..30083a6 --- /dev/null +++ b/src/views/AutoRedirect.tsx @@ -0,0 +1,35 @@ +import { Center, Flex, Spinner, Text } from "@chakra-ui/react"; +import AppGuard from "@lib/Guards"; +import { useAuth } from "@src/ctx/AuthContext"; +import useContentGuard, { GuardedContent } from "@src/util/guards"; +import { Links, rootLink } from "@src/util/links"; +import { useEffect, useState } from "react"; +import { Navigate } from "react-router-dom"; + +export default function AutoRedirect() { + const manageProjects = useContentGuard(AppGuard.ManageProjects); + const { auth, initialized, loading } = useAuth(); + if (!initialized || loading) return ; + if (!auth) return ; + if (manageProjects) return ; + return ; +} + +export function RedirectLoader() { + const [visible, setVisible] = useState(false); + useEffect(() => { + setTimeout(() => setVisible(true), 1500); + }, []); + return ( +
+ + + + + Loading + + + +
+ ); +} diff --git a/src/views/ProjectView.tsx b/src/views/ProjectView.tsx new file mode 100644 index 0000000..1d2a608 --- /dev/null +++ b/src/views/ProjectView.tsx @@ -0,0 +1,11 @@ +import { Flex, Text, Center } from "@chakra-ui/react"; + +export default function ProjectView() { + return ( + +
+ Project Management +
+
+ ); +} diff --git a/templates/NOTES.txt b/templates/NOTES.txt new file mode 100644 index 0000000..849018d --- /dev/null +++ b/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "cairo.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "cairo.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "cairo.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "cairo.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/templates/_helpers.tpl b/templates/_helpers.tpl new file mode 100644 index 0000000..b53ed1f --- /dev/null +++ b/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "cairo.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cairo.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "cairo.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "cairo.labels" -}} +helm.sh/chart: {{ include "cairo.chart" . }} +{{ include "cairo.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "cairo.selectorLabels" -}} +app.kubernetes.io/name: {{ include "cairo.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "cairo.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "cairo.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/templates/deployment.yaml b/templates/deployment.yaml new file mode 100644 index 0000000..40e37ff --- /dev/null +++ b/templates/deployment.yaml @@ -0,0 +1,74 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "cairo.fullname" . }} + labels: + {{- include "cairo.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "cairo.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "cairo.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "cairo.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + env: + {{- toYaml .Values.containerEnv | nindent 12 }} + {{- with .Values.dataClaim }} + volumeMounts: + - name: cairo-data + mountPath: /dunemask/net/cairo/data + {{- end}} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.containerPort | default 52000 }} + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: http + readinessProbe: + httpGet: + path: /healthz + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumes: + {{- with .Values.dataClaim }} + - name: cairo-data + persistentVolumeClaim: + claimName: {{ . }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/templates/hpa.yaml b/templates/hpa.yaml new file mode 100644 index 0000000..8980984 --- /dev/null +++ b/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "cairo.fullname" . }} + labels: + {{- include "cairo.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "cairo.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/templates/ingress.yaml b/templates/ingress.yaml new file mode 100644 index 0000000..b920af9 --- /dev/null +++ b/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "cairo.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "cairo.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/templates/service.yaml b/templates/service.yaml new file mode 100644 index 0000000..7829a9e --- /dev/null +++ b/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "cairo.fullname" . }} + labels: + {{- include "cairo.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "cairo.selectorLabels" . | nindent 4 }} diff --git a/templates/serviceaccount.yaml b/templates/serviceaccount.yaml new file mode 100644 index 0000000..009e117 --- /dev/null +++ b/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "cairo.serviceAccountName" . }} + labels: + {{- include "cairo.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/templates/tests/test-connection.yaml b/templates/tests/test-connection.yaml new file mode 100644 index 0000000..5740ecd --- /dev/null +++ b/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "cairo.fullname" . }}-test-connection" + labels: + {{- include "cairo.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "cairo.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8503167 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "strict": true, + "module": "ESNext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "target": "ESNext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + /* Vite Compile Options */ + "allowImportingTsExtensions": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "types": ["vite/client"], + "paths": { + "@lib/enums/*": ["./lib/types/enums/*"], + "@lib/Guards": ["./lib/vix/AppGuards.ts"], + "@lib/Policies": ["./lib/vix/AppPolicies.ts"], + "@lib/Cairo": ["./lib/Cairo.ts"], + "@lib/config": ["./lib/config.ts"], + "@lib/contracts/*": ["./lib/types/contracts/*"], + "@lib/svc/*": ["./lib/services/*"], + "@src/ctx/*": ["./src/ctx/*"], + "@src/hooks/*": ["./src/hooks/*"], + "@src/views/*": ["./src/views/*"], + "@src/components/*": ["./src/components/*"], + "@lib/types/*": ["./lib/types/*"], + "@src/*": ["./src/*"], + "@lib/*": ["./lib/*"], + "@vix/ContractTypes": ["./lib/types/ContractTypes.ts"] + } + }, + "tsc-alias": { + "resolveFullPaths": true, + "verbose": false + } +} diff --git a/tsconfig.server.json b/tsconfig.server.json new file mode 100644 index 0000000..ef0b379 --- /dev/null +++ b/tsconfig.server.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "allowJs": true, + "esModuleInterop": true, + "allowImportingTsExtensions": false, + "isolatedModules": true, + "noEmit": false, + "resolveJsonModule": true, + "outDir": "./build/server", + "strict": true, + "strictPropertyInitialization": false + }, + "include": ["./lib", "./lib/**/*.ts"], + "exclude": ["src", "node_modules"] +} diff --git a/values.yaml b/values.yaml new file mode 100644 index 0000000..42ed126 --- /dev/null +++ b/values.yaml @@ -0,0 +1,86 @@ +# Default values for cairo. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: registry.dunemask.dev/cairo + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +containerEnv: [] +containerPort: +dataClaim: + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: cairo.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..b0dcb10 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,31 @@ +import config from "./lib/config"; +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; +import react from "@vitejs/plugin-react"; + +const { CAIRO_VITE_BACKEND_URL, CAIRO_VITE_DEV_PORT } = process.env; +const backendUrl = CAIRO_VITE_BACKEND_URL ?? "http://localhost:52000"; +const vitePort = Number(CAIRO_VITE_DEV_PORT) ?? 52025; +export default () => { + return defineConfig({ + plugins: [react(), tsconfigPaths()], + server: { + host: "0.0.0.0", + port: vitePort, + proxy: { + "/api": backendUrl, + "/healthz": backendUrl, + }, + hmr: { + protocol: process.env.CAIRO_VITE_DEV_PROTOCOL, + }, + }, + build: { + outDir: "./build/vite", + }, + base: config.Server.basePath, + define: { + "import.meta.env.VITE_CAIRO_PROJECT": JSON.stringify(config.Server.projectSlug), + }, + }); +};