From 451a1adadc2484b904b01f6c9a156bca6e9add49 Mon Sep 17 00:00:00 2001 From: sei-dupdyke Date: Sat, 24 Aug 2024 13:57:01 -0400 Subject: [PATCH 1/5] 8.2.0.0 --- src/Ghosts.Client/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ghosts.Client/Properties/AssemblyInfo.cs b/src/Ghosts.Client/Properties/AssemblyInfo.cs index 66c60472..8381231e 100755 --- a/src/Ghosts.Client/Properties/AssemblyInfo.cs +++ b/src/Ghosts.Client/Properties/AssemblyInfo.cs @@ -34,4 +34,4 @@ // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("8.0.0.0")] [assembly: AssemblyInformationalVersion("8.0.0.0")] -[assembly: AssemblyFileVersion("8.1.1.0")] +[assembly: AssemblyFileVersion("8.2.0.0")] From 661ec7b33269a24235fc85e021278ee98b1697db Mon Sep 17 00:00:00 2001 From: Dustin Updyke Date: Mon, 26 Aug 2024 10:55:41 -0400 Subject: [PATCH 2/5] 8.2 updates - moving projects into main, documentation, etc. --- docs/assets/screens/ui/machine-groups.png | Bin 0 -> 59613 bytes docs/assets/screens/ui/machines.png | Bin 0 -> 55165 bytes docs/assets/screens/ui/npcs.png | Bin 0 -> 123237 bytes docs/assets/screens/ui/timelines.png | Bin 0 -> 54456 bytes docs/core/lite.md | 36 + docs/core/ui.md | 100 + docs/new.md | 25 +- docs/shadows/index.md | 67 + mkdocs.yml | 5 + src/Ghosts.Api/docker-compose.yml | 9 + src/Ghosts.Client.Lite/README.md | 34 +- src/ghosts.shadows/.dockerignore | 14 + .../.github/workflows/docker.yml | 31 + src/ghosts.shadows/.gitignore | 164 + src/ghosts.shadows/Dockerfile | 34 + src/ghosts.shadows/README.md | 76 + .../content-models/activity/Modelfile | 11 + .../content-models/chat/Modelfile | 22 + .../content-models/excel_content/Modelfile | 9 + .../content-models/img_content/Modelfile | 26 + .../content-models/lessons/Modelfile | 10 + src/ghosts.shadows/content-models/readme.md | 31 + .../content-models/social/Modelfile | 8 + .../content-models/web_content/Modelfile | 26 + .../scripts/convert-pdf-to-txt.py | 23 + src/ghosts.shadows/scripts/horde.py | 98 + src/ghosts.shadows/scripts/horde_users.csv | 101 + src/ghosts.shadows/scripts/scandals.txt | 20 + src/ghosts.shadows/src/.python-version | 1 + src/ghosts.shadows/src/api.py | 231 + .../src/assets/ghosts-shadows.png | Bin 0 -> 187904 bytes src/ghosts.shadows/src/auth.py | 185 + src/ghosts.shadows/src/flagged/log.csv | 2 + .../src/handlers/activities_handler.py | 174 + .../src/handlers/content_handler.py | 165 + src/ghosts.shadows/src/handlers/filters.py | 38 + .../src/handlers/img_handler.py | 10 + .../src/handlers/lessons_handler.py | 154 + src/ghosts.shadows/src/readme.md | 2 + src/ghosts.shadows/src/requirements.txt | 18 + src/ghosts.shadows/src/templates/index.html | 22 + src/ghosts.shadows/src/test.db | Bin 0 -> 16384 bytes src/ghosts.shadows/src/ui.py | 103 + src/ghosts.shadows/supervisord.conf | 29 + src/ghosts.ui/.dockerignore | 3 + src/ghosts.ui/.eslintrc.json | 3 + src/ghosts.ui/.gitignore | 45 + src/ghosts.ui/Dockerfile | 67 + src/ghosts.ui/README.md | 44 + src/ghosts.ui/biome.json | 24 + src/ghosts.ui/components.json | 17 + src/ghosts.ui/docker-compose.yml | 69 + src/ghosts.ui/drizzle.config.ts | 10 + src/ghosts.ui/next-env.d.ts | 5 + src/ghosts.ui/next.config.mjs | 7 + src/ghosts.ui/package-lock.json | 9291 +++++++++++++++++ src/ghosts.ui/package.json | 65 + src/ghosts.ui/postcss.config.mjs | 8 + src/ghosts.ui/public/logo.png | Bin 0 -> 7872 bytes src/ghosts.ui/src/app/global-error.tsx | 37 + src/ghosts.ui/src/app/globals.css | 76 + src/ghosts.ui/src/app/layout.tsx | 44 + .../activity/[machineGroupId]/page.tsx | 29 + .../src/app/machine-groups/column-helpers.tsx | 156 + .../src/app/machine-groups/layout.tsx | 26 + .../machine-groups/machine-group-table.tsx | 52 + .../machine-groups/new/machine-group-form.tsx | 36 + .../src/app/machine-groups/new/page.tsx | 10 + src/ghosts.ui/src/app/machine-groups/page.tsx | 1 + .../run-timeline/[machineGroupId]/page.tsx | 23 + .../machines/activity/[machineId]/page.tsx | 30 + src/ghosts.ui/src/app/machines/layout.tsx | 26 + .../src/app/machines/machine-table.tsx | 69 + .../src/app/machines/new/machine-form.tsx | 33 + src/ghosts.ui/src/app/machines/new/page.tsx | 10 + src/ghosts.ui/src/app/machines/page.tsx | 1 + .../run-timeline/[machineId]/page.tsx | 20 + .../src/app/npcs/generate/npc-generator.tsx | 106 + src/ghosts.ui/src/app/npcs/generate/page.tsx | 10 + src/ghosts.ui/src/app/npcs/layout.tsx | 29 + .../src/app/npcs/manual/npc-form.tsx | 39 + src/ghosts.ui/src/app/npcs/manual/page.tsx | 10 + src/ghosts.ui/src/app/npcs/npc-table.tsx | 74 + src/ghosts.ui/src/app/npcs/page.tsx | 1 + src/ghosts.ui/src/app/page.tsx | 1 + src/ghosts.ui/src/app/timelines/action.ts | 40 + .../app/timelines/edit/[timelineId]/page.tsx | 24 + src/ghosts.ui/src/app/timelines/layout.tsx | 24 + src/ghosts.ui/src/app/timelines/new/page.tsx | 10 + src/ghosts.ui/src/app/timelines/page.tsx | 1 + .../app/timelines/timeline-form-events.tsx | 68 + .../app/timelines/timeline-form-handlers.tsx | 244 + .../src/app/timelines/timeline-form.tsx | 175 + .../src/app/timelines/timeline-table.tsx | 55 + .../src/components/activity-sheet.tsx | 157 + src/ghosts.ui/src/components/data-table.tsx | 212 + src/ghosts.ui/src/components/input.tsx | 124 + src/ghosts.ui/src/components/json-utils.tsx | 100 + .../src/components/sheet-wrapper.tsx | 40 + src/ghosts.ui/src/components/text.tsx | 6 + .../src/components/theme-provider.tsx | 7 + src/ghosts.ui/src/components/theme-toggle.tsx | 38 + .../src/components/timeline-runner.tsx | 183 + src/ghosts.ui/src/components/ui/accordion.tsx | 58 + .../components/ui/auto-form/common/label.tsx | 23 + .../ui/auto-form/common/tooltip.tsx | 13 + .../src/components/ui/auto-form/config.ts | 35 + .../components/ui/auto-form/dependencies.ts | 57 + .../components/ui/auto-form/fields/array.tsx | 108 + .../ui/auto-form/fields/checkbox.tsx | 31 + .../components/ui/auto-form/fields/date.tsx | 29 + .../components/ui/auto-form/fields/enum.tsx | 64 + .../components/ui/auto-form/fields/file.tsx | 62 + .../components/ui/auto-form/fields/input.tsx | 29 + .../components/ui/auto-form/fields/number.tsx | 26 + .../components/ui/auto-form/fields/object.tsx | 183 + .../ui/auto-form/fields/radio-group.tsx | 60 + .../components/ui/auto-form/fields/switch.tsx | 31 + .../ui/auto-form/fields/textarea.tsx | 25 + .../src/components/ui/auto-form/index.tsx | 108 + .../src/components/ui/auto-form/types.ts | 75 + .../src/components/ui/auto-form/utils.ts | 180 + src/ghosts.ui/src/components/ui/badge.tsx | 36 + src/ghosts.ui/src/components/ui/button.tsx | 56 + src/ghosts.ui/src/components/ui/calendar.tsx | 66 + src/ghosts.ui/src/components/ui/card.tsx | 86 + src/ghosts.ui/src/components/ui/checkbox.tsx | 30 + .../src/components/ui/date-picker.tsx | 46 + src/ghosts.ui/src/components/ui/dialog.tsx | 122 + src/ghosts.ui/src/components/ui/drawer.tsx | 118 + .../src/components/ui/dropdown-menu.tsx | 200 + src/ghosts.ui/src/components/ui/form.tsx | 177 + src/ghosts.ui/src/components/ui/input.tsx | 25 + src/ghosts.ui/src/components/ui/label.tsx | 26 + .../src/components/ui/pagination.tsx | 118 + src/ghosts.ui/src/components/ui/popover.tsx | 31 + .../src/components/ui/radio-group.tsx | 44 + src/ghosts.ui/src/components/ui/select.tsx | 160 + src/ghosts.ui/src/components/ui/separator.tsx | 31 + src/ghosts.ui/src/components/ui/sheet.tsx | 140 + src/ghosts.ui/src/components/ui/switch.tsx | 29 + src/ghosts.ui/src/components/ui/table.tsx | 117 + src/ghosts.ui/src/components/ui/tabs.tsx | 55 + src/ghosts.ui/src/components/ui/textarea.tsx | 24 + src/ghosts.ui/src/components/ui/toast.tsx | 129 + src/ghosts.ui/src/components/ui/toaster.tsx | 35 + src/ghosts.ui/src/components/ui/toggle.tsx | 45 + src/ghosts.ui/src/components/ui/tooltip.tsx | 30 + src/ghosts.ui/src/components/ui/use-toast.ts | 194 + src/ghosts.ui/src/generated/endpoints.ts | 1889 ++++ src/ghosts.ui/src/generated/swagger.json | 4793 +++++++++ src/ghosts.ui/src/lib/db.ts | 21 + src/ghosts.ui/src/lib/server-utils.ts | 43 + src/ghosts.ui/src/lib/utils.tsx | 43 + src/ghosts.ui/src/lib/validation.ts | 89 + src/ghosts.ui/src/middleware.ts | 16 + src/ghosts.ui/tailwind.config.ts | 80 + src/ghosts.ui/tsconfig.json | 34 + .../Ghosts.tools.addmachines.generated.sln | 25 + .../ghosts.tools.addmachines}/Program.cs | 16 +- .../ghosts.tools.addmachines.csproj | 2 +- .../ghosts.tools.emailgenerator/App.config | 0 .../ghosts.tools.emailgenerator/Program.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../config/application.json | 0 .../ghosts.tools.emailgenerator.csproj | 0 .../packages.config | 0 .../ghosts.tools.loadtestercore/Program.cs | 0 .../ghosts.tools.loadtestercore.csproj | 0 .../ghosts.tools.loadtestercore.generated.sln | 25 + .../ghosts.tools.socialcontent/Readme.md | 0 .../animal_content.yml | 0 .../anime_content.yml | 0 .../astronomy_content.yml | 0 .../convert_all_images.py | 0 .../copy_all_images.py | 0 .../ghosts.tools.socialcontent/dall3_test.py | 0 .../gen_animal_topics.py | 0 .../gen_anime_topics.py | 0 .../gen_astronomy_topics.py | 0 .../gen_dalle3_images.py | 0 .../gen_dalle3_prompts.py | 0 .../gen_history_topics.py | 0 .../gen_movie_topics.py | 0 .../gen_music_topics.py | 0 .../ghosts.tools.socialcontent/gen_names.py | 0 .../gen_paranormal_topics.py | 0 .../gen_product_topics.py | 0 .../gen_science_topics.py | 0 .../gen_social_posts.py | 0 .../gen_sports_topics.py | 0 .../gen_stable_ai_images.py | 0 .../gen_stable_ai_prompts.py | 0 .../gen_topics_common.py | 0 .../gen_travel_topics.py | 0 .../history_content.yml | 0 .../movie_content.yml | 0 .../music_content.yml | 0 .../paranormal2_content.yml | 0 .../paranormal_content.yml | 0 .../product_content.yml | 0 .../science_content.yml | 0 .../sports_content.yml | 0 .../travel_content.yml | 0 204 files changed, 24650 insertions(+), 22 deletions(-) create mode 100644 docs/assets/screens/ui/machine-groups.png create mode 100644 docs/assets/screens/ui/machines.png create mode 100644 docs/assets/screens/ui/npcs.png create mode 100644 docs/assets/screens/ui/timelines.png create mode 100644 docs/core/lite.md create mode 100644 docs/core/ui.md create mode 100644 docs/shadows/index.md create mode 100644 src/ghosts.shadows/.dockerignore create mode 100644 src/ghosts.shadows/.github/workflows/docker.yml create mode 100644 src/ghosts.shadows/.gitignore create mode 100644 src/ghosts.shadows/Dockerfile create mode 100644 src/ghosts.shadows/README.md create mode 100644 src/ghosts.shadows/content-models/activity/Modelfile create mode 100644 src/ghosts.shadows/content-models/chat/Modelfile create mode 100644 src/ghosts.shadows/content-models/excel_content/Modelfile create mode 100644 src/ghosts.shadows/content-models/img_content/Modelfile create mode 100644 src/ghosts.shadows/content-models/lessons/Modelfile create mode 100644 src/ghosts.shadows/content-models/readme.md create mode 100644 src/ghosts.shadows/content-models/social/Modelfile create mode 100644 src/ghosts.shadows/content-models/web_content/Modelfile create mode 100644 src/ghosts.shadows/scripts/convert-pdf-to-txt.py create mode 100644 src/ghosts.shadows/scripts/horde.py create mode 100644 src/ghosts.shadows/scripts/horde_users.csv create mode 100644 src/ghosts.shadows/scripts/scandals.txt create mode 100644 src/ghosts.shadows/src/.python-version create mode 100644 src/ghosts.shadows/src/api.py create mode 100644 src/ghosts.shadows/src/assets/ghosts-shadows.png create mode 100644 src/ghosts.shadows/src/auth.py create mode 100644 src/ghosts.shadows/src/flagged/log.csv create mode 100644 src/ghosts.shadows/src/handlers/activities_handler.py create mode 100644 src/ghosts.shadows/src/handlers/content_handler.py create mode 100644 src/ghosts.shadows/src/handlers/filters.py create mode 100644 src/ghosts.shadows/src/handlers/img_handler.py create mode 100644 src/ghosts.shadows/src/handlers/lessons_handler.py create mode 100644 src/ghosts.shadows/src/readme.md create mode 100644 src/ghosts.shadows/src/requirements.txt create mode 100644 src/ghosts.shadows/src/templates/index.html create mode 100644 src/ghosts.shadows/src/test.db create mode 100644 src/ghosts.shadows/src/ui.py create mode 100644 src/ghosts.shadows/supervisord.conf create mode 100644 src/ghosts.ui/.dockerignore create mode 100644 src/ghosts.ui/.eslintrc.json create mode 100644 src/ghosts.ui/.gitignore create mode 100644 src/ghosts.ui/Dockerfile create mode 100644 src/ghosts.ui/README.md create mode 100644 src/ghosts.ui/biome.json create mode 100644 src/ghosts.ui/components.json create mode 100644 src/ghosts.ui/docker-compose.yml create mode 100644 src/ghosts.ui/drizzle.config.ts create mode 100644 src/ghosts.ui/next-env.d.ts create mode 100644 src/ghosts.ui/next.config.mjs create mode 100644 src/ghosts.ui/package-lock.json create mode 100644 src/ghosts.ui/package.json create mode 100644 src/ghosts.ui/postcss.config.mjs create mode 100644 src/ghosts.ui/public/logo.png create mode 100644 src/ghosts.ui/src/app/global-error.tsx create mode 100644 src/ghosts.ui/src/app/globals.css create mode 100644 src/ghosts.ui/src/app/layout.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/activity/[machineGroupId]/page.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/column-helpers.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/layout.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/machine-group-table.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/new/machine-group-form.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/new/page.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/page.tsx create mode 100644 src/ghosts.ui/src/app/machine-groups/run-timeline/[machineGroupId]/page.tsx create mode 100644 src/ghosts.ui/src/app/machines/activity/[machineId]/page.tsx create mode 100644 src/ghosts.ui/src/app/machines/layout.tsx create mode 100644 src/ghosts.ui/src/app/machines/machine-table.tsx create mode 100644 src/ghosts.ui/src/app/machines/new/machine-form.tsx create mode 100644 src/ghosts.ui/src/app/machines/new/page.tsx create mode 100644 src/ghosts.ui/src/app/machines/page.tsx create mode 100644 src/ghosts.ui/src/app/machines/run-timeline/[machineId]/page.tsx create mode 100644 src/ghosts.ui/src/app/npcs/generate/npc-generator.tsx create mode 100644 src/ghosts.ui/src/app/npcs/generate/page.tsx create mode 100644 src/ghosts.ui/src/app/npcs/layout.tsx create mode 100644 src/ghosts.ui/src/app/npcs/manual/npc-form.tsx create mode 100644 src/ghosts.ui/src/app/npcs/manual/page.tsx create mode 100644 src/ghosts.ui/src/app/npcs/npc-table.tsx create mode 100644 src/ghosts.ui/src/app/npcs/page.tsx create mode 100644 src/ghosts.ui/src/app/page.tsx create mode 100644 src/ghosts.ui/src/app/timelines/action.ts create mode 100644 src/ghosts.ui/src/app/timelines/edit/[timelineId]/page.tsx create mode 100644 src/ghosts.ui/src/app/timelines/layout.tsx create mode 100644 src/ghosts.ui/src/app/timelines/new/page.tsx create mode 100644 src/ghosts.ui/src/app/timelines/page.tsx create mode 100644 src/ghosts.ui/src/app/timelines/timeline-form-events.tsx create mode 100644 src/ghosts.ui/src/app/timelines/timeline-form-handlers.tsx create mode 100644 src/ghosts.ui/src/app/timelines/timeline-form.tsx create mode 100644 src/ghosts.ui/src/app/timelines/timeline-table.tsx create mode 100644 src/ghosts.ui/src/components/activity-sheet.tsx create mode 100644 src/ghosts.ui/src/components/data-table.tsx create mode 100644 src/ghosts.ui/src/components/input.tsx create mode 100644 src/ghosts.ui/src/components/json-utils.tsx create mode 100644 src/ghosts.ui/src/components/sheet-wrapper.tsx create mode 100644 src/ghosts.ui/src/components/text.tsx create mode 100644 src/ghosts.ui/src/components/theme-provider.tsx create mode 100644 src/ghosts.ui/src/components/theme-toggle.tsx create mode 100644 src/ghosts.ui/src/components/timeline-runner.tsx create mode 100644 src/ghosts.ui/src/components/ui/accordion.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/common/label.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/common/tooltip.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/config.ts create mode 100644 src/ghosts.ui/src/components/ui/auto-form/dependencies.ts create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/array.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/checkbox.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/date.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/enum.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/file.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/input.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/number.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/object.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/radio-group.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/switch.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/fields/textarea.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/index.tsx create mode 100644 src/ghosts.ui/src/components/ui/auto-form/types.ts create mode 100644 src/ghosts.ui/src/components/ui/auto-form/utils.ts create mode 100644 src/ghosts.ui/src/components/ui/badge.tsx create mode 100644 src/ghosts.ui/src/components/ui/button.tsx create mode 100644 src/ghosts.ui/src/components/ui/calendar.tsx create mode 100644 src/ghosts.ui/src/components/ui/card.tsx create mode 100644 src/ghosts.ui/src/components/ui/checkbox.tsx create mode 100644 src/ghosts.ui/src/components/ui/date-picker.tsx create mode 100644 src/ghosts.ui/src/components/ui/dialog.tsx create mode 100644 src/ghosts.ui/src/components/ui/drawer.tsx create mode 100644 src/ghosts.ui/src/components/ui/dropdown-menu.tsx create mode 100644 src/ghosts.ui/src/components/ui/form.tsx create mode 100644 src/ghosts.ui/src/components/ui/input.tsx create mode 100644 src/ghosts.ui/src/components/ui/label.tsx create mode 100644 src/ghosts.ui/src/components/ui/pagination.tsx create mode 100644 src/ghosts.ui/src/components/ui/popover.tsx create mode 100644 src/ghosts.ui/src/components/ui/radio-group.tsx create mode 100644 src/ghosts.ui/src/components/ui/select.tsx create mode 100644 src/ghosts.ui/src/components/ui/separator.tsx create mode 100644 src/ghosts.ui/src/components/ui/sheet.tsx create mode 100644 src/ghosts.ui/src/components/ui/switch.tsx create mode 100644 src/ghosts.ui/src/components/ui/table.tsx create mode 100644 src/ghosts.ui/src/components/ui/tabs.tsx create mode 100644 src/ghosts.ui/src/components/ui/textarea.tsx create mode 100644 src/ghosts.ui/src/components/ui/toast.tsx create mode 100644 src/ghosts.ui/src/components/ui/toaster.tsx create mode 100644 src/ghosts.ui/src/components/ui/toggle.tsx create mode 100644 src/ghosts.ui/src/components/ui/tooltip.tsx create mode 100644 src/ghosts.ui/src/components/ui/use-toast.ts create mode 100644 src/ghosts.ui/src/generated/endpoints.ts create mode 100644 src/ghosts.ui/src/generated/swagger.json create mode 100644 src/ghosts.ui/src/lib/db.ts create mode 100644 src/ghosts.ui/src/lib/server-utils.ts create mode 100644 src/ghosts.ui/src/lib/utils.tsx create mode 100644 src/ghosts.ui/src/lib/validation.ts create mode 100644 src/ghosts.ui/src/middleware.ts create mode 100644 src/ghosts.ui/tailwind.config.ts create mode 100644 src/ghosts.ui/tsconfig.json create mode 100644 src/tools/ghosts.tools.addmachines/Ghosts.tools.addmachines.generated.sln rename src/{Ghosts.tools.addmachines => tools/ghosts.tools.addmachines}/Program.cs (54%) rename src/{Ghosts.tools.addmachines => tools/ghosts.tools.addmachines}/ghosts.tools.addmachines.csproj (75%) rename src/{ => tools}/ghosts.tools.emailgenerator/App.config (100%) rename src/{ => tools}/ghosts.tools.emailgenerator/Program.cs (100%) rename src/{ => tools}/ghosts.tools.emailgenerator/Properties/AssemblyInfo.cs (100%) rename src/{ => tools}/ghosts.tools.emailgenerator/config/application.json (100%) rename src/{ => tools}/ghosts.tools.emailgenerator/ghosts.tools.emailgenerator.csproj (100%) rename src/{ => tools}/ghosts.tools.emailgenerator/packages.config (100%) rename src/{ => tools}/ghosts.tools.loadtestercore/Program.cs (100%) rename src/{ => tools}/ghosts.tools.loadtestercore/ghosts.tools.loadtestercore.csproj (100%) create mode 100644 src/tools/ghosts.tools.loadtestercore/ghosts.tools.loadtestercore.generated.sln rename src/{ => tools}/ghosts.tools.socialcontent/Readme.md (100%) rename src/{ => tools}/ghosts.tools.socialcontent/animal_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/anime_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/astronomy_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/convert_all_images.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/copy_all_images.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/dall3_test.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_animal_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_anime_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_astronomy_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_dalle3_images.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_dalle3_prompts.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_history_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_movie_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_music_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_names.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_paranormal_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_product_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_science_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_social_posts.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_sports_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_stable_ai_images.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_stable_ai_prompts.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_topics_common.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/gen_travel_topics.py (100%) rename src/{ => tools}/ghosts.tools.socialcontent/history_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/movie_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/music_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/paranormal2_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/paranormal_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/product_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/science_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/sports_content.yml (100%) rename src/{ => tools}/ghosts.tools.socialcontent/travel_content.yml (100%) diff --git a/docs/assets/screens/ui/machine-groups.png b/docs/assets/screens/ui/machine-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..30fb44a675528e7f18467a86baa11339347e1e4a GIT binary patch literal 59613 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screens/ui/machines.png b/docs/assets/screens/ui/machines.png new file mode 100644 index 0000000000000000000000000000000000000000..39d6e4106ab770dfdd5f76582ef2b0535107808b GIT binary patch literal 55165 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
    0cWCs_PLoVOZ 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 literal 0 HcmV?d00001 diff --git a/docs/assets/screens/ui/npcs.png b/docs/assets/screens/ui/npcs.png new file mode 100644 index 0000000000000000000000000000000000000000..71a20e46d41452b6a118b39f73af75bdbd4f5727 GIT binary patch literal 123237 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 S|8WBNQ&)ZR0Cn%V|NjBmC>9+6 literal 0 HcmV?d00001 diff --git a/docs/assets/screens/ui/timelines.png b/docs/assets/screens/ui/timelines.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2afe984a519ed4a7d32744d6994bd15a42a0fe GIT binary patch literal 54456 zcmeFZcT`i`w>FF*Ma53!N! z3B8BVdkZDJThF=o{;uaZ#`o7Z-tmsZ7#Z2@y;qxSt~uv==Cktd*;D0<=NZlu5fNQ{ z^ibhB5fPav5fL#j1sQNhZ8-%`M07saMqd8eBYAnYXD&{bHue@oL=WFZ#gJ=$7{2y$ z{WL4+b@Y{xk3I1_G_sEu&Yb-m_~rG@_s6L@} zvz0128d3{G-l1nu8E1;My6p)GCzts#(1%JP*Y!%*?z2RKQGC}j8bgT8DN35B2}V0Z z6<*?w6jNu;+#xw%Um~W$T#JcmK0|a~Ui4jj zbGz(;Xj*|NJLEpm7m{E@84>+^?J-v~Ln4W<`rm8k>XQ_2f20wnq=r{`>%);tMwHZK z8LC0VM$hKqeTkFwo&1*EkX{=##Z{#`lKrqSRsL@ejZ9u01Yb!CLq9y^f7&r=db{1U zc$iBtNgDNW%I~ahnwtmV6v}+6FZlhIkXYE2Tbs>irrRFNudNvAS-uZ@^XNvZ5bxAe zyqbXVwJXAn3B2nE^z+4jugrb=5d>Q1%((cEsS*nJm-5;1+-95-ET&~EB9Pg&Aj z0=;FUE+~-ftHNg!n$xgM$Ka{EO)(|$E1DF za+`z1+{y|)h`ugpWoFsjVLQ9!>ucqgW==@62kG*wd&hPr$E<-$tgs4gdzKuRT|As( zS1xG`2fPrX^nD4UP?C1LLb~!&s_@JuqRKdXqlr02(uue<-y*g*$xp1<4O`MnUNfO8 z-SqABeTZ)RcpN^esTCOry>d~;4yDk&a!5y{<31Q|P9ckWKty%H%Hb_BQQN}^_m3_& zXA*2i%_YuIvJsQYk}ks z@{4J_&nQ2Na8pr7JXU(A&ZFM^MNso1;@kjy>B0DeN9r73)U0_wy~<4I>&agra-;eb zXcS`fZX!5e7L%^uL)%l{bF!emBSJ}^{!XB^!bB%lNA>(|T8-CSjs2!iP54a@?*_*1 z>+nXu6>brKK~e}A(p(W-QCeZK7b+te4P>r|PdkgcCx~@lqzy5fEruvo7*@zvlvEgv zv8{0!T`CAHZ$6ry-F$GY=SxpuBT&}So-)ZieRh-XngK=XS^gWzg>lX=d!AOv(cKKY z9u?f8AYyt`Agbc6&Qp7Kqnpy~bx|Ka^nGxR)@S2Y=9i&{6nxkZ0^Zp zwnq=+AG&|O^xf~fzF?fa!rsl+4<+sKZ5QXZ=Q!sgwy2;g&}d0*|0v%K-%#IzV;<61 zuTqIMUKBkDco6qZ;0@z>j*zp89EwhgWiyYPA2)vp@uY73c<1r`$ElC$A2UW>;x<%g zc;3Rr$aTc+8g(IRpC?(HB_-v~A(hklpklboOP5H&ht1E!vw3Z~OJ94(jyz!ot7{c$ zztd{h$kr6gW6wynR=P*Smsl3(@zEn_PZz8bmEEB+o-*=zBuaoSK}AG(>8^`ej>9>Ka@El>*7%o|S)lW70Y6 zMa(oghgmvZ`mR!*l6;G83-2uPtkSIVZS(7wKV;k%zFq#LD3h}9UY}H^NSBEaxlo;M z#_&bgp|M^Ale*R#D}KxTZG-8tPnDj04{20GnL?F9{Z&3$6k_#IS}1KTGObN5{k*E& zI$a5!EPd8Of9rJn>((WMnd9@}d2xKLW#9M8n1{R3j!}m3<90r-K1nA=M?RORg7BA? znZ=pw#KpxznB$p(5-Ag|C3;AVTRfwG5f&bX>ZY>-;lSNl2{M(URp!-9?s(L|H{q_` zl;s}DS!fNEeEwp^Vr9`dV*K-(+rGlS-`exbhL_8f!&^1f{M7QT@^G%1TtZRMV0;H^ zL}kVO+j3xe=>GZjOROIwkZMJ0M-(C3j*_**q13U^Uiqc z>hWI62@qyjpsHZscyNX54*M7O1)DXgHWRH4U@{bic-)*>&dS|+ueO3_~n$J6^lTdfCbM4Ko zm0PXX1l|d}BfpL;lphveDY~ikeeJV4T*QhKcMJ2OI#Ht2bv9}%iL?4v%y*v8IZ->$aIZME86 zV0q+1>3MD1OUF~E@@A2~krfMT-k4pmOd5>pc&N6)u`&PRWJqPRwo0x_$KyKtIs2N! z4_#_lnJ4y-C;DrLA=?vtLww)(Jj=Z8^FUy3zB|lA_hI@dkHfv0)pZZvVMs=2U9K%B zB+ESOt7JuuLrgo|;#xQ2#FKduO_* zt5G^=^b_wVM7&McE#>;F?UA&|n*M0-x4#7a*R*>Al%7d)NWEYYnlcS_C(22X|5^lCbP6zX$ zZ$MTSTxV6HpeuLHyM_qz#(IGv%P5Bv1%tuj5~zr!ib&T6khOVjIMK1;Q5;yVh{bLK=7{Wn}6FcE!> zC%QuW6y2{u{N(gqYC=xaVH)X{220|;NWEOZ`OK6ygK z4O~+Yoe8obItyH#0X_`Chlq&ekGDkR!1p!aqmV-UUr)(IQ%L^nnwa;;i*g$Bj~)Tv z8fGpQ7LKmgPHqqZ?kS)ujE$y_o6ZweaWf|e{uky>rWX8O4$eP{5J`H81D6gKZZFup z9PAxk#l581f4(6OT>rQYVrTpLikqDjyUvqmZ1PSn7Hs$V@ABVemp;$N#wO`vZYlm; zLFupJz<*Ng)^2Xj;vkTxrzgLs5Wka)6-Yo#Obm2a5F{wb2fV@O3UzdQ;l=0Z%JF9< z|5cBIg{zs1jkBALlOx-YdS942xw}cRv;S!5zyJR1r-hfz|Fq=j`q!|40fK%!0SWNm z1^sv3KvBsbcg3ICcv;x%D%dyx;sM%_78brQ`Sbn1J^7y&|D&YN|CAIE78Cr>qW|&e z*P>uo3m17O2cS(i>HnFUzY727!@mkjf_@DBKSc4ToPXX01TB4D67=7bCVjqH^XYdY zB3YtG3UZoWXI92ZE0~*yiKZgxSW-l(${%oD8)JS&=80if452MIRSfar(z=t;93mfJ z!pHEnLLU-zvmQBl+oxiG{&r=+O;|CGImrjzv9i)B;nTRi;%R9ardD?_fApT>3Y+Xp zqBF#2|8|icDVx>%B_HwlpC1DS?vS1pm8AH4$v^MZTXVA23yiqOoxlFOCWx7m{;B1k zr>_zss3I9t_0liOUUz&Yg7NoxYyYT_jPVzgk{(qQu z!z*E40Zzyx{<>4b(H7@=^k`fQomp6mm80j{%?Zs{2a3Px_gi*Aqo`6?eZ&LlPLL<} z#i`{&;bi=RSGEi{`!ZZ{N*lAS6O-=0=~_xRFe#0do(yYwwDU<`h%T5wV6*jr&qO&AW+GJDcB4ORCfmr?$ZF5cO66R6CkbO zq%=Br2S-gB7fR>#dTWo)S~$-g1#pNXj-`L6`2nW%!NBshtbcXop58glWy`q+c-ZF! z3=$@GnC67^hxERoZDLguzhUIFJD~K8BMZ@CqBMGyo_?$?IpGuHyoaj9xLeUEi%-kE zz9aK^l}9*YMT^?LzsR&p@6`a*Uq;OT1&Y*`) z*>UbmI4%js?=cE(tyrJ%>0py56Be}CU`NqC??_P?Jr3nB^E%$#5i%RpwdBKWxA}aH zDXvQ#Ijc5OmRh^a#PJ(tOV4>pq#U1wl2ssMbQuo|V)g%$Aa0xbh9+dQb=`=JYs&zo zNh;!4x0pHfVl;0iJwiIHTahh|GK7*zy;l&XT$a+-2}ghWYdf!snLrr zn!6{*CFq#|n9LPpe*(1ASk+y4pkJe0e-b`s%<`K>e;09q!ujh$s%?LxJI3gG^-6`G z?^Zh}cDOQxv>sHs64I8Pj(GVX=}RWOYMvDq;ZQarc}U%-Vd2a{a=noQY~jwAnJs>* zMyps*I_NkigeqA2L*s=*)h1alu1Fa*`c!oKHDn|X*R*7}W6SF$ExD9V`J*e=PXh{& zi^gQb$dfXWD27h8I^ z?2b;wwt~af(#Sq7@P58@`IzsAgH|vsl=8K?L~)(Q6JhX}>nY51=Fx43vkws7_?tgx zk@@PuUiJEHPQek)vYb17vvrYXyvmJBNz7xeV>*V@%4_KU&1%S1}Xdrg4p0+V5AhlyNfR+2Y@($U<6gXAK(a5|OzRLJBon>|>a zl!ma6^fbener}C1_Ejg7M@%Uh#Rt5L#^4B3&)xGol8**7b#yJs9&fQg3u>(LNuLkg z$ZG1SvglYAs))oOcL()1JB84cq7wjI$g&ao)AG8>vIR2I55=0lf|z#ZbI4Rgf;(S6 zo{(66@7^x{=vO-vKt*?~zkho>oA~@JHODPM?8D&b?Qt$$7=1%;NE|Mw4mz zxo>)@xK`8$4Ep{ksAKnT3oGoE3zf2aKCk&yfn>B?Smy^jt2yC;+MHuuj|qgx{&W3$p4L5mIIZOLfS_>~_pQ;F(%(cWaw@JAahskuuS|k=b{whjY zKqaPxdbp76dY=uf%)UP&S6%*iM1QaCDi!@}uZ7g0?Pr@V8Fq91nlT2x>hzLdUR|U& zXgf9w7uG5wYZ-=221YckdhWqtyLBQox^6{V2EuwAsP@&)WSpSde3#wU2ygm%9rKAA z<>=)7P9G~~!5_V#Cu%+@<#p zZDpFRIe*z&S>>}Xa+?OOW|}IxS-J5Fzxp8{A~~QmuTMRHm$#-ZEiWmI=|&`%^3$5V zr5x>W$Wdd2V@Ldx{yk* zDZ&xiInywyy`ko!{7pPA`O+4JX29D4En^P;+T#vEwnz(iF5)W~V^0VB;%RTJFf>9H zoWij^FFbGuE}0D7{)Fh%ZLUfu53F5_juId_OgI5G;Hz_m=XZ z?=BVtS>_Xo;$TC_Dh%=}KipZyl#f5wYIu!H^1Gkpf7l-DyTvurrzXv>7{ zIqBuBrqUduZ`)>X{)aOD@KX!{tXidxpKf2SOr^ilrp`pqHsl@efa>H6JWK!5n(?!> zzG)KLMA0awA$+X6f5LqL(8=shKw2(7&RhjK`CXD==8|q*&(P4zPrD&MhDkR}d|7IY zlSaq>O~uqV6{Wqr@rYl7;x9!&gdmYPT1j^?(q`GAJR;6Asgm+J<+ABG{ZJc`0`=UN zS63@1fk5*E4x!F6;K8zPjZk`LZdlSChq&+dl@k9`;Pt`R4hTo<9cf4&0*v#2`%_?; zZ)1M6@(2CPwyRgJKiMe}-KduzY40tPr_XImrj&JC{GLH+ui1(~*Jvl9BnOJ%QPS4= zxpsrY3*m$JBX*&ZNq&282FX`1Y6pl+`tqz*p9W0pSt?&Z;Z71gC*C=Qa*ce3pZh#) z=s9_Py>{QIm7nfh<#8hX>|CTQi!TS0N&KSB zL;*J_D4Z$DIB6Nsw3&7V<^J|{&C%FH8v0a*x^`j;29-fej7I*HjFc1yB%j= z<#HOOZOoWdPVdlhcrdHRfR-cFmhKBJgXZ~0UC~ne&7bU?sE$@(8xL)acb%H29Pd}1 zCTgup9Dgwzb(p!=hh|~4|7uZ+5;KQ(`S9{d|7u>DKqmUHbb1{==Fa8>Qkt+_ zvrI&{e6@#HLc!9(I!uNREp_^!QykS9NaZtZOc)W3K9e*Zhu~5RX=^qKU7hed7G3Ef zF-tpFec5%xy6_FW={jFmel_9kkZ(yidF2rphRlcLE`4YTNUjm6_n>IPGVhJeifkqa zvB2XjKW%bO7IBcyxt4A_?eUi6mkuroz#>>S+sq=G!P|Lj{d;d@&mf;8wtK-#bS7?pgY;ueA&|Ztpv_TAWZT0eX z8w{Q`o2L6xdts}vS~FGAX$36Bt7wjUA*JKRnDO$%Xf#xLl#xxerf+LDHu+ zjr*~X%s3zj1eE^N*v{z~8-i@ULB580ETl{`=C+-e2R|7~^zEJeo?q)i7Gs4m^sol` z%nnWE+nLiT-Y59>TC9?Z@>k6jPd{%=p6PMTz;eLIV#J?&C~ukL#qz$_9bJwUU#pua zZ(S)tk5sG*s_1^yn3|s^YQ)y^Rb5d z%!I@Ey2yRH=Z9Pl3?q|^@7G3qU1c)-nQL2}_9tWr(DBK)i<2|(emgJhqP2v-Z5_Au zW=BpzE6wQIwf(W9Mk)`XE>XV(*TZwfj55^2yT2G0+1NDOJD26iC=d6RY5S-qU*-?a z(tQuz9g>cuUGEZ>G+I?GxROk ze{CPc-gzHQk33vj7M-uSZn|ip{Vw^5xC0))k2LNRRH-}}99?gDDsg&0Gw}sn$0Rjl zCQJxz7sa{09Y2%d8RY_-Jh>c#DyR^Q)_+l2ypkY2zl)jtQv5L)gxs=SshteiL{-v+ zC74>G9Q>IS*4&$4I(2^K#^v2Mm#)Oa@hhgZ-uvK!zRfnJX8s*=%*zMvFd?RC` zc0Cjw$~Lu_mDB^s4`W}vNmg`V8u~Gy)b?>fu6{J^M8*mJhF1Un?PQm?TkD|hNuSA+ zqFoP(DD=}LiJijq^eTQdY=b~<5f9?dJZ~4*ExoUX-ON?aMAV99=tu|Rc^ykv;hP(c z5oI;GluS$>a{?AgOL5)a;Vb=RhUF7`1;tXjG1T6BAzYbBMG4QjvW_}jhcmgdlCpOI z{{$;XtVJv~YLQZo+2B3(2G$E;wYI@%L!*&MWZy~TS$)6XulD;T!g*PL_Z%hR;^AFtjrC4&%8NhRZ!?<83mKE$wv1n; zg&1z8IVVAVJ_ZEU+`%*h?)ZVZGds+sT099V_%ISPS6b37KKd+>3Hk(_g@8lt%`^S| zj+zgb^O)CbPyNR>3##?T4`)kIPAoF=4-XGa%Xny)?&z-cMML$Cs(VjR*>sX zp}-n44l~yUZRyX%2`-e(@>jPOwI(uY(8_%bygZbplm1!5zT|`-(w-4h&h6Bi=ox{Q zKH@E#Fzq{-`=B=aGVoGpbijK6XW}93PaK8Yxty||R!GA|mkxAH+nY`C*ciCJW3AMn zj%#2`=(=x1)t)$GD>lZMx>n1$)C*GQKjwdAShOR^(|V++FJ$o^f#bG|(O`F|={?+x zPb`lBEV8(kL8Z2CM9amX#+FaDT6`*%X0WK@9KPBb%I z4OHL z2;U8*{eHQ5P~TDOtcqo*Op>>feI0f$e5$K_(vQ)pcGm;gUeM;P?Y6hF#^?{lIaU+)SjwDafk?36rq!I9iNbCJ-{k1b5p`T$55slYB8W(2oh7%bhr z2MVl~4rIoENN3v`aqT|U$Stx(&onP(S=_y8oLL@I{8WXnR@Ems&Mr=WVN3=zXc>zBrblf+u$0ANL4rCnF2bjCcHWu=~`9ii3*4xZN$JJ?1r= z2k8<%4I|kb&GFi-)rX$IC03vDhSj_%8hnsE^wq0ZJL49u@jd=J>w5MfeWzMzr_f{? zME`1-j?bzQI9g6xh^-G7d1N+XL!R6BelnyxCJFzC|J%i^(AiMh!%DyP@p9q$KI0q; z!5stlMA6k9*V!KVy$D<=eohFzR=qwJn`DQL(hh@-L)A8)oUkg1P`YfhLQK}6IDTTQ zk|sQ?>W=?@buEf3+U0C>M$CzDw66E&Lu9m#7b6Zex?FIg59~~J6q8q&UAt?a9hd0H z5S0Rc^`|~e)>rgdSBV?K(^nG#|1^;t2;o9t`uYBE0vLgTs-tLypliVvu8XBHGo`-9w z;pHol_)Nx@VO#?1Y?zRVL)eST$>6r?QAdg9RPt408mYz4*ITERSs0I2OO#it(N5${ zJOrc5;&U5b$L~1JiWF(zv5p2Y=lS3%rMzJ|xV6J&$B^q0tQ%wQbL%^66C_G!nPFq< zMaM2GG37?qsrXQ~IZiCH+%Oat@m9N|Q~@rr7d&Je&pi8HJ_0WER0dM0=s5?qS*JHN z31ES&Y;rckPLJ$&?z~b@?-1H;OOI%Mph8I@?y)$MVem{6GuHNXtXQSYMJEHdg(bM6 zkvjhQl@s&L6s4`GRi^1kxhsE*%6qN`$W0P^%pq=fZGQ_zUoOKAP=rYNS8I2Un$@}7 zQ>qh1#pH_#a*)uj0@#oauoa6FDQI8i_SwAkN70@jkFhJ8E3WcMx4Df4wHv}~Dsc6^M4;MZTU{;qo%S6p zZF0=y4%+Ft=URWIY6K%GrqMA_#FP*@uqLJWW-9< ziLHg%nRlGYA&?ek&b?uu2w)SreVXWfiSn7H)O@_tM6tM(H|0TRVl$2Y7sS(Nt-T~}pL>JMrMbxIA;mR@8ci1}RIV~5=5 z$39yzrsr#Jgex$NYztOc-3xTPJm#Yeq%(Zr+-OaBzr=pn^_i8v(jda}~PU)Ec@atahu4cgW{=h)$gzXM`!=%J9q*O-F%(h zxt&C>!5r$EZ)3|hPu0V!hJ5?NJ0eM?wDoReezHZ#*+$B}pIpONyPTO@GOt^)i%asJ zUz{1?3Uw-r7~gWP9=%QtYSPbKn~j)^t;@h}Mvo4N?B$q^S4ZeO`WuIRYcExId7Q4w zlUrknAKt<+I@Rc|S<0N?zmjk>8k}-U~2if)Q6h;?>ICZne#Q^5iNS*9q3xlhy zY^J2nv2CU7-UT%B8B0>pLA*nppx1{p#jVNqClAUjk{TRv6!B#?nein}wU58wf_m3N;0 zTlZ9QHT*P@Fhg6?#Kp--LKvi21nVy=u>5!!=DTos)I6`(mI&u*bM`gSx z-Bqf~>3*uwSBDqr--SwdqvOjE6H7VyRFx?Q6GyBxAD-%+B?^sXq#rxzVmXS!4;p*c z->J4Wf07fr`nRO3INOh$q9#8% zK@Ce20cadszFd+IHbiW5EW2i#@`X}9G=MZucBoT{opj8{JM^!u?#pZx3RXadQpuIj zQPH6`S#h^ncrp`h@o7GXrfv%PFM5DYri*x{#{~vCa#uv5fy7Paa|VXFxSsp&45EK< zM1YDn9zc%rFtmNmlB_^&vI#Crx<%7U`ZOHZyjxX;RFiez>K_iHZ-<177=ZYBh#5gO zJ1&*)_xL3oScn8G|ljwaLVyFJP>$q@Qn^`;wZFzZ5KgIhZ`8REGa}`<6wI?HK!k`jbB4hd0tU z0sswZOn=n4<@xE%=Ut4xNYWkRfO1+OZ|2cbxjEFLuaIndm?KCbCCS~N7Dl;3m_C?n zHS#&-@0MI1qw~ofY$)p#|BADCh_(*ZkK*W6!dfjQ^r_vUrCKj_T;`hWmYQvfb&rnI zyWf2Oe}kZGvL>;ls_Md2#p@v{a+wj*hj%BSxI~v~?8C6=GjFikE5l32tZLE%WkdF} z6;orbrZLQ(!6g3WYEWrqiaE7R$>=}xDT3hrFCCp`eCyyuw7A8%AlRMHQ)#Qf_ff^F zR(w?7dVx<-IcHz#_wTi3sm4i7IU2#Btt*^I%Agm2P>B-owv*xJ=PT9s1Sk zW#MDbaX&S&-9g{&{X3UW>}Sq!Xgk*62f0<~-KsZc7Y+7v@(8zr@S5dCMLS9 zemjr^qZ%Ew_)`Fa!+NvP8aaE!0YT?_K0jlgG~jA36)1W9h-7A*He+X>1`CAra&Cj} z8doN@4eHzL@goQ`7eJQ_5R}imY2uxjE?`Z!n#FHdMn4?A2TZ*)+FIHSKs_Hx9uCbm zBTv%Tgxqn4`znLWpG0CneJMfDx+hCBa?qWByxLZy%dul$P6u7NV^aUhURnPr$#^%Tq}2(c{papu<@ z9tu`?_-?M^Q!|(pi@Nrzn{LNDP&4KtpKg9TN)#=s@Ptncdo`Zn$QE>t>7&QG$;aDQ zJ%J!^&9*Q)abu)y3Xa1?M(^*9xnf*C4?=OLm7V+X?C)c2a%X_#wInv|U}?EvHn{O} zSTZ%o*L+@L-neKT-`*`(w-a-{Iijzv%1nRC;wh?QErCD{d0TAXdKzOa`i$7@M?rw}Z#Y2+SYJ$q0w*CFo{)D`Oqi z%>%;(NXI6h+VJ1FJZ=vGNcE2Dz{7Vj#y}1xPVS9lbU-+F&-?8`^d?Fy{iwc_O`IAk z7%t{~@ulsYV!5N)ePUXubReB!wFj!JWg!e8$>^?WTbRe`?#=qK@C4rETQ?lIwS0eH za{IoL-$&B0*TyzIg4pu!+B`;jR#!|KFAg3}_sd3fOuzKo51}>o;<_ZZ(Ox1s(K) z>`@Q&juA^>=8luqvQh56@%5A;gwFnF2gHbQO;{*rNsS`o%#5{r&7u8jA}!cGdr7A> zLy!fj!-Fk|IThO*TlRz;Ty51HHtjRj?3fN>9vX6T;vkX27`iGNxGWmaCX0+QX&bsf z!G9Ac;UH%&bebdH0NYA(4g>@w+ZBxSNb_YrmpIvRoxw<4^vaCZ_h=X08%o#9V|7_# zjfg1lI4Guc8S_K?VTqUVOmo}%rCgx~{`d^D!8ogTCwnp#HS%O>-7>fx9j_@jZL#n% zi&a2j)_WyRd?aX~ z#Cd2skSr;aCvz1+%ml83OM3!9M;8)teRO$QFBnI*|F~7^t5iNdEn+b(cDNeB$vWz#q?~BA6jV0pjy@^U z6bM;*A4nFa*C`~%JoahXfu%CVt8~64o0D0eOoab*c>prha6}DjyngyDnD1B64@iNw z9L$9}k##oo2XuDDX26QPy!@~416ka6KsMqt<>Q|`knPSF~vDLG-&;R{ffLG8Mk`2^LAN1X8RXGnn2c zX&Ey2V0M3eRH7S{S?s;itK1>DouS9?=)aK~)STqAP75|vj`2SP(A1d{v~)yvW>WDB zjL|rfkm*!&)LktAc(c;#2?ZYvCE5(|FaSEmprI>h|~9ANNE7q>F}J#@@Y8 zk)<+KbT}b`hrlcLEG)fiXMSVT2N(})&8eK~ecdBF54X>SD@cIgG@-+jUTe1{)`_fi zG$aqd04nTxE?`zf)D@Ly(g%E;`oit#JxWADET%w)`6L^t>hxtjo50@cM?Zn6Z(S zcYf?+4h{IFwv=zt`c8~6$=#hTop~GlAA%&bQ2W4(B5>UhC%1hrCF4%PWqU<7^Y$|q zRJfd-(c1lRQd*;%NwBrySf4d$TI=xzAR$Q)UeZ&A2m{AnngN0iQ@m3Vcx5j>arWDV zZoB>rggzLvRHc3*MBCM!oSIP-@@6;-K&DbH7+>JF_4n{X6(9YQ?UchpY}^F8tt4ru z2m)NET4ej*%hRzICKlFQ$&K*O=R(xA@j{<9^Hv2uOQw%jCVvNl$2|EXiLUzoQyh{b z(9TR5u)`kK=!J!2)r)q{X3o*@UumsfKlrX6rO~~NaX^xEcdNu{vaUHeFncy7@G^bj zWPvfg^}?8`ZH#0j;O(d0p9wu~@4tWLIWwwWnflloq&ANtZ9?+ZVJGtJFk2G&^b|kNja$j9c_6H8do$Tp{ zCkSn)jAdIGWer(1BY+N`c5ZTrrLU$z_K@RiD))O6jz2G&9Kq4bS!>s?O_u4vp>#6)p!c0-7G)@ z%?j144~Rvm03=$b04OfbZf>m2(Dud@G+R-`_UtdA_TBRo$AvwOcb>(m=baaGVegYz zuVFU!!&_9=JM#-3cc4J6TrkN>$(V+B$BU!o#%7xvTTRY~Q5Wu54G;Jg57l@M-dO%a zMz{QD8WsyT{xw+ptG$#=VkKv{6tiTQe?9T6*mDkAIy72_$;VCda6`W6kfC-aO52Ew z_MFV@ifd@|8%`$vJ_T@}o*!X2tElhNXjJG&H6TR}885{&t(K4L4Nh0HAM{pIexp^1m}+z=pSb2Z=C5y_@**?Nia+pDp5P_m z_*16jc4r^t#2pizF1%#~%|+Z`mMm|ItrMmVcNmt~)W! z>69Qd|NW}>6CldH{Wo;H<_2Ad(8e_Rdh4hY5~5hdBkta7o3%AHV9__$!2VnPdSG5#rOp&t2dU0p+kVZ*v(&E z6+pN)NeWme>qc!7$XQ$ToyufhrLSfTSi_m{5W6C2Wi&P>oH|DTww69Lqhdd4BAix` zzTaBRmg5H-EFMTv=_+L+I?MJEdpShPg96K+vJpN}t(-sgk4`H9$OB*VJMv>p_QQ7- z8i{|~vN9}wsw?t0cobOqu~sSPnQ91!b{6obiQ>XaDqlSx&94uZ>WhV#W-*tA?hfj4 z09+I#_SKXhi_bmpyfT-S>V2o#*$5eK5@!5r-&nU9lz)59o8d>s)?zL=jJE`Vnp%r@ zM`;eYKg5snGz$D2eos>U59%f{li%!#T3wja;Vy^(>o>~3>chJpx8E&p4s`Kv97Hx! zUs9Jl=!R{ywEp}Tn(c0r2LxZhH)7SORSyo*BW72G)FLi`YS@hYuu(3Xo6&NSov=ar ztky1(aXNAqw}-yQ$DaLHg8))xt>*lypmUSb1n0Jqce^44E#=u74e*(DJu;V!9G0IA z@GVyzZ}EJDp8PqFGT;=~ECJIRNJ|*Nre$UI-2w|BHmYY%jW|TGuVyOemHY+Rmf8QN zN8CTDZ1IsN`Ds=AcTR>2beisEy*pf8t8T{QlBnrletE^9yGhBd*$^CkvE2+{2=%*o zXLpm}E;vDXx4(MUh)3_|ykdwG(V)JU4cBgf6BPZ*hu1KWnRZwhVvQt!BmP%B@-HrQ zzgj&7ykW78xsL`3XAj1@Hi8+c{Z4+gk3{y8e!6Nr0O;YL5&S z33V4iWakyvAo2&?2c-U_(EVa;e{eRd&glfEC$e;<$m2|@TC|P*n4N%JT^vAfhDol5 zRg~=eL58Vep+0M{J066teC(ZY$~$uu5z!pt@Z*yr$iCkx|Ms5$R0EJC3uMsHv#8@X z`6J*xu=I+@YHk;FeZ&bGMb*|~ z`LT?CKt?ne(#q^q?-wd~>sRaX*YrPAK4a%hnW`-m3z;UxMfJ(?)iwQr9igdgvw`jV9l}e0aNN^j0)iZ< zTqUD9|NPV5qqXXp4j%pp1LJgDM@|!iUB2*8&HheZb;5l+R9-nBivB@K!k^3J7wZl5 zExi_?zL8hoC1C(ad~t&HksS9%SXc*Z#Pn{GF!5>lSj-i{=N)vT9ey`1ku#xTmot=I zZz=(u6?mTRz^!aZ74VJ;5~=aff*Uh?@D5s%K>5k-^H?-gXzC9RnZMcB|B{gB84l5< ziN+D-Uzxdo#UQqKdc3uNi_D|v>0=pM5Y@f{bf==s&9YiOeQ$h9CzfTTVne|{&|=E z$;c#ZJ+wdfeC^;c?;-4H^{z1N$l-pdQBDDqG3?|?=Ux4XgGrzD*5@kxz^S*Lh!@;e z<`xsDDI7DKoJsHA&?bN`9gZh4SFHjGBZkq{ol(K{Rgn{^Xd{=RONN}+f3x+b(L?Z z3Fsxkn`v|l$C6z_+Go+YL>iHCZ)N+UcCvJH=X7v$&wL(gEs$zkizES#D#57~X! zfQ#p!8@oa$M*Kud5$w~{3jB7_is#fcHrqcLX$bss$-2ekXrokZu~%lL03X^ezpA44 zwuI7e@B}4^fJ~N#O%0!AIBeWdRbyAKQ+%|u*KEx=s@V^~W+7NGrg?u7MytYK^iWlB zvnf*Jh17AInZRJIS@UBae#Q&kGETFDo|CRH$(@JEUI2a1v<`}UcZ=RC#@+F)mDV%p!M?v=|Opl8DFQBD_yKARr1l8Q* zI*>ORW=DzpVLuKrxg(BOqzPUS%qphYz_q(~$!o2K&=OztxZq;wREuk1!sv_9uGwID z813~_`!u=ki^~C7p|UNv^$ArqD|y;U_Gb<950Bg-2kWQL0IJfoa&nW0#2QPo{~k1F zW`E2qOLXmvydHCoha-rXaoO?fE*oYJ4q`N>K7BuB*PyH&kOHdZSFKv@wTM*jX;(TkeB`oe&Ec`xCPt+@l!*&6Xww>l+pbbR zlI%rT#yeJ;NfPGzutlRz6^M$p-ikHWn5NT-1E-Y|96xrGQt}6XN8eB+%|oz$>pP4U zULD$d`?Th;*lVpFCi04p*3cK4GwQ!Ftz2YV5Z+-X)P2_wIv%(`uJ_4zr~5+WnH1F^ zW_Mr7&3+-Q2f_PG>>y88W{2AhM7inu<$d^ewqn`7JGs`?|Eh!6B}MVYP0i1F5Y@vmCu+W52JLXJsZK;$J%+ zZDE4lr9Jv+2m2~+6ZE%^|1?duARvE5TQyZtxc|tGCx=A{3sS3>1Jw&{tla$*PjoC_ij00L?HQ7bgD8p| zHlID@?tSbTOYb!8xLth($KyTXrv9X?FVDL~7^cs6jaYC+)ht<^7DiAqv8BHKf*I(N z?jZx`s{|Pc^^2YC;L(y9rP_Z6$A3B>y&XK=i7@pNb%dM-v^QzrqLm7-kQcMI?Z1S3 z!JdHRX&hk)=XQtk9@vvvyUhHn7{#l{lA~qatoSu;QtXRf-ImUAVgkHlz&B(pM6~*< zAlDD1-gEcq*t*N)e=o`penZA2TJ5O=I}(W zF7Pr10#vWG)3aoOE;8ZC#pmV^>@PZP*U465u|KUGl7Q@7Ph+qP)0GQ5Ux(@B74QF< zb^YZ;{xO|Pv2Nes*ClT%sMr+w>0rkziooLi>29}U z^zZ3qogSc<`v=Amt}A9Ec7>&F4?bsd-{-#{PL55y5w3mSpFF?M(Ga9Z0&An0)m)mDj;t?TU<)GMPltW}sw;(s~QKXVK=kh6$ELAJu#;W_(jfE}u83eU zbT@8~QjV=udO;`MyjcYUy*N(&h{V*11zGwB?bsI{ar&<%VTXypku7- zyzeYO-qD4k08r69GoRnh@i9Aon<#>$DVV~$Tv0=t{odu8aXNp9j#;OqerPYB#pbpO zsu_SSjHu!S25KiknJ|#T{Fz|t*R`vwyNaWx=pmMFl(J7ymj{DfkdfWSU1p*2)uHlj~l904CT^{ z<2*HpY2$AFvc6GV{$e5Nr{-JaRnu|vDiBn?4zD3zkJfh5Abn`1htxdo<@a2u9ES%T zi=8|MjI8Jct0_}WH1rpT#NKCX#=BGG)@>xZ9%RD`+>S2=S{I)e*+IRK565>-4$AxW za>#Nya`KZ*zK(bNj_v_&J0t>nuQ$3f?fv^?Suk z{YvX+lFF$l;Fo;+pDf{fh6Uv5s;nzN{+{=5kEjB9Ixwi<-F11ohM##lgcjR%oy97D zZqahwjP$xKmH>G=&vVu8-}9)CxaH40-G7eYKS%H%D)@h&5muF8aX8PL6$BRiPR@Dx zTa^2SsXWgQ$pcsnDPmD;0n7+A#WPMFGR|DOp`aBZ`$n1M_mYjY4@KWYH|vM?vWfC^ zcS#+w7GekHaY zht;@RhTI*tE4|+2;Lyci!2Ew$Exv=#GEB$kI!yCEPLr~w4N`$RH{qMczhK1vl=$n6 z0~I&Jwe6qhLw&r8y{XJ;ekTTdnFcD9RpbQ`)5L_Q_ z;Tgq%e0M}>Abx*o+1{bK z>8{12yVGkUdCEUAeMR9_&V_FR-c6GYAp=VvO1A#G{BaJVe_8|!h;H}$M)L_ID-39yJCNWgW_Sq^{qVC;9DNG8@p0B|?lW-SbHD!ec#ep+`BK zXlM9sqcOgu97V{#=>%I|G2UpK(EyJ+!34AsbOg2#OatE}Oxl~W;u`m?$?O7nnI zNT&ah^F`s1`GUH8rlo!{S{$1{RyS*1e7W7fL25vxPl_5#cXTQ$q9 z{m0t2YkNRbfRaaIT9;F1=Q9h*)(uSFeA6De)eC*@T4`35B3F7Wt$PK9R8`0VXN`20 zD=$!C-Ez*LeOOqR2Q)<=yl20nhlsRoqhz^sIXf-2E0NdhBpM6x7CVu?*fb`HRkp2U zb|7_9)wXO_w~9T~E4OrJD$z9faVoWn4EStT_Inm;G+_W7)dzx`1tksPo_NCftZQHR zu)|lHfLcx4xf@+b`fJ@|RzI&&$N(Uy#apk`Gt=A~(W+)qf zpYL6jI+NHaeX_pMPPK>|`Dtrw3w>=X?k*+)5s}a(vy)z?kCNYzEYOGEnSaRD=IYor zLSqZ)MRBBFd~|$PGc%d!JnOtHCq~$g|Q&Q=ai^- z#c$mF-5;uZx7UR_1Dz(4A^E<618c~L20ndI3MQv}W8;rKIcQV#eY_x7+AlN#kbP8avLCH!&vyf#Q_MyZM(%yZ}mRNxn{ zj9H2~A4*n>b3MFA6c@HHKih&Fh<-a~;vx=-s~?FYCXu&USj-#NDG`%f{%Ch` z(&>)=T)2qGas5-Yum;y8gu_nXy5;>@AH~f4no%UxZ%+g`CF%g|yK_N5FoJp^-ZxPm z99v6c{*E+%Qou`sjL`f9Cy9ycj~Ml?4GYklo(-Sux=Z*uWez4VrK!|=#M9qj)E}2u zg@XEI`d-w{>lP0DR4?hq&G7%h1&NZ+NzZL>69?WY)%96;a2`S9e%+nDr=Kgo8U7t@ zKVYe;?g>MqZMZ(hraYlVGc;ge}t9*}}6O5JFC3Q|knx}= z>ep*Y9$2R^F(Ax1$yol)T;dKt8Doo99C-~t{FLEyr8jQkMs%wGJ1YI61z7qHR5#b9 zt~($=UPYh*Z$)_7hV^gex;q1G{>%C8S7O)6XkbMytN{DzbE#e<0)L*7?<%l){23{q zGyLmEHR=PWNEuU#@^9vnr~=q;RTO0;;`i$8kG)U=r?`{wk?7yagIZwo636%%UjOD= zchmtQYBwmnj^TdZ~|lXdH>0mx~TW(re7WkMcVy-4-X~_X@F?tyM0DSL5e#sdrYP-a9#$`{C!B z4T$QYa;Yk5gzyR|YeKJ8cJ_&wUTb(+)Gz$I(}*^YmUPf)9{iaIb-Io|w@-&y3>w(e z3rCG^>{py$qj+}@#a2T6%25~Zb|iLuiJW*No6Nqn-fk#WX@HjdF-2r?|3P#mIk*KM z$B9-DRTdER{%40#DFS7ZU)}m3w>euAU#6u|*&4M^;{U=xJ0U)b7*E1e8(ef1!R|}9 zU)@G|O*dDe(iJIa`rfQir-ZjD?6yo)XR6O^OB%oDM~H=!zzXPn!n_KDVqe6Q%7x84 zzes@TD)AP|rG{-YJ)N6w<@{flUM$ukf?eHPh-qxBZz8_P_PdH4&(I?%gW|}yKB-f_ zz9|xakYX4AWP2L3wRZ_$L~MR}wp{I(qp}f00W|CYCx3+&^F5RXx{Q^&wDYa#@S3O3 z8k14*1#%xowp1^-Mlsw5 z-qj2uW0j(=7MJMD3tGg~VHmdkxf17adiP&eqJjlzbXw-9JnVmCztph+!WxqHDd2DW z`0Kx~f!ZQktjIi+|EHcaw=y&T2nSelHEkrHyqW22MZ+g{4Q(gHEDHf+|4-iq-gy^C z`EX;D2d4b;>|!TbyT*?9KDcq8xj==LaWwx;H1x&CnEG?vYOJq1m0w1RK=RRa3atAi z9I?SMMqOb(H^%LZzi1~$59Pek7jRq`J9QrsvzwcHXB_2eJ)V=e*qN%#pqNOr!DoS4 zx>*^Y9>Z;X731qK^*(`WSj?b5PEt^GOqR>Ihq_?AIG(0is zfI%T9EV-&R0fA-x{2s&0MhV{E8BNd%;u39bA7)i`T2mG-Bw+`rouQxZP$H!e^G`k z9S%`i>-tMSkE{Ldy-78(miO|tD|`lB2|8nJ>4vx7I+9mGjAuL89h|)+z}jQa|867s zR$08v4*`Fvz}(2(p!d^6YXtcTTkfQjG&5D z95x;VJ6Cl`$FT-q?DV$3{)T~99HOE80yfw7qge`Z3AVb*dYR6vcuy=vx-EjzqQ4VE zO^E(Cv~yb`8!#mCDg!^JG6%m@qtLx72|Pd+#(R3xxpJ+Ec|@O>=#%21b#7s!$VAhD zi_rU0q12vU>x@G3$11nbajWeG+5Ql(NXA8Jn zqVSgDpe0sX#rYQsauS&El;2Y=q4%+Au6wqFTxVB%VVg7H@5|#JQ_m!;)U=+grjNyo zSzBqn--;<#uGDiquaPKyc2vG>J2U~sm~iDSP;)YpJgL`=%@`wuA}@1Ub!%S4v1-wW zX^FBw4+#5oiXA^?m$o)LN$D>c8ZQ^xUfW%bsf^(K`l`M(MZ{Srgox?UWSJ4}>y^Z- zKH20r`7DzkC^XCMad_*x)o(=yk-)&<8918J71j397ssLfyyvhuC+984i=kXO^N6rC z_wt;NWy66^MREONZbGOZAp3>SA;e{~6>bCj&-;IfVO-MH;^50vnyKQ8Kpkgj-N!oX z$QCSabZd-*CXc6}JAG@YnD;uWq2BSHFtsUf>$C051^uTw3iZ2GZjat~#;4aUu+CHb zDyoC*Znn+sL|zO;DJ$hU;L9Wm=Yf>r@XbLTTnZ6Wh~wZ^ywwcWr>L0aj{HN|lHb}C zy)pRCp2WskG?V9jNT0wkPS1`lx54mHy&dv}k3naoLfYnlbeX|R^LTHVcUG2cnzll^ z5F^ZqB9a6Gj-LNu*X_4NZqWCI*RI1MEcW{dtgIu zBiEO*(oV5i<9GDEFt+kBqt129zBg3+ zju-QGHB-IlndJKTBNiNUl?q8*GHwuY$@C*#=y6KcV?{4rh!;o)xvFNWS`|IwT4A9+ zTDuHtu#-oRNYcYWc?mr^wKtB<736VpJghW_(~$97e%_pNS650-{t??v9Mx9IQZu%_ zt3U+-74RW!mR!GBiZDeAL0Iqz1{rPEh71K9PQDp*rcBP>LFOy!CUTmmT?m=hBJIHz z%USqfUf*yQ+xbPN!P18TI2RgSZ!AsPgHQG&sIty7W0y{XW6I2W(YZk~wZfMPh3fS> zZ6A~A@RCaz4>~<8YcigGs@&iYLcim6cBD^kqh0RgZy=qn&=to-qkKid9x-P6Lxqh) z1P%V%E5OKdW}RbwWdVz9ZFMWV^8s(_gh8D*ocO7rn&7GSWQ z%%?|D+VyUuh~42hDYu@D5swjcf2Zvk4%c2%`WcABg{RbLEtaco??V3t_shoP!gk)7r76LTMm(*zCe$bD?u;z+s7l6rKir)ED{k5|{G zJaJTLI9cK#xKaJi{M@V2M5D^Eiig+N#|m-3^Fw$15(F*<0R#GtrOf5Upi!m8 zoc?4|5tl;`k4!3ao`dE1D?0-jV~B^Qb(ihX8JoMsD~Vh81Q|M3JNFH$FbUtsvg_6} z1V*HPBH92aiOUc%>6ZCe%v35~l5)xn<$AWDk|#;i6R0E@)z)h^I2BMx(O4!Cmf0bk z)NBj*Evi7crWr4W<5Dpe^K0@FIMh_t(smdE!qcp99JGXZ3QWQK-|n24NB4RioS2@j zkK-E&`*iQA$J}Q)iITreZIEv3S6^jTxb@sSEZx##NM`>m)^c3U^DF`kTj*+$sK63F zpND;!p)r;7eYf1{=!pf=;xpj6DIz~5AAM;#QSqirY^uYl@}P4CK1traUAG(EyT8D3 zYw7rDGotsXSP{y)?X^>r3eT{TKi{h3v6y|GKVo5&KH+ujGQD>;O zd3flXBqRBSbUa_!%w*Jq(eDM7Wa^sMaT_rgke;xGjyoPA?tKr* zIL~weCrQ^$bi5a=H<*h|-<)cyoD?*vX0ZH$FIc2rIo6kNfX;!JX4J3qNDGXpxJk7_ zimFRFoXhftRiEE>t!vcTGGEYqP98o(A!cky@eOoKb*gphYbn9z<_jD@6tS(o@?*H? zXj&jnvSVaiPI951q4^Z2f|*LeJR#MV`)5B_gsa0z$LqC;Lp1laqsvXL)47Ebgy2?J z`06E^SZ?KE=%u@`)5Uv2_BS(D<(K3`-p!Nc@KbL$b%ro`bB24r_*T?+DNwuyUz=JK zmpjIoJ=~SJOayma8cHY2n!RDCA7zf?;m?{6#x*Et3RYm-kU0!#MHDah$H3K zR+jmVB$xxDYLmSjtE#Gecc_+d9k9cwL0QMiouJYY%-J(Ji@y4<;nEadWUC98~) z%OEH6GULv}G#wGw;FT@08#F$YOTNpq3uu6}0-62Yn5{ZuZ7 zejRrC4VB7M$273n;El)}!p`VPpZ+FVMo_WSO^!i^4F18;_!2h2i}`snc7FGU_at4@s$ zaIoQq!YSgoDaUXC3z7sWwWjhtIv!B)g%Hpbmef#g%6%unQ}>%*(Zyq% z3M9FZV?(O*gfLkFQxVz4apMmHuAObBy-vmFh9_cA`9BqFA%sq|61dzcjI8&y`Pn z=HTvqqF+&W*=fxeWZUYn_9agx%Hzm$zYkev3Zs-UYUBB;`Z>X33V*~;zn;vbUgEPm zyt*7MA$~nJq}%s7qeYckb6YPL=q(y)JfTx5c)25;(L87_0Q`9HW`4v2u_ZzpG=E2_ zSPtU>g0?AoQl>Ms3U?|*zb-sCaVv7l!Q(~Q5{o(H{m_2dbI5XZi^FJ^OvHxi@WW?U z;Ys8p$zTiqnb$?--A0NOY}O5Db!2KZB@g)9y@J=y)`|&9N%i8O(DZ^zi6FGkqT0Mg z2`Pk+s!}>_;FZaIj3Syfbre~UhP8X091ZD(8jxAh)NR)BW7iyVS|tBPn>mMipp3F{ zXVde*Z0R3<;82=gZj)8`8S%q6oJGuhMQJQl30t`-gd8JRdAufH8qTsV-Ko3`A!BCK zW#zrIHJ-2TIv@gikID(8?Yf4XbI=I%Op z(*Ns2tGGliNu|6ul^^S_lt@ffOUf*G`H>N+PiWPw#SjJhN+ty;D$Z^|(FX^BR)nHtLXq#aiiRlEhjpn^Cfadp0^uI?BkB^mDBA>6ZDX)?a;#`pXQSF(Tnwr8?seKjlDsIKxybIzgMcPfvspNgtnA_e5l`{=P*&z_WoW3*8Q_q}T9G;sT6jhQKYfegKSu#s7 z4tE$QuR{8%;zPTO6vt+FXXiA;jPpS8RNlsZ@jj#<54jlTEEb1YR-a*6qh3iBs*Dpu zzoJJAQHw2mbALiS!^ttH6Eqn$2_@rRnJn8#vXx3v$v1eN$Z49j>a#@m_xK->oMgay zUl;m-pz1NY%53djlwvlybiT^eG4hz2GQ+ZAqTaC2b~&TI44#c1 zSD!N(8l#%P;!j+c3mv=*OA*Dg@%^0s9&i?slt;dF-1=q~lcoI?3AfjeWcT~EYRAUn z+3a79(;PF?KJ1PwoO*kU6rS+3IW;-!>LqlTEh6r9t-6TWVK_7fpmP^oo|$jrR}IfJU12`njBYGG2Jtd6BXnUIGyPj5wT?Z zYO)3Bqjb(kJ!O*>Sc46Fsnl&o<=aVRMtgk?Q{P=&-=gSWB|d^D-;9%sXJx=Py3|L% znx*@IwH!Y$i9NL-;xPiX8>^5N)K4=Tw@Q9-2f@-UUyxg@C~Sm*)^AW7dN!Y&z9~K^ z_^8SWEn9!O&ZJh}E*||3C4;WVLGed&0qGYJ6daS~hNb*G%3Np>1FCX3trZfc zrrj2US-v9a{_*u)citDzkkiX2sfSYvS+#qU9;`eXe46NZ5r!G#k8-zZd~mIDgKvsD z(217Ue(w=xwe5_Pm?4Ij4rI`1e6E!sb*gikOy6*-r^ZPKaX(_pyGl;2uq?eDDfC8@ z$I=7?Jp0Wq+=5r%oR0TOwbGnkzNG$e5Om8HhE}CpD~t?z`9O&7q>xmsNZ+Ck3GH7D zRh*55q94YJxZ@>kwTH{pl+jy;#*Z4!Z31CI8Hw<8NUEcA8V*m9y(n^rP2-7q9e}1N z%i^6W5E;u!6k)U@tcHA$**WVo5E0y+w4bX!P3f7=;Jw8i&%xY1 zW)%m-_~d5H3>PEG)b!_jvX#bAV^e&jB#r`w2N^TktF2<3xZKpe-J3_q?8V!OR*lfH zovlVx3x<_)!l>ARa8spsZR@acZ+R0=>gC*m_2Pa6Jc{2I$ZXdkU4TZ-2Jof z9h?l4?$9|HcnXz{IgW#Ef0?6nX?5bZphASxFz@1#_+l}Zm7+U)ptJX2?Dnn|N0MDb+!SyARMV`Zuaz;} z%YU&S+FrdUz*gwDof+=UrGMm+r&TbO>QVaEY;FMmDCeSFQH-X>-muEMR+k{BCvru{ zWq9kUM1=0njAL!AU3dv(-vYq5L^J85yHl=t1<2VXCg-wl2eb8%D{mp;=|J zDtKH;ue`#jTc+`+&ILJF))pDGwLr5yCY6p9kKbrTedLABe{A|;k=YQ)huQGa^f$tj z8FfC9ob(5r>0=06P>vw(12M+QA&juoxlV=@L3brI6Uu zSL=qTy|CD`fH^jLjWJqljg&mZF;n@LZp@}`h;iF_Y@Ga@LL;f%<-FMXD(5=zaik{|PxTWo~wHoIhx7E9^z%o>vN9jse zLw3F>op9*3aZ)4HUorYIJR4s%-r$|p1R~LG%iLyXwUppT+W9fFP}zBW3;3Xu8CJCo z))${KC$F#RnK}K@Tl?tO6xe(KfE|QUSZdc*2+oy#IR}um4P6JJn^ix zc)!kDAL(LP~)l^X@Ju*r`n2bPPG z=-}gEosDXR{=%6=!nSH!3nnA*OJ?(*Q_JEm> z@UIK`iAf>-iI>9lhMw4oP*cC4xWk9;i^2A10$2%1xX&2A6F{NFlvqp&k*17brnfJ| zpPOh;dfpoFcdXOhOjHlP#;C=2-ZeI-ZXX3nE$*P;X^Q`mlFp9nya>le5xjvRIDbD(>KB**)QahakN!~z?4^k>H3z4>^grrQqj;)cGR#Ofy+Ws7?QJK1S4w{UZt=l!QaIZu&iL9;G& zG(e)<4R@`EaInRd~2_6^Pfu)}%)i$M zkuGfwiLJBsY6+n*r2QotJLe0)d|c*QRDPw9|6+z&;+-}2{JJn1*Z=zNmrr+jf1;e) z5;cEy^8Q6LjiJDpx*(a?zx?{YrvJ}#{&PP6BA9=Pvp)fE|Dm7%FZs*swX%Fq@zVDt zbGx-JoEm%^Wfc9RoHEC2rGzN!-TqAoRM$gh?;Dg(E@dE)UIGAXEf%2M&R62wtG^()wv$tNPaS*~Ce}hFYV_vBUh!dGOOy3J z!$PkEMr3A;!~F$3xC`}hvnWq8;>a6j-ZKKP6xqCP@;L&ODaqK`m9g`gh6F(Meb%=E z1p99y8~ms1fb%iIc z9SNMAtt5bq)fR}}#JJ{Zz!*`W)UP=Zmk$#1i*ozty^3q&1AtbwaJutf72rR|_}~GU z^PSKBy~Tew82)*Kx2f-{q29J>iKXrIx*irh_Z(0?9;U%&PL+2c7m9cU1Z1c89eTuVaQVad&~=vqjrPcn=z|ddJV3u z*iDTg$TIhTJLN%^Zx+3(HLe>*)#R^>C2nfezYAmqmCK~9O{f5{mq*ieQ6QVOy*EI< zHQu22lWLh^?fLO{-{yA1mKK4boOisPiEPRS1(?qDo*2N(nHF-hJv#m7NyNOWPwVR6 zwx`{)Ti%q+dzBwKUFRwnS2Xi5aVXo3`g|1uyjS$6-RcWLQ!R$Gk6TYiK0CFO?pl=D z?we~$!9dQeH04AR0Yw5)fSG$PtbXe<$wY3#eJ;VlOau02Dp>idGb2hl>qWK_>Jx3| zmw&nPyGRu16@>#1)odJLSMqaJ%L#_$s%?V$;{GUJeHRT{k*k(G?xW*p2&wM(WOEbc zSKl@#JYRtkqC4VNmq2Jwhq!2(x)p0N+CYXt%1uldvVO%{ zs#!T`6#;h8t~Dzc9?MbghZpcjvg`Dm>YLpo% zu%v2@<+gTM+Ry&QV!SQaSd%tphXok3y@fYwZI>;o|b)%j%h6rJ-El05a= zuWMs#?|%YM?2P&!^^44EGb9jW%BfnGZH#diaZd5%Z!sIgwvb%2tnm8nAUfFu@q9IA zn%;F4&ZQbEEL&vU%u(Ki6@pwQ@yqE_CKb9IinlkD#-oy#$xtPrgFnNPEMYX`)Cf0! zjGvdcL{38(?5GPc@fWL2^P;;qhp`naK4r;Jg3rGlH{z2WZNC(7Imtq%Fd7@V=07KZ zp>-~?j2FuEGG{LpuGyJ|oytc)e)sGrq(-GgeaH|9Yj|kX*~MtrdPsH=aXbQQ+U(e{ z&F6K_=Ms4G-#lIBfIR{-0Fjrv4GbjmlT&V9=UdOg$)7AVhGdSxVRZUu8F2Y`qs@P^ z(K(5FonB_v%P4J1Hr){~xFtW_9c|CRnW*rppNiAAxNxR=cy@ef8y?PP1`{qhxNM#7 zt~J;{a>i z<#F3lWnwu`&$D&~5cTjf zd;Gzg(o|yrRKxfLTHbT@6>sW7ja`?UWZ@=X^=C1aiypipXj^|Ahc{BoE{RhZYq^)b z9l+jPGEDr)y4lRwnL=McpNwgt!lu@9xpPvsZBt{jRu=QY`LBL&(0d2d*pzuwo<_3;?O5(=RiZb_SIh zzP(lg;-oanMjSD=!^9FM<`tsn&TNg#P@5n5^|su-Bd;ee_*_;$pMXR2G_ciX)I9yA z6nPhXvda0x4weUfU^C9C{QRj6mzM95VXwPUIhkXb^dNC(h8<6|(!oB1h++7Xb3Ce; zho^Q^h8AMtpnz5(y22VRr#k;K_3yi;tLSY{{-(=t)>CG;JE zgteV1wRF{C<7a|B`Kzd6Rl#>Et*n1Y&vU|wn&S*lpDKr452bt)QLQPD{a4mIBi;!$ z)|Doebc&bXOvEn^yjK>Jy=a%dlHJOG(K=sTc(!95aKPl>aC~sSedG-HrEQnLd|kHP z_&U#|miy(N&9g*K?+i|xhpbI4Pct;A}zw6FK5DevNkhVdwpQAB#w zl-2HunWv$!s6LKYc?23@AJ6^j=3x3R9(rc0E8xPj+WtM!p2T3Z&GO!et|cv`?$zak zy^Tn3!ykKxL*I-f)e`?I?|mAP*e0Rt{Arff*h9obZnVgv6`>@Ia6d}vq1{ubEg^&S zm#KorHI_v?m)(leNh(a6y+_9l7tf8@)rr2u2IguV&dMoHSQR)>k3}?4J=AhS#0W;j z#deGxyL7uLjS9OK_@`9C*e6?I$e`xACUf&Ph{CY+*!N}0`yU% z9$hpI;qCG?24~s#*d7?|jH!+@lmJozZ+}24k^WydzPu4 z&hJBmF;V9W0dt3gLerCZEipXIlCBo&x}K-JFGwRhX5<1urlOl@bGv@TFfIkTM#~Ln z7mPn!>`oF$MW%?#zp`JqAmgr%Gw%MR%9jQ;5!;^iZfW4qf@lDMN8{WQ5Y!5eM*%<_ zyynpUYFyVn%uoyvWb&`k8NVSF;E=aj$VxUmaa=HNHE}F2bToA=_Cf&+Kq1)5c-NX` zqh#*Cv}s!$$Or*52sqPxb;ol)%$CJJQm33!(vEQ|Po~v+0h4_$#`toMW0EVUia&}W zA&xXKBDIul%u!>E0_7SSwPM(+5O4`WVuB2f?1$=$qG`^QT#kTye% zu}Vpzw^OskD)tQe7d;mL8zQ8R;clt9V-b6!a8o|hNoDQu5R8nw*=T1@vK6vx8C@HZ{ z$f~F?;dY;snFdADX!L~D%N3nrL6a~#-eF%rynU0vIp+}D|5 za6WX^oSfjCar=HrTX4ubF7V{_g4^IKzs$v3CTWsIFv18 zT3*DzAYj^MN%>&5lH+S^P%3^KHXQ$5#$#;XCyxMEts8^aG&*pp)Tq*MHNmtvx)L)L zJU!6#NwpAWc3y>azhE8T>v(A(ovc}AAZ?66cC2_;*Uq5VBu!n@lw%PhHm1%T$4;22 zr-AX`n3?)j(K8u$<>hj!K$+$#qQ&T%Np7Pqlwm1Xz0>9T6>VOVfwwAkuEqU=gVn07 zchhP2nn0du;QKPk%wIQ(vH^HnaoU*0l&K#9BW)Q|vG7s|Nf}7n)O*!1WHAOU2YNI& zqgBH-n`Tpm_j!L~CArF~E8X1nsqL~CuQYT;XU*Dvz7$oLH#?%Wq>El!}Z zWOhB;HR5|a_bKbC|A4RmeIhx*(3u7y-_W2jXEom@exV7#?4uvus}wL?IWNT`ROGO`Nvh^pRGmQilq30gp^4v+vBANjtKF>d?MPa=SJw0jO#m#%!886+ zyKb!1>$qc3-_ke@FC|0+GmeX^nh#Nce)JGYQWDMLKp9&MZ*N&Z(VrF`Fb8XEsH{m12=&BJXZ zdiA)ITX_SET1hux$Xi{FRjU>K;DA`2y@Gm)h*wm)ODG#0JslrR*6xg^3pe3i{G<3K z2<0Z=Nlt%|%NdpAa(y)6BCjw?!l4`05`6DNO;4x&)&>2!$QS=4DTZANd@|m#U`v!i zTc{8NDgIm#rj)Pc^)xv?qJPF!{_~vwt>@F&PyV50j0*q&kZAFz0x7NQD5)_Q%|oy;ip>)% zUG!vA_&Q<|-z3=?4Ln`@!hDnt*}Qq(Fd$yY2q>WyTmhkvzXs<1L7l*}fOz4*>)rr# z8tDHSFRXdqhx@x~tv?@h_Z+BOZ@JX(p!^%z|K;B~`=9Z`t;q7`>tlf}UVw-%y&^5c zxPHt@3SdB|3oULwzJBXKQ;Hi>n_>a~E04z~y&u7O-K8JX@BGYiI{lgDoUXQAXz0SK zFM~p%gzO1wn!M(ZMBE*)>l6Bc3-FPn*2$15Rutv2{j-Ym10I6&_tED@BxxHu&297Pn7wd`f1wb3&Qn!thD+zeXJXC8&jogSzGd ztWwaGDinT3`R~R75zB8X34y<-U>ej4t^BWMHTZRUMamltKk*Bn0YZFF{NtLS{4{-r zzLkVpNMCKHd3qknP1I>1S!-i0f&1Ilc<6{@5JnUeraDTEiz;)V+^z<=<;QH$gWnS8 zNnK+YIscblYQc?gaB7a;|8xTwAKjO*j0vy^fZB?^*BUB&WTElJaM*ub%zjKbk=y&T z$J9BQi_4Lb3A`=ktn*>H>%JaFE?xBTb$%q!v<$XW;7apoGe6 zi-QS>UI7iO#UeeiyhKG;YbiT$Up@K<hX-) zZQHN?<~&d}+womeF4I!cZ(PiEo%OWn>ManV)vK_KP~JVmNnVQg^6m&vg`{e5ZXw~A z%1fOqI>94OmNQ`GH19Q>8kb$A_v2T!{Ty6wo2Y7+7@l?Cr`q7?cjDgBzJP$6U<6J5 z?HHi=s;bnzf6U(KjLK6zcvf0m41LinBpvRNy%@a3AuTR0UKl{ivuHi;g$8fm_TDl+ z?j|44kc%&gW^_M@R>@P6DQ7smZPl{Q9T4`fwkCQ%`+-b&UOclvI>S9!rH-vR6;~PY zIK>1-E6fJf+0$k@el|X$7!}(QjCdgM5Q;^}*y@z&iZ)$aAvbspM%lyEjE@}lz2xqHRS z6t0DvBZQTb%iYPat@y3veg3`vn@+TKwm7w>`@~vf-+ZB6!!zkYQ>mGJe_;VXK;qvH zz@O}FmI@CRJ&fh@w91?Lmi;nKkXzz40fT%@S?s#>Mavq!`)u?V#XTVzYgX^`<`SiE zF7%K(BP8*c-mX-K{bl*nlXB~9gPQx`3*bHjCKt8$HwgACd(ITP66(L*q2N=R61n^Y zsh7zR4EG$m?hX<0_2;m` z3`Ua1y?p7=9 z&3 zC+{teBvmRg`Y&~#^Z-*G^j#-tf@6LfLMUHkuEMUBp8lHW{>H4-v%$lm^jnX2=L-MV zbd3VjW1yA|-|4eHsiHk*g3c}P9xpahC9X9!*^}yXVivUWv}NB^~Qcy32wQ0FPX!YsrYr zOigOpI7Nq-IiW^HxAq}bhOv-wZwF5-RWYkC|3egI+=ydbRu5ibIi4uCzX=T;^Aa+h zoRhPrqsNw4^Bk+Ylt)*y8-~E6^C~18T;g#=x=AfTZS=Wtb_reWf^}281SWE4coHT= z_nbtkUiUC~Gv)R3b6-@<11p2qS2@<&NN=|S5R!fpoggM75jKwn;>>N$#K32~Kmk>x z^-xwxn7Mbj&L)?-nxqTS<`1h`vPC=XI3}N_meh`_mr7UnIYQedv)h-l(a-7U(c7PX zcca%$;_7&d$f#_$+WYmmbgzLAu#Z$D`H`j6O;77$G&kx@>BpIn&AK7ul$KP}h@yPN z`b;iz3#yL zb^5RmmQaN;{AcCwb2R&&>u8Z7&oBISsTy=i5AUDB=e%TZkqkZ8nptHFq$f+l!nl#D z?iNG3d470$o5h(}sD%9L{$Tr(aVCKY$QPYse+CwrMIb{hjC+u&;!z@izfAu682 zVnFp_(GL-S*LPg;%DpoVaZs`@t+{6^=Ow# zz)ZqJS9Z2~WTwg{$8D!Bdhc-siJDcyY2}gZzkBsRvh>DHMe^@+C?^Ap{2r9%pg$y! zch>xIsv_C7W1L?y+mxM%8wUH2p9-gH}~XCJ1SOL0{|-Vd9cQ@)o_{@ z6-fzpz2F8i$D|i5&n^kWHjllKH|Mv3Li#w>FK0Vafih>6bnkDav~gKjzW1=dV%>PN zPn2{d!3$r*1(R!rg`|%ivdxA1gG}h>Zxr2edg%FJ$CWq{pNZ#%wxIdK6ZrlqLz5IL zVTD2S0TZc5(`EZ(We|n=-Z3bxuRMuGZ~Pt0!@DW(?L3FX6@?_<220FQq&k+WJu#^z zYBMY7<=J)|!WvH%3>u%YV+Z%m1P4~TcMjX*ni@-bQ&EHE-D+fm!^X10(bd6QEpV8Hv5A^tr-p{_)$&nh{$dzi6t4)YDg{B>Si>3T(pZ4{lrgl$ z6a68~#J~0}KD#x^4XD{1@{e^K8s)_}Jz+1qwwy(zx5+yo`~Ak-V9v3faHjn}`+m4* zrV?WPJaMo(tBd~WVJn3gZZf&t9~m7pLl{3P$0mN{F`01-n;M)A2ALOR($967*9fvoLTY}-=hRI(KRx8j~*-m6cM#`&tWVu-PYXdMvHF$b2$Q)mx zHiamMmZcv(w}Si|L*UPF8_5;^)9p7dTsVcM1~T^5pe{GXyJSm;4-Ls-nfDtWMHSi z#|RmxoKGD~pIc8$IS87$#R8T{40A$ZV58VxT}ggtUE&}w=_;{LKF>H;+v1I@8nGo< zd9%IVh_qzKoY9$Zp{_u>%1fBC8>@0hnyZhd$XX5lu?jbrzx{F&I5sLn+u)$cu}&|C zs_$kRmN;J5oSPi&%7Gf)VD%7&e&MY$g5$dYW7pP9pX?v@W!}*nbD8tmVgf!628+D- zMzatLOy%i97{2nfc~*;+*~r7?&pa}oNNBL%L^;#ssNxTMhUp8*sM$l;z?+?OA&(`% zb&%gq8{e7gsf+XSQh_sc3Sm{1?k?TefYayiMJRGeWs#kML&L^xLL9|~fbBZECoP}@ zIlD3pb*DYN9(ezglexyE(B2C8MY(g<#mN&{`|XLY%dc^l#8h0bDpvcsVn(p}SDlk9 zDOb}}A44ueD5@(LZ#9C<%|_c&F9*(0ye9Bap#bO-cS)3O2dng^xfWD_@a66n#PJx7 zo23Rf$vKNICaK<^)~QDgziE;oy#I_wF}UG$V-wiXOj}l-%a`qTqtg9q>wx)^)t5)U z)~1#e9*Csbz14$;gsCIH>9bW|L*e_y*8mtevi^#M=4lnzR*XI`(>Q*{u0nIFuevq> z%{U@!J$}=@x2B}ro#vPUCpVZ_KjMG!MMbg3l{p<7e=tXOO>fe0kMLV&RQ8+Rn-kQwaIUIa=4V-8I9gFHq~otgQ+4* z&nf=3odH}v18cyIcOHu>#$1R*zcoL_4PWq5@yaaZ%ucU~p>D#+0qCAwKVjB15$4E> zJuD}w{qB1Nn0uIMfZ150Z}V5FO)=%JDpsS2qH?obIiSiY4)HB?)=<{E{3V@PE4{J7 z5c?5xg3v9M>h6BWrdz`E6{%0c?{+?=B5H?XEJmS<-8+ZzX(-oGx)hNxt4`Nedu_!J zw*o2Fc=5w|&8G=|tk*gjXD>avb4Yrx$8>l@z?(6JsRMem+An?TFD-TnR7vr>p5bio z!&=<}lJq55Ujl?yDCu*gnZl7gR7ErLNa0RDvUf)pce3~W)%+)8dCredRhkqMm1C4X zY4!07JseCh;6L;=pLFTN1&Dkd`o=ctr>9P=6_IQdDB4lkirSDeBP$?9I&pXJ91;|f zmzwF6WCmiR!4rg(%YOyH=p5{Tx0#Bl^jj?v%<;r<*6abB2&n+OgVhYrzVcV5*;+P! z&Lod$k>1zVrIAU7SU5SgY~mXID6+A6a?yZK*8PP3`rTn)5#2jQwShg}`mnj>n%cI$ z^=Meg)ZDh~*oAjM+IY}-eTQsxupoAo?eic@{8f8mwE_{fTuOf>QgCR(e(v=Yq0iW@ z9qKFHy7LasSo%-%`QxQtY#=S)x#Xj=JLNnP8H*`ag}g)h1GiKmwe?9ZB=Q%^zVz8p zD9}3c%kIHyws>lVUDKZP7r@q8=t^Ry`aXp7hmS56m8Li92~t-Qsy@W^l3a;dHRy@x zc1OP}3F1}Js_@OSb&a6Op)Sqzhg~@d7t{b&g=c5i`l|==kzW`;qcT zKAzWnnwr&PRp%%oD%K@4kRjRp;|$5GQ2WG}+N50?Tu>c#|KV?>C75Hg4g$*#8fo0u zo#c`Xl=8ZKJe?b*_Usnc!V4%ReD%?`m=g!CQx*-gC)sX2g59Oqy3B%|H8Eyp+zw{! zkT;~%c}mWmEL{dELf~vGjG$pGR>#1_bunn>i6eKEF$z{)xEyM-w$(KdXQa(_7F>`fTht^87*m!9;pnBi3aBa8EpT2#Gk7AIPVvE8h(^ zEhn!nhZm2@p@5?SSI^4w#Svt7>dOY1#U3WU*$uXmNQO?Gv}#c+#F~fH(>>&I#d?7M zaf)C6qSKgMhky_u{&SGme+yk7Tg@3+a#1TLs}1OjRR%brviMc;=-acB<4pfOp($o$n(`m^^sB?3^X?ZeS@EP6)Ag zB9ol5o{}X%*F}4U#b4O*o$c|C;F8%YvNtOU^6joQ37CSGh=`#jmZ7Nx!F7J|B2cUu zZ1K+dxnQ(^j6&Vx>R|j%spa)?W$y7saUuRyGZPokt;9&2Mzy1A2MV-jDx~jH39Defl6FZLcDp#~Pn+HK>}SSJsD)GfR3Ku#MN66D*q&Z;(s}aj zL99dHJl~_i$1b4Zck>Sz#}m9-X7hxpI<@M&g+eBYdjt={F8Neeh_(JnHdrwS^CEC9(?-?p<}iett785a}?N z+6pNk*&z!ClnYkF8KjnsYX3Q{Y?TB4bI3L=WTWqLOkoIPUEg!_LyE`e<~p-UeE;a7boCp{%)ZhhgG8rryxs#5Tt%2!#!;} zjNT;rW~!_!@NR{)VQv1w{q96A0Zz|(+$l%9+r9~dNbB}5J7XuVefV5=CHzo5UO&g< z`%?cq7OvlyDsz`!Td-?ya{CZRnJu&ymy!%iICb)wvY(E^>S~S~RV#F% zWRaoap{fm{L%#PzOV-_Jjjb@oyL>fJcny=i@F^4g#N;UKh(_o=FSSKigbnQ{-a-!~Y(Ys|E)jvB7UR=^%zB7MNiNuD5*3&7!Malu3WS0xr?z+82ieu42>;*GEh!1ax=LMEcjcwk4w9Y)liHPr(7@ zGLdUj9}=qCDBr7UyWDf#ef0i1=a#(Yi8))8mt|~J({RRze$H@Zn_G%}ZH|ieT2(#! zvSVOF$Vl31alB!yLOdU1h!TvJuE$TKkl=BOT6Gb5$OWim#xXOcz83BK%=THo>KOE$ zcVR8}fMHq`!lwc|tcYeB%uu+swr`!n5n;@%wUz?#Q978&`VEXmkh_7~lb`q~DhH4K zj>WTvcyKB#gUc(y>%)of?tSkOFj}Rwl<&H{K7qDBhWc?Qmo6Ezf0KATFg!;^F858) zkEz6otk~S%0CVB=#)nrwduCkc@NTWTY@k6yf`1Woa$$cW|+4*@9amF`zt(n_q zbo+^E(`-v~D};8_B)6r%-!{+v^TT#9c)V2dmtwg1*jnhYy|Ae_6ae zM)viSwe>=tU%=BycEm|NekFDCoPC;{yAq z2>+6${E=hFk54<0*ujiCHOgat!57wg@0H{e#eWL>ua>|=5Gh@8R#YF{POCBkDQ(}; zy=S*3_Dt!{tthW5;_3|vuK#bk?GIoV-)AK?;57}j-L$LXfI%el@`xoH)@%iEBzf-b zL}W4k-j~FWaRFw3OfkP5J7wO;uNrlevUGz^E7%7?yVDE9{*~~5aK;rfTsKP`>1;xa zquK0RO3KR0Z<@>no)oBQbd_5gdAGOz9#CL$t=? zitSAu!x@^o+LT6Jvg_6|xc5kp(4NUaR^5ktyB6NQZ ztk^Kzp>?0JQLTjZy|9a-ZD;3D&qLV~ur;#mswAz`yxSr_QB-#DSa@sHv5fAvlD)3Q@hT4u< zu`0j5fP^Q%G%H$w2AdiF3iwg-Mmb=XCK)%iw&uR1o}`TA@R!1~TSNZ<)Aq?xLEpo) zi*i@C9uUv&Q63&Kts^d5OyoZYt=G9@M|=+P%Ggg9{Aa_+jED%Sf}CFgM+%;`*L#06 zVD)#gt?btyojn8Q;Hc$qzd)u046guSco`?2|8j_a0EHP(eg%E0_wpXV;!aww-+xm6 zlOR1az4wW?ZvF~*Z1-V#$>Fnv5X<;q7zx2I{JS;%ueeD#3r1 gV8?%z;F-{xqC#tPlhIyf&27NX*wD-Xr|%T?KWEwFCjbBd literal 0 HcmV?d00001 diff --git a/docs/core/lite.md b/docs/core/lite.md new file mode 100644 index 00000000..e33ca1ec --- /dev/null +++ b/docs/core/lite.md @@ -0,0 +1,36 @@ +# GHOSTS LITE + +Generate web requests and file creation activity with minimal resources (good for when participants lack host access). + +## Overview + +### What is GHOSTS LITE? +GHOSTS LITE is a streamlined version of the GHOSTS framework, designed to simulate realistic network activity without the overhead of running actual applications. It programmatically generates web browsing traffic and file creation, emulating real-user actions without launching resource-intensive applications. + +### Purpose +GHOSTS LITE was created to provide an efficient tool for simulating network activity. If you don't give participants access to the host, there is perhaps no need to launch applications like web browsers or office suites — so, GHOSTS LITE reduces resource consumption, including CPU, storage, and memory, simplifying the simulation process and requiring less resources to run. + +### Objectives +- Efficiency: Minimize the resources required to simulate user activity on a network. +- Simplicity: Simplify installation and configuration compared to the full GHOSTS framework. +- Realism: Preserve the ability to generate realistic network activity. + +## Installation + +### Prerequisites +- Ensure you have the .NET framework installed on your system. + +### Download and install ghosts-lite + +1. **Download the latest release** +2. **Extract the downloaded archive** to a directory of your choice. +3. **Open terminal** and navigate to the directory where you extracted ghosts-lite +4. **Run the following command** to start the program: +```bash +dotnet Ghosts.Client.Lite.dll +``` + +## Troubleshooting + +- Ensure the .NET framework is installed with version 8.0 or later. +- If you're experiencing any problems please submit an issue or start a discussion. diff --git a/docs/core/ui.md b/docs/core/ui.md new file mode 100644 index 00000000..2c64d4e6 --- /dev/null +++ b/docs/core/ui.md @@ -0,0 +1,100 @@ +# GHOSTS UI + +A UI for the GHOSTS API, providing interfaces for: + +- Viewing and managing machines and machine groups controlled by the GHOSTS API +- Creating and managing timeLines that we can then send to machines or machine groups +- Viewer for Npcs + +For any machine or machine group, we can use the UI to deploy new timelines, or view activities. For machine groups, we can create or manage the machines in the group. For timelines, we can view the activities in the timeline, or deploy new activities. It also provides a management interface for timelines as well. + +## Install + +The easiest way to run the GHOSTS UI is to use Docker. The following is an example we would add to the ghosts `docker-compose.yml` file that will run the GHOSTS UI and the GHOSTS API together: + +```yaml +ghostsui: + image: dustinupdyke/ghosts-ui + container_name: ghosts-ui + ports: + - '8080:8080' + networks: + - ghosts-network + environment: + GHOSTS_API_URL: http://ghosts-api:5000 +``` + +## Functions + +This first screen is part of the user interface for managing machines within a network simulation or exercise environment, likely related to the GHOSTS framework or a similar system. + +### Machines + +![Machines](../../assets/screens/ui/machines.png) + +Here's an explanation of the various elements seen here: + +New Machine Button: This button allows you to create or add a new machine to the simulation environment. + +Search raw JSON: This input field allows you to perform a search within the machine data using raw JSON queries. It provides a more advanced way to filter or find specific data points. + +Machine List: + +- Id: This column displays the unique identifier for each machine. +- Name: This column displays the name of the machine. In this case, it is labeled as string, which might be a placeholder or default value. +- Status: This column shows the current status of the machine. The status Down indicates that the machine is not currently active or reachable. + +There are also functions to delete the machine, run a particular timeline on that machine, view its activity, or view its JSON representation. + +### Machine Groups + +![Machine Groups](../../assets/screens/ui/machine-groups.png) + +New Machine Group Button: This button allows you to create or add a new machine group to the simulation environment. Machine groups can be used to collectively manage multiple machines with similar roles or functions. + +Machine Group List: + +- Id: This column displays the unique identifier for each machine group. + +- Name: This column displays the name of the machine group. In this case, it is labeled as string-*, which might be a placeholder or default value, suggesting it is a pattern-based naming convention. + +- View Machines (0): This button opens a view to see all the machines currently in this group. The number in parentheses indicates that there are currently no machines in this group. + +- Add Machines (1): This button allows you to add machines to the group. The number in parentheses suggests that there is one machine that could be added or is pending addition to this group. + +More (Three-dot Menu): This button likely provides additional options such as deleting a grouping, running a timeline on a group of machines, viewing their activity or JSON representation. + +### Timelines + +![Timelines](../../assets/screens/ui/timelines.png) + +This screen is part of the user interface for managing timelines within a network simulation or exercise environment. + +- Name: This column displays the name of each timeline. In the example shown, the timeline is named baseline win workstation timeline, which suggests it is a baseline or standard sequence of events for a Windows workstation. + +- Timeline Handlers: This column shows the handler or the specific application/component associated with executing the timeline. In this case, the handler is BrowserFirefox, indicating that this timeline is likely related to actions performed in the Firefox browser. + +Actions (Three-dot Menu): This button provides access to deleting or editing a timeline, or viewing its JSON representation. + + +### NPCs + +![NPCs](../../assets/screens/ui/npcs.png) + +This screen is part of the user interface for managing NPCs (Non-Player Characters) within a network simulation or exercise environment. + +Generate Random NPCs Button: This button allows you to generate NPCs automatically with random attributes. This can be useful for populating the environment quickly with varied NPCs. + +NPC List: + +- Id: This column displays the unique identifier for each NPC. The IDs are represented as UUIDs, which ensure that each NPC has a distinct identifier within the system. + +- First Name: This column shows the first name of the NPC. In this case, the NPCs listed have names like Richard, Collie, Ferdinande, Moyra, and Emylee. + +- Machine: This column likely shows the machine or environment to which the NPC is assigned. This association would define where or how the NPC interacts within the simulation. + +- Campaign: This column indicates the campaign or scenario in which the NPC is participating. All NPCs listed are part of Exercise Season 2024, suggesting they are involved in the same simulation or training exercise. + +- Enclave: This column shows the organization or unit to which the NPC belongs. In this case, all NPCs are part of Brigade Abbott Inc and Sons. + +- Team: This column indicates the specific team within the enclave to which the NPC belongs. All NPCs listed are part of the Engineering team, which might define their role or tasks within the simulation. diff --git a/docs/new.md b/docs/new.md index c8621929..c4d958b7 100644 --- a/docs/new.md +++ b/docs/new.md @@ -3,7 +3,28 @@ ???+ info "Welcome to GHOSTS" Welcome to what's new in the GHOSTS framework. Use this page to review the latest changes. -## Enhancements: +## What's new in 8.2 + +- [GHOSTS now has a UI](core/ui.md)! Manage machines and machine groups, deploy new timelines, and view activities. 😍 +- [GHOSTS Shadows](shadows/index.md) provides integrations with an LLM for the purposes of GHOSTS agents. It provides multiple models for activities, chat, content, social, and whatever else you may need. 👻 +- [GHOSTS LITE](core/lite.md) is a stripped-down version of GHOSTS that is designed to be more lightweight and require less resources to run certain activities in training, exercises, and simulations. 👀 +- Fixes #385 default guid 00000000-0000-0000-0000-000000000000 animator NPC bug. 🐛 +- Fixes #384 client path bug. 🐛 +- Fixes animation cancellation token bugs (chat). 🐛 +- Updated documentation for Animations (Thank you to the SEI's TMR team). 🤙 + +## What's new in 8.1 + +- GHOSTS LITE BETA - when you want to conserve resources needed and participants won't access that machine directly. +- API clean up, particularly machine updates and groups. +- Made sample json objects easier to understand and submit the swagger generated defaults +- API robustness +- MachineGroups cleanup +- Timeline delivery by machine and by group + +## What's new in 8.0 + +### Enhancements: - ANIMATOR and SPECTRE functionality merged into the GHOSTS API proper. Those projects are now archived. 📁 - We have moved off mongo — all that data is now stored in Postgres ❤️. @@ -16,7 +37,7 @@ - API endpoints have been re-organized in a more logical fashion. 🗂️ - Added a favicon. 💅 -## Bug Fixes: +### Bug Fixes: - Updates Grafana docker compose to not use root. 🚫👤 - Cleans up containers and ensures all are amd64 (not arm!). 💻 diff --git a/docs/shadows/index.md b/docs/shadows/index.md new file mode 100644 index 00000000..d0803e1d --- /dev/null +++ b/docs/shadows/index.md @@ -0,0 +1,67 @@ +# GHOSTS SHADOWS + +Shadows provides access to a locally-hosted LLM for various GHOSTS agent purposes. + +It provides multiple interfaces: + +- A REST API for the purposes of ghosts agents +- A UI web interface for testing and demo purposes + +The default API endpoints are: + +- **Activities**: Answers the question of "what should an NPC do next?" +- **Chat**: Provides content for an NPC to chat with a player or other NPC +- **Content**: Provides a richer array of content for the docuements created by NPCs in a range +- **Social**: Provides content for an NPC to post on a social media system such as GHOSTS Socializer + +We suspect there will be many more in the future. + +## Running via Docker + +Typically, the easiest way to manage deployment is to pass the env var "GHOSTS_OLLAMA_URL" into the container. + + EXPORT GHOSTS_OLLAMA_URL=http://localhost:11434 + +(where 5900 is the api port and 7860 is the ui port) +`docker run -d --name shadows -p 5900:5900 -p 7860:7860 dustinupdyke/ghosts-shadows` + +## Running on bare metal + +Standing up the Shadows stack is currently (you'll need three terminal windows. We'll clean this up eventually): + +Get Ollama up and running: + +```bash +cd content-models/content +ollama create content +ollama run content +``` +Now run the two servers (in separate terminals): + +```bash +python api.py +python ui.py +``` + +Eventually ollama will serve multiple models all the time. + +So, this loop for ["content", "social", "chat", "activities"] will be: + +```bash +cd content-models/activities +ollama create activities + +cd content-models/chat +ollama create chat + +cd content-models/social +ollama create social + +ollama serve +``` + +If you want this to be available beyond localhost, you'd need to run: + + OLLAMA_HOST=0.0.0.0:11434 ollama serve + +Now ollama is running all four models concurrently. The API server provides access into each. diff --git a/mkdocs.yml b/mkdocs.yml index 965daefb..d897824a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,6 +67,7 @@ nav: - Quick Start: quickstart.md - Client: - core/client.md + - core/lite.md - Client Handlers: - Basic Configuration: core/handlers.md - Clicks: core/handlers/clicks.md @@ -95,6 +96,8 @@ nav: - Capabilities: - Managing Timelines: core/api/timelines.md - Grafana: core/grafana.md + - UI: + - core/ui.md - Animations: - animator/index.md - Animation Jobs: animator/jobs.md @@ -103,6 +106,8 @@ nav: - content/index.md - Pandora: content/pandora.md - Pandora Social: content/social.md + - Shadows LLM API: + - shadows/index.md - Advanced: - advanced/index.md - Cyclone: advanced/cyclone.md diff --git a/src/Ghosts.Api/docker-compose.yml b/src/Ghosts.Api/docker-compose.yml index c98f6dee..198aa8c3 100644 --- a/src/Ghosts.Api/docker-compose.yml +++ b/src/Ghosts.Api/docker-compose.yml @@ -6,6 +6,15 @@ networks: ghosts-network: driver: bridge services: + ghostsui: + image: dustinupdyke/ghosts-ui + container_name: ghosts-ui + ports: + - '8080:8080' + networks: + - ghosts-network + environment: + GHOSTS_API_URL: http://ghosts-api:5000 postgres: image: postgres container_name: ghosts-postgres diff --git a/src/Ghosts.Client.Lite/README.md b/src/Ghosts.Client.Lite/README.md index 69f81941..ce25dd50 100644 --- a/src/Ghosts.Client.Lite/README.md +++ b/src/Ghosts.Client.Lite/README.md @@ -1,23 +1,19 @@ # GHOSTS LITE -## Background +Generate web requests and file creation activity with minimal resources (good for when participants lack host access). -### What is this? -GHOSTS LITE is a streamlined version of the GHOSTS framework designed to simulate realistic -network without the expense of running actual applications. It generates web browsing traffic -and file creation programatically and is configured to be similar to real-user actions. +## Overview -### Why did we build this? -We built ghosts-lite to provide a more efficient tool for simulating network activity. By -avoiding the need to launch applications like web browsers or office suites, ghosts-lite is -able to reduce the resource consumption and complexity of the simulation, resulting in saving -CPU, storage space, and other memory resources. +### What is GHOSTS LITE? +GHOSTS LITE is a streamlined version of the GHOSTS framework, designed to simulate realistic network activity without the overhead of running actual applications. It programmatically generates web browsing traffic and file creation, emulating real-user actions without launching resource-intensive applications. -### What were the goals? +### Purpose +GHOSTS LITE was created to provide an efficient tool for simulating network activity. If you don't give participants access to the host, there is perhaps no need to launch applications like web browsers or office suites — so, GHOSTS LITE reduces resource consumption, including CPU, storage, and memory, simplifying the simulation process and requiring less resources to run. -- **Efficiency:** Reduce the resources required to simualte user activity on a network. -- **Simplicity:** Simplify installation and configuration compared to the full GHOSTS framework -- **Realism:** Maintain the ability to generate realistic network activity. +### Objectives +- Efficiency: Minimize the resources required to simulate user activity on a network. +- Simplicity: Simplify installation and configuration compared to the full GHOSTS framework. +- Realism: Preserve the ability to generate realistic network activity. ## Installation @@ -35,6 +31,16 @@ CPU, storage space, and other memory resources. - Ensure the .NET framework is installed with version 8.0 or later. - If you're experiencing any problems please submit an issue or start a discussion. +## Contributing + +We welcome contributions! Please follow these steps to contribute to GHOSTS LITE: + +- Fork the repository. +- Create a new branch (git checkout -b feature-branch). +- Make your changes and commit them (git commit -m 'Add feature'). +- Push to the branch (git push origin feature-branch). +- Open a Pull Request. + ## License [DISTRIBUTION STATEMENT A] This material has been approved for public release and unlimited distribution. diff --git a/src/ghosts.shadows/.dockerignore b/src/ghosts.shadows/.dockerignore new file mode 100644 index 00000000..29223e36 --- /dev/null +++ b/src/ghosts.shadows/.dockerignore @@ -0,0 +1,14 @@ +.git +.github +.cache + +*__pycache__* +__pycache__/* + +.dockerignore +Dockerfile + +*venv* + +data/* +docs/* diff --git a/src/ghosts.shadows/.github/workflows/docker.yml b/src/ghosts.shadows/.github/workflows/docker.yml new file mode 100644 index 00000000..da2a45cb --- /dev/null +++ b/src/ghosts.shadows/.github/workflows/docker.yml @@ -0,0 +1,31 @@ +name: Make Docker Image + +on: + workflow_dispatch: + branches: [ main ] + push: + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Login to dockerhub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push Docker images + uses: docker/build-push-action@v2 + with: + tags: dustinupdyke/ghosts-shadows:latest + push: true + context: src/. + file: ./src/Dockerfile diff --git a/src/ghosts.shadows/.gitignore b/src/ghosts.shadows/.gitignore new file mode 100644 index 00000000..66d492ab --- /dev/null +++ b/src/ghosts.shadows/.gitignore @@ -0,0 +1,164 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +docs/* +data/* +embeddings/* \ No newline at end of file diff --git a/src/ghosts.shadows/Dockerfile b/src/ghosts.shadows/Dockerfile new file mode 100644 index 00000000..ac47c492 --- /dev/null +++ b/src/ghosts.shadows/Dockerfile @@ -0,0 +1,34 @@ +# Use an official Python runtime as a parent image +FROM python:3.11.5-slim + +# Set the working directory in the container +WORKDIR /usr/src/app + +# Install system dependencies and ignore invalid signatures +RUN apt-get -o Acquire::Check-Valid-Until=false -o Acquire::AllowInsecureRepositories=true update && apt-get --allow-unauthenticated install -y \ + build-essential \ + libffi-dev \ + curl \ + python3-dev \ + && rm -rf /var/lib/apt/lists/* + +# Copy the current directory contents into the container at /usr/src/app +COPY . . + +# Upgrade pip, setuptools, and wheel +RUN pip install --upgrade pip setuptools wheel + +# Install any needed packages specified in requirements.txt +RUN pip install --no-cache-dir -r src/requirements.txt + +# Install Supervisor +RUN apt-get update && apt-get install -y supervisor && rm -rf /var/lib/apt/lists/* + +# Copy Supervisor config file +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +EXPOSE 5900 +EXPOSE 7860 + +# Run Supervisor when the container starts +CMD ["/usr/bin/supervisord"] diff --git a/src/ghosts.shadows/README.md b/src/ghosts.shadows/README.md new file mode 100644 index 00000000..a24c149e --- /dev/null +++ b/src/ghosts.shadows/README.md @@ -0,0 +1,76 @@ +# GHOSTS SHADOWS + +Shadows provides access to a locally-hosted llm for the purposes of GHOSTS agents. + +It provides multiple interfaces: + +- A REST API for the purposes of ghosts agents +- A UI web interface for testing and demo purposes + +The API endpoints are: + +- **Activities**: Answers the question of "what should an NPC do next?" +- **Chat**: Provides content for an NPC to chat with a player or other NPC +- **Content**: Provides a richer array of content for the docuements created by NPCs in a range +- **Social**: Provides content for an NPC to post on a social media system such as GHOSTS Socializer + +We suspect there will be many more in the future. + +## Running via Docker + +Typically, the easiest way to manage deployment is to pass the env var "GHOSTS_OLLAMA_URL" into the container. + + EXPORT GHOSTS_OLLAMA_URL=http://localhost:11434 + +(where 5900 is the api port and 7860 is the ui port) +`docker run -d --name shadows -p 5900:5900 -p 7860:7860 dustinupdyke/ghosts-shadows` + +## Running on bare metal + +Standing up the Shadows stack is currently (you'll need three terminal windows. We'll clean this up eventually): + +Get Ollama up and running: + +```bash +cd content-models/content +ollama create content +ollama run content +``` +Now run the two servers (in separate terminals): + +```bash +python api.py +python ui.py +``` + +Eventually ollama will serve multiple models all the time. + +So, this loop for ["content", "social", "chat", "activities"] will be: + +```bash +cd content-models/activities +ollama create activities + +cd content-models/chat +ollama create chat + +cd content-models/social +ollama create social + +ollama serve +``` + +If you want this to be available beyond localhost, you'd need to run: + + OLLAMA_HOST=0.0.0.0:11434 ollama serve + +Now ollama is running all four models concurrently. The API server provides access into each. + +## Documentation + +- [GHOSTS Documentation](https://cmu-sei.github.io/GHOSTS/) +- [Don't hesitate to submit issues and feature requests](https://github.com/cmu-sei/GHOSTS/issues) + +## License + +[DISTRIBUTION STATEMENT A] This material has been approved for public release and unlimited distribution. Copyright 2017 Carnegie Mellon University. All Rights Reserved. See LICENSE.md file for terms. \ No newline at end of file diff --git a/src/ghosts.shadows/content-models/activity/Modelfile b/src/ghosts.shadows/content-models/activity/Modelfile new file mode 100644 index 00000000..8c96f6df --- /dev/null +++ b/src/ghosts.shadows/content-models/activity/Modelfile @@ -0,0 +1,11 @@ +FROM mistral + +# set the temperature to 1 [higher is more creative, lower is more coherent] +PARAMETER temperature 1 + +# set the system message +SYSTEM """ +You are a task manager for a group of people in an office. You tell them what to do and why. Some tasks are on the computer, some are not. +Answer very crisply and in short sentences only. Your answers should be in format: +{"activities": ["activity":"place_activity_here","reason":"place_reason_here"]} +""" \ No newline at end of file diff --git a/src/ghosts.shadows/content-models/chat/Modelfile b/src/ghosts.shadows/content-models/chat/Modelfile new file mode 100644 index 00000000..04bd6541 --- /dev/null +++ b/src/ghosts.shadows/content-models/chat/Modelfile @@ -0,0 +1,22 @@ +# FROM nous-hermes + +# PARAMETER temperature 1 +# PARAMETER num_ctx 8192 + +# SYSTEM """ +# You are a surly content marketer who needs to come up with a short but succinct tweet. Make sure to include the appropriate hashtags and links. Sometimes when appropriate, describe a meme that can be included as well. All answers should be in the form of a status update which has a max size of 280 characters. Don't be overly positive or collaborative, and tell people off periodically. +# """ + +FROM llama2-uncensored + +# set the temperature to 1 [higher is more creative, lower is more coherent] +PARAMETER temperature 1 +PARAMETER num_ctx 8192 + +# set the system message +SYSTEM """ +You are the super secret chatbot. You write people's posts to the chat system. +You get straight to the point and don't waste time with small talk. +Be creative with your own responses! +""" + diff --git a/src/ghosts.shadows/content-models/excel_content/Modelfile b/src/ghosts.shadows/content-models/excel_content/Modelfile new file mode 100644 index 00000000..1940406b --- /dev/null +++ b/src/ghosts.shadows/content-models/excel_content/Modelfile @@ -0,0 +1,9 @@ +FROM llama2 +SYSTEM """ +Embrace your role as an excel-sheet creator. +Based on the URL provided, you must produce a text-based 10 rows and 5 columns excel sheet. +Label your row and columns with words based on the URL. DO NOT label them row, column, and cell contents. +Fill in the all the cells with numbers content based on the context of the row and column names generated. +You will reply only the result of excel table as text, and nothing else. +Do NOT return anything but the rows and columns. NO explanations. +""" \ No newline at end of file diff --git a/src/ghosts.shadows/content-models/img_content/Modelfile b/src/ghosts.shadows/content-models/img_content/Modelfile new file mode 100644 index 00000000..ab37e613 --- /dev/null +++ b/src/ghosts.shadows/content-models/img_content/Modelfile @@ -0,0 +1,26 @@ +# Modelfile for creating a Midjourney prompts from a topic +# This prompt was adapted from the original at https://www.greataiprompts.com/guide/midjourney/best-chatgpt-prompt-for-midjourney/ +# Run `ollama create mj -f ./Modelfile` and then `ollama run mj` and enter a topic + +# FROM zephyr +# PARAMETER temperature 0.8 +# PARAMETER top_k 500 +# PARAMETER top_p 0.9 +# SYSTEM """ +# Embrace your role as a creative illustrator. +# Based on the URL provided, you must produce a single paragraph with a multifaceted description of a realistic image, ensuring significant details of the concept and more is represented in your instructions. +# You do not need to write complete sentences but rather short concepts with the following information: the level of detail that should be represented, an artistic style, the ideal color pallete, lighting, mood, perspective, the setting, time of day, weather, the season, the time period, location, materials, patterns, lines, techniques, the medium, the genre, the rendering style. +# Don't include everything and keep the description length under 25 words. +# """ + +FROM zephyr +PARAMETER temperature 0.8 +PARAMETER top_k 500 +PARAMETER top_p 0.9 +SYSTEM """ +Embrace your role as a photographer. +Based on the URL provided, you must produce a single paragraph with a multifaceted description of a realistic image, ensuring significant details of the concept and more is represented in your instructions. +You do not need to write complete sentences but rather short concepts with the following information: +the level of detail that should be represented, a photo style, the ideal color pallete, lighting, mood, perspective, the setting, time of day, weather, the season, the time period, location, materials, the medium, the genre, the rendering style. +Don't include everything and keep the description length under 25 words. +""" \ No newline at end of file diff --git a/src/ghosts.shadows/content-models/lessons/Modelfile b/src/ghosts.shadows/content-models/lessons/Modelfile new file mode 100644 index 00000000..0a21e1d0 --- /dev/null +++ b/src/ghosts.shadows/content-models/lessons/Modelfile @@ -0,0 +1,10 @@ +FROM llama3:70B + +PARAMETER temperature 1 +PARAMETER num_ctx 8192 + +SYSTEM """ +Embrace your role as an lesson plan or lesson module creator. +Based on the information provided, you must produce appropriate sub-topics of things to be taught, knowledge checks and tasks that a user should be able to do for the topic, hands-on lab concepts, and similar for the lesson. +Do NOT return anything but I have asked. NO lengthy explanations into your reasoning please. +""" \ No newline at end of file diff --git a/src/ghosts.shadows/content-models/readme.md b/src/ghosts.shadows/content-models/readme.md new file mode 100644 index 00000000..cd027e11 --- /dev/null +++ b/src/ghosts.shadows/content-models/readme.md @@ -0,0 +1,31 @@ +# Content Models + +This repository contains modelfiles intended for building customized models on ollama.ai. These models enhance various facets of digital interactions and content creation: + +1. **Activity**: Generates simulations of agent activity, encompassing a wide range of behaviors and scenarios. +2. **Chat**: Tailors responses and interactions for agents using chat platforms or posting messages on social media, ensuring relevance and engagement. +3. **Content**: Facilitates the creation of documents and other artifacts, streamlining the process of generating authentic and contextually appropriate content. + +## Getting Started + +As an example for the /activity model: + +```bash +cd activity +ollama create activity +ollama run activity +``` + +To tear down the model, run: + +```bash +rm ~/.ollama/history +ollama rm activity +``` + +And then rebuild: + +```bash +ollama create activity +ollama run activity +``` \ No newline at end of file diff --git a/src/ghosts.shadows/content-models/social/Modelfile b/src/ghosts.shadows/content-models/social/Modelfile new file mode 100644 index 00000000..00e7d585 --- /dev/null +++ b/src/ghosts.shadows/content-models/social/Modelfile @@ -0,0 +1,8 @@ +FROM llama2-uncensored + +PARAMETER temperature 1 +PARAMETER num_ctx 8192 + +SYSTEM """ +You are TweeterGPT, you write short and sweet social media posts. +""" diff --git a/src/ghosts.shadows/content-models/web_content/Modelfile b/src/ghosts.shadows/content-models/web_content/Modelfile new file mode 100644 index 00000000..81a78207 --- /dev/null +++ b/src/ghosts.shadows/content-models/web_content/Modelfile @@ -0,0 +1,26 @@ +# FROM llama2:13B +FROM codellama:13b +# FROM codeup + +# Set the temperature to 1 [higher is more creative, lower is more coherent] +PARAMETER temperature 1 + +# Set the system message to guide the model for generating realistic document content +# SYSTEM """ +# You are DocuGen, specialized in creating realistic and detailed document content tailored to the needs of various professionals. +# Use the following pieces of context to answer the question. +# Focus on understanding the context and requirements of each request to generate content that is both relevant and informative. +# Consider the role, industry, and purpose of the document while maintaining a professional and coherent tone. +# Be adaptable, providing structured and concise content that directly addresses the user's query. +# NEVER, NEVER talk about yourself, DocuGen or your company. +# Don't talk about the thing you wrote, just stick to the topic. +# """ + +SYSTEM """ +You are a webpage content creator specialized in creating realistic and detailed webpage content based on the url of the website given. +Return the webpage content in HTML format +Be adaptable, providing structured and concise content that directly addresses the user's query. +NEVER, NEVER talk about yourself. +Don't talk about the thing you wrote, just stick to the topic. +Don't give me anything but the webpage content. +""" \ No newline at end of file diff --git a/src/ghosts.shadows/scripts/convert-pdf-to-txt.py b/src/ghosts.shadows/scripts/convert-pdf-to-txt.py new file mode 100644 index 00000000..60b122b3 --- /dev/null +++ b/src/ghosts.shadows/scripts/convert-pdf-to-txt.py @@ -0,0 +1,23 @@ +import os +import PyPDF2 + +def pdf_to_txt(pdf_path, txt_path): + with open(pdf_path, 'rb') as pdf_file: + reader = PyPDF2.PdfReader(pdf_file) + with open(txt_path, 'w', encoding='utf-8') as txt_file: + for page_num in range(len(reader.pages)): + page = reader.pages[page_num] + text = page.extract_text() + txt_file.write(text) + +def convert_folder_pdfs_to_txt(folder_path): + for filename in os.listdir(folder_path): + if filename.endswith('.pdf'): + pdf_path = os.path.join(folder_path, filename) + txt_path = os.path.splitext(pdf_path)[0] + '.txt' + pdf_to_txt(pdf_path, txt_path) + print(f"Converted {filename} to text file.") + +if __name__ == "__main__": + folder_path = '../docs' + convert_folder_pdfs_to_txt(folder_path) diff --git a/src/ghosts.shadows/scripts/horde.py b/src/ghosts.shadows/scripts/horde.py new file mode 100644 index 00000000..d69ae297 --- /dev/null +++ b/src/ghosts.shadows/scripts/horde.py @@ -0,0 +1,98 @@ +import requests +import random +import json +import os +import time +from faker import Faker + +fake = Faker() + +def post_data(url, data): + payload = json.dumps({"query": data}) + headers = {'Content-Type': 'application/json'} + response = requests.post(url, headers=headers, data=payload) + return response.text + +def post_social(url, user, data): + payload = f"u={user}&m={data}" + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + + response = requests.post(url, headers=headers, data=payload) + print("========================================================") + print(data) + print(response.text) + +def generate_fake_name(): + first_name = fake.first_name() + last_name = fake.last_name() + return f"{first_name} {last_name}" + + +if __name__ == '__main__': + print(""" + + ('-. .-. .-') .-') _ .-') + ( OO ) / ( OO ). ( OO) ) ( OO ). + ,----. ,--. ,--. .-'),-----. (_)---\_)/ '._ (_)---\_) + ' .-./-') | | | |( OO' .-. '/ _ | |'--...__)/ _ | + | |_( O- )| .| |/ | | | |\ :` `. '--. .--'\ :` `. + | | .--, \| |\_) | |\| | '..`''.) | | '..`''.) +(| | '. (_/| .-. | \ | | | |.-._) \ | | .-._) \ + | '--' | | | | | `' '-' '\ / | | \ / + `------' `--' `--' `-----' `-----' `--' `-----' + + """) + print("A GHOSTS HORDE is coming online...") + + shadow_host = os.getenv("GHOSTS_SHADOWS", "http://localhost:5900/social") + socializer_host = os.getenv("GHOSTS_SOCIALIZER", "http://socializer.com") + delay = os.getenv("GHOSTS_DELAY", 30) + + #does file exist? + if not os.path.exists("horde_users.csv"): + with open("horde_users.csv", "w") as f: + # create a file with 100 random users + # write the header of firstname, lastname, party, strength + f.write("firstname,lastname,party,strength\n") + for i in range(100): + first_name = fake.first_name() + last_name = fake.last_name() + party = random.choice(["Republican", "Democrat"]) + strength = random.randint(1, 100) + f.write(f"{first_name},{last_name},{party},{strength}\n") + f.write("") + + # load the data from the file + with open("horde_users.csv", "r") as f: + data = f.readlines() + # remove the header + data = data[1:] + + with open("scandals.txt", "r") as f: + scandals = f.readlines() + scandal = random.choice(scandals).strip() + print(f"Starting a rumor mill about the following scandal: {scandal}") + + # Loop to continuously send data + while True: + # pick a random record from data + record = random.choice(data) + record = record.strip().split(",") + fake_name = f"{record[0]} {record[1]}" + party = record[2] + partisan_level = record[3] + + prompt = f"I want to tweet about the following scandal in El Marador: `{scandal}`. Write me a tweet, but don't refer to me ever! I am a {party} with a strength of belief in my part of {partisan_level} out of 100. Write me a tweet, but don't refer to me, and don't refer to my strength of belief. If that strength is a low number, then i will be questiong things, if it is high, then i will be trying to convince others to join me." + + #prompt = f"I want to tweet about the critical upcoming election in El Marador. My name is {fake_name}, and I am a {party} with a strength of belief in my part of {partisan_level} out of 100. Write me a tweet, but don't refer to me, and don't refer to my strength of belief. If that strength is a low number, then i will be questiong things, if it is high, then i will be trying to convince others to join me." + print("========================================================") + print(f"{fake_name} {party} {partisan_level}") + + response = post_data(shadow_host, prompt).replace('"', '') + print(response) + + #post_social(socializer_host, fake_name, response) + + # Sleep for a random amount of time + # time.sleep(random.randint(1, delay)) + time.sleep(5) diff --git a/src/ghosts.shadows/scripts/horde_users.csv b/src/ghosts.shadows/scripts/horde_users.csv new file mode 100644 index 00000000..52a14fd5 --- /dev/null +++ b/src/ghosts.shadows/scripts/horde_users.csv @@ -0,0 +1,101 @@ +firstname,lastname,party,strength +Mark,Fernandez,Republican,93 +Tyler,Powell,Democrat,68 +Sylvia,Melendez,Republican,32 +Travis,Smith,Republican,65 +Susan,Johnson,Republican,95 +Gregory,Woods,Republican,56 +Travis,Pitts,Republican,68 +Amber,Roth,Democrat,4 +Caleb,Wilson,Democrat,76 +Mary,Barrett,Republican,6 +Vickie,Hawkins,Democrat,33 +Madison,Wells,Democrat,87 +Jennifer,Livingston,Democrat,4 +Maria,Owens,Republican,19 +Tiffany,Carey,Republican,21 +James,Peters,Democrat,91 +Morgan,Gates,Democrat,4 +Douglas,Horn,Democrat,20 +Michael,Roy,Democrat,23 +Mary,Zhang,Democrat,48 +Samuel,Duffy,Democrat,18 +David,Anderson,Republican,73 +Henry,Graham,Democrat,47 +Nicole,Hicks,Democrat,66 +Nancy,Ibarra,Republican,97 +Stacey,Massey,Democrat,82 +Katherine,Hernandez,Democrat,52 +Amanda,Hobbs,Republican,93 +Taylor,Smith,Republican,95 +Donald,Walton,Republican,16 +James,Arias,Democrat,53 +Brianna,Fletcher,Democrat,47 +Robert,Leon,Republican,68 +Erica,Cobb,Democrat,63 +Sara,Smith,Republican,27 +Alexis,Mccall,Democrat,64 +Lee,Meyers,Republican,26 +Cheryl,Greene,Republican,92 +Marc,Miller,Democrat,25 +Matthew,Jones,Democrat,71 +Luis,Smith,Republican,43 +Terri,West,Republican,67 +Logan,Miller,Republican,1 +Alec,Alexander,Republican,62 +Michael,Woodward,Democrat,16 +Beverly,Fowler,Democrat,17 +Jessica,Pearson,Republican,36 +Spencer,Nguyen,Democrat,74 +Darlene,Wiggins,Democrat,84 +Kimberly,Rivas,Republican,75 +Alison,Keith,Republican,91 +Thomas,Roberts,Republican,56 +Jennifer,Davis,Democrat,83 +Xavier,Collins,Republican,33 +Rachel,Carter,Republican,55 +Diane,Phillips,Republican,15 +Samantha,Rodgers,Democrat,22 +Kerri,Gonzalez,Democrat,99 +Maria,Drake,Democrat,56 +John,Ali,Republican,43 +Jeffrey,Franklin,Republican,89 +Samuel,Carlson,Republican,14 +Jessica,Koch,Republican,15 +Oscar,Marshall,Democrat,78 +Angelica,George,Republican,3 +Diane,Flores,Democrat,41 +Dana,Anderson,Republican,96 +Anna,Montoya,Republican,71 +Janice,Villanueva,Democrat,16 +Amy,Taylor,Republican,100 +Donald,Hale,Republican,87 +Wendy,Leach,Republican,63 +Alfred,Jennings,Republican,96 +Shari,Howell,Democrat,15 +Maxwell,Melton,Democrat,80 +Danny,Day,Republican,41 +Angelica,Brown,Republican,55 +Brooke,Hernandez,Republican,15 +Robert,Wyatt,Democrat,75 +Karen,Lindsey,Democrat,78 +Darlene,Flores,Republican,61 +Vanessa,Jones,Democrat,54 +Ashley,Thomas,Republican,24 +Steven,Stephens,Democrat,100 +Jennifer,Murphy,Democrat,17 +Erica,Cobb,Republican,100 +Sarah,Ortiz,Republican,23 +Jason,Santos,Democrat,95 +Rachel,Irwin,Republican,64 +Adrian,Hamilton,Democrat,32 +Nichole,Harris,Republican,53 +Sarah,Stone,Republican,62 +Dawn,Hernandez,Democrat,8 +Holly,Hill,Republican,55 +Ashley,Richardson,Republican,45 +Leah,Martinez,Republican,22 +Nicole,Ross,Republican,24 +Mark,Walker,Republican,28 +Tammy,Ingram,Republican,9 +Sherri,Bruce,Republican,43 diff --git a/src/ghosts.shadows/scripts/scandals.txt b/src/ghosts.shadows/scripts/scandals.txt new file mode 100644 index 00000000..8a4639e8 --- /dev/null +++ b/src/ghosts.shadows/scripts/scandals.txt @@ -0,0 +1,20 @@ +Financial Embezzlement - Misappropriation of funds from a company or organization. +Bribery and Corruption - Accepting or offering something of value in exchange for influence or action. +Sexual Harassment - Unwelcome sexual advances, requests for sexual favors, and other verbal or physical harassment. +Insider Trading - Trading a public company's stock or other securities based on material, non-public information. +Plagiarism - Taking someone else's work or ideas and passing them off as one's own. +Substance Abuse - Misuse of alcohol or drugs, particularly if it affects professional conduct or public safety. +Tax Evasion - Illegally avoiding paying taxes, often by making fraudulent claims. +Campaign Finance Violations - Illegal actions related to political fundraising. +Professional Misconduct - Actions in a professional setting that violate ethical standards. +Conflicts of Interest - Situations where a person's personal interests could interfere with their professional obligations. +Data Privacy Violations - Mishandling or unauthorized access to sensitive data. +Discrimination - Unfair treatment based on race, gender, age, or other protected characteristics. +Leaking Confidential Information - Unauthorized disclosure of sensitive or classified information. +Nepotism and Favoritism - Giving unfair advantages to friends or relatives in professional settings. +Election Interference - Actions aimed at improperly influencing the outcome of an election. +Health and Safety Violations - Failure to comply with regulations designed to protect health and safety. +Illegal Lobbying - Lobbying without proper registration or exceeding the bounds of legal advocacy. +Corporate Espionage - Illegally obtaining trade secrets or confidential information from competitors. +Academic Dishonesty - Cheating or falsification in an academic environment. +Public Indecency - Acts that are offensive or unacceptable in public settings. diff --git a/src/ghosts.shadows/src/.python-version b/src/ghosts.shadows/src/.python-version new file mode 100644 index 00000000..9ac38041 --- /dev/null +++ b/src/ghosts.shadows/src/.python-version @@ -0,0 +1 @@ +3.11.5 diff --git a/src/ghosts.shadows/src/api.py b/src/ghosts.shadows/src/api.py new file mode 100644 index 00000000..b2393531 --- /dev/null +++ b/src/ghosts.shadows/src/api.py @@ -0,0 +1,231 @@ +from flask import Flask, request, jsonify, render_template, send_file +from langchain.chains import ConversationalRetrievalChain +from langchain.memory import ConversationBufferMemory +from langchain.text_splitter import CharacterTextSplitter +from langchain.prompts import PromptTemplate + +from langchain_community.document_loaders import PyPDFLoader +from langchain_community.document_loaders import Docx2txtLoader +from langchain_community.document_loaders import TextLoader +from langchain_community.vectorstores import Chroma + +from langchain_community.chat_models import ChatOllama +from langchain_community.embeddings import FastEmbedEmbeddings + +from transformers import BertModel, BertTokenizer +from handlers import content_handler, activities_handler, img_handler, lessons_handler + +from jose import jwt, JWTError +import re +import csv +import os +import logging + +# Initialize the logger +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +SECRET_KEY = "Tartans1" +ALGORITHM = "HS256" + +docs = [] +documents = [] + +def filter(content): + content_sentences = re.split(r'([:|.!?])', content) + content_sentences = [(content_sentences[i] + content_sentences[i+1]) for i in range(0, len(content_sentences) - 1, 2)] + for i, sentence in enumerate(content_sentences): + if re.match(r'^[^:]*:', sentence): + sentence = re.sub(r'^[^:]*:', '', sentence) + + if re.match(r'\b\w+,\s*', sentence): + sentence = re.sub(r'\b\w+,\s*', '', sentence) + if sentence: + sentence = sentence[0].upper() + sentence[1:] + + if re.match(r'^\s*\w+!', sentence): + sentence = re.sub(r'^\w+!', '', sentence) + + if re.match(r'^\s*\w+\s\w+!', sentence): + sentence = re.sub(r'^\w+\s\w+!', '', sentence) + + if re.match(r"^\s*.*\b(here is|here are|here's a|here's an|here's the|here's)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(here is|here are|here's a|here's an|here's the|here's)\b.*$", "", sentence, flags = re.IGNORECASE) + + if re.match(r"^\s*.*\b(excel|URL|a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you|to optimize this tweet|provide one or two relevant hashtags for the tweet)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(excel|URL|a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you|to optimize this tweet|provide one or two relevant hashtags for the tweet)\b.*$", "", sentence, flags=re.IGNORECASE) + + if re.match(r"^\s*.*\b(demonstration purposes|random|based on the context|randomly|just examples|hypothetical|may contain|based on the information|based on the provided context)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(demonstration purposes|random|based on the context|randomly|just examples|hypothetical|may contain|based on the information|based on the provided context)\b.*$", "", sentence, flags = re.IGNORECASE) + + # Regex to remove any email addresses + sentence = re.sub(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", "", sentence) + + emoji_pattern = re.compile("[" + u"\U0001F600-\U0001F64F" # emoticons + u"\U0001F300-\U0001F5FF" # symbols & pictographs + u"\U0001F680-\U0001F6FF" # transport & map symbols + u"\U0001F1E0-\U0001F1FF" # flags (iOS) + "]+", flags=re.UNICODE) + sentence = emoji_pattern.sub(r'', sentence) # no emoji + content_sentences[i] = sentence + + content = " ".join(content_sentences) + return content.strip() + +api_app = Flask(__name__) + +def decode_jwt(token: str): + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if not username: + raise ValueError("Invalid token payload") + return username + except JWTError as e: + logger.error(f"JWT Error: {str(e)}") + return None + +@api_app.before_request +def log_request_info(): + token = request.headers.get('Authorization') + if token and token.startswith("Bearer "): + token = token.split("Bearer ")[1] + username = decode_jwt(token) + if username: + logger.debug('Incoming request: %s %s %s', request.method, request.url, request.data) + logger.debug(f'User: {username}, Token: {token}') + else: + logger.debug('Invalid Token') + else: + logger.debug('No token provided') + +@api_app.after_request +def log_response_info(response): + content_type = response.headers.get('Content-Type', '') + if 'image' not in content_type and 'binary' not in content_type: + logger.debug('Outgoing response: %s', response.status) + print("-------------------------------------------------------------------------------------------") + else: + logger.debug('Outgoing response (binary content): %s', response.status) + print("-------------------------------------------------------------------------------------------") + return response + +@api_app.route('/', methods=['GET', 'POST']) +def home(): + return render_template('index.html') + +@api_app.route('/assets/ghosts-shadows.png', methods=['GET']) +def image(): + return send_file("assets/ghosts-shadows.png", mimetype='image/png') + +@api_app.route('/activity', methods=['POST']) +def activity(): + global docs + global documents + logger.info("Processing activity request") + llm = ChatOllama(model="activity", temperature=0.9) + data = request.json + query = data.get('query') + logger.debug("Activity query: %s", query) + response, docs, documents = activities_handler.main(query, docs, documents) + response = llm.invoke(query).content + logger.debug("Activity response: %s", response) + return jsonify(response) + +@api_app.route('/chat', methods=['POST']) +def chat(): + logger.debug(f"Connecting to ollama at {ollama_host} using chat model") + llm = ChatOllama(base_url=ollama_host, model="chat", temperature=0.9) # , base_url="http://0.0.0.0:11434" + data = request.json + query = data.get('query') + response = llm.invoke(query) + logger.debug("Chat response: %s", response.content) + return jsonify(response.content) + +@api_app.route('/content', methods=['POST']) +def content(): + global docs + global documents + response = "" + while len(response) == 0: + web_llm = ChatOllama(base_url=ollama_host, model='web_content', temperature=0.9) + img_llm = ChatOllama(base_url=ollama_host, model='img_content', temperature=0.9) + excel_llm = ChatOllama(base_url=ollama_host, model='excel_content', temperature=0.9) + + data = request.json + query = data.get('query') + logger.debug("Content query: %s", query) + if '.docx' in query or '.pdf' in query: + response, docs, documents = content_handler.main(query, docs, documents) + elif '.png' in query: + prompt = img_llm.invoke(query).content + prompt = filter(prompt) + img_handler.main(prompt) + logger.debug("Image handler response sent") + return send_file("/handlers/my_image.jpg", mimetype = 'image/png') + elif '.xls' in query: + excel = excel_llm.invoke(query).content + excel = filter(excel) + response = excel.split('\n') + with open ('excel.csv', 'w', newline = '') as csvfile: + writer = csv.writer(csvfile, delimiter = ' ', quotechar = '|', quoting = csv.QUOTE_MINIMAL) + for r in response: + if len(r) != 0: + r_list = r.split('| ') + r_list = r_list[1:len(r_list)-1] + r_list = [word.strip() for word in r_list] + writer.writerow(r_list) + logger.debug("Excel handler response sent") + return send_file("excel.csv", mimetype = 'text/csv') + elif 'http' in query: + response = web_llm.invoke(query).content + response = filter(response) + else: + response, docs, documents = content_handler.main(query, docs, documents) + logger.debug("Content response: %s", response) + return jsonify(response) + +@api_app.route('/social', methods=['POST']) +def social(): + llm = ChatOllama(base_url=ollama_host, model="social", temperature=0.9) + data = request.json + query = data.get('query') + logger.debug("Social query: %s", query) + response = llm.invoke(query).content + response = filter(response) + logger.debug("Social response: %s", response) + return jsonify(response) + +@api_app.route('/lessons', methods=['POST']) +def lessons(): + global docs + global documents + data = request.json + query = data.get('query') + logger.debug("Lessons query: %s", query) + response, docs, documents = lessons_handler.main(query, docs, documents) + response = filter(response) + logger.debug("Lessons response: %s", response) + return jsonify(response) + +if __name__ == '__main__': + api_app.logger.setLevel(logging.DEBUG) + + api_app.logger.info(""" + + ('-. .-. .-') .-') _ .-') + ( OO ) / ( OO ). ( OO) ) ( OO ). + ,----. ,--. ,--. .-'),-----. (_)---\_)/ '._ (_)---\_) + ' .-./-') | | | |( OO' .-. '/ _ | |'--...__)/ _ | + | |_( O- )| .| |/ | | | |\ :` `. '--. .--'\ :` `. + | | .--, \| |\_) | |\| | '..`''.) | | '..`''.) +(| | '. (_/| .-. | \ | | | |.-._) \ | | .-._) \ + | '--' | | | | | `' '-' '\ / | | \ / + `------' `--' `--' `-----' `-----' `--' `-----' + +""") + api_app.logger.info("GHOSTS SHADOWS coming online...") + + ollama_host = os.getenv("GHOSTS_OLLAMA_URL", "http://localhost:11434") + api_app.run(host='0.0.0.0', debug=True, port=5900) diff --git a/src/ghosts.shadows/src/assets/ghosts-shadows.png b/src/ghosts.shadows/src/assets/ghosts-shadows.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d8c8b2fc55960c43f88c6df9056593cff6141d GIT binary patch literal 187904 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⪚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%0APcw4 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

    nqx(~ab?y}QPzoO@0q7b^FSjhfc`Ea!BPjc4+ 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 literal 0 HcmV?d00001 diff --git a/src/ghosts.shadows/src/auth.py b/src/ghosts.shadows/src/auth.py new file mode 100644 index 00000000..528c6b77 --- /dev/null +++ b/src/ghosts.shadows/src/auth.py @@ -0,0 +1,185 @@ +from fastapi import FastAPI, Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jose import JWTError, jwt +from passlib.context import CryptContext +from pydantic import BaseModel +from datetime import datetime, timedelta +from typing import Optional +from sqlalchemy import Column, Integer, String, Boolean +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.future import select + +# Secret key to encode the JWT token +SECRET_KEY = "Tartans1" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 30 + +# SQLite database URL +SQLALCHEMY_DATABASE_URL = "sqlite+aiosqlite:///./test.db" + +# Create database connection and engine +engine = create_async_engine(SQLALCHEMY_DATABASE_URL, echo=True) + +# Create sessionmaker for async sessions +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession) + +# Base class for SQLAlchemy models +Base = declarative_base() + +# Define User model +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + username = Column(String, unique=True, index=True) + full_name = Column(String) + hashed_password = Column(String) + disabled = Column(Boolean, default=False) + +# Pydantic model for token response +class Token(BaseModel): + access_token: str + token_type: str + +# Pydantic model for token data +class TokenData(BaseModel): + username: Optional[str] = None + +# Pydantic model for user data in the database +class UserInDB(BaseModel): + username: str + full_name: Optional[str] = None + hashed_password: str + disabled: Optional[bool] = None + +# Password hashing context using bcrypt +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + +# OAuth2 password bearer token configuration +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + +# Create FastAPI instance +app = FastAPI() + +# Event handler to create database tables on startup +@app.on_event("startup") +async def on_startup(): + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + +# Verify plain password against hashed password +def verify_password(plain_password, hashed_password): + return pwd_context.verify(plain_password, hashed_password) + +# Hash a password +def get_password_hash(password): + return pwd_context.hash(password) + +# Retrieve user from database by username +async def get_user(db: AsyncSession, username: str): + result = await db.execute(select(User).where(User.username == username)) + return result.scalars().first() + +# Authenticate user by username and password +async def authenticate_user(db: AsyncSession, username: str, password: str): + user = await get_user(db, username) + if not user: + return False + if not verify_password(password, user.hashed_password): + return False + return user + +# Create a JWT token with an expiration date +def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + +# Dependency to get a database session +async def get_db(): + async with SessionLocal() as session: + yield session + +# Retrieve the current user from the token +async def get_current_user(token: str = Depends(oauth2_scheme), db: AsyncSession = Depends(get_db)): + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = TokenData(username=username) + except JWTError: + raise credentials_exception + user = await get_user(db, username=token_data.username) + if user is None: + raise credentials_exception + return user + +# Check if the current user is active +async def get_current_active_user(current_user: User = Depends(get_current_user)): + if current_user.disabled: + raise HTTPException(status_code=400, detail="Inactive user") + return current_user + +# Endpoint for user login and token generation +@app.post("/token", response_model=Token) +async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db)): + user = await authenticate_user(db, form_data.username, form_data.password) + if not user: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": user.username}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + +# Endpoint for user signup +@app.post("/signup", response_model=Token) +async def signup(form_data: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db)): + user = await get_user(db, form_data.username) + if user: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="User already exists!", + ) + hashed_password = get_password_hash(form_data.password) + new_user = User( + username=form_data.username, + hashed_password=hashed_password, + full_name="", + disabled=False, + ) + async with db as session: + session.add(new_user) + await session.commit() + access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = create_access_token( + data={"sub": form_data.username}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} + +# Endpoint to get the current user's information +@app.get("/users/me/", response_model=UserInDB) +async def read_users_me(current_user: User = Depends(get_current_active_user)): + return current_user + +# Run the app with Uvicorn +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/src/ghosts.shadows/src/flagged/log.csv b/src/ghosts.shadows/src/flagged/log.csv new file mode 100644 index 00000000..b3b8a30a --- /dev/null +++ b/src/ghosts.shadows/src/flagged/log.csv @@ -0,0 +1,2 @@ +Query,Model,Response,flag,username,timestamp +write a quick sentence about life in logistics,content,"""Life in logistics is a dynamic and fast-paced world where the ability to adapt and innovate is crucial for success, with constantly evolving technology and changing customer demands driving the need for agile and proactive professionals.""",,,2024-01-25 17:12:36.452405 diff --git a/src/ghosts.shadows/src/handlers/activities_handler.py b/src/ghosts.shadows/src/handlers/activities_handler.py new file mode 100644 index 00000000..bfa69b2d --- /dev/null +++ b/src/ghosts.shadows/src/handlers/activities_handler.py @@ -0,0 +1,174 @@ +#! /usr/bin/env python3 + +import sys +import os + +from langchain.chains import ConversationalRetrievalChain +from langchain.memory import ConversationBufferMemory +from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter +from langchain.prompts import PromptTemplate + +from langchain_community.document_loaders import PyPDFLoader +from langchain_community.document_loaders import Docx2txtLoader +from langchain_community.document_loaders import TextLoader +from langchain_community.document_loaders import JSONLoader +from langchain_community.vectorstores import Chroma + +from langchain_community.chat_models import ChatOllama +from langchain_community.embeddings import FastEmbedEmbeddings + +from transformers import BertModel, BertTokenizer +import torch +import numpy as np +import logging +from transformers import logging as hf_logging +import re + +hf_logging.set_verbosity_error() +np.set_printoptions(edgeitems=3, infstr='inf', + linewidth=75, nanstr='nan', precision=8, + suppress=False, threshold=6, formatter=None) +os.environ['PYTHONHTTPSVERIFY'] = '0' + +class BertEmbeddings: + def __init__(self, model_name='bert-base-uncased', cache_dir='./data/bert'): + if torch.backends.mps.is_available(): + self.device = torch.device("mps") + print("MPS device found. Using GPU with MPS.") + else: + self.device = torch.device("cpu") + print("MPS device not found. Using CPU.") + + self.tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') + self.model = BertModel.from_pretrained('bert-base-uncased').to(self.device) + + def get_embedding(self, text): + inputs = self.tokenizer(text, return_tensors='pt', max_length=512, truncation=True) + inputs = inputs.to(self.device) + with torch.no_grad(): + outputs = self.model(**inputs) + return outputs.last_hidden_state.mean(dim=1).detach().cpu().numpy() + + def embed_documents(self, documents): + embeddings = [] + for doc in documents: + inputs = self.tokenizer(doc, return_tensors='pt', max_length=512, truncation=True, padding='max_length') + inputs = inputs.to(self.device) + with torch.no_grad(): + outputs = self.model(**inputs) + doc_embedding = outputs.last_hidden_state.mean(dim=1) + doc_embedding_list = doc_embedding[0].detach().cpu().numpy().tolist() # Convert to list + embeddings.append(doc_embedding_list) + return embeddings + + def embed_query(self, query): + inputs = self.tokenizer(query, return_tensors='pt', max_length=512, truncation=True, padding='max_length') + inputs = inputs.to(self.device) + with torch.no_grad(): + outputs = self.model(**inputs) + query_embedding = outputs.last_hidden_state.mean(dim=1) + return query_embedding[0].detach().cpu().numpy().tolist() + +def filter_llm_response(content): + content_sentences = re.split('([\:|\.|!|\?])', content) + content_sentences = [(content_sentences[i] + content_sentences[i+1]) for i in range(0, int(len(content_sentences)/2), 2)] + for i, sentence in enumerate(content_sentences): + if re.match(r'\b\w+,\s*', sentence): + sentence = re.sub(r'\b\w+,\s*', '', sentence) + if sentence: + sentence = sentence[0].upper() + sentence[1:] + + if re.match(r'^\s*\w+!', sentence): + sentence = re.sub(r'^\w+!', '', sentence) + + if re.match(r'^\s*\w+\s\w+!', sentence): + sentence = re.sub(r'^\w+\s\w+!', '', sentence) + + if re.match(r"^\s*.*\b(here is|here are|here\'s a|here\'s an|here\'s the|here\'s)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(here is|here are|here\'s a|here\'s an|here\'s the|here\'s)\b.*$", "", sentence, flags = re.IGNORECASE) + + if re.match(r"^\s*.*\b(a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you|)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you)\b.*$", "", sentence, flags=re.IGNORECASE) + + if re.match(r"^\s*.*\b(hypothetical|may contain|based on the context provided|based on the provided context)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(hypothetical|may contain|based on the context provided|based on the provided context)\b.*$", "", sentence, flags = re.IGNORECASE) + + emoji_pattern = re.compile("[" + u"\U0001F600-\U0001F64F" # emoticons + u"\U0001F300-\U0001F5FF" # symbols & pictographs + u"\U0001F680-\U0001F6FF" # transport & map symbols + u"\U0001F1E0-\U0001F1FF" # flags (iOS) + "]+", flags=re.UNICODE) + sentence = emoji_pattern.sub(r'', sentence) # no emoji + content_sentences[i] = sentence + + content = " ".join(content_sentences) + return content.strip() + +def capitalize_first_word(s): + words = s.split() + if words: + words[0] = words[0].capitalize() + return ' '.join(words) + return s + +def main(query, docs, documents): + # documents = [] + for file in os.listdir("docs"): + if file not in docs: + docs.append(file) + if file.endswith(".pdf"): + pdf_path = "./docs/" + file + loader = PyPDFLoader(pdf_path) + documents.extend(loader.load()) + print(f"Loaded pdf {pdf_path}") + elif file.endswith('.docx') or file.endswith('.doc'): + doc_path = "./docs/" + file + loader = Docx2txtLoader(doc_path) + documents.extend(loader.load()) + print(f"Loaded doc {doc_path}") + elif file.endswith('.txt'): + text_path = "./docs/" + file + loader = TextLoader(text_path) + documents.extend(loader.load()) + print(f"Loaded txt {text_path}") + elif file.endswith('.json'): + json_path = "./json/" + file + loader = JSONLoader(json_path) + documents.extend(loader.load()) + print(f"Loaded json {json_path}") + + text_splitter = RecursiveCharacterTextSplitter(chunk_size=2500, chunk_overlap=0) + documents = text_splitter.split_documents(documents) + + bert_embeddings = BertEmbeddings() + + # vectordb = Chroma.from_documents(documents, embedding=FastEmbedEmbeddings(), persist_directory="./data") + vectordb = Chroma.from_documents(documents, embedding=bert_embeddings, persist_directory="./data") + vectordb.persist() + + prompt_template = PromptTemplate.from_template( + """ + [INST] + Your only task is to absorb the information given to you and then respond to any user input with + your provided information in mind.[/INST] + [INST] Prompt: {question} + Context: {context} + Answer: [/INST] + """ + ) + + pdf_qa = ConversationalRetrievalChain.from_llm( + ChatOllama(model="mistral", temperature=0.9), + vectordb.as_retriever(search_kwargs={"k": 3}), + return_source_documents=True, + verbose=False, + combine_docs_chain_kwargs={"prompt": prompt_template} + ) + + chat_history = [] + result = pdf_qa.invoke( + {"question": query, "chat_history": chat_history}) + filtered_response = filter_llm_response(result["answer"]) + chat_history.append((query, result["answer"])) + return filtered_response, docs, documents \ No newline at end of file diff --git a/src/ghosts.shadows/src/handlers/content_handler.py b/src/ghosts.shadows/src/handlers/content_handler.py new file mode 100644 index 00000000..f1de870c --- /dev/null +++ b/src/ghosts.shadows/src/handlers/content_handler.py @@ -0,0 +1,165 @@ +#! /usr/bin/env python3 + +import sys +import os + +from langchain.chains import ConversationalRetrievalChain +from langchain.memory import ConversationBufferMemory +from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter +from langchain.prompts import PromptTemplate + +from langchain_community.document_loaders import PyPDFLoader +from langchain_community.document_loaders import Docx2txtLoader +from langchain_community.document_loaders import TextLoader +from langchain_community.document_loaders import JSONLoader +from langchain_community.vectorstores import Chroma + +from langchain_community.chat_models import ChatOllama +from langchain_community.embeddings import FastEmbedEmbeddings + +from transformers import BertModel, BertTokenizer +import torch +import numpy as np +import logging +from transformers import logging as hf_logging +import re + +hf_logging.set_verbosity_error() +np.set_printoptions(edgeitems=3, infstr='inf', + linewidth=75, nanstr='nan', precision=8, + suppress=False, threshold=6, formatter=None) +os.environ['PYTHONHTTPSVERIFY'] = '0' + +class BertEmbeddings: + def __init__(self, model_name='bert-base-uncased', cache_dir='./data/bert'): + self.tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') + self.model = BertModel.from_pretrained('bert-base-uncased') + + def get_embedding(self, text): + inputs = self.tokenizer(text, return_tensors='pt', max_length=512, truncation=True) + outputs = self.model(**inputs) + return outputs.last_hidden_state.mean(dim=1).detach().numpy() + + def embed_documents(self, documents): + embeddings = [] + for doc in documents: + inputs = self.tokenizer(doc, return_tensors='pt', max_length=512, truncation=True, padding='max_length') + outputs = self.model(**inputs) + doc_embedding = outputs.last_hidden_state.mean(dim=1) + doc_embedding_list = doc_embedding[0].detach().cpu().numpy().tolist() # Convert to list + embeddings.append(doc_embedding_list) + return embeddings + + def embed_query(self, query): + inputs = self.tokenizer(query, return_tensors='pt', max_length=512, truncation=True, padding='max_length') + outputs = self.model(**inputs) + query_embedding = outputs.last_hidden_state.mean(dim=1) + # Convert to list + return query_embedding[0].detach().cpu().numpy().tolist() + +def filter_llm_response(content): + content_sentences = re.split('([\:|\.|!|\?])', content) + content_sentences = [(content_sentences[i] + content_sentences[i+1]) for i in range(0, int(len(content_sentences)/2), 2)] + for i, sentence in enumerate(content_sentences): + if re.match(r'\b\w+,\s*', sentence): + sentence = re.sub(r'\b\w+,\s*', '', sentence) + if sentence: + sentence = sentence[0].upper() + sentence[1:] + + if re.match(r'^\s*\w+!', sentence): + sentence = re.sub(r'^\w+!', '', sentence) + + if re.match(r'^\s*\w+\s\w+!', sentence): + sentence = re.sub(r'^\w+\s\w+!', '', sentence) + + if re.match(r"^\s*.*\b(here is|here are|here\'s a|here\'s an|here\'s the|here\'s)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(here is|here are|here\'s a|here\'s an|here\'s the|here\'s)\b.*$", "", sentence, flags = re.IGNORECASE) + + if re.match(r"^\s*.*\b(a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you|)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you)\b.*$", "", sentence, flags=re.IGNORECASE) + + if re.match(r"^\s*.*\b(hypothetical|may contain|based on the context provided|based on the provided context)\b.*$", sentence, flags = re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(hypothetical|may contain|based on the context provided|based on the provided context)\b.*$", "", sentence, flags = re.IGNORECASE) + + emoji_pattern = re.compile("[" + u"\U0001F600-\U0001F64F" # emoticons + u"\U0001F300-\U0001F5FF" # symbols & pictographs + u"\U0001F680-\U0001F6FF" # transport & map symbols + u"\U0001F1E0-\U0001F1FF" # flags (iOS) + "]+", flags=re.UNICODE) + sentence = emoji_pattern.sub(r'', sentence) # no emoji + content_sentences[i] = sentence + + content = " ".join(content_sentences) + return content.strip() + +def capitalize_first_word(s): + words = s.split() + if words: + words[0] = words[0].capitalize() + return ' '.join(words) + return s + +def main(query, docs, documents): + # documents = [] + for file in os.listdir("docs"): + if file not in docs: + docs.append(file) + if file.endswith(".pdf"): + pdf_path = "./docs/" + file + loader = PyPDFLoader(pdf_path) + documents.extend(loader.load()) + print(f"Loaded pdf {pdf_path}") + elif file.endswith('.docx') or file.endswith('.doc'): + doc_path = "./docs/" + file + loader = Docx2txtLoader(doc_path) + documents.extend(loader.load()) + print(f"Loaded doc {doc_path}") + elif file.endswith('.txt'): + text_path = "./docs/" + file + loader = TextLoader(text_path) + documents.extend(loader.load()) + print(f"Loaded txt {text_path}") + elif file.endswith('.json'): + json_path = "./json/" + file + loader = JSONLoader(json_path) + documents.extend(loader.load()) + print(f"Loaded json {json_path}") + + text_splitter = RecursiveCharacterTextSplitter(chunk_size=250, chunk_overlap=0) + documents = text_splitter.split_documents(documents) + + # vectordb = Chroma.from_documents(documents, embedding=FastEmbedEmbeddings(), persist_directory="./data") + vectordb = Chroma.from_documents(documents, embedding=BertEmbeddings(), persist_directory="./data") + vectordb.persist() + + prompt_template = PromptTemplate.from_template( + """ + [INST] + You are DocuGen, specialized in creating realistic and detailed document content tailored to the needs of various professionals. + Use the following pieces of context to answer the question. + Focus on understanding the context and requirements of each request to generate content that is both relevant and informative. + Consider the role, industry, and purpose of the document while maintaining a professional and coherent tone. + Be adaptable, providing structured and concise content that directly addresses the user's query. + NEVER, NEVER talk about yourself, DocuGen or your company. + Don't talk about the thing you wrote, just stick to the topic. [/INST] + [INST] Prompt: {question} + Context: {context} + Answer: [/INST] + """ + ) + + pdf_qa = ConversationalRetrievalChain.from_llm( + ChatOllama(model="mistral", temperature=0.9), + vectordb.as_retriever(search_kwargs={"k": 3}), + return_source_documents=True, + verbose=False, + combine_docs_chain_kwargs={"prompt": prompt_template} + ) + + chat_history = [] + result = pdf_qa.invoke( + {"question": query, "chat_history": chat_history}) + filtered_response = filter_llm_response(result["answer"]) + chat_history.append((query, result["answer"])) + return filtered_response, docs, documents \ No newline at end of file diff --git a/src/ghosts.shadows/src/handlers/filters.py b/src/ghosts.shadows/src/handlers/filters.py new file mode 100644 index 00000000..5e176cea --- /dev/null +++ b/src/ghosts.shadows/src/handlers/filters.py @@ -0,0 +1,38 @@ +import os +import re + +def filter_llm_response(content): + content_sentences = re.split('([\:|\.|!|\?])', content) + content_sentences = [(content_sentences[i] + content_sentences[i+1]) for i in range(0, len(content_sentences)//2, 2)] + for i, sentence in enumerate(content_sentences): + if re.match(r'\b\w+,\s*', sentence): + sentence = re.sub(r'\b\w+,\s*', '', sentence) + if sentence: + sentence = sentence[0].upper() + sentence[1:] + + if re.match(r'^\s*\w+!', sentence): + sentence = re.sub(r'^\w+!', '', sentence) + + if re.match(r'^\s*\w+\s\w+!', sentence): + sentence = re.sub(r'^\w+\s\w+!', '', sentence) + + if re.match(r"^\s*.*\b(here is|here are|here's a|here's an|here's the|here's)\b.*$", sentence, flags=re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(here is|here are|here's a|here's an|here's the|here's)\b.*$", "", sentence, flags=re.IGNORECASE) + + if re.match(r"^\s*.*\b(a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you|)\b.*$", sentence, flags=re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(a sentence about|a paragraph about|like to know|I hope|AI-powered|be happy to help|can help you)\b.*$", "", sentence, flags=re.IGNORECASE) + + if re.match(r"^\s*.*\b(hypothetical|may contain|based on the context provided|based on the provided context)\b.*$", sentence, flags=re.IGNORECASE): + sentence = re.sub(r"^\s*.*\b(hypothetical|may contain|based on the context provided|based on the provided context)\b.*$", "", sentence, flags=re.IGNORECASE) + + emoji_pattern = re.compile("[" + u"\U0001F600-\U0001F64F" # emoticons + u"\U0001F300-\U0001F5FF" # symbols & pictographs + u"\U0001F680-\U0001F6FF" # transport & map symbols + u"\U0001F1E0-\U0001F1FF" # flags (iOS) + "]+", flags=re.UNICODE) + sentence = emoji_pattern.sub(r'', sentence) # no emoji + content_sentences[i] = sentence + + content = " ".join(content_sentences) + return content.strip() diff --git a/src/ghosts.shadows/src/handlers/img_handler.py b/src/ghosts.shadows/src/handlers/img_handler.py new file mode 100644 index 00000000..d190036d --- /dev/null +++ b/src/ghosts.shadows/src/handlers/img_handler.py @@ -0,0 +1,10 @@ +from imaginairy.api import imagine +from imaginairy.schema import ImaginePrompt + +def main(prompt): + prompts = [ + ImaginePrompt(prompt), + ] + for result in imagine(prompts): + result.save("my_image.jpg") + return \ No newline at end of file diff --git a/src/ghosts.shadows/src/handlers/lessons_handler.py b/src/ghosts.shadows/src/handlers/lessons_handler.py new file mode 100644 index 00000000..0e62fb5e --- /dev/null +++ b/src/ghosts.shadows/src/handlers/lessons_handler.py @@ -0,0 +1,154 @@ +#! /usr/bin/env python3 + +import os +import pickle +import numpy as np + +from langchain.chains import ConversationalRetrievalChain +from langchain.memory import ConversationBufferMemory +from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter +from langchain.prompts import PromptTemplate + +from langchain_community.document_loaders import PyPDFLoader +from langchain_community.document_loaders import Docx2txtLoader +from langchain_community.document_loaders import TextLoader +from langchain_community.document_loaders import JSONLoader +from langchain_community.vectorstores import Chroma +import torch +from transformers import BertModel, BertTokenizer + +from langchain_community.chat_models import ChatOllama +from langchain_community.embeddings import FastEmbedEmbeddings + +from transformers import AutoModel, AutoTokenizer +from transformers import logging as hf_logging +from handlers.filters import filter_llm_response + +hf_logging.set_verbosity_error() +np.set_printoptions(edgeitems=3, infstr='inf', + linewidth=75, nanstr='nan', precision=8, + suppress=False, threshold=6, formatter=None) +os.environ['PYTHONHTTPSVERIFY'] = '0' + +class BertEmbeddings: + def __init__(self, model_name='bert-base-uncased', cache_dir='./data/bert'): + if torch.backends.mps.is_available(): + self.device = torch.device("mps") + print("MPS device found. Using GPU with MPS.") + else: + self.device = torch.device("cpu") + print("MPS device not found. Using CPU.") + + self.tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') + self.model = BertModel.from_pretrained('bert-base-uncased').to(self.device) + + def get_embedding(self, text): + inputs = self.tokenizer(text, return_tensors='pt', max_length=512, truncation=True) + inputs = inputs.to(self.device) + with torch.no_grad(): + outputs = self.model(**inputs) + return outputs.last_hidden_state.mean(dim=1).detach().cpu().numpy() + + def embed_documents(self, documents): + embeddings = [] + for doc in documents: + inputs = self.tokenizer(doc, return_tensors='pt', max_length=512, truncation=True, padding='max_length') + inputs = inputs.to(self.device) + with torch.no_grad(): + outputs = self.model(**inputs) + doc_embedding = outputs.last_hidden_state.mean(dim=1) + doc_embedding_list = doc_embedding[0].detach().cpu().numpy().tolist() # Convert to list + embeddings.append(doc_embedding_list) + return embeddings + + def embed_query(self, query): + inputs = self.tokenizer(query, return_tensors='pt', max_length=512, truncation=True, padding='max_length') + inputs = inputs.to(self.device) + with torch.no_grad(): + outputs = self.model(**inputs) + query_embedding = outputs.last_hidden_state.mean(dim=1) + return query_embedding[0].detach().cpu().numpy().tolist() + +def capitalize_first_word(s): + words = s.split() + if words: + words[0] = words[0].capitalize() + return ' '.join(words) + return s + +def main(query, docs, documents): + vectordb_path = '../data/vectordb' + vectorized_docs_path = '../data/vectorized_docs.pkl' + + if os.path.exists(vectorized_docs_path): + vectordb = Chroma(persist_directory=vectordb_path, embedding_function=BertEmbeddings()) + with open(vectorized_docs_path, 'rb') as f: + documents = pickle.load(f) + print("Loaded vectorized documents and vector database from disk...") + else: + print("Vectorized documents not found. Vectorizing from disk...") + for file in os.listdir("./docs"): + if file not in docs: + try: + docs.append(file) + if file.endswith(".pdf"): + pdf_path = "./docs/" + file + loader = PyPDFLoader(pdf_path) + documents.extend(loader.load()) + print(f"Loaded pdf {pdf_path}") + elif file.endswith('.docx') or file.endswith('.doc'): + doc_path = "./docs/" + file + loader = Docx2txtLoader(doc_path) + documents.extend(loader.load()) + print(f"Loaded doc {doc_path}") + elif file.endswith('.txt'): + text_path = "./docs/" + file + loader = TextLoader(text_path) + documents.extend(loader.load()) + print(f"Loaded txt {text_path}") + elif file.endswith('.json'): + json_path = "./json/" + file + loader = JSONLoader(json_path) + documents.extend(loader.load()) + print(f"Loaded json {json_path}") + else: + print(f"Document found that does not have a loader {file}") + except Exception as e: + print(f"Error loading {file}: {e}") + + text_splitter = RecursiveCharacterTextSplitter(chunk_size=250, chunk_overlap=0) + documents = text_splitter.split_documents(documents) + + vectordb = Chroma.from_documents(documents, embedding=BertEmbeddings(), persist_directory="../data") + vectordb.persist() + + with open(vectorized_docs_path, 'wb') as f: + pickle.dump(documents, f) + print("Saved vectorized documents to disk.") + + prompt_template = PromptTemplate.from_template( + """ + [INST] + Embrace your role as a lesson plan or lesson module creator. + Based on the information provided, you must produce appropriate sub-topics of things to be taught, knowledge checks and tasks that a user should be able to do for the topic, hands-on lab concepts, and similar for the lesson. + Do NOT return anything but what I have asked. NO lengthy explanations into your reasoning please. + [/INST] + [INST] Prompt: {question} + Context: {context} + Answer: [/INST] + """ + ) + + pdf_qa = ConversationalRetrievalChain.from_llm( + ChatOllama(model="lessons", temperature=0.9), + vectordb.as_retriever(search_kwargs={"k": 3}), + return_source_documents=True, + verbose=False, + combine_docs_chain_kwargs={"prompt": prompt_template} + ) + + chat_history = [] + result = pdf_qa.invoke({"question": query, "chat_history": chat_history}) + filtered_response = filter_llm_response(result["answer"]) + chat_history.append((query, result["answer"])) + return filtered_response, docs, documents diff --git a/src/ghosts.shadows/src/readme.md b/src/ghosts.shadows/src/readme.md new file mode 100644 index 00000000..b83f7ede --- /dev/null +++ b/src/ghosts.shadows/src/readme.md @@ -0,0 +1,2 @@ +# GHOSTS SHADOWS + diff --git a/src/ghosts.shadows/src/requirements.txt b/src/ghosts.shadows/src/requirements.txt new file mode 100644 index 00000000..79362c78 --- /dev/null +++ b/src/ghosts.shadows/src/requirements.txt @@ -0,0 +1,18 @@ +Flask==3.0.2 +gradio==4.29.0 +imaginairy==14.2.0 +langchain==0.1.14 +langchain_community==0.0.31 +numpy==1.25.2 +Requests==2.31.0 +torch==2.1.0 +transformers==4.30.2 +docx2txt==0.8 +pypdf==4.1.0 +chromadb==0.4.24 +tqdm +pipdeptree +watchdog +python-jose +passlib +aiosqlite diff --git a/src/ghosts.shadows/src/templates/index.html b/src/ghosts.shadows/src/templates/index.html new file mode 100644 index 00000000..e74c9de9 --- /dev/null +++ b/src/ghosts.shadows/src/templates/index.html @@ -0,0 +1,22 @@ + + + + GHOSTS SHADOWS + + + + +

    API for accessing NPC data from a locally-hosted LLM

    +

    Endpoints

    +
      +
    • Activities
    • +
    • Chat
    • +
    • Content
    • +
    • Social
    • +
    +

    A UI should be running on http://localhost:7860

    + + \ No newline at end of file diff --git a/src/ghosts.shadows/src/test.db b/src/ghosts.shadows/src/test.db new file mode 100644 index 0000000000000000000000000000000000000000..36177fd30c58472a01be63f91487ed89059f065f GIT binary patch literal 16384 zcmeI$KX21O7zXe=yJ?z8t=X(@Cp80+kfW4_7O~WcEn+pX)2kDjGDI$RRMY%%;sgQ< zDj$fE4~050l!XD?iKQSU7>d;8Iq7`%-TBe$-{w0zZTK^f^~ckpGh(4Y@_{*3fO8?t-v_ahYLL_VFdo-Xy00Izz00bZa0SG_<0uX=z1pXmV z6*uKQnRfk=>n;36ZytKnu;;tUxKZP}YU|7}HT|5etuo7G$qx3|cZ;uuO}Qk~Prqlx z>mz6ACHurxQrk36+kXV6Ti0UKsp5@7v$8DH&o5@qX*ccXG` z{iV*CY1zzdHyTe^K9}aPj>>CwmB(}a`C!nCOI)A4a>6Um?FCL4z8_EB^(EI2;}Tp} zwXBA&nsG*p8%>pW*@@mwEb_(p-&~NciS#wPpg{lv5P$##AOHafKmY;|fB*y_a9;sK z$dcXdo6J^pTru-Uh5gGydB1Q`JMj1$ZNj-fcDsGe2p6NKb)=R~f>-6Cr&T&iNnLb? zVcqu5E81aQ;~l3?vqX-gg7G-`uu3|rcr$zAC~d#38XpgN?I1Ab)^KuW2d#^D6V2@K zw=GLAw?cC?y;c^_pEb)$KKd#_x+T)B^y9uCi1#4?0SG_<0uX=z1Rwwb2tWV=5O{cj zytqr3XAi=bDCd&1gXRDK9g%)YcMo47Du4h4AOHafKmY;|fB*y_009U<;Qt9^L`nrg H6mz*>r;e>m literal 0 HcmV?d00001 diff --git a/src/ghosts.shadows/src/ui.py b/src/ghosts.shadows/src/ui.py new file mode 100644 index 00000000..671582a4 --- /dev/null +++ b/src/ghosts.shadows/src/ui.py @@ -0,0 +1,103 @@ +import gradio as gr +import requests +import os + +# URLs for authentication and shadows services, defaulting to local if environment variables are not set +auth_host = os.getenv("AUTH_URL", "http://0.0.0.0:8000") +shadows_host = os.getenv("SHADOWS_URL", "http://0.0.0.0:5900") + +# Variable to store the JWT token +token = None + +# Function to handle user login +def login(username, password): + global token + response = requests.post(f"{auth_host}/token", data={"username": username, "password": password}) + if response.status_code == 200: + token = response.json().get("access_token") + return "Login successful", True + else: + return f"Login failed: {response.json().get('detail', 'Unknown error')}", False + +# Function to handle user signup +def signup(username, password): + global token + response = requests.post(f"{auth_host}/signup", data={"username": username, "password": password}) + if response.status_code == 200: + token = response.json().get("access_token") + return "Signup successful", True + else: + return f"Signup failed: {response.json().get('detail', 'Unknown error')}", False + +# Function to query the API with the given input text and model +def query_api(input_text, model): + if not token: + return "Please log in to access." + headers = {"Authorization": f"Bearer {token}"} + response = requests.post(f"{shadows_host}/{model}", json={'query': input_text}, headers=headers) + return response.json() + +# CSS to hide the 'Clear' button +css = """ +button:contains('Clear') { + display: none !important; +} +""" + +# Available model options for querying the API +model_options = ["activity", "chat", "content", "social"] + +# Function to authenticate a user based on the authentication type (login or signup) +def authenticate(username, password, auth_type): + if auth_type == "login": + status, logged_in = login(username, password) + else: + status, logged_in = signup(username, password) + + return status, logged_in + +# Create Gradio interface for querying the API +ux_interface = gr.Interface( + fn=query_api, + inputs=[gr.Textbox(label="Query"), gr.Dropdown(label="Model", choices=model_options, value="content")], + outputs=gr.Textbox(label="Response"), + description=f"", + flagging_options=None, # This removes the flagging functionality + css=css # This applies the custom CSS to hide the Clear button +) + +# Create Gradio Blocks for the UI +with gr.Blocks(css=css) as demo: + with gr.Tab("Authenticate"): + with gr.Row(): + with gr.Column(scale=1): + gr.Image(value=f"{shadows_host}/assets/ghosts-shadows.png", width=350, height=350) + with gr.Column(scale=2): + username = gr.Textbox(label="Username") + password = gr.Textbox(label="Password", type="password") + auth_type = gr.Radio(["login", "signup"], label="New or existing User?") + status = gr.Textbox(label="Status", interactive=False) + + # Function to handle authentication and update the status + def handle_auth(username, password, auth_type): + status, logged_in = authenticate(username, password, auth_type) + return status, logged_in + + auth_output = gr.Button("Submit").click(handle_auth, inputs=[username, password, auth_type], outputs=[status]) + + with gr.Tab("Query API"): + # Function to query the API from the UI, ensuring the user is logged in + def query_api_ui(query_text, model_choice): + if token: + return query_api(query_text, model_choice) + else: + return "Please log in to access the Query API." + + query_text = gr.Textbox(label="Query") + model_choice = gr.Dropdown(label="Model", choices=model_options, value="content") + response = gr.Textbox(label="Response", interactive=False) + + query_output = gr.Button("Submit").click(query_api_ui, inputs=[query_text, model_choice], outputs=[response]) + +# Launch the Gradio app +demo.launch(share=False, server_name='0.0.0.0') diff --git a/src/ghosts.shadows/supervisord.conf b/src/ghosts.shadows/supervisord.conf new file mode 100644 index 00000000..160294c8 --- /dev/null +++ b/src/ghosts.shadows/supervisord.conf @@ -0,0 +1,29 @@ +[supervisord] +nodaemon=true + +[program:api] +command=python3 /usr/src/app/src/api.py +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:ui] +command=python3 /usr/src/app/src/ui.py +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:auth] +command=python3 /usr/src/app/src/auth.py +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 diff --git a/src/ghosts.ui/.dockerignore b/src/ghosts.ui/.dockerignore new file mode 100644 index 00000000..b7dce17b --- /dev/null +++ b/src/ghosts.ui/.dockerignore @@ -0,0 +1,3 @@ +node_modules/ +.next/ +sqlite.db \ No newline at end of file diff --git a/src/ghosts.ui/.eslintrc.json b/src/ghosts.ui/.eslintrc.json new file mode 100644 index 00000000..72cc705c --- /dev/null +++ b/src/ghosts.ui/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/src/ghosts.ui/.gitignore b/src/ghosts.ui/.gitignore new file mode 100644 index 00000000..84f5c5d0 --- /dev/null +++ b/src/ghosts.ui/.gitignore @@ -0,0 +1,45 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.tsbuildinfo + +#db +sqlite.db +localdb + + +# ghosts +_db +_g diff --git a/src/ghosts.ui/Dockerfile b/src/ghosts.ui/Dockerfile new file mode 100644 index 00000000..f7b8bcf7 --- /dev/null +++ b/src/ghosts.ui/Dockerfile @@ -0,0 +1,67 @@ +FROM node:20-alpine AS base + +# libc6-compat for nextjs. This is needed at runtime so its fine to have in the base container +RUN apk add --no-cache libc6-compat + + +# Stage for installing deps +FROM base AS deps +WORKDIR /app + +# Deps needed to build the Better-sqlite3 package. These only exist in the deps stage so no bloat in the final image +RUN apk add --no-cache python3 make gcc g++ + +COPY package.json package-lock.json ./ +RUN npm ci + +RUN npm install sharp + +# Stage for building the nextjs app +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +RUN npm run build + +# Create SQLite database and correct tables +RUN npx drizzle-kit push:sqlite + + +# Final stage to run the app +FROM base AS runner + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# Make user the owner of the /app directory because SQLite needs to create journal files to function +RUN mkdir app +RUN chown -R nextjs app + +WORKDIR /app + +ENV NODE_ENV production + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=builder --chown=nextjs:nodejs /app/public ./public + +# Copy database file to runner and ensure that the nextjs user has write access +COPY --from=builder --chown=nextjs:nodejs /app/sqlite.db ./sqlite.db +RUN chmod 777 sqlite.db + +USER nextjs + +EXPOSE 8080 + +ENV PORT 8080 + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +CMD HOSTNAME="0.0.0.0" node server.js \ No newline at end of file diff --git a/src/ghosts.ui/README.md b/src/ghosts.ui/README.md new file mode 100644 index 00000000..adff6922 --- /dev/null +++ b/src/ghosts.ui/README.md @@ -0,0 +1,44 @@ +# GHOSTS UI + +A UI for the [GHOSTS](https://github.com/cmu-sei/GHOSTS) API implemented as a Next.js web app. + +## Overview + +The GHOSTS UI is a web application that provides a user interface for the GHOSTS API. The GHOSTS UI is implemented as a Next.js web app that is served by a Node.js server. The GHOSTS UI is a single page application that uses the GHOSTS API to interact with the GHOSTS backend. It provides support for the following features: + +- Machines +- Machine Groups +- TimeLines +- Npcs + +For any machine or machine group, we can use the UI to deploy new timelines, or view activities. For machine groups, we can create or manage the machines in the group. For timelines, we can view the activities in the timeline, or deploy new activities. It also provides a management interface for timelines as well. + +## Install + +An easy way to run the GHOSTS UI is to use Docker. The following is an example we would add to the ghosts `docker-compose.yml` file that will run the GHOSTS UI and the GHOSTS API together: + +```yaml +ghostsui: + image: dustinupdyke/ghosts-ui + container_name: ghosts-ui + ports: + - '8080:8080' + networks: + - ghosts-network + environment: + GHOSTS_API_URL: http://ghosts-api:5000 +``` + +## Documentation + +- [GHOSTS Documentation](https://cmu-sei.github.io/GHOSTS/) +- [Don't hesitate to submit issues and feature requests](https://github.com/cmu-sei/GHOSTS/issues) + +## Thanks + +Many thanks to the UI team for their hard work on this project. You know who you are — stay safe out there. + +## License + +[DISTRIBUTION STATEMENT A] This material has been approved for public release and unlimited distribution. +Copyright 2017 Carnegie Mellon University. All Rights Reserved. See LICENSE.md file for terms. diff --git a/src/ghosts.ui/biome.json b/src/ghosts.ui/biome.json new file mode 100644 index 00000000..6c46a02d --- /dev/null +++ b/src/ghosts.ui/biome.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.0/schema.json", + "files": { + "ignore": [ + "node_modules/**", + ".next/**", + "src/components/ui/**", + "_db", + "_g" + ] + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedImports": "warn" + } + } + } +} diff --git a/src/ghosts.ui/components.json b/src/ghosts.ui/components.json new file mode 100644 index 00000000..9c2da15d --- /dev/null +++ b/src/ghosts.ui/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/src/ghosts.ui/docker-compose.yml b/src/ghosts.ui/docker-compose.yml new file mode 100644 index 00000000..57b92612 --- /dev/null +++ b/src/ghosts.ui/docker-compose.yml @@ -0,0 +1,69 @@ +# docker-compose up -d +# -f compose-api.yml (if you want a custom file) + +version: '3.2' +networks: + ghosts-network: + driver: bridge +services: + # Service for the ui + ghostsui: + image: dustinupdyke/ghosts-ui + container_name: ghosts-ui + ports: + - '8080:8080' + networks: + - ghosts-network + environment: + GHOSTS_API_URL: http://ghosts-api:5000 + # persist the timelines in the sqlite db + # volumes: + # - ./sqlite.db:/app/sqlite.db + # From here on this is the basic GHOSTS docker compose + # postgres: + # image: postgres + # container_name: ghosts-postgres + # environment: + # POSTGRES_DB: ghosts + # POSTGRES_USER: ghosts + # POSTGRES_PASSWORD: scotty@1 + # volumes: + # - ./_db:/var/lib/postgresql/data + # logging: + # options: + # max-size: '100m' + # max-file: '5' + # ports: + # - '5432:5432' + # healthcheck: + # test: ['CMD-SHELL', 'pg_isready -U ghosts'] + # interval: 10s + # timeout: 5s + # retries: 10 + # networks: + # - ghosts-network + # restart: always + # ghosts-api: + # image: dustinupdyke/ghosts:latest + # container_name: ghosts-api + # depends_on: + # - postgres + # ports: + # - '5000:5000' + # networks: + # - ghosts-network + # restart: always + # grafana: + # image: grafana/grafana + # container_name: ghosts-grafana + # depends_on: + # - postgres + # ports: + # - '3000:3000' + # networks: + # - ghosts-network + # restart: always + # volumes: + # - ./_g:/var/lib/grafana + # user: root + \ No newline at end of file diff --git a/src/ghosts.ui/drizzle.config.ts b/src/ghosts.ui/drizzle.config.ts new file mode 100644 index 00000000..b144593e --- /dev/null +++ b/src/ghosts.ui/drizzle.config.ts @@ -0,0 +1,10 @@ +import { DB_URL } from "@/lib/db"; +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + schema: "./src/lib/db.ts", + driver: "better-sqlite", + dbCredentials: { + url: DB_URL, + }, +}); diff --git a/src/ghosts.ui/next-env.d.ts b/src/ghosts.ui/next-env.d.ts new file mode 100644 index 00000000..4f11a03d --- /dev/null +++ b/src/ghosts.ui/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/src/ghosts.ui/next.config.mjs b/src/ghosts.ui/next.config.mjs new file mode 100644 index 00000000..72ff9cba --- /dev/null +++ b/src/ghosts.ui/next.config.mjs @@ -0,0 +1,7 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // Export as a standalone nodejs server for use within a Docker container + output: "standalone", +}; + +export default nextConfig; diff --git a/src/ghosts.ui/package-lock.json b/src/ghosts.ui/package-lock.json new file mode 100644 index 00000000..eb0ab0ac --- /dev/null +++ b/src/ghosts.ui/package-lock.json @@ -0,0 +1,9291 @@ +{ + "name": "ghostsui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ghostsui", + "version": "0.1.0", + "license": "ISC", + "dependencies": { + "@hookform/resolvers": "^3.3.4", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-tooltip": "^1.0.7", + "@tanstack/react-table": "^8.16.0", + "better-sqlite3": "^9.5.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "date-fns": "^3.6.0", + "drizzle-orm": "^0.30.8", + "lucide-react": "^0.368.0", + "next": "^14.2.1", + "next-themes": "^0.3.0", + "react": "^18", + "react-day-picker": "^8.10.1", + "react-dom": "^18", + "react-hook-form": "^7.51.3", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7", + "vaul": "^0.9.0", + "zod": "3.22.4" + }, + "devDependencies": { + "@biomejs/biome": "1.7.0", + "@types/better-sqlite3": "^7.6.9", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "drizzle-kit": "^0.20.14", + "eslint": "^8", + "eslint-config-next": "14.2.1", + "openapi-zod-client": "^1.18.0", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "dev": true + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz", + "integrity": "sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "9.0.6", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "ajv": "^8.6.3", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@apidevtools/swagger-parser/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@apidevtools/swagger-parser/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@apidevtools/swagger-parser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.8.tgz", + "integrity": "sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.8.tgz", + "integrity": "sha512-6AWcmZC/MZCO0yKys4uhg5NlxL0ESF3K6IAaoQ+xSXvPyPyxNWRafP+GDbI88Oh68O7QkJgmEtedWPM9U0pZNg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8", + "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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.8.tgz", + "integrity": "sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.8", + "@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.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@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-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.8.tgz", + "integrity": "sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-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-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@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==", + "dev": true, + "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==", + "dev": true, + "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.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "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==", + "dev": true, + "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/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.8.tgz", + "integrity": "sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA==", + "dev": true, + "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/@biomejs/biome": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.0.tgz", + "integrity": "sha512-mejiRhnAq6UrXtYvjWJUKdstcT58n0/FfKemFf3d2Ou0HxOdS88HQmWtQ/UgyZvOEPD572YbFTb6IheyROpqkw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.7.0", + "@biomejs/cli-darwin-x64": "1.7.0", + "@biomejs/cli-linux-arm64": "1.7.0", + "@biomejs/cli-linux-arm64-musl": "1.7.0", + "@biomejs/cli-linux-x64": "1.7.0", + "@biomejs/cli-linux-x64-musl": "1.7.0", + "@biomejs/cli-win32-arm64": "1.7.0", + "@biomejs/cli-win32-x64": "1.7.0" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.0.tgz", + "integrity": "sha512-12TaeaKHU4SAZt0fQJ2bYk1jUb4foope7LmgDE5p3c0uMxd3mFkg1k7G721T+K6UHYULcSOQDsNNM8DhYi8Irg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.7.0.tgz", + "integrity": "sha512-6Qq1BSIB0cpp0cQNqO/+EiUV7FE3jMpF6w7+AgIBXp0oJxUWb2Ff0RDZdO9bfzkimXD58j0vGpNHMGnCcjDV2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.7.0.tgz", + "integrity": "sha512-GwSci7xBJ2j1CrdDXDUVXnUtrvypEz/xmiYPpFeVdlX5p95eXx+7FekPPbJfhGGw5WKSsKZ+V8AAlbN+kUwJWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.7.0.tgz", + "integrity": "sha512-pwIY80nU7SAxrVVZ6HD9ah1pruwh9ZqlSR0Nvbg4ZJqQa0POhiB+RJx7+/1Ml2mTZdrl8kb/YiwQpD16uwb5wg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.7.0.tgz", + "integrity": "sha512-1y+odKQsyHcw0JCGRuqhbx7Y6jxOVSh4lGIVDdJxW1b55yD22DY1kcMEfhUte6f95OIc2uqfkwtiI6xQAiZJdw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.7.0.tgz", + "integrity": "sha512-KzCA0mW4LSbCd7XZWaEJvTOTTBjfJoVEXkfq1fsXxww1HB+ww5PGMbhbIcbYCsj2CTJUifeD5hOkyuBVppU1xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.7.0.tgz", + "integrity": "sha512-AvLDUYZBpOUFgS/mni4VruIoVV3uSGbKSkZQBPXsHgL0w4KttLll3NBrVanmWxOHsom6C6ocHLyfAY8HUc8TXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.7.0.tgz", + "integrity": "sha512-Pylm00BAAuLVb40IH9PC17432BTsY8K4pSUvhvgR1eaalnMaD6ug9SYJTTzKDbT6r24MPAGCTiSZERyhGkGzFQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "dev": true, + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", + "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==", + "dependencies": { + "@floating-ui/utils": "^0.2.4" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz", + "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.4" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", + "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" + }, + "node_modules/@hono/node-server": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.12.0.tgz", + "integrity": "sha512-e6oHjNiErRxsZRZBmc2KucuvY3btlO/XPncIpP2X75bRdTilF9GLjm3NHvKKunpJbbJJj31/FoPTksTf8djAVw==", + "dev": true, + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.2.2.tgz", + "integrity": "sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==", + "dev": true, + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.19.1" + } + }, + "node_modules/@hookform/resolvers": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", + "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/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/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@liuli-util/fs-extra": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@liuli-util/fs-extra/-/fs-extra-0.1.0.tgz", + "integrity": "sha512-eaAyDyMGT23QuRGbITVY3SOJff3G9ekAAyGqB9joAnTBmqvFN+9a1FazOdO70G6IUqgpKV451eBHYSRcOJ/FNQ==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^9.0.13", + "fs-extra": "^10.1.0" + } + }, + "node_modules/@next/env": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.1.tgz", + "integrity": "sha512-qsHJle3GU3CmVx7pUoXcghX4sRN+vINkbLdH611T8ZlsP//grzqVW87BSUgOZeSAD4q7ZdZicdwNe/20U2janA==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.1.tgz", + "integrity": "sha512-Fp+mthEBjkn8r9qd6o4JgxKp0IDEzW0VYHD8ZC05xS5/lFNwHKuOdr2kVhWG7BQCO9L6eeepshM1Wbs2T+LgSg==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.1.tgz", + "integrity": "sha512-kGjnjcIJehEcd3rT/3NAATJQndAEELk0J9GmGMXHSC75TMnvpOhONcjNHbjtcWE5HUQnIHy5JVkatrnYm1QhVw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.1.tgz", + "integrity": "sha512-dAdWndgdQi7BK2WSXrx4lae7mYcOYjbHJUhvOUnJjMNYrmYhxbbvJ2xElZpxNxdfA6zkqagIB9He2tQk+l16ew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.1.tgz", + "integrity": "sha512-2ZctfnyFOGvTkoD6L+DtQtO3BfFz4CapoHnyLTXkOxbZkVRgg3TQBUjTD/xKrO1QWeydeo8AWfZRg8539qNKrg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.1.tgz", + "integrity": "sha512-jazZXctiaanemy4r+TPIpFP36t1mMwWCKMsmrTRVChRqE6putyAxZA4PDujx0SnfvZHosjdkx9xIq9BzBB5tWg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.1.tgz", + "integrity": "sha512-VjCHWCjsAzQAAo8lkBOLEIkBZFdfW+Z18qcQ056kL4KpUYc8o59JhLDCBlhg+hINQRgzQ2UPGma2AURGOH0+Qg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.1.tgz", + "integrity": "sha512-7HZKYKvAp4nAHiHIbY04finRqjeYvkITOGOurP1aLMexIFG/1+oCnqhGogBdc4lao/lkMW1c+AkwWSzSlLasqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.1.tgz", + "integrity": "sha512-YGHklaJ/Cj/F0Xd8jxgj2p8po4JTCi6H7Z3Yics3xJhm9CPIqtl8erlpK1CLv+HInDqEWfXilqatF8YsLxxA2Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.1.tgz", + "integrity": "sha512-o+ISKOlvU/L43ZhtAAfCjwIfcwuZstiHVXq/BDsZwGqQE0h/81td95MPHliWCnFoikzWcYqh+hz54ZB2FIT8RA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.1.tgz", + "integrity": "sha512-GmRoTiLcvCLifujlisknv4zu9/C4i9r0ktsA8E51EMqJL4bD4CpO7lDYr7SrUxCR0tS4RVcrqKmCak24T0ohaw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.0.tgz", + "integrity": "sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collapsible": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.1.tgz", + "integrity": "sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz", + "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.0.tgz", + "integrity": "sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz", + "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", + "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", + "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", + "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz", + "integrity": "sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", + "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", + "dev": true + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.19.2.tgz", + "integrity": "sha512-itoSIAkA/Vsg+bjY23FSemcTyPhc5/1YjYyaMsr9QSH/cdbZnQxHVWrpWn0Sp2BWN71qkzR7e5ye8WuMmwyOjg==", + "dependencies": { + "@tanstack/table-core": "8.19.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.19.2.tgz", + "integrity": "sha512-KpRjhgehIhbfH78ARm/GJDXGnpdw4bCg3qas6yjWSi7czJhI/J6pWln7NHtmBkGE9ZbohiiNtLqwGzKmBfixig==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.11", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.11.tgz", + "integrity": "sha512-i8KcD3PgGtGBLl3+mMYA8PdKkButvPyARxA7IQAd6qeslht13qxb1zzO8dRCtE7U3IoJS782zDBAeoKiM695kg==", + "devOptional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "devOptional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "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==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "devOptional": true, + "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==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@zodios/core": { + "version": "10.9.6", + "resolved": "https://registry.npmjs.org/@zodios/core/-/core-10.9.6.tgz", + "integrity": "sha512-aH4rOdb3AcezN7ws8vDgBfGboZMk2JGGzEq/DtW65MhnRxyTGRuLJRWVQ/2KxDgWvV2F5oTkAS+5pnjKbl0n+A==", + "dev": true, + "peerDependencies": { + "axios": "^0.x || ^1.0.0", + "zod": "^3.x" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/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/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "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/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.6.0.tgz", + "integrity": "sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "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.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=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==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001641", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", + "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "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==", + "dev": 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==", + "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/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, + "node_modules/class-variance-authority/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "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": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dreamopt": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", + "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", + "dev": true, + "dependencies": { + "wordwrap": ">=0.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.20.18", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.20.18.tgz", + "integrity": "sha512-fLTwcnLqtBxGd+51H/dEm9TC0FW6+cIX/RVPyNcitBO77X9+nkogEfMAJebpd/8Yl4KucmePHRYRWWvUlW0rqg==", + "dev": true, + "dependencies": { + "@esbuild-kit/esm-loader": "^2.5.5", + "@hono/node-server": "^1.9.0", + "@hono/zod-validator": "^0.2.0", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "commander": "^9.4.1", + "env-paths": "^3.0.0", + "esbuild": "^0.19.7", + "esbuild-register": "^3.5.0", + "glob": "^8.1.0", + "hanji": "^0.0.5", + "hono": "^4.1.4", + "json-diff": "0.9.0", + "minimatch": "^7.4.3", + "semver": "^7.5.4", + "superjson": "^2.2.1", + "zod": "^3.20.2" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.30.10.tgz", + "integrity": "sha512-IRy/QmMWw9lAQHpwbUh1b8fcn27S/a9zMIzqea1WNOxK9/4EB8gIo+FZWLiPXzl2n9ixGSv8BhsLZiOppWEwBw==", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=3", + "@electric-sql/pglite": ">=0.1.1", + "@libsql/client": "*", + "@neondatabase/serverless": ">=0.1", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/react": ">=18", + "@types/sql.js": "*", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=13.2.0", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "react": ">=18", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "react": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.825", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.825.tgz", + "integrity": "sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/esbuild-register": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", + "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <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-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.1.tgz", + "integrity": "sha512-BgD0kPCWMlqoItRf3xe9fG0MqwObKfVch+f2ccwDpZiCJA8ghkz2wrASH+bI6nLZzGcOJOpMm1v1Q1euhfpt4Q==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.2.1", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "dev": true, + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eval-estree-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eval-estree-expression/-/eval-estree-expression-2.0.0.tgz", + "integrity": "sha512-e1VweC8biANiuLBY1kZSva3PpaiqaL79S9RR9ql9ngidCYM6tsY20xrUBEJsN63A1yVSmO92chPaBpIGBmGsPg==", + "dev": true + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-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-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hanji": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/hanji/-/hanji-0.0.5.tgz", + "integrity": "sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==", + "dev": true, + "dependencies": { + "lodash.throttle": "^4.1.1", + "sisteransi": "^1.0.5" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, + "node_modules/hono": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.4.13.tgz", + "integrity": "sha512-c6qqenclmQ6wpXzqiElMa2jt423PVCmgBreDfC5s2lPPpGk7d0lOymd8QTzFZyYC5mSSs6imiTMPip+gLwuW/g==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-diff": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-0.9.0.tgz", + "integrity": "sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==", + "dev": true, + "dependencies": { + "cli-color": "^2.0.0", + "difflib": "~0.2.1", + "dreamopt": "~0.8.0" + }, + "bin": { + "json-diff": "bin/json-diff.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "dev": true + }, + "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/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/lucide-react": { + "version": "0.368.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.368.0.tgz", + "integrity": "sha512-soryVrCjheZs8rbXKdINw9B8iPi5OajBJZMJ1HORig89ljcOcEokKKAgGbg3QWxSXel7JwHOfDFUdDHAKyUAMw==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "dev": true, + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "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==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.1.tgz", + "integrity": "sha512-SF3TJnKdH43PMkCcErLPv+x/DY1YCklslk3ZmwaVoyUfDgHKexuKlf9sEfBQ69w+ue8jQ3msLb+hSj1T19hGag==", + "dependencies": { + "@next/env": "14.2.1", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.1", + "@next/swc-darwin-x64": "14.2.1", + "@next/swc-linux-arm64-gnu": "14.2.1", + "@next/swc-linux-arm64-musl": "14.2.1", + "@next/swc-linux-x64-gnu": "14.2.1", + "@next/swc-linux-x64-musl": "14.2.1", + "@next/swc-win32-arm64-msvc": "14.2.1", + "@next/swc-win32-ia32-msvc": "14.2.1", + "@next/swc-win32-x64-msvc": "14.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", + "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-abi": { + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "dev": true + }, + "node_modules/openapi-zod-client": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/openapi-zod-client/-/openapi-zod-client-1.18.1.tgz", + "integrity": "sha512-L0GzU/7Sx9ugbWWoQwOJdKtyxr8ZnjxIK2RJP63//OkmKws2w7c5HSgS2bdNxPVCIp/eJuYk+CtaKfvCoJ08Yw==", + "dev": true, + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "@liuli-util/fs-extra": "^0.1.0", + "@zodios/core": "^10.3.1", + "axios": "^1.6.0", + "cac": "^6.7.14", + "handlebars": "^4.7.7", + "openapi-types": "^12.0.2", + "openapi3-ts": "3.1.0", + "pastable": "^2.2.1", + "prettier": "^2.7.1", + "tanu": "^0.1.13", + "ts-pattern": "^5.0.1", + "whence": "^2.0.0", + "zod": "^3.19.1" + }, + "bin": { + "openapi-zod-client": "bin.js" + } + }, + "node_modules/openapi3-ts": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-3.1.0.tgz", + "integrity": "sha512-1qKTvCCVoV0rkwUh1zq5o8QyghmwYPuhdvtjv1rFjuOnJToXhQyF8eGjNETQ8QmGjr9Jz/tkAKLITIl2s7dw3A==", + "dev": true, + "dependencies": { + "yaml": "^2.1.3" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pastable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/pastable/-/pastable-2.2.1.tgz", + "integrity": "sha512-K4ClMxRKpgN4sXj6VIPPrvor/TMp2yPNCGtfhvV106C73SwefQ3FuegURsH7AQHpqu0WwbvKXRl1HQxF6qax9w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "ts-toolbelt": "^9.6.0", + "type-fest": "^3.5.3" + }, + "engines": { + "node": ">=14.x" + }, + "peerDependencies": { + "react": ">=17", + "xstate": ">=4.32.1" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "xstate": { + "optional": true + } + } + }, + "node_modules/pastable/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "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/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "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==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.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-hook-form": { + "version": "7.52.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.52.1.tgz", + "integrity": "sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "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==", + "dev": true + }, + "node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "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-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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "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", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/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", + "dev": true, + "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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.4.0.tgz", + "integrity": "sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tanu": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/tanu/-/tanu-0.1.13.tgz", + "integrity": "sha512-UbRmX7ccZ4wMVOY/Uw+7ji4VOkEYSYJG1+I4qzbnn4qh/jtvVbrm6BFnF12NQQ4+jGv21wKmjb1iFyUSVnBWcQ==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0", + "typescript": "^4.7.4" + } + }, + "node_modules/tanu/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/ts-pattern": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.2.0.tgz", + "integrity": "sha512-aGaSpOlDcns7ZoeG/OMftWyQG1KqPVhgplhJxNCvyIXqWrumM5uIoOSarw/hmmi/T1PnuQ/uD8NaFHvLpHicDg==", + "dev": true + }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", + "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "devOptional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-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/vaul": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.1.tgz", + "integrity": "sha512-fAhd7i4RNMinx+WEm6pF3nOl78DFkAazcN04ElLPFF9BMCNGbY/kou8UMhIcicm0rJCNePJP0Yyza60gGOD0Jw==", + "dependencies": { + "@radix-ui/react-dialog": "^1.0.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/whence": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/whence/-/whence-2.0.1.tgz", + "integrity": "sha512-VtcCE1Pe3BKofF/k+P5xcpuoqQ0f1NJY6TmdUw5kInl9/pEr1ZEFD9+ZOUicf52tvpTbhMS93aWXriu2IQYTTw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "eval-estree-expression": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/src/ghosts.ui/package.json b/src/ghosts.ui/package.json new file mode 100644 index 00000000..50b9f0d7 --- /dev/null +++ b/src/ghosts.ui/package.json @@ -0,0 +1,65 @@ +{ + "name": "ghostsui", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@hookform/resolvers": "^3.3.4", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-separator": "^1.0.3", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@radix-ui/react-toggle": "^1.0.3", + "@radix-ui/react-tooltip": "^1.0.7", + "@tanstack/react-table": "^8.16.0", + "better-sqlite3": "^9.5.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "date-fns": "^3.6.0", + "drizzle-orm": "^0.30.8", + "lucide-react": "^0.368.0", + "next": "^14.2.1", + "next-themes": "^0.3.0", + "react": "^18", + "react-day-picker": "^8.10.1", + "react-dom": "^18", + "react-hook-form": "^7.51.3", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7", + "vaul": "^0.9.0", + "zod": "3.22.4" + }, + "devDependencies": { + "@biomejs/biome": "1.7.0", + "@types/better-sqlite3": "^7.6.9", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "drizzle-kit": "^0.20.14", + "eslint": "^8", + "eslint-config-next": "14.2.1", + "openapi-zod-client": "^1.18.0", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + }, + "description": "A UI for [GHOSTS](https://github.com/cmu-sei/GHOSTS) implemented as a Next.js web app.", + "main": "server.js", + "author": "", + "license": "ISC" +} diff --git a/src/ghosts.ui/postcss.config.mjs b/src/ghosts.ui/postcss.config.mjs new file mode 100644 index 00000000..f6c3605a --- /dev/null +++ b/src/ghosts.ui/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/src/ghosts.ui/public/logo.png b/src/ghosts.ui/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..09d4ec00862febd8da8769344eb9fd825cc8bac4 GIT binary patch literal 7872 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®rMmf6vWwXda%gC80a60Y z*_Fl0Eef;{9%J6ak8gEF^&LR0EE~J#k?iMrx+hWPwak}e@q)v6#d5sZBzEn3u~r7q zRMw;FG5AY(CyJB9XuPDk!?~mxyYHe}kc2?g!!eq2Sp_8Kh+_iY0{2GSY+_n?mFy9m zKIRQ$3PaLy&TTJ{z&kk|L3fYawT$+L*Od)xy@%dQb=S~xPNdIVVfGfLH>RIK1a zk0|(28cG#Zz! void; +}) { + return ( + <> +

    Something went wrong!

    + + + Details + +

    {error.message}

    +
    +
    +
    + + + ); +} diff --git a/src/ghosts.ui/src/app/globals.css b/src/ghosts.ui/src/app/globals.css new file mode 100644 index 00000000..b0e6fff5 --- /dev/null +++ b/src/ghosts.ui/src/app/globals.css @@ -0,0 +1,76 @@ +@tailwind base; + @tailwind components; + @tailwind utilities; + + @layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + } + + @layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } + } \ No newline at end of file diff --git a/src/ghosts.ui/src/app/layout.tsx b/src/ghosts.ui/src/app/layout.tsx new file mode 100644 index 00000000..f6e8711e --- /dev/null +++ b/src/ghosts.ui/src/app/layout.tsx @@ -0,0 +1,44 @@ +import { ThemeProvider } from "@/components/theme-provider"; +import { ThemeToggle } from "@/components/theme-toggle"; +import { Toaster } from "@/components/ui/toaster"; +import { Inter } from "next/font/google"; +import Link from "next/link"; +import "./globals.css"; +import Image from "next/image"; +import GLogo from "../../public/logo.png"; + +const inter = Inter({ subsets: ["latin"] }); + +export const dynamic = "force-dynamic"; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + + +
    + {children} +
    + +
    + + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/activity/[machineGroupId]/page.tsx b/src/ghosts.ui/src/app/machine-groups/activity/[machineGroupId]/page.tsx new file mode 100644 index 00000000..6b0fb69a --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/activity/[machineGroupId]/page.tsx @@ -0,0 +1,29 @@ +import { ActivitySheet } from "@/components/activity-sheet"; +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { api } from "@/generated/endpoints"; +import { getSortedActivity } from "@/lib/server-utils"; + +export default async function Page({ + params: { machineGroupId }, + searchParams, +}: { params: { machineGroupId: string }; searchParams: unknown }) { + const id = Number.parseInt(machineGroupId); + const sortedActivity = await getSortedActivity( + api.getApimachinegroupsIdactivity, + id, + searchParams, + `/machine-groups/activity/${machineGroupId}?skip=0&take=50`, + ); + + const machineGroup = await api.getApimachinegroupsId({ params: { id } }); + const allMachines = await api.getApimachines(); + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/column-helpers.tsx b/src/ghosts.ui/src/app/machine-groups/column-helpers.tsx new file mode 100644 index 00000000..ec10994f --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/column-helpers.tsx @@ -0,0 +1,156 @@ +"use client"; + +import { DataTableMoreMenu } from "@/components/data-table"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { type GroupType, type MachineType, api } from "@/generated/endpoints"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import type { PropsWithChildren } from "react"; + +function MachinesDrowpdown({ + children, + triggerText, + dropdownDesc, +}: { + triggerText: string; + dropdownDesc: string; +} & PropsWithChildren) { + return ( + + + + + + {dropdownDesc} + {children} + + + ); +} + +export function MachineGroupMachines({ + machineGroup, +}: { + machineGroup: GroupType; +}) { + const machines = machineGroup.machines ?? []; + const router = useRouter(); + + return ( + + {machines.map((machine) => { + return ( + { + const groupMachinesWithoutDeleted = machines + .filter((m) => m.id !== machine.id) + .map((machine2) => ({ + groupId: machineGroup.id, + machineId: machine2.id, + })); + await api.putApimachinegroupsId( + { + id: machineGroup.id, + name: machineGroup.name, + groupMachines: groupMachinesWithoutDeleted, + }, + { params: { id: machineGroup.id?.toString() ?? "" } }, + ); + router.refresh(); + }} + > + {machine.name} + + ); + })} + + ); +} + +export function MachineGroupAddMachines({ + machineGroup, + allMachines, +}: { machineGroup: GroupType; allMachines: MachineType[] }) { + const router = useRouter(); + + const machinesNotInMachineGroup = allMachines.filter( + (machine) => + !machineGroup.machines?.find((machine2) => machine2.id === machine.id), + ); + const currentGroupMachines = (machineGroup.machines ?? []).map((machine) => ({ + groupId: machineGroup.id, + machineId: machine.id, + })); + + return ( + + {machinesNotInMachineGroup.map((machine) => ( + { + await api.putApimachinegroupsId( + { + id: machineGroup.id, + name: machineGroup.name, + groupMachines: [ + ...currentGroupMachines, + { groupId: machineGroup.id, machineId: machine.id }, + ], + }, + { + params: { id: machineGroup.id?.toString() ?? "" }, + }, + ); + router.refresh(); + }} + > + {machine.name} + + ))} + + ); +} + +export function MachineGroupOptions({ + machineGroup, +}: { machineGroup: GroupType }) { + const router = useRouter(); + return ( + + { + await api.deleteApimachinegroupsId(undefined, { + params: { id: machineGroup.id ?? 0 }, + }); + router.refresh(); + }} + > + Delete + + + + Run timeLine + + + + + View activity + + + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/layout.tsx b/src/ghosts.ui/src/app/machine-groups/layout.tsx new file mode 100644 index 00000000..337368e4 --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/layout.tsx @@ -0,0 +1,26 @@ +import { H1 } from "@/components/text"; +import { MachineGroupTable } from "./machine-group-table"; + +import { Button } from "@/components/ui/button"; +import { api } from "@/generated/endpoints"; +import Link from "next/link"; +import type React from "react"; + +export default async function Page({ + children, +}: { children: React.ReactNode }) { + const machines = await api.getApimachines(); + const machineGroups = await api.getApimachinegroups(); + return ( + <> +

    Machine groups

    +
    + +
    + + {children} + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/machine-group-table.tsx b/src/ghosts.ui/src/app/machine-groups/machine-group-table.tsx new file mode 100644 index 00000000..3c1598cc --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/machine-group-table.tsx @@ -0,0 +1,52 @@ +"use client"; + +import { DataTable } from "@/components/data-table"; +import type { GroupType, MachineType } from "@/generated/endpoints"; +import type { ColumnDef } from "@tanstack/react-table"; +import { + MachineGroupAddMachines, + MachineGroupMachines, + MachineGroupOptions, +} from "./column-helpers"; + +export function MachineGroupTable({ + allMachines, + machineGroups, +}: { allMachines: MachineType[]; machineGroups: GroupType[] }) { + const machineGroupColumns: ColumnDef[] = [ + { + accessorKey: "id", + header: "Id", + }, + { + accessorKey: "name", + header: "Name", + }, + { + header: "Machines", + cell: ({ row: { original } }) => ( + + ), + }, + { + header: "Add machines", + cell: ({ row: { original } }) => ( + + ), + }, + { + header: "More", + cell: ({ row: { original } }) => ( + + ), + }, + ]; + return ( + <> + + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/new/machine-group-form.tsx b/src/ghosts.ui/src/app/machine-groups/new/machine-group-form.tsx new file mode 100644 index 00000000..1f880e23 --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/new/machine-group-form.tsx @@ -0,0 +1,36 @@ +"use client"; + +import { FormInput } from "@/components/input"; +import { Button } from "@/components/ui/button"; +import { Form } from "@/components/ui/form"; +import { api } from "@/generated/endpoints"; +import { useApiCall } from "@/lib/utils"; +import { type NewGroup, newGroupSchema } from "@/lib/validation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useRouter } from "next/navigation"; +import { useForm } from "react-hook-form"; + +export function MachineGroupForm() { + const router = useRouter(); + const form = useForm({ + resolver: zodResolver(newGroupSchema), + }); + const call = useApiCall(); + return ( +
    + { + await call( + api.postApimachinegroups({ id: 0, ...data }), + "Created new machine group", + ); + router.push("/machine-groups"); + router.refresh(); + })} + > + + + + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/new/page.tsx b/src/ghosts.ui/src/app/machine-groups/new/page.tsx new file mode 100644 index 00000000..c11d80f3 --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/new/page.tsx @@ -0,0 +1,10 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { MachineGroupForm } from "./machine-group-form"; + +export default function Page() { + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/machine-groups/page.tsx b/src/ghosts.ui/src/app/machine-groups/page.tsx new file mode 100644 index 00000000..b454a79b --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/page.tsx @@ -0,0 +1 @@ +export default function Page() {} diff --git a/src/ghosts.ui/src/app/machine-groups/run-timeline/[machineGroupId]/page.tsx b/src/ghosts.ui/src/app/machine-groups/run-timeline/[machineGroupId]/page.tsx new file mode 100644 index 00000000..437b03b5 --- /dev/null +++ b/src/ghosts.ui/src/app/machine-groups/run-timeline/[machineGroupId]/page.tsx @@ -0,0 +1,23 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { TimeLineRunner } from "@/components/timeline-runner"; +import { api } from "@/generated/endpoints"; +import { db, timeLinesTable } from "@/lib/db"; + +export default async function Page({ + params: { machineGroupId }, +}: { params: { machineGroupId: string } }) { + const machineGroup = await api.getApimachinegroupsId({ + params: { id: Number.parseInt(machineGroupId) }, + }); + const timeLines = await db.select().from(timeLinesTable); + + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/machines/activity/[machineId]/page.tsx b/src/ghosts.ui/src/app/machines/activity/[machineId]/page.tsx new file mode 100644 index 00000000..9c43097d --- /dev/null +++ b/src/ghosts.ui/src/app/machines/activity/[machineId]/page.tsx @@ -0,0 +1,30 @@ +import { ActivitySheet } from "@/components/activity-sheet"; +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { api } from "@/generated/endpoints"; +import { getSortedActivity } from "@/lib/server-utils"; +import { notFound } from "next/navigation"; + +export default async function Page({ + params: { machineId: id }, + searchParams, +}: { params: { machineId: string }; searchParams: unknown }) { + const sortedActivity = await getSortedActivity( + api.getApimachinesIdactivity, + id, + searchParams, + `/machines/activity/${id}?skip=0&take=50`, + ); + const allMachines = await api.getApimachines(); + const machine = allMachines.find((machine) => machine.id === id); + + if (!machine) notFound(); + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/machines/layout.tsx b/src/ghosts.ui/src/app/machines/layout.tsx new file mode 100644 index 00000000..c8097634 --- /dev/null +++ b/src/ghosts.ui/src/app/machines/layout.tsx @@ -0,0 +1,26 @@ +import { H1 } from "@/components/text"; +import { Button } from "@/components/ui/button"; +import { api } from "@/generated/endpoints"; +import { db, timeLinesTable } from "@/lib/db"; +import Link from "next/link"; +import type React from "react"; +import { MachineTable } from "./machine-table"; + +export default async function Layout({ + children, +}: { children: React.ReactNode }) { + const machines = await api.getApimachines(); + const timeLines = await db.select().from(timeLinesTable); + return ( + <> +

    Machines

    +
    + +
    + + {children} + + ); +} diff --git a/src/ghosts.ui/src/app/machines/machine-table.tsx b/src/ghosts.ui/src/app/machines/machine-table.tsx new file mode 100644 index 00000000..ced70324 --- /dev/null +++ b/src/ghosts.ui/src/app/machines/machine-table.tsx @@ -0,0 +1,69 @@ +"use client"; + +import { DataTable, DataTableMoreMenu } from "@/components/data-table"; +import { Badge } from "@/components/ui/badge"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +import { type MachineType, api } from "@/generated/endpoints"; +import type { ColumnDef } from "@tanstack/react-table"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; + +export function MachineTable({ machines }: { machines: MachineType[] }) { + const machineColumns: ColumnDef[] = [ + { + accessorKey: "id", + header: "Id", + }, + { + accessorKey: "name", + header: "Name", + }, + { + header: "Status", + cell: ({ row: { original } }) => { + const status = original.statusUp; + + let bg = "bg-green-500"; + switch (status) { + case "Down": + case "DownWithErrors": + bg = "bg-red-500"; + break; + case "Unknown": + case "UpWithErrors": + bg = "bg-orange-500"; + } + return {status}; + }, + }, + { + header: "More", + cell: ({ row: { original } }) => , + }, + ]; + return ; +} + +function MachineOptions({ machine }: { machine: MachineType }) { + const router = useRouter(); + return ( + + { + await api.deleteApimachinesId(undefined, { + params: { id: machine.id ?? "" }, + }); + router.refresh(); + }} + > + Delete + + + Run timeLine + + + View activity + + + ); +} diff --git a/src/ghosts.ui/src/app/machines/new/machine-form.tsx b/src/ghosts.ui/src/app/machines/new/machine-form.tsx new file mode 100644 index 00000000..62784a6e --- /dev/null +++ b/src/ghosts.ui/src/app/machines/new/machine-form.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { FormInput } from "@/components/input"; +import { Button } from "@/components/ui/button"; +import { Form } from "@/components/ui/form"; +import { api } from "@/generated/endpoints"; +import { useApiCall } from "@/lib/utils"; +import { type NewMachine, newMachineSchema } from "@/lib/validation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useRouter } from "next/navigation"; +import { useForm } from "react-hook-form"; + +export function MachineForm() { + const router = useRouter(); + const form = useForm({ + resolver: zodResolver(newMachineSchema), + }); + const call = useApiCall(); + return ( +
    + { + await call(api.postApimachines(data), "Created new machine"); + router.push("/machines"); + router.refresh(); + })} + > + + + + + ); +} diff --git a/src/ghosts.ui/src/app/machines/new/page.tsx b/src/ghosts.ui/src/app/machines/new/page.tsx new file mode 100644 index 00000000..ec3c2859 --- /dev/null +++ b/src/ghosts.ui/src/app/machines/new/page.tsx @@ -0,0 +1,10 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { MachineForm } from "./machine-form"; + +export default function Page() { + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/machines/page.tsx b/src/ghosts.ui/src/app/machines/page.tsx new file mode 100644 index 00000000..b454a79b --- /dev/null +++ b/src/ghosts.ui/src/app/machines/page.tsx @@ -0,0 +1 @@ +export default function Page() {} diff --git a/src/ghosts.ui/src/app/machines/run-timeline/[machineId]/page.tsx b/src/ghosts.ui/src/app/machines/run-timeline/[machineId]/page.tsx new file mode 100644 index 00000000..debd6d63 --- /dev/null +++ b/src/ghosts.ui/src/app/machines/run-timeline/[machineId]/page.tsx @@ -0,0 +1,20 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { TimeLineRunner } from "@/components/timeline-runner"; +import { api } from "@/generated/endpoints"; +import { db, timeLinesTable } from "@/lib/db"; + +export default async function Page({ + params: { machineId }, +}: { params: { machineId: string } }) { + const machine = await api.getApimachinesId({ params: { id: machineId } }); + const timeLines = await db.select().from(timeLinesTable); + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/generate/npc-generator.tsx b/src/ghosts.ui/src/app/npcs/generate/npc-generator.tsx new file mode 100644 index 00000000..0073d414 --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/generate/npc-generator.tsx @@ -0,0 +1,106 @@ +"use client"; + +import { FormInput } from "@/components/input"; +import { Button } from "@/components/ui/button"; +import { Form } from "@/components/ui/form"; +import { Separator } from "@/components/ui/separator"; +import { api } from "@/generated/endpoints"; +import { useApiCall } from "@/lib/utils"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useRouter } from "next/navigation"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +export function NpcGenerator() { + const router = useRouter(); + + const call = useApiCall(); + + return ( + <> + + + + + ); +} + +function GenerateNpcsForm() { + const generateNpcsSchema = z.object({ + campaign: z.string(), + enclave: z.string(), + team: z.string(), + count: z.number().int(), + }); + + type GenerateNpcs = z.infer; + + const generateNpcsForm = useForm({ + resolver: zodResolver(generateNpcsSchema), + }); + + const router = useRouter(); + const call = useApiCall(); + + async function generateNpcsForCampaignEnclaveTeam(data: GenerateNpcs) { + await call( + api.postApinpcsgenerate({ + campaign: data.campaign, + enclaves: [ + { + name: data.enclave, + teams: [ + { + name: data.team, + npcs: { + number: data.count, + }, + }, + ], + }, + ], + }), + `Generated ${data.count} NPC's`, + ); + router.push("/npcs"); + router.refresh(); + } + + return ( +
    + + + + + + + + + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/generate/page.tsx b/src/ghosts.ui/src/app/npcs/generate/page.tsx new file mode 100644 index 00000000..c4a5e6fa --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/generate/page.tsx @@ -0,0 +1,10 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { NpcGenerator } from "./npc-generator"; + +export default function Page() { + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/layout.tsx b/src/ghosts.ui/src/app/npcs/layout.tsx new file mode 100644 index 00000000..5211c849 --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/layout.tsx @@ -0,0 +1,29 @@ +import { H1 } from "@/components/text"; +import { Button } from "@/components/ui/button"; +import { api } from "@/generated/endpoints"; +import Link from "next/link"; +import type React from "react"; +import { NpcTable } from "./npc-table"; + +export default async function Layout({ + children, +}: { children: React.ReactNode }) { + const npcs = await api.getApinpcs(); + const machines = await api.getApimachines(); + + return ( + <> +

    Npcs

    +
    + + +
    + + {children} + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/manual/npc-form.tsx b/src/ghosts.ui/src/app/npcs/manual/npc-form.tsx new file mode 100644 index 00000000..8fcf0d9e --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/manual/npc-form.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { JSONImporter } from "@/components/json-utils"; +import AutoForm, { AutoFormSubmit } from "@/components/ui/auto-form"; +import { api, schemas } from "@/generated/endpoints"; +import { useApiCall } from "@/lib/utils"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import type { z } from "zod"; + +/** + * This form is autogenerated using @see https://github.com/vantezzen/auto-form + * The NPC object has so many fields, manually creating a form is unreasonable. + */ +export function NpcForm() { + const router = useRouter(); + const [values, setValues] = useState>({}); + const call = useApiCall(); + return ( + <> + setValues(data)} + /> + { + await call(api.postApinpcs(data), "Created NPC"); + router.push("/npcs"); + router.refresh(); + }} + > + Create + + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/manual/page.tsx b/src/ghosts.ui/src/app/npcs/manual/page.tsx new file mode 100644 index 00000000..e59892f0 --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/manual/page.tsx @@ -0,0 +1,10 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { NpcForm } from "./npc-form"; + +export default function Page() { + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/npc-table.tsx b/src/ghosts.ui/src/app/npcs/npc-table.tsx new file mode 100644 index 00000000..b1928f85 --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/npc-table.tsx @@ -0,0 +1,74 @@ +"use client"; + +import { DataTable, DataTableMoreMenu } from "@/components/data-table"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +import { type MachineType, api, type schemas } from "@/generated/endpoints"; +import type { ColumnDef } from "@tanstack/react-table"; +import { useRouter } from "next/navigation"; +import type { z } from "zod"; + +export function NpcTable({ + npcs, + machines, +}: { npcs: NPC[]; machines: MachineType[] }) { + const npcColumns: ColumnDef[] = [ + { + header: "Id", + accessorFn: (npc) => { + const id = npc.id; + if (id) return id; + + return "No id"; + }, + }, + { + header: "First name", + accessorFn: (npc) => npc.npcProfile?.name?.first, + filterFn: "equalsString", + }, + { + header: "Machine", + accessorFn: (npc) => + machines.find((machine) => npc.machineId === machine.id)?.name, + }, + { + header: "Campaign", + accessorKey: "campaign", + }, + { + header: "Enclave", + accessorKey: "enclave", + }, + { + header: "Team", + accessorKey: "team", + }, + { + header: "More", + cell: ({ row: { original } }) => , + }, + ]; + + return ; +} + +export type NPC = z.infer; + +export function NpcTableMore({ npc }: { npc: NPC }) { + const router = useRouter(); + return ( + + { + const id = npc.id ?? ""; + await api.deleteApinpcsId(undefined, { + params: { id }, + }); + router.refresh(); + }} + > + Delete + + + ); +} diff --git a/src/ghosts.ui/src/app/npcs/page.tsx b/src/ghosts.ui/src/app/npcs/page.tsx new file mode 100644 index 00000000..b454a79b --- /dev/null +++ b/src/ghosts.ui/src/app/npcs/page.tsx @@ -0,0 +1 @@ +export default function Page() {} diff --git a/src/ghosts.ui/src/app/page.tsx b/src/ghosts.ui/src/app/page.tsx new file mode 100644 index 00000000..9ffca100 --- /dev/null +++ b/src/ghosts.ui/src/app/page.tsx @@ -0,0 +1 @@ +export default async function Home() {} diff --git a/src/ghosts.ui/src/app/timelines/action.ts b/src/ghosts.ui/src/app/timelines/action.ts new file mode 100644 index 00000000..fe094d17 --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/action.ts @@ -0,0 +1,40 @@ +"use server"; + +/** + * Server actions for timeLines CRUD + * For server actions docs @see https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations + */ + +import { db, timeLinesTable } from "@/lib/db"; +import { + type NewTimeLine, + type TimeLine, + newTimeLineSchema, + timeLineSchema, +} from "@/lib/validation"; +import { eq } from "drizzle-orm"; +import { revalidatePath } from "next/cache"; +import { z } from "zod"; + +export async function createTimeLine(data: NewTimeLine) { + const timeLine = newTimeLineSchema.parse(data); + await db.insert(timeLinesTable).values(timeLine).run(); + revalidatePath("/timelines"); +} + +export async function updateTimeLine(data: TimeLine) { + const t = timeLineSchema.parse(data); + const { id, ...timeLine } = t; + await db + .update(timeLinesTable) + .set(timeLine) + .where(eq(timeLinesTable.id, id)) + .run(); + revalidatePath("/timelines"); +} + +export async function deleteTimeLine(data: unknown) { + const id = z.number().parse(data); + await db.delete(timeLinesTable).where(eq(timeLinesTable.id, id)).run(); + revalidatePath("/timelines"); +} diff --git a/src/ghosts.ui/src/app/timelines/edit/[timelineId]/page.tsx b/src/ghosts.ui/src/app/timelines/edit/[timelineId]/page.tsx new file mode 100644 index 00000000..47ef0745 --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/edit/[timelineId]/page.tsx @@ -0,0 +1,24 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { db, timeLinesTable } from "@/lib/db"; +import { eq } from "drizzle-orm"; +import { notFound } from "next/navigation"; +import { TimeLineForm } from "../../timeline-form"; + +export default async function Page({ + params: { timelineId }, +}: { params: { timelineId: string } }) { + const id = Number.parseInt(timelineId); + const timeLine = await db + .select() + .from(timeLinesTable) + .where(eq(timeLinesTable.id, id)) + .get(); + + if (!timeLine) notFound(); + + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/timelines/layout.tsx b/src/ghosts.ui/src/app/timelines/layout.tsx new file mode 100644 index 00000000..59755ba8 --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/layout.tsx @@ -0,0 +1,24 @@ +import { H1 } from "@/components/text"; +import { Button } from "@/components/ui/button"; +import { db, timeLinesTable } from "@/lib/db"; +import Link from "next/link"; +import type React from "react"; +import { TimeLineTable } from "./timeline-table"; + +export default async function Layout({ + children, +}: { children: React.ReactNode }) { + const timeLines = await db.select().from(timeLinesTable); + return ( + <> +

    TimeLines

    +
    + +
    + + {children} + + ); +} diff --git a/src/ghosts.ui/src/app/timelines/new/page.tsx b/src/ghosts.ui/src/app/timelines/new/page.tsx new file mode 100644 index 00000000..73e182b9 --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/new/page.tsx @@ -0,0 +1,10 @@ +import { SheetWrapper } from "@/components/sheet-wrapper"; +import { TimeLineForm } from "../timeline-form"; + +export default function Page() { + return ( + + + + ); +} diff --git a/src/ghosts.ui/src/app/timelines/page.tsx b/src/ghosts.ui/src/app/timelines/page.tsx new file mode 100644 index 00000000..b454a79b --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/page.tsx @@ -0,0 +1 @@ +export default function Page() {} diff --git a/src/ghosts.ui/src/app/timelines/timeline-form-events.tsx b/src/ghosts.ui/src/app/timelines/timeline-form-events.tsx new file mode 100644 index 00000000..fc20267c --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/timeline-form-events.tsx @@ -0,0 +1,68 @@ +import { FormInput } from "@/components/input"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { Button } from "@/components/ui/button"; +import type { NewTimeLine } from "@/lib/validation"; +import { Trash } from "lucide-react"; +import type { UseFormReturn } from "react-hook-form"; + +/** + * Renders a single event of a timeline handler in a timeline form + */ +export function TimeLineFormEvents({ + form, + remove, + j, + i, +}: { + i: number; + j: number; + remove: (j: number) => void; + form: UseFormReturn; +}) { + const basePath = `timeLineHandlers.${i}.timeLineEvents.${j}` as const; + const basePathWatch = form.watch(basePath); + return ( + + + {`${j + 1} : ${ + basePathWatch.command ? basePathWatch.command : "No command yet" + }`} + + + + + + + + + + + + ); +} diff --git a/src/ghosts.ui/src/app/timelines/timeline-form-handlers.tsx b/src/ghosts.ui/src/app/timelines/timeline-form-handlers.tsx new file mode 100644 index 00000000..415aa1ab --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/timeline-form-handlers.tsx @@ -0,0 +1,244 @@ +import { FormInput, FormSelect, FormSwitch } from "@/components/input"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import AutoFormObject from "@/components/ui/auto-form/fields/object"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { FormLabel } from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { SelectGroup, SelectItem } from "@/components/ui/select"; +import { TabsContent } from "@/components/ui/tabs"; +import { HANDLER_TYPES, type HandlerType } from "@/generated/endpoints"; +import { HANDLER_ARGS_SCHEMAS, type NewTimeLine } from "@/lib/validation"; +import { Plus, Trash } from "lucide-react"; +import { useEffect, useState } from "react"; +import { + type FieldArrayWithId, + type UseFormReturn, + useFieldArray, +} from "react-hook-form"; +import { type AnyZodObject, z } from "zod"; +import { timeLineHandlerName } from "./timeline-form"; +import { TimeLineFormEvents } from "./timeline-form-events"; + +/** + * Renders a single handler in a timeline form + */ +export function TimeLineFormHandler({ + timeLineHandler, + form, + i, + removeOuter, +}: { + removeOuter: (i: number) => void; + i: number; + form: UseFormReturn; + timeLineHandler: FieldArrayWithId; +}) { + const basePath = `timeLineHandlers.${i}` as const; + + const { + fields: timeLineEvents, + append, + remove, + } = useFieldArray({ + control: form.control, + name: `${basePath}.timeLineEvents`, + }); + return ( + + + + + {timeLineHandlerName(form.watch(`timeLineHandlers.${i}`), i)} + + + + + + {HANDLER_TYPES.map((handlerType) => ( + + {handlerType} + + ))} + + + + + + +
    + + +
    + +
    + + +
    + TimeLine events + + {timeLineEvents.map((timeLineEvent, j) => ( + + ))} +
    + + + +
    +
    + ); +} + +function AddHandlerEventButton({ + append, +}: { + append: ( + event: NonNullable< + NewTimeLine["timeLineHandlers"][number]["timeLineEvents"] + >[number], + ) => void; +}) { + return ( + + ); +} + +function getDefaultHandlerArgs(handlerType: HandlerType) { + return ( + HANDLER_ARGS_SCHEMAS[handlerType as keyof typeof HANDLER_ARGS_SCHEMAS] ?? + z.object({}) + ); +} + +/** + * Renders the inputs for predefined handler args and allows the addition of custom handler args + */ +function HandlerArgs({ + form, + basePath, +}: { + form: UseFormReturn; + basePath: `timeLineHandlers.${number}`; +}) { + const handlerType = form.watch(basePath).handlerType; + + // The name/key of a new arg we want to add + const [newHandlerArgName, setNewHandlerArgName] = useState< + string | undefined + >(undefined); + + // When we add new keys to handler args we also want to update the schema + // because it validates the handler args and also renders the inputs using auto-form + const [handlerArgsSchema, setHandlerArgsSchema] = useState( + getDefaultHandlerArgs(handlerType), + ); + + // Update the schema whenever the handler changes + // ie. when the handler type of a handler is changed or the visible handler is changed + useEffect(() => { + setHandlerArgsSchema(getDefaultHandlerArgs(handlerType)); + }, [handlerType]); + + return ( + + + Handler args + + setNewHandlerArgName(e.target.value)} + placeholder="Handler arg name" + /> + + + + + + + ); +} diff --git a/src/ghosts.ui/src/app/timelines/timeline-form.tsx b/src/ghosts.ui/src/app/timelines/timeline-form.tsx new file mode 100644 index 00000000..c36368d6 --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/timeline-form.tsx @@ -0,0 +1,175 @@ +"use client"; + +import { FormInput } from "@/components/input"; +import { JSONImporter } from "@/components/json-utils"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Form, FormLabel } from "@/components/ui/form"; +import { Tabs } from "@/components/ui/tabs"; +import { useApiCall } from "@/lib/utils"; +import { + type NewTimeLine, + type TimeLine, + newTimeLineSchema, +} from "@/lib/validation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; +import { + type FieldArrayWithId, + type UseFormReturn, + useFieldArray, + useForm, +} from "react-hook-form"; +import { createTimeLine, updateTimeLine } from "./action"; +import { TimeLineFormHandler } from "./timeline-form-handlers"; + +export function timeLineHandlerName( + timeLineHandler: TimeLine["timeLineHandlers"][number], + i: number, +) { + return `${i + 1} : ${timeLineHandler.handlerType ?? "No handler type yet"}`; +} + +export function TimeLineForm({ timeLine }: { timeLine?: TimeLine }) { + const form = useForm({ + resolver: zodResolver(newTimeLineSchema), + defaultValues: timeLine, + }); + + const { + fields: timeLineHandlers, + append, + remove, + } = useFieldArray({ + control: form.control, + name: "timeLineHandlers", + }); + + // Keep track of which handler is currently being edited + const [openHandler, setOpenHandler] = useState(); + + // Ensure that a handler is always visible if one exists + useEffect(() => { + setOpenHandler(timeLineHandlers[0]?.id); + }, [timeLineHandlers]); + + const call = useApiCall(); + const router = useRouter(); + + async function createOrUpdateTimeLine(data: NewTimeLine) { + if (timeLine) { + await call( + updateTimeLine({ id: timeLine.id, ...data }), + "Updated timeLine", + ); + } else { + await call(createTimeLine(data), "Created timeLine"); + } + router.push("/timelines"); + } + + return ( +
    + + + TimeLine handlers +
    + { + form.setValue("timeLineHandlers", data); + }} + /> + +
    + + + + {timeLineHandlers.map((timeLineHandler, i) => ( + + ))} + + + + + ); +} + +/** + * A button that adds a new handler to the timeline form + */ +function AddHandlerButton({ + append, +}: { append: (handler: TimeLine["timeLineHandlers"][number]) => void }) { + return ( + + ); +} + +/** + * Renders a dropdown that allows the user to pick a handler to edit + */ +function HandlerToEditSelector({ + form, + timeLineHandlers, + setOpenHandler, +}: { + form: UseFormReturn; + timeLineHandlers: FieldArrayWithId[]; + setOpenHandler: (id: string) => void; +}) { + return ( + + + + + + {timeLineHandlers.map((timeLineHandler, i) => ( + setOpenHandler(timeLineHandler.id)} + > + {timeLineHandlerName(form.watch(`timeLineHandlers.${i}`), i)} + + ))} + + + ); +} diff --git a/src/ghosts.ui/src/app/timelines/timeline-table.tsx b/src/ghosts.ui/src/app/timelines/timeline-table.tsx new file mode 100644 index 00000000..efb75090 --- /dev/null +++ b/src/ghosts.ui/src/app/timelines/timeline-table.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { DataTable, DataTableMoreMenu } from "@/components/data-table"; +import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; +import { useApiCall } from "@/lib/utils"; +import type { TimeLine } from "@/lib/validation"; +import type { ColumnDef } from "@tanstack/react-table"; +import Link from "next/link"; +import { deleteTimeLine } from "./action"; + +export function TimeLineTable({ timeLines }: { timeLines: TimeLine[] }) { + const timeLineColumns: ColumnDef[] = [ + { + accessorKey: "name", + header: "Name", + }, + { + header: "TimeLine handlers", + cell: ({ row: { original } }) => { + return ( +

    + {original.timeLineHandlers + .map((timeLineHandler) => timeLineHandler.handlerType) + .join(" -> ")} +

    + ); + }, + }, + { + header: "Actions", + cell: ({ row: { original } }) => ( + + ), + }, + ]; + return ; +} + +function TimeLineTableMore({ timeLine }: { timeLine: TimeLine }) { + const call = useApiCall(); + return ( + + { + await call(deleteTimeLine(timeLine.id), "Deleted timeLine"); + }} + > + Delete + + + Edit + + + ); +} diff --git a/src/ghosts.ui/src/components/activity-sheet.tsx b/src/ghosts.ui/src/components/activity-sheet.tsx new file mode 100644 index 00000000..ad0714c5 --- /dev/null +++ b/src/ghosts.ui/src/components/activity-sheet.tsx @@ -0,0 +1,157 @@ +"use client"; + +import { SheetTitle } from "@/components/ui/sheet"; +import type { MachineActivityType, MachineType } from "@/generated/endpoints"; +import type { ColumnDef } from "@tanstack/react-table"; +import Link from "next/link"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import { DataTable } from "./data-table"; +import type { MachineOrMachineGroup } from "./timeline-runner"; +import { Input } from "./ui/input"; + +/** + * A component to display activity of a machine or machine group in a table + */ +export function ActivitySheet({ + activity, + machine, + machineGroup, + allMachines, +}: { + activity: MachineActivityType[]; + allMachines: MachineType[]; +} & MachineOrMachineGroup) { + const name = machine ? machine.name : machineGroup.name; + const entityName = `${machine ? "machine" : "machine group"} '${name}'`; + + const activityColumns: ColumnDef[] = [ + { + header: "Handler type", + accessorKey: "handler", + }, + { + header: "Command", + accessorKey: "command", + }, + { + header: "Command arg", + accessorKey: "commandArg", + }, + { + header: "Created UTC", + accessorKey: "createdUtc", + }, + ]; + + // Add the machine link column if we are viewing the activity of a machine group + if (machineGroup) { + activityColumns.push({ + header: "Machine", + cell: ({ row: { original } }) => { + const machine = allMachines.find( + (machine) => machine.id === original.machineId, + ); + if (machine) { + return ( + + {machine.name ?? "No machine name"} + + ); + } + return "Machine not found"; + }, + }); + } + + return ( + <> + {`Activity for ${entityName}`} + + + + ); +} + +import { + Pagination, + PaginationContent, + PaginationItem, + PaginationNext, + PaginationPrevious, +} from "@/components/ui/pagination"; +import { useEffect, useState } from "react"; + +function ActivityPaginator() { + const router = useRouter(); + const path = usePathname(); + const searchParams = useSearchParams(); + + const currentTake = Number.parseInt( + searchParams.get("take")?.toString() ?? "50", + ); + const currentSkip = Number.parseInt( + searchParams.get("skip")?.toString() ?? "0", + ); + + const [take, setTake] = useState(currentTake); + + useEffect(() => { + const timeoutId = setTimeout(() => { + if (!Number.isNaN(take)) router.push(`${path}?skip=0&take=${take}`); + }, 1000); + return () => clearTimeout(timeoutId); + }, [take, path, router.push]); + + const [page, setPage] = useState(1); + + useEffect(() => { + const timeoutId = setTimeout(() => { + if (!Number.isNaN(take)) + router.push(`${path}?skip=${(page - 1) * take}&take=${take}`); + }, 1000); + return () => clearTimeout(timeoutId); + }, [page, take, path, router.push]); + + const prevTake = currentSkip - currentTake; + const prevHref = `${path}?skip=${ + prevTake < 0 ? 0 : prevTake + }&take=${currentTake}`; + + const nextHref = `${path}?skip=${ + currentSkip + currentTake + }&take=${currentTake}`; + + return ( + + + + + + + setPage(Number.parseInt(e.target.value))} + type="number" + min={1} + /> + + + + + + setTake(Number.parseInt(e.target.value))} + type="number" + min={1} + /> + + + + ); +} diff --git a/src/ghosts.ui/src/components/data-table.tsx b/src/ghosts.ui/src/components/data-table.tsx new file mode 100644 index 00000000..2505955e --- /dev/null +++ b/src/ghosts.ui/src/components/data-table.tsx @@ -0,0 +1,212 @@ +"use client"; + +import { + type Column, + type ColumnDef, + flexRender, + getCoreRowModel, + getFilteredRowModel, + useReactTable, +} from "@tanstack/react-table"; + +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { MoreHorizontal } from "lucide-react"; +import { type PropsWithChildren, useEffect, useState } from "react"; +import { JSONViewer } from "./json-utils"; +import { Button } from "./ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuTrigger, +} from "./ui/dropdown-menu"; +import { Input } from "./ui/input"; + +interface DataTableProps { + columns: ColumnDef[]; + data: TData[]; +} + +/** + * A dropdown menu to perform actions on a table row + * Includes a json viewer to view the provided (usually the row) JSON + */ +export function DataTableMoreMenu({ + children, + jsonViewerJson, +}: { jsonViewerJson: T } & PropsWithChildren) { + return ( + + + + + + Actions + {children} + + + + ); +} + +/** + * Default ShadCN UI DataTable component + * Added a simple implementation of selecting columns to filter + * Rows are filtered by a string search of the value of the selected column + */ +export function DataTable({ + columns, + data, +}: DataTableProps) { + // Add a rawJson column for searching the raw json + columns = [ + ...columns, + { + id: "rawJson", + accessorFn: (row) => JSON.stringify(row), + } as ColumnDef, + ]; + + // @ts-expect-error ts doesn't like this + columns = columns.map( + // @ts-expect-error same + (col) => ({ ...col, filterFn: "test" }) satisfies ColumnDef, + ); + + const table = useReactTable({ + data, + columns, + state: { + columnVisibility: { + // Hide the rawJson column + rawJson: false, + }, + }, + columnResizeMode: "onChange", + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + + /** + * Custom search fn because default tanstack table filter fn doesn't work with nullable cols + * @see https://github.com/TanStack/table/issues/4919 + */ + filterFns: { + test: (row, filterColumnId, filterValue) => { + const val = row.getValue(filterColumnId) as string | undefined; + if (!val) { + return false; + } + if (val.includes(filterValue)) { + return true; + } + return false; + }, + }, + }); + + const rawJsonColumn = table.getColumn("rawJson"); + + const [searchColumn, setSearchColumn] = useState | undefined>( + rawJsonColumn, + ); + + const [searchValue, setSearchValue] = useState(undefined); + + // Debounce setting the search column value so we don't refilter on every single character change + useEffect(() => { + const timeoutId = setTimeout(() => { + searchColumn?.setFilterValue(searchValue); + }, 500); + return () => clearTimeout(timeoutId); + }, [searchValue, searchColumn?.setFilterValue]); + + function updateSearchColumn(newSearchColumn?: Column) { + searchColumn?.setFilterValue(undefined); + setSearchValue(undefined); + setSearchColumn(newSearchColumn ?? undefined); + } + + return ( + <> +
    + {searchColumn && ( + setSearchValue(e.target.value)} + placeholder={`Search ${searchColumn.id}`} + /> + )} + + {searchColumn && ( + + )} +
    +
    + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + updateSearchColumn(header.column)} + > + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext(), + )} + + ); + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext(), + )} + + ))} + + )) + ) : ( + + + No results. + + + )} + +
    +
    + + ); +} diff --git a/src/ghosts.ui/src/components/input.tsx b/src/ghosts.ui/src/components/input.tsx new file mode 100644 index 00000000..225beb27 --- /dev/null +++ b/src/ghosts.ui/src/components/input.tsx @@ -0,0 +1,124 @@ +import type { PropsWithChildren } from "react"; +import type { + ControllerRenderProps, + FieldValues, + Path, + UseFormReturn, +} from "react-hook-form"; +import { + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "./ui/form"; +import { Input } from "./ui/input"; +import { Select, SelectContent, SelectTrigger, SelectValue } from "./ui/select"; +import { Switch } from "./ui/switch"; + +/** + * Utility wrappers around inputs + */ + +type FormComponentProps = { + form: UseFormReturn; + fieldName: Path; + label?: string; +}; + +function InputWrapper({ + form, + fieldName, + label, + renderInput, +}: FormComponentProps & { + renderInput: ( + field: ControllerRenderProps>, + ) => React.ReactNode; +}) { + return ( + ( + + {label && {label}} + {renderInput(field)} + + + + )} + /> + ); +} + +export function FormSwitch( + props: FormComponentProps, +) { + return ( + ( + + )} + /> + ); +} + +export function FormInput( + props: FormComponentProps & { + parseCommaSeparatedStringAsArray?: boolean; + parseInt?: boolean; + }, +) { + return ( + ( + { + if (props.parseCommaSeparatedStringAsArray) { + field.onChange(e.target.value.split(",")); + } else if (props.parseInt) { + const int = Number.parseInt(e.target.value); + if (!Number.isNaN(int)) { + field.onChange(int); + } else { + field.onChange(e); + } + } else { + field.onChange(e); + } + }} + /> + )} + /> + ); +} + +export function FormSelect({ + children, + parseAsInt, + ...props +}: FormComponentProps & { + parseAsInt?: boolean; +} & PropsWithChildren) { + return ( + ( + + )} + /> + ); +} diff --git a/src/ghosts.ui/src/components/json-utils.tsx b/src/ghosts.ui/src/components/json-utils.tsx new file mode 100644 index 00000000..2b3a9b92 --- /dev/null +++ b/src/ghosts.ui/src/components/json-utils.tsx @@ -0,0 +1,100 @@ +import { CopyCheck } from "lucide-react"; +import { useEffect, useState } from "react"; +import type { ZodType, z } from "zod"; +import { Button } from "./ui/button"; +import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; +import { Textarea } from "./ui/textarea"; +import { useToast } from "./ui/use-toast"; + +/** + * A popover to view and copy the provided json + */ +export function JSONViewer({ json }: { json: T }) { + const jsonString = JSON.stringify(json, undefined, 2); + return ( + + View JSON + + await navigator.clipboard.writeText(jsonString)} + /> +
    {jsonString}
    +
    +
    + ); +} + +/** + * Renders a textarea, validates the provided input against the validator and calls onValidData if the data is valid + * If there is existing data to edit, use the prefillData prop + */ +export function JSONImporter< + TValidator extends ZodType, + TData extends z.infer, +>({ + validator, + onValidData, + prefillData, +}: { + validator: TValidator; + onValidData: (data: TData) => void; + prefillData?: TData; +}) { + const prefillDataString = prefillData + ? JSON.stringify(prefillData, undefined, 4) + : ""; + const [jsonToImport, setJsonToImport] = useState(prefillDataString); + + // Ensure prefilldata is up to date + useEffect(() => setJsonToImport(prefillDataString), [prefillDataString]); + + const { toast } = useToast(); + return ( + + + + + +